2011-02-01 13 views
8

क्या सी # के लिए कोई गणना इंजन है जो मूल्य बदलते समय स्वचालित फ़ील्ड को स्वचालित रूप से पुन: गणना कर सकता है?सी # के लिए गणना इंजन के रूप में ऐसी चीज?

मुझे फ्रीस्टाइल एक पल के लिए, मैं कुछ इस तरह की कल्पना कर रहा हूँ चलो ..

Field<double> quantity = Field.Create<double>("Quantity"); 
Field<double> unitCost = Field.Create<double>("Unit Cost"); 
Field<double> total = Field.Create<double>("Total"); 

total.Calculation((q,uc) => q * uc, quantity, value); 
     // would have signature something like this: 
     // void Calculation<TR,T1,T1>(Func<TR,T1,T2>, Field<T1>, Field<T2>) 

इस फ़ील्ड निर्भर मूल्यों ऑटो प्रचार की स्थापना की जाएगी।

quantity.Value = 5.0; 
unitCost.Value = 1.5; 
Assert.That(total.Value, Is.EqualTo(7.5)); 

स्पष्ट रूप से यह एक साधारण उदाहरण है, अंत उपयोग एक जटिल स्प्रेडशीट की गणना के समान होगा।

आगे सोचकर यह आश्चर्यजनक होगा कि क्षेत्र/कक्ष परिवर्तन अधिसूचना का समर्थन करेंगे।

+3

विंडोज वर्कफ़्लो फाउंडेशन के तहत "नियम इंजन" देखें। –

+0

मुझे नहीं पता कि यह पहले से मौजूद है या नहीं, लेकिन यह किसी भी तरह से लागू करने के लिए एक अच्छा विचार की तरह दिखता है, आपको केवल 'इनोटिफाईप्रॉपर्टी चेंजिंग की आवश्यकता है और डिप्लेसीज को जोड़ने के लिए अभिव्यक्ति वृक्ष को विघटित करने की आवश्यकता है। – Guillaume86

उत्तर

5

क्या आपने http://ncalc.codeplex.com देखा है?

यह एक्स्टेंसिबल, तेज़ (उदा। इसका अपना कैश है) आपको मूल्यांकन कार्यों/मूल्यांकन मूल्यांकन कार्यक्रमों को संभालने के द्वारा रन टाइम पर कस्टम फ़ंक्शन और वैरिएबल प्रदान करने में सक्षम बनाता है। उदाहरण भाव यह पार्स कर सकते हैं:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

    e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
    e.Parameters["X"] = 10; 

    e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
     if (name == "Pi") 
     args.Result = 3.14; 
    }; 

    Debug.Assert(117.07 == e.Evaluate()); 

यह भी संभालती यूनिकोड & कई डेटा देशी रूप टाइप करें। यदि आप व्याकरण को बदलना चाहते हैं तो यह एक एंटरलर फ़ाइल के साथ आता है। एक कांटा भी है जो नए कार्यों को लोड करने के लिए एमईएफ का समर्थन करता है।

यह तार्किक ऑपरेटरों, दिनांक/समय के तारों और यदि बयानों का भी समर्थन करता है।

एक समाधान

आप संभवतः INotifyPropertyChanged को लागू तो

  • की तरह कुछ सेट एक क्षेत्र की अभिव्यक्ति this.Field.Expression = नई अभिव्यक्ति ("फ़ील्ड 1 + फ़ील्ड 2 करके स्वत: पुनर्गणना कर सकता है ");

वर्ग

    प्रत्येक फ़ील्ड (प्रतिबिंब के साथ) के लिए
  • एक समारोह
  • यह है कि अगर यह अभिव्यक्ति है में notifypropertyupdated पर बदल क्षेत्र को संदर्भित करता है तो चर पुनर्गणना।
  • पुनर्गणना आप सही क्षेत्र खोजने के लिए और अपने मूल्य निकालने के लिए प्रतिबिंब का उपयोग करने के EvaluateParameter घटना को संभालने के लिए आवश्यकता होगी पर (आप प्रतिबिंब से बचने के लिए कैश कर सकता है अगर जरूरत है)
+0

दिलचस्प परियोजना - क्या यह निर्भरताओं को संभालती है? अर्थात।क्या मैं अभिव्यक्तियों की एक श्रृंखला तैयार कर सकता हूं जो अन्य अभिव्यक्तियों के परिणामों पर भरोसा करता है? अगर वे गलत क्रम में हैं (या यदि बाद में किसी पूर्व द्वारा उपयोग की जाने वाली चीज़ का मूल्य बदलता है - क्या यह कैस्केडिंग अपडेट को संभालेगा?) दस्तावेज़ीकरण विषय से बचने के लिए प्रतीत होता है (शायद मैं गलत जगह पर देख रहा हूं) – Rudu

+0

@Rudu "यह निर्भरताओं को संभालता है", यह अभिव्यक्ति के पैरामीटर के रूप में निर्दिष्ट अभिव्यक्तियों के माध्यम से अभिव्यक्ति के माध्यम से अभिव्यक्ति के एक डीएजी को संभालेगा और उसके बाद उन अभिव्यक्तियों के पैरामीटर के रूप में निर्दिष्ट अभिव्यक्तियों के लिए। इस तरह आप कभी भी एक परिपत्र निर्भरता प्राप्त नहीं करते हैं और गणना आदेश हमेशा सही होना चाहिए सिकन निर्भरता पहले गणना की जाती है। – GreyCloud

+0

