एक हल्के / कोई-स्थापित C या C ++ आधारित घने रैखिक बीजगणित सॉल्वर के लिए सिफारिशें


9

मेरे अधिकांश प्रोग्रामिंग अपने स्वयं के उपयोग के लिए C में एक-बंद अनुसंधान कोड हैं। मैंने कभी भी निकट सहयोगियों के अलावा किसी भी कोड को वितरित नहीं किया है। मैंने एक एल्गोरिथ्म विकसित किया है जिसे मैं एक वैज्ञानिक पत्रिका में प्रकाशित कर रहा हूं। मैं लेख के लिए ऑनलाइन पूरक में स्रोत कोड और शायद निष्पादन योग्य कोड प्रदान करना चाहता हूं। एक सहकर्मी ने अनुरोध किया कि मैं एल्गोरिथ्म का एक सामान्यीकरण करता हूं जिसके लिए मुझे C ++ (ack!) में लिखना आवश्यक है और जिसके लिए मुझे छोटे घने रैखिक प्रणालियों को हल करने की आवश्यकता होती है। यदि मैं एल्गोरिथ्म के लिए एक उपयोगकर्ता आधार प्राप्त करने में सफल होता हूं तो यह आंशिक रूप से होगा क्योंकि इसका उपयोग करने के लिए प्रवेश बार कम है (जैसे फर्श पर)। संभावित उपयोगकर्ता कोड का उपयोग करने के लिए पुस्तकालयों आदि को स्थापित नहीं करेंगे। मैं चाहता हूं कि कोड पूरी तरह से अकेला खड़ा हो और किसी भी लाइसेंस से अप्रभावित हो। मैं बस अपने खुद के सॉल्वर को गोलब और वैन लोन से बाहर ले जाकर लिख सकता हूं, लेकिन मैं वेनिला सॉल्वर का इस्तेमाल करूंगा जो किसी और ने पहले ही लिख दिया हो अगर वहां कोई बाहर हो। सुझावों की सराहना की। धन्यवाद!



प्रिय जेप, मंच पर आपका स्वागत है। आपका प्रश्न यहाँ एक के समान है: scicomp.stackexchange.com/questions/351/…
GertVdE

लाइब्रेरी सॉल्वर मजबूती, दक्षता और व्यापकता के लिए जटिल और बड़े होते हैं। यदि आपकी समस्याएं बहुत छोटी और यथोचित रूप से वातानुकूलित हैं, तो मैं आपको अपना स्वयं का मिनी-कार्यान्वयन लिखना चाहूंगा।
स्टेफानो एम

@GertVdE, इस सवाल पर त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं "अनुशंसाएँ ..." प्रश्न से लिंक करने में असहज हूं क्योंकि इन जैसी स्थितियों में कोई भी सहायता प्रदान करने के लिए प्रश्न और शीर्ष उत्तर दोनों ही सामान्य हैं। यदि आप इसके बारे में आगे चर्चा करना चाहते हैं, तो मेरा सुझाव है कि हम इसे स्कोम्पिक चैट रूम में ले जाएं
अरोन अहमदिया

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

जवाबों:


7

मैं आपको जिस फ़ंक्शन की ज़रूरत है, उस लैपैक इंटरफ़ेस को बिल्कुल डुप्लिकेट करने का सुझाव दूंगा, सबसे अधिक संभवत: आपको बस आवश्यकता है dgesv। इस तरह से जिन लोगों के पास लैपैक स्थापित है वे बस इसे लिंक कर सकते हैं और यह बस काम करेगा। ऐसे लोगों के लिए, जिनके पास लैपैक स्थापित नहीं है, आप इस फ़ंक्शन का अपना सरल कार्यान्वयन प्रदान करते हैं, या संभवतः इसे Eigen या FLENS का उपयोग करके लागू कर सकते हैं जैसा कि अन्य ने सुझाव दिया है।

फोरट्रान भूमि में, लैपैक पुस्तकालय एक ऐसा मानक है, जो कि ज्यादातर लोग केवल अपने स्वयं के कार्यान्वयन प्रदान करने के बजाय, इसका उपयोग करते हैं और यह वह है।


+1 इसे इस तथ्य से जोड़ें कि अधिकांश लिनक्स वितरण (कम से कम डेबियन आधारित) में रिपॉजिटरी में बाइनरी पैकेज होते हैं और सभी विक्रेता गणित काम (MKL, SunPerf, ACML, ESSL आदि) की आपूर्ति करते हैं। आपको हमेशा जितना संभव हो मानक मानदंड का उपयोग करना चाहिए, हालांकि यदि आप विंडोज / मैक पर हैं, तो आप कुछ सी के साथ बेहतर हो सकते हैं क्योंकि उन पर मुफ्त फोरट्रान कंपाइलर (गॉफ़रान) स्थापित करना काम की कुछ राशि है या इसलिए मैंने सुना है।
स्टली

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

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

5

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

चूंकि आप अपने कोड को अकादमिक कारणों से वितरित कर रहे हैं, और आप अपने कोड में एक घने रैखिक बीजगणित सॉल्वर को एम्बेड करना चाहते हैं, तो मैं दृढ़ता से अनुशंसा करूंगा कि आप आइजन पर विचार करें । ईजेन को मोज़िला पब्लिक लाइसेंस के तहत लाइसेंस दिया गया है और यह हेडर-ओनली लाइब्रेरी है। इसका मतलब है कि आप अपने कोड के साथ ईजन को स्रोत रूप में वितरित कर सकते हैं (यह आपके कोड पर कोई लाइसेंस प्रतिबंध नहीं लगाता है), और आपको इसकी सामान्य क्षमताओं तक पहुंच प्राप्त होगी, जिसमें बेहद कुशल घने रैखिक सॉल्वर शामिल हैं। जैसा कि GertVdE उल्लेख करता है, आपके पास कई अन्य विकल्प हैं


मैं एक सिंगल फाइल की उम्मीद कर रहा था। मैंने काफी समय से वैज्ञानिक प्रोग्रामिंग की है। मेरे पास सी और फोरट्रान जैसी मिश्रित भाषाएं हैं, लेकिन इस परियोजना के लिए मैं वास्तव में सिर्फ एक फ़ाइल चाहता हूं जिसमें मेरे सभी स्रोत कोड हैं। मुझे लगता है कि मैं सी ++ कोड में एक सी सॉल्वर रख सकता हूं जो एक बड़ी बात नहीं होगी। मुख्य रूप से मैं कोड को यथासंभव सरल रखना चाहता हूं। धुरी के साथ एलयू पर्याप्त होना चाहिए। मैं ईगन को देखूंगा। धन्यवाद!
JEP

@jep, आप भी चेरी उठा दिनचर्या आप से जरूरत की कोशिश कर सकते CLAPACK यदि आप वास्तव में प्रदर्शन के बारे में बिल्कुल भी परवाह नहीं है।
एरन अहमदिया

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

@VictorLiu - आप जिन मुद्दों का जिक्र कर रहे हैं, वे भाषाओं की तुलना में क्रियान्वयन के लिए अधिक कड़े हैं। टिप्पणी स्थान एक गंभीर चर्चा में आने के लिए एक खराब जगह है, लेकिन अगर आप मुझे इस पर अपने विचारों का विस्तार करना चाहते हैं तो मैं आपको चैट या अन्य जगहों पर संलग्न करने में प्रसन्न हूं।
एरन अहमदिया

4

यदि आप रैखिक समीकरणों के सिस्टम के लिए एक विश्वसनीय सॉल्वर चाहते हैं तो मैं फ्लेन्स की सिफारिश करूंगा । इसमें LAPACK का सटीक पुन: क्रियान्वयन होता है (यदि यह एकल-थ्रेडेड BLAS कार्यान्वयन का उपयोग किया जाता है, तो LAPACK के समान ही राउंडऑफ़ त्रुटियां पुन: उत्पन्न होती हैं)। यह सभी FLENS-LAPACK फ़ंक्शंस (लगभग 100 रूटीन की उपयोगिता फ़ंक्शंस के साथ) के लिए सही है।

FLENS BSD लाइसेंस के अंतर्गत है और इसलिए मालिकाना उत्पादों में शामिल होने की अनुमति देता है।

FLENS केवल हेडर है और यदि आपको केवल FLENS के उपसमूह की आवश्यकता है तो मैं आपको एक स्ट्रिप-डाउन संस्करण दे सकता हूं जिसमें केवल उन्हीं कार्यों की आवश्यकता है। FLENS अपने स्वयं के संदर्भ BLAS कार्यान्वयन के साथ आता है। लेकिन वैकल्पिक रूप से आपके उपयोगकर्ता अनुकूलित BLAS पुस्तकालयों जैसे ATLAS, OpenBLAS या GotoBALS से लिंक कर सकते हैं। बड़े मेट्रिसेस के लिए यह Eigen की तुलना में लगभग 40% का प्रदर्शन लाभ देता है।

और हाँ, Eigen भी अपने परिणामों की जाँच करने के लिए LAPACK परीक्षण सूट का उपयोग करता है। वे 3 कार्यों के लिए ऐसा करते हैं (लू, चोल्स्की और आइगेनवेल्यूज / एक सममित मैट्रिक्स के डॉक्टर)। हालाँकि, गैर-सममित मैट्रिक्स के eigenvalues ​​/ -vectors की उनकी गणना लैपैक परीक्षण सूट को विफल कर देगी।

डिस्क्लेमर: हाँ, FLENS मेरा बच्चा है! इसका मतलब है कि मैंने इसके बारे में 95% कोडित किया और कोड की प्रत्येक पंक्ति इसके लायक थी।


1
माइकल - कृपया इस मित्रवत चेतावनी पर विचार करें कि आपको संबद्धता का खुलासा करने के बारे में नियम का पालन करने की आवश्यकता है
एरन अहमदिया

ज़रूर, लेकिन आप अपने पोस्ट को 'मैं दृढ़ता से सुझाऊंगा कि आप ईजन को' कुछ इस तरह से समझें जैसे 'उदाहरण के लिए ईजेन' है। इस मामले में मैं इस एक सहित Eigen के बारे में अपनी टिप्पणी को हटाता हूं (हालांकि वे सभी सच साबित होते हैं)।
माइकल Lehn

1
Eigen के बारे में आपकी टिप्पणी यहाँ जारी नहीं है (हालाँकि वे मुझे विषय-वस्तु लगते हैं)। आप FLENS के एक प्राथमिक डेवलपर हैं, यदि आप यहां एक उत्तर में इसकी सिफारिश करने जा रहे हैं, तो आपको परियोजना के डेवलपर के रूप में अपनी संबद्धता का खुलासा करना होगा।
एरन अहमदिया

आह, ठीक है। मुझे लगा कि '... मैं तुम्हें दे सकता हूं ...' से स्पष्ट था। क्या इस फॉर्म में खुलासा ठीक है?
माइकल Lehn

2
मैं सिर्फ यह करने के लिए धन्यवाद कहना चाहता हूं; मेरे पास सी ++ में लैपैक के एक बड़े हिस्से को फिर से लागू करने की समान योजना थी। हालांकि, ऐसा लगता है कि अधिकांश उन्नत (eigenvalue) दिनचर्या के लिए, आप बस लैपैक में कॉल करने से चूक जाते हैं, इसलिए यह कहना गलत है कि आप पूरी बात को फिर से लागू करते हैं। दूसरी ओर, मैं वास्तव में सी ++ के ZGEEV स्रोत में स्थलांतरित है RNP , यद्यपि कुछ भागों ऑटो रूपांतरण से 1 आधारित अनुक्रमण में अब भी कर रहे हैं।
विक्टर लियू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.