एक C++23 लाइब्रेरी, LU से CFD तक
इंजीनियरिंग सॉफ़्टवेयर भारी गणित पर चलता है, और अपना गणित ख़ुद लगभग कोई नहीं लिखता। वह दूसरों की लाइब्रेरियों और सशुल्क प्लेटफ़ॉर्मों से जोड़-जोड़कर बनाया जाता है — जिसका ऑडिट मुश्किल, बदलाव मुश्किल, और जहाँ बिल्ड मशीन पर इंटरनेट नहीं है वहाँ इंस्टॉल करना भी मुश्किल। MathScript गणित ख़ुद करता है, मैट्रिक्स के अंकगणित से लेकर द्रव-गतिकी तक, एक ही C++ लाइब्रेरी में, कुछ भी बाहर से लाए बिना।
- मैट्रिक्स कर्नेल अपने ही पेड़ में। बुनियादी रैखिक बीजगणित उपप्रोग्राम (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
प्रतीकात्मक अवकलज
Result<T>
समर्थित: + - * / ^, sin cos tan exp log sqrt abs sinh cosh tanh
asin acos atan, स्थिरांक pi और e। असली CAS काफ़ी बड़ा है; यह वही विचार है, पढ़ने लायक़ पैमाने पर।
symbolic लाइब्रेरी में।
असली C++ लाइब्रेरी, WebAssembly में कंपाइल की हुई
ऊपर जो कुछ है, वह इस पृष्ठ के लिए लिखा गया JavaScript है — ईमानदार, पर असली चीज़ का एक नमूना। नीचे असली चीज़ है: libms_symbolic ख़ुद, उसी स्रोत से कंपाइल किया हुआ जिससे नेटिव लाइब्रेरी बनती है, और आपके ब्राउज़र में चलता हुआ।
ms::sym_diff — WebAssembly
लोड नहीं हुआजब तक आप लोड नहीं दबाते, कुछ भी डाउनलोड नहीं होता, और फिर वह एक ही बार आता है। मॉड्यूल 113 किलोबाइट (KB) का WebAssembly और 10 KB का लोडर है — पूरी लाइब्रेरी का बिल्ड 4.9 मेगाबाइट (MB) का है, इसलिए यहाँ सिर्फ़ उतना ही लिंक होता है जितने तक ये चार कॉल पहुँचते हैं। पैनल लाइब्रेरी का संस्करण और वह वेक्टर निर्देश-समुच्चय संरचना (ISA) दिखाता है जो बिल्ड बताता है।
ms::detect_isa(), वही कॉल जो वह नेटिव रूप में करती है। आपके डेस्कटॉप पर इसका जवाब उन्नत वेक्टर एक्सटेंशन (AVX2 या AVX-512) में से कोई एक होता है; यहाँ एक ही वेक्टर ISA है और वह यही कहती है।
tools/wasm/README.md.
पैंतीस स्टैटिक लाइब्रेरी, छह क्षेत्र
सघन और विरल रैखिक बीजगणित, विशेष फलन, सांख्यिकी और मशीन लर्निंग (ML)। साधारण अवकल समीकरण (ODE) और आंशिक अवकल समीकरण (PDE), परिमित अवयव विधि (FEM) और अभिकलनात्मक द्रव गतिकी (CFD)। अनुकूलन, सिग्नल और छवि प्रसंस्करण, संख्या सिद्धांत, ग्राफ़, ज्यामिति, टोपोलॉजी, क्वांटम आदिम क्रियाएँ, नियंत्रण, वित्त, संपीड़न — और एक प्रतीकात्मक CAS। LU, QR, SVD, eigensolver और Cholesky इसी पेड़ में लिखे हुए।
मूल सिस्टम
सघन और विरल रैखिक बीजगणित, जिसमें LU, QR, SVD, eigensolver और Cholesky अपने ही ट्री में हैं। Result<T> त्रुटि-संभाल हर जगह।
ODE, PDE, FEM, CFD
समय-समाकलन, परिमित अवयव और संगणकीय तरल गतिकी, साथ में विशेष फलन और संख्यात्मक समाकलन।
सांख्यिकी & ML
बंटन, अनुमान, प्रतिगमन और उनके नीचे लगी अनुकूलन की मशीनरी।
सिग्नल, छवि, नियंत्रण, वित्त
रूपांतरण, फ़िल्टरिंग, छवि प्रसंस्करण, नियंत्रण सिद्धांत और मात्रात्मक वित्त के आदिम।
कंप्यूटर बीजगणित
एक छोटा प्रतीकात्मक CAS, जो संख्यात्मक हिस्सों के ऊपर ठोका हुआ नहीं, बल्कि उनके साथ-साथ बैठा है।
ग्राफ़, ज्यामिति, टोपोलॉजी, क्वांटम
संख्या सिद्धांत, ग्राफ़ एल्गोरिदम, संगणकीय ज्यामिति, टोपोलॉजी और क्वांटम आदिम।
तीन एक्ज़ीक्यूटेबल, बाक़ी सब वैकल्पिक
तीन एक्ज़ीक्यूटेबल के बाद सब कुछ एक बिल्ड विकल्प है — एक 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% सहनशीलता |
प्रोग्रामरों के लिए पूरा गणित औज़ार-बक्सा, एक ही टुकड़े में
गंभीर गणना के काम का मतलब आमतौर पर यह होता है कि दर्जन भर अलग-अलग सॉफ़्टवेयर आपस में जोड़े जाएँ और उम्मीद की जाए कि वे आपस में सहमत रहेंगे। यह एक ही लाइब्रेरी है जो पूरा काम ढकती है।
वे टीमें जिन्हें कुछ भी डाउनलोड करने की इजाज़त नहीं
रक्षा, चिकित्सा, विमानन और बैंकिंग के बिल्ड सिस्टम अक्सर इंटरनेट से कटे रहते हैं। यहाँ सब कुछ साथ ही आता है, इसलिए न कुछ लाना है और न किसी चीज़ की मंज़ूरी लेनी है।
वे टीमें जो उत्पाद पर Python ठोकते-ठोकते थक चुकी हैं
बहुत सारा सॉफ़्टवेयर अपना असली काम एक भाषा में करता है और गणित दूसरी में, यानी दो-दो तरह की मुसीबतें। यह गणित को उसी भाषा में रखता है जिसमें उत्पाद है।
पढ़ाना और सीखना
तरीक़े पूरे लिखे हुए हैं और पढ़े जा सकते हैं, किसी आपूर्तिकर्ता के बंद हिस्से में छिपे नहीं। छात्र देख सकते हैं कि असल में हो क्या रहा है।
एक संख्यात्मक लाइब्रेरी जो आप पर एक्सेप्शन नहीं फेंक सकती
संख्यात्मक कोड आम तरीक़ों से नाकाम होता है: कोई अव्युत्क्रमणीय मैट्रिक्स, कोई ऐसी पुनरावृत्ति जो अभिसरित नहीं होती, किसी विशेष फलन में प्रांत की त्रुटि। इसे एक्सेप्शन से बताने का मतलब है कि हर कॉल करने वाले को या तो सब कुछ लपेटना पड़ता है 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.