@Rudu - http://ncalc.codeplex.com/ पर अंतिम उदाहरण दिखाता है कि घोंसले कैसे हो सकते हैं। कैस्केडिंग अपडेट के विषय पर। ऐसा नहीं होगा, आपके द्वारा प्राप्त मूल्य उस समय गणना की गई मान है। आपको डेटा – GreyCloud

1

मैं यहाँ एक समान प्रश्न पूछा: Truly declarative language?

जहां तक ​​मुझे पता नहीं है, केवल एनसीएएलसी के बारे में सुना है, मैं इसे देख लूंगा। मेरे पास एक प्रोजेक्ट है जो आपके द्वारा वर्णित बहुत कुछ करता है और फिर कैशिंग/कैश जैसे कुछ मूल्यों या मॉडल संरचना में परिवर्तनों पर छोड़ देता है। डेटाबेस और एक्सेल के बीच एक क्रॉसओवर के रूप में इसे सोचें। आप कक्षाओं को भी परिभाषित कर सकते हैं और ग्राफिक्स में लाखों ऑब्जेक्ट्स के साथ बड़े मॉडल में उन्हें एक साथ जोड़ सकते हैं, न केवल पेड़। क्लाइंट सर्वर इत्यादि। इसके अलावा एक मॉडल संपादक भी है जहां आप यूआई में मॉडल बनाते हैं ताकि आप विश्लेषण कर सकें कि सभी गणनाएं एक दूसरे पर कैसे बनती हैं।

आप वास्तव में क्यों पूछ रहे हैं?

1

मैं जेस को भी देखने की सिफारिश करता हूं। जेस .NET ढांचे के लिए एक और आधुनिक गणना इंजन है। उपर्युक्त प्रस्तावित एनसीएएलसी के बाद यह बहुत तेज है। इसके अलावा यह अधिक प्लेटफॉर्म (.NET, WinRT, WP7 और WP8) का समर्थन करता है। जेस के बारे में

अधिक जानकारी GitHub पृष्ठ पर पाया जा सकता है: https://github.com/pieterderycke/Jace

NuGet लिंक: https://www.nuget.org/packages/Jace

1

अदिश मापदंडों के लिए गणना इंजन रहे हैं, और वहाँ तालिकाओं के लिए उच्च स्तर की गणना इंजन हैं, आम तौर पर वित्तीय नियोजन, शुल्क और कमीशन गणना, नेटवर्क और अनुबंध गणना जैसे अनुप्रयोगों के लिए उपयोग किया जाता है ...

मुझे इसे जल्द ही समझाएं। स्केलर्स के लिए निम्नलिखित सूत्रों पर विचार करें:

1) z = f1(x,y) 
2) p = f2(z,n) 
3) q = f3(x,p) 
... 

और इसी तरह। ऐसे कार्यों और निर्भरता पेड़ों को कॉन्फ़िगर करने के लिए स्केलर पैरामीटर के साथ एक गणना इंजन की आवश्यकता होती है। मैं (भी) एक अच्छा प्रारंभिक बिंदु के रूप में सी # में लिखा इस तरह के एक गणना के इंजन के लिए नीचे दिए गए लिंक की सिफारिश करेंगे: http://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET

के रूप में उल्लेख किया है, वहाँ भी कर रहे हैं तालिका कार्यों कि पैरामीटर के रूप में टेबल लेने के साथ गणना इंजन। मुख्य सिद्धांत है लेकिन वही:

1) (T4, T5) = TableFunction1(T1, T2, T3) 
2) (T7, T8) = TableFunction2(T2, T4) 
... 

और इसी तरह। ध्यान दें कि ऊपर दिखाए गए अनुसार एक टेबल फ़ंक्शन आउटपुट के रूप में एकाधिक तालिकाओं को वापस कर सकता है।

वहाँ दो महत्वपूर्ण मुद्दों यहाँ मनाया जा रहे हैं:

क) टेबल T7 और T8 के मूल्यों टेबल टी 2 और टी -4 पर निर्भर हैं। इसलिए, तालिका T7 और T8 को केवल "TableFunction2" फ़ंक्शन निष्पादित करके अद्यतन किया जाना चाहिए यदि इनपुट पैरामीटर T2 या T4 में से कोई एक में कोई परिवर्तन हो।

इसी तरह, टी 4 को केवल तभी अपडेट किया जाना चाहिए जब टी 1, टी 2 या टी 3 अपडेट किया गया हो; निर्भरता पेड़!

बी) गणना प्रक्रिया से डेटाबेस का पृथक्करण: गणना इंजन किसी निश्चित डेटा संरचना या डेटाबेस स्कीमा से स्वतंत्र होना चाहिए ताकि इसे किसी भी डेटाबेस और डेटा संरचना के साथ एकीकृत किया जा सके।

तुम मेरे संबंधित लेख पा सकते हैं, जहां इन सिद्धांतों पर समझाया गया है:

एक नियम आधारित गणना फ्रेमवर्क के तार्किक वास्तुकला http://finaquant.com/logical-architecture-of-a-rule-based-calculation-framework/1053

अब, टेबल के साथ एक गणना के इंजन के लिए एक सी #/नेट पुस्तकालय। क्योंकि इन सिद्धांतों के आधार पर इनपुट और आउटपुट पैरामीटर विकसित किए जा रहे हैं।

मॉडरेटर को ध्यान दें: यदि उपरोक्त पदोन्नति के रूप में गिना जाता है तो कृपया उपरोक्त लिंक हटाएं।

+0

एक और अच्छा प्रारंभिक बिंदु: http: //www.codeproject .com/लेख/17,853/कार्यान्वयन-एक-एक्सेल की तरह-सूत्र इंजन – tuncalik

संबंधित मुद्दे