MathScript · v1.0.0 প্রি-রিলিজ

একটিই C++23 লাইব্রেরি, LU থেকে CFD

প্রকৌশল সফটওয়্যার চলে ভারী গণিতের উপর, আর নিজেরটা প্রায় কেউই লেখে না। সেটা জোড়া হয় অন্যের লাইব্রেরি আর টাকা দিয়ে কেনা প্ল্যাটফর্ম থেকে — নিরীক্ষা করা কঠিন, বদলানো কঠিন, আর যেখানে বিল্ড মেশিনে ইন্টারনেট নেই সেখানে বসানোও কঠিন। MathScript গণিতটা নিজেই করে, ম্যাট্রিক্সের হিসাব থেকে তরল গতিবিদ্যা পর্যন্ত, একটিমাত্র C++ লাইব্রেরিতে, বাইরে থেকে আনার কিছু নেই।

ভাষাC++23
পরীক্ষার স্যুট৮১৬টি CTest
কভারেজ গেট90%
স্ট্যাটিক লাইব্রেরি35
সর্বশেষ পুশসম্প্রতি
দুটি সিদ্ধান্ত, যা সবকিছুর আকার দেয়
  • ম্যাট্রিক্স কার্নেল নিজের কোডেই। মৌলিক রৈখিক বীজগণিত সাবপ্রোগ্রাম (BLAS) আর রৈখিক বীজগণিত প্যাকেজ (LAPACK) বাইরে থেকে আনা নয়, এখানেই লেখা: কোনো Eigen নেই, OpenBLAS নেই। linalg নিজেই ধরে রাখে LU, QR, সিঙ্গুলার ভ্যালু ডিকম্পোজিশন (SVD), eig, Cholesky আর LAPACK-ধাঁচের কার্নেল, তাই স্থাপনা মানে নির্ভরতার পিছনে দৌড়ঝাঁপ নয়, স্রেফ একটা কম্পাইল।
  • C++-এর একটি সীমিত উপসেট। কোনো কাঁচা পয়েন্টার নয়, কোনো এক্সেপশন নয়, কোনো অনিরাপদ কাস্ট নয় — কম্পাইলের সময়েই তা বাধ্যতামূলক। উৎপাদন কোড ফেরত দেয় Result<T>, তাই ত্রুটি সামলানো নির্ধারণবাদী আর টাইপেই দৃশ্যমান।
সহজ কথায়

এটি কী, এক মিনিটে

সমস্যা

পীড়ন, প্রবাহ, সংকেত, ঝুঁকি — প্রকৌশল সফটওয়্যারের নিচের হিসাবগুলি যে দল সেটি পাঠায় তারা খুব কমই লেখে। সেগুলি আসে বাইরের ডজনখানেক লাইব্রেরি আর টাকার প্ল্যাটফর্ম থেকে, যা আনতে হয়, লাইসেন্স করতে হয়, বিশ্বাস করতে হয়। উত্তর ভুল ঠেকলে হিসাবের কাজটা পড়ে থাকে অন্য কারও কোডে; আর সিল করা বিল্ড মেশিনে হয়তো সেগুলি আনাই যাবে না।

সমাধান

MathScript একটিমাত্র C++ লাইব্রেরি, যা গণিতটা নিজেই করে: রৈখিক বীজগণিত, পরিসংখ্যান, অন্তরকলনীয় সমীকরণ, সসীম উপাদান, তরল প্রবাহ, অপ্টিমাইজেশন আর একটি প্রতীকী বীজগণিত ব্যবস্থা — পঁয়ত্রিশটি স্ট্যাটিক লাইব্রেরি জুড়ে। বেশিরভাগ প্রকল্প যে ম্যাট্রিক্স রুটিনগুলি BLAS আর LAPACK থেকে আনে, সেগুলি এখানে নিজেই লেখা। Windows বিল্ডে ৮১৬টি পরীক্ষার স্যুটই উত্তীর্ণ। 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

লোড হয়নি

লোড চাপার আগে কিছুই ডাউনলোড হয় না, আর তারপর একবারই আনা হয়। মডিউলটি ১১৩ কিলোবাইট (KB) WebAssembly আর ১০ KB লোডার — পুরো লাইব্রেরি বিল্ড ৪.৯ মেগাবাইট (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, আইগেন-সমাধায়ক ও Cholesky।

ছয়টি লাইব্রেরি ক্ষেত্র — কোর সিস্টেম, সাংখ্যিক, পরিসংখ্যান ও মেশিন লার্নিং, ফলিত, প্রতীকী ও বিশেষায়িত — একটি Result<T> ভিত্তি-রেলের উপরে, কোনো এক্সেপশন বা কাঁচা পয়েন্টার ছাড়া
পুরো চিত্রটি দেখতে স্ক্রল করুন →
পঁয়ত্রিশটি লাইব্রেরি, একটিই ত্রুটি-রীতি। নিচের রেলটাই আসল কথা: ব্যর্থতা থাকে রিটার্ন টাইপে, স্ট্যাকের মাথায় গিয়ে পাওয়া কোনো এক্সেপশনে নয়।
কোর

কোর সিস্টেম

ঘন ও বিরল রৈখিক বীজগণিত, সঙ্গে নিজস্ব LU, QR, SVD, আইগেন-সমাধায়ক ও 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
যাচাই

৮১৬টি স্যুটে আপনি কী পান

নিচের গেটগুলির পিছনের কন্টিনিউয়াস ইন্টিগ্রেশন (CI) ম্যাট্রিক্স দুটি কম্পাইলার ঢাকে: Windows-এ Microsoft Visual C++ (MSVC) আর Linux-এ GNU কম্পাইলার কালেকশন (GCC) 13।

গেটসেটিং
CTest স্যুট৮১৬, ১০০% উত্তীর্ণ
প্ল্যাটফর্মWindows MSVC Release
CI ম্যাট্রিক্সMSVC + Linux GCC 13
কভারেজ গেট90%
স্যানিটাইজারচালু
ফাজিংচালু
বেঞ্চমার্ক রিগ্রেশন২৮, ১০% সহনসীমা
প্রি-রিলিজ মানে প্রি-রিলিজ। v1.0.0 এখনও পাঠানো হয়নি। ৮১৬-স্যুটের সংখ্যাটি 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.