MathScript · v1.0.0 पूर्व-रिलीज़

एक C++23 लाइब्रेरी, LU से CFD तक

इंजीनियरिंग सॉफ़्टवेयर भारी गणित पर चलता है, और अपना गणित ख़ुद लगभग कोई नहीं लिखता। वह दूसरों की लाइब्रेरियों और सशुल्क प्लेटफ़ॉर्मों से जोड़-जोड़कर बनाया जाता है — जिसका ऑडिट मुश्किल, बदलाव मुश्किल, और जहाँ बिल्ड मशीन पर इंटरनेट नहीं है वहाँ इंस्टॉल करना भी मुश्किल। MathScript गणित ख़ुद करता है, मैट्रिक्स के अंकगणित से लेकर द्रव-गतिकी तक, एक ही C++ लाइब्रेरी में, कुछ भी बाहर से लाए बिना।

भाषाC++23
परीक्षण सूट816 CTest
कवरेज का पहरा90%
स्टैटिक लाइब्रेरी35
आख़िरी पुशहाल ही में
दो फ़ैसले, जो सब कुछ तय करते हैं
  • मैट्रिक्स कर्नेल अपने ही पेड़ में। बुनियादी रैखिक बीजगणित उपप्रोग्राम (BLAS) और रैखिक बीजगणित पैकेज (LAPACK) यहीं लागू किए गए हैं, बाहर से लाए नहीं गए: न Eigen, न OpenBLAS। linalg के पास LU, QR, एकल मान अपघटन (SVD), eig, Cholesky और LAPACK-शैली के कर्नेल हैं, इसलिए तैनाती एक कंपाइल है, निर्भरताओं की तलाश नहीं।
  • C++ का एक सीमित उपसमुच्चय। न कच्चे पॉइंटर, न एक्सेप्शन, न असुरक्षित कास्ट — और यह कंपाइल के समय ही लागू होता है। उत्पादन कोड लौटाता है Result<T>, इसलिए त्रुटि-संभाल नियतात्मक है और टाइप में ही दिखती है।
सीधी-सादी भाषा में

यह क्या है, एक मिनट में

समस्या

तनाव, प्रवाह, सिग्नल, जोखिम — इंजीनियरिंग सॉफ़्टवेयर के नीचे की गणनाएँ उसे भेजने वाली टीम शायद ही ख़ुद लिखती है। वे दर्जन भर बाहरी लाइब्रेरियों और सशुल्क प्लेटफ़ॉर्मों से आती हैं, जिन्हें लाना पड़ता है, जिनका लाइसेंस लेना पड़ता है और जिन पर भरोसा करना पड़ता है। जब कोई जवाब ग़लत लगे, तो हिसाब किसी और के कोड में पड़ा होता है; और बंद बिल्ड मशीन पर शायद आप उसे ला ही न सकें।

समाधान

MathScript एक C++ लाइब्रेरी है जो गणित ख़ुद करती है: रैखिक बीजगणित, सांख्यिकी, अवकल समीकरण, परिमित अवयव, द्रव प्रवाह, अनुकूलन और एक प्रतीकात्मक बीजगणित प्रणाली — पैंतीस स्टैटिक लाइब्रेरियों में फैली हुई। जो मैट्रिक्स रूटीन ज़्यादातर परियोजनाएँ BLAS और LAPACK से आयात करती हैं, वे यहाँ ख़ुद लिखी गई हैं। Windows बिल्ड पर सभी 816 टेस्ट सूट पास होते हैं। v1.0.0 अभी भेजा नहीं गया है।

यह किसके लिए है

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

गणित पेड़ के भीतर है, किसी निर्भरता-सूची में नहीं। दलील यही है, और इस पृष्ठ का बाक़ी हिस्सा उसका सबूत: पैंतीस लाइब्रेरियों में क्या है, नाकामी एक्सेप्शन के बजाय रिटर्न टाइप में क्यों लौटती है, और परीक्षण के आँकड़े ठीक-ठीक किन चीज़ों को घेरते हैं।
इंटरैक्टिव

एक प्रतीकात्मक कंप्यूटर बीजगणित प्रणाली (CAS), आपके ब्राउज़र में चलती हुई

कोई व्यंजक लिखिए। उसे टोकन में बाँटा जाता है, अमूर्त वाक्य-रचना वृक्ष (AST) में पार्स किया जाता है, प्रतीकात्मक रूप से अवकलित किया जाता है, सरल किया जाता है, और फिर आलेख के लिए संख्यात्मक रूप से आँका जाता है — साथ ही दिखाई दे रहे अंतराल पर Simpson नियम से समाकल और द्विभाजन से मूल-खोज भी।

mathscript-repl

f(x) =
f(x) f′(x), प्रतीकात्मक f के मूल

प्रतीकात्मक अवकलज


          
प्रांत पर ∫
—
मिले हुए मूल
—
AST नोड
—
पार्स
—

Result<T>

Ok
बिना किसी त्रुटि के पार्स और अवकलन हुआ।

समर्थित: + - * / ^, sin cos tan exp log sqrt abs sinh cosh tanh asin acos atan, स्थिरांक pi और e। असली CAS काफ़ी बड़ा है; यह वही विचार है, पढ़ने लायक़ पैमाने पर।

एक टोकनाइज़र, रिकर्सिव-डिसेंट पार्सर, प्रतीकात्मक अवकलक और सरलक, जो इस पृष्ठ के लिए लिखे गए हैं। C++ कार्यान्वयन रहता है symbolic लाइब्रेरी में।
दोबारा लिखा हुआ नहीं

असली C++ लाइब्रेरी, WebAssembly में कंपाइल की हुई

ऊपर जो कुछ है, वह इस पृष्ठ के लिए लिखा गया JavaScript है — ईमानदार, पर असली चीज़ का एक नमूना। नीचे असली चीज़ है: libms_symbolic ख़ुद, उसी स्रोत से कंपाइल किया हुआ जिससे नेटिव लाइब्रेरी बनती है, और आपके ब्राउज़र में चलता हुआ।

ms::sym_diff — WebAssembly

लोड नहीं हुआ

जब तक आप लोड नहीं दबाते, कुछ भी डाउनलोड नहीं होता, और फिर वह एक ही बार आता है। मॉड्यूल 113 किलोबाइट (KB) का WebAssembly और 10 KB का लोडर है — पूरी लाइब्रेरी का बिल्ड 4.9 मेगाबाइट (MB) का है, इसलिए यहाँ सिर्फ़ उतना ही लिंक होता है जितने तक ये चार कॉल पहुँचते हैं। पैनल लाइब्रेरी का संस्करण और वह वेक्टर निर्देश-समुच्चय संरचना (ISA) दिखाता है जो बिल्ड बताता है।

सरल किया हुआ
—
अवकलज
—
समाकल
—
लाइब्रेरी
—
वेक्टर ISA
—
ISA वाली पंक्ति में लाइब्रेरी अपने बारे में सच बता रही है। वह पूछती है ms::detect_isa(), वही कॉल जो वह नेटिव रूप में करती है। आपके डेस्कटॉप पर इसका जवाब उन्नत वेक्टर एक्सटेंशन (AVX2 या AVX-512) में से कोई एक होता है; यहाँ एक ही वेक्टर ISA है और वह यही कहती है।
MathScript ट्री से Emscripten के साथ बनाया गया। वहाँ तक पहुँचने के लिए पोर्टेबिलिटी की तीन ख़ामियाँ ठीक करनी पड़ीं, और वे सब Apple clang तथा ARM पर नेटिव बिल्डों पर भी असर डालती हैं — देखिए tools/wasm/README.md.
दायरा

पैंतीस स्टैटिक लाइब्रेरी, छह क्षेत्र

सघन और विरल रैखिक बीजगणित, विशेष फलन, सांख्यिकी और मशीन लर्निंग (ML)। साधारण अवकल समीकरण (ODE) और आंशिक अवकल समीकरण (PDE), परिमित अवयव विधि (FEM) और अभिकलनात्मक द्रव गतिकी (CFD)। अनुकूलन, सिग्नल और छवि प्रसंस्करण, संख्या सिद्धांत, ग्राफ़, ज्यामिति, टोपोलॉजी, क्वांटम आदिम क्रियाएँ, नियंत्रण, वित्त, संपीड़न — और एक प्रतीकात्मक CAS। LU, QR, SVD, eigensolver और Cholesky इसी पेड़ में लिखे हुए।

लाइब्रेरी के छह क्षेत्र — मूल सिस्टम, संख्यात्मक, सांख्यिकी और मशीन लर्निंग, अनुप्रयुक्त, प्रतीकात्मक और विशिष्ट — सब एक Result<T> की बुनियादी पटरी पर, बिना एक्सेप्शन और बिना कच्चे पॉइंटर के
पूरा आरेख देखने के लिए स्क्रॉल करें →
पैंतीस लाइब्रेरी, त्रुटि की एक ही परंपरा। नीचे की पटरी ही असली बात है: नाकामी रिटर्न टाइप में है, किसी ऐसे एक्सेप्शन में नहीं जो आपको स्टैक के सिरे पर मिले।
मूल

मूल सिस्टम

सघन और विरल रैखिक बीजगणित, जिसमें LU, QR, SVD, eigensolver और Cholesky अपने ही ट्री में हैं। Result<T> त्रुटि-संभाल हर जगह।

संख्यात्मक

ODE, PDE, FEM, CFD

समय-समाकलन, परिमित अवयव और संगणकीय तरल गतिकी, साथ में विशेष फलन और संख्यात्मक समाकलन।

सांख्यिकी

सांख्यिकी & ML

बंटन, अनुमान, प्रतिगमन और उनके नीचे लगी अनुकूलन की मशीनरी।

अनुप्रयुक्त

सिग्नल, छवि, नियंत्रण, वित्त

रूपांतरण, फ़िल्टरिंग, छवि प्रसंस्करण, नियंत्रण सिद्धांत और मात्रात्मक वित्त के आदिम।

प्रतीकात्मक

कंप्यूटर बीजगणित

एक छोटा प्रतीकात्मक CAS, जो संख्यात्मक हिस्सों के ऊपर ठोका हुआ नहीं, बल्कि उनके साथ-साथ बैठा है।

विशिष्ट

ग्राफ़, ज्यामिति, टोपोलॉजी, क्वांटम

संख्या सिद्धांत, ग्राफ़ एल्गोरिदम, संगणकीय ज्यामिति, टोपोलॉजी और क्वांटम आदिम।

जो असल में भेजा जाता है

तीन एक्ज़ीक्यूटेबल, बाक़ी सब वैकल्पिक

तीन एक्ज़ीक्यूटेबल के बाद सब कुछ एक बिल्ड विकल्प है — एक Qt ग्राफ़िकल यूज़र इंटरफ़ेस (GUI), CUDA, संदेश-पारण इंटरफ़ेस (MPI), और LLVM की माँग-पर-कंपाइलेशन (ORC) परत पर बना एक जस्ट-इन-टाइम (JIT) कंपाइलर।

mathscriptcकंपाइलर / बैच ड्राइवर
mathscript-replइंटरैक्टिव सत्र
mathscript-serverसेवा मोड
वैकल्पिकQt GUI, CUDA, MPI, LLVM ORC JIT
सत्यापन

816 सूट से आपको क्या मिलता है

नीचे दिए पहरों के पीछे का सतत एकीकरण (CI) मैट्रिक्स दो कंपाइलर घेरता है: Windows पर Microsoft Visual C++ (MSVC) और Linux पर GNU Compiler Collection (GCC) 13।

पहरासेटिंग
CTest सूट816, 100% पास
प्लेटफ़ॉर्मWindows MSVC Release
CI मैट्रिक्सMSVC + Linux GCC 13
कवरेज का पहरा90%
सैनिटाइज़रचालू
फ़ज़िंगचालू
बेंचमार्क रिग्रेशन28, 10% सहनशीलता
पूर्व-रिलीज़ का मतलब पूर्व-रिलीज़ ही है। v1.0.0 भेजा नहीं गया है। 816-सूट वाला आँकड़ा Windows MSVC Release से है; Linux GCC 13 वाला हिस्सा CI में चलता है, पर मुख्य आँकड़ा वही है जो Windows पर नापा गया।
यह किसके लिए है

प्रोग्रामरों के लिए पूरा गणित औज़ार-बक्सा, एक ही टुकड़े में

गंभीर गणना के काम का मतलब आमतौर पर यह होता है कि दर्जन भर अलग-अलग सॉफ़्टवेयर आपस में जोड़े जाएँ और उम्मीद की जाए कि वे आपस में सहमत रहेंगे। यह एक ही लाइब्रेरी है जो पूरा काम ढकती है।

01

वे टीमें जिन्हें कुछ भी डाउनलोड करने की इजाज़त नहीं

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

02

वे टीमें जो उत्पाद पर Python ठोकते-ठोकते थक चुकी हैं

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

03

पढ़ाना और सीखना

तरीक़े पूरे लिखे हुए हैं और पढ़े जा सकते हैं, किसी आपूर्तिकर्ता के बंद हिस्से में छिपे नहीं। छात्र देख सकते हैं कि असल में हो क्या रहा है।

क्या यहाँ आपको अपनी स्थिति दिख रही है? यह अभी बीटा परीक्षण के लिए खुला है, और जिनके लिए यह बना है, उन्हीं की राय इसे सचमुच बदलती है। बीटा टेस्टर बनें →
एक्सेप्शन क्यों नहीं

एक संख्यात्मक लाइब्रेरी जो आप पर एक्सेप्शन नहीं फेंक सकती

संख्यात्मक कोड आम तरीक़ों से नाकाम होता है: कोई अव्युत्क्रमणीय मैट्रिक्स, कोई ऐसी पुनरावृत्ति जो अभिसरित नहीं होती, किसी विशेष फलन में प्रांत की त्रुटि। इसे एक्सेप्शन से बताने का मतलब है कि हर कॉल करने वाले को या तो सब कुछ लपेटना पड़ता है try में, या फिर नाकामी उसे स्टैक के सिरे पर बिना किसी संदर्भ के मिलती है। MathScript नाकामी को रिटर्न टाइप का हिस्सा बना देता है।

// Every production entry point returns Result<T>.
auto lu = linalg::lu_factor(A);
if (!lu) return lu.error();          // singular — handled, not thrown

auto x = lu->solve(b);
if (!x) return x.error();

// No raw pointers, no unsafe casts, no exceptions:
// the restricted subset is enforced at compile time.