MathScript · préversion v1.0.0

Une seule bibliothèque C++23, de LU à la CFD

Le logiciel d’ingénierie repose sur des mathématiques lourdes, et presque personne n’écrit les siennes. Il est cousu à partir des bibliothèques des autres et de plateformes payantes — difficile à auditer, difficile à modifier, et difficile à installer là où la machine de build n’a pas d’internet. MathScript fait les mathématiques lui-même, de l’arithmétique matricielle jusqu’à la dynamique des fluides, dans une seule bibliothèque C++ sans rien à télécharger.

LangageC++23
Suites de tests816 CTest
Seuil de couverture90%
Bibliothèques statiques35
Dernier envoirécemment
Deux décisions qui façonnent tout
  • Noyaux matriciels intégrés. Les sous-programmes d’algèbre linéaire de base (BLAS) et la bibliothèque d’algèbre linéaire (LAPACK) sont implémentés ici plutôt que téléchargés : pas d’Eigen, pas d’OpenBLAS. linalg possède LU, QR, la décomposition en valeurs singulières (SVD), eig, Cholesky et les noyaux à la LAPACK, si bien que le déploiement est une compilation plutôt qu’une chasse aux dépendances.
  • Un sous-ensemble restreint de C++. Pas de pointeurs bruts, pas d’exceptions, pas de conversions non sûres — imposé à la compilation. Le code de production renvoie Result<T>, si bien que la gestion des erreurs est déterministe et visible dans le type.
En clair

Ce que c’est, en une minute

Le problème

Contraintes, écoulements, signaux, risque — les calculs sous le logiciel d’ingénierie sont rarement écrits par l’équipe qui le livre. Ils arrivent d’une douzaine de bibliothèques extérieures et de plateformes payantes qu’il faut télécharger, licencier et croire sur parole. Quand une réponse semble fausse, le détail du calcul est dans le code de quelqu’un d’autre ; sur une machine de build scellée, vous ne pourrez peut-être même pas le télécharger.

La solution

MathScript est une seule bibliothèque C++ qui fait les mathématiques elle-même : algèbre linéaire, statistiques, équations différentielles, éléments finis, écoulement des fluides, optimisation et un système d’algèbre symbolique, répartis sur trente-cinq bibliothèques statiques. Les routines matricielles que la plupart des projets importent de BLAS et LAPACK sont écrites ici. Les 816 suites de tests passent toutes sur le build Windows. La v1.0.0 n’est pas encore sortie.

À qui cela s’adresse

Les équipes dont les machines de build n’ont pas accès à internet — défense, médical, aérospatial, banque — où chaque dépendance téléchargée est une validation de plus. Les produits qui font leur vrai travail en C++ et leurs mathématiques en Python, et qui en portent les deux séries de problèmes. Les enseignants et les étudiants qui veulent la méthode écrite là où on peut la lire.

Les mathématiques sont dans l’arbre, pas dans une liste de dépendances. C’est l’argument, et le reste de cette page en est la preuve : ce que contiennent les trente-cinq bibliothèques, pourquoi un échec revient dans le type de retour plutôt qu’en exception, et ce que couvrent exactement les chiffres des tests.
Interactif

Un système de calcul formel (CAS) symbolique, dans votre navigateur

Tapez une expression. Elle est découpée en jetons, analysée en arbre syntaxique abstrait (AST), dérivée symboliquement, simplifiée, puis évaluée numériquement pour le tracé — avec une intégrale par la règle de Simpson et une recherche de racines par bissection sur l’intervalle visible.

mathscript-repl

f(x) =
f(x) f′(x), symbolique racines de f

Dérivée symbolique


          
∫ sur le domaine
—
Racines trouvées
—
Nœuds de l’AST
—
Analyse
—

Result<T>

Ok
Analysée et dérivée sans erreur.

Pris en charge : + - * / ^, sin cos tan exp log sqrt abs sinh cosh tanh asin acos atan, constantes pi et e. Le vrai CAS est considérablement plus grand ; ceci est la même idée, à l’échelle de la lecture.

Un découpeur en jetons, un analyseur à descente récursive, un dérivateur symbolique et un simplificateur écrits pour cette page. L’implémentation C++ se trouve dans la bibliothèque symbolic du projet.
Pas une réimplémentation

La vraie bibliothèque C++, compilée en WebAssembly

Tout ce qui précède est du JavaScript écrit pour cette page — honnête, mais un modèle de la chose réelle. Ci-dessous, c’est la chose réelle : libms_symbolic lui-même, compilé à partir des mêmes sources qui produisent la bibliothèque native, en train de tourner dans votre navigateur.

ms::sym_diff — WebAssembly

non chargée

Rien n’est téléchargé tant que vous n’appuyez pas sur charger, et ensuite c’est téléchargé une seule fois. Le module fait 113 kilooctets (Ko) de WebAssembly et 10 Ko de chargeur — le build complet de la bibliothèque fait 4,9 mégaoctets (Mo), donc on ne lie ici que ce que ces quatre appels atteignent. Le panneau affiche la version de la bibliothèque et l’architecture de jeu d’instructions (ISA) vectorielle que le build rapporte.

Simplifiée
—
Dérivée
—
Intégrale
—
Bibliothèque
—
ISA vectorielle
—
La ligne ISA, c’est la bibliothèque qui dit la vérité sur elle-même. Elle appelle ms::detect_isa(), le même appel qu’elle fait en natif. Sur votre poste, ça répond avec l’une des Advanced Vector Extensions (AVX2 ou AVX-512) ; ici il n’y a qu’un seul ISA vectoriel, et elle le dit.
Compilé avec Emscripten depuis l’arbre MathScript. Trois défauts de portabilité ont dû être corrigés pour y arriver, et tous affectent aussi les compilations natives sur Apple clang et sur ARM — voir tools/wasm/README.md.
Périmètre

Trente-cinq bibliothèques statiques, six domaines

Algèbre linéaire dense et creuse, fonctions spéciales, statistiques et apprentissage automatique (ML). Équations différentielles ordinaires (EDO) et équations aux dérivées partielles (EDP), méthode des éléments finis (FEM) et mécanique des fluides numérique (CFD). Optimisation, traitement du signal et de l’image, théorie des nombres, graphes, géométrie, topologie, primitives quantiques, contrôle, finance, compression — et un CAS symbolique. Avec LU, QR, SVD, solveurs de valeurs propres et Cholesky intégrés.

Six domaines de bibliothèques — systèmes de base, numérique, statistiques et apprentissage automatique, appliqué, symbolique et spécialisé — sur un rail de base Result<T> sans exceptions ni pointeurs bruts
faites défiler pour voir tout le schéma →
Trente-cinq bibliothèques, une seule convention d’erreur. Le rail en dessous est l’essentiel : l’échec est dans le type de retour, pas dans une exception que vous trouvez en haut de la pile.
Base

Systèmes de base

Algèbre linéaire dense et creuse avec LU, QR, SVD, solveurs de valeurs propres et Cholesky intégrés. Gestion des erreurs par Result<T> partout.

Numérique

EDO, EDP, FEM, CFD

Intégration temporelle, éléments finis et mécanique des fluides numérique, plus les fonctions spéciales et la quadrature.

Statistiques

Statistiques & ML

Distributions, inférence, régression et la machinerie d’optimisation qui les porte.

Appliqué

Signal, image, automatique, finance

Transformées, filtrage, traitement d’images, théorie du contrôle et primitives de finance quantitative.

Symbolique

Calcul formel

Un petit CAS symbolique posé à côté du numérique plutôt que boulonné par-dessus.

Spécialisé

Graphes, géométrie, topologie, quantique

Théorie des nombres, algorithmes de graphes, géométrie algorithmique, topologie et primitives quantiques.

Surface livrée

Trois exécutables, tout le reste en option

Tout ce qui dépasse les trois exécutables est une option de build — une interface graphique utilisateur (GUI) Qt, CUDA, l’interface de passage de messages (MPI), et un compilateur juste-à-temps (JIT) bâti sur la couche On-Request Compilation (ORC) de LLVM.

mathscriptcCompilateur / moteur par lots
mathscript-replSession interactive
mathscript-serverMode service
En optionInterface Qt, CUDA, MPI, LLVM ORC JIT
Vérification

Ce que valent 816 suites

La matrice d’intégration continue (CI) derrière les contrôles ci-dessous couvre deux compilateurs : Microsoft Visual C++ (MSVC) sous Windows et la GNU Compiler Collection (GCC) 13 sous Linux.

ContrôleRéglage
Suites CTest816, 100 % passées
PlateformeWindows MSVC Release
Matrice CIMSVC + Linux GCC 13
Seuil de couverture90%
SanitizersActivé
FuzzingActivé
Régressions de benchmark28, tolérance de 10 %
Préversion veut dire préversion. La v1.0.0 n’est pas sortie. Le chiffre de 816 suites vient de Windows MSVC Release ; la branche Linux GCC 13 tourne en CI, mais le chiffre affiché est celui mesuré sur Windows.
À qui cela s’adresse

Une boîte à outils mathématique complète pour programmeurs, d’un seul tenant

Le calcul sérieux revient d’habitude à boulonner ensemble une douzaine de logiciels distincts en espérant qu’ils soient d’accord. Ici, c’est une seule bibliothèque qui couvre l’ensemble.

01

Des équipes qui n’ont le droit de rien télécharger

Les chaînes de compilation de la défense, du médical, de l’aérospatiale et de la banque sont souvent coupées d’Internet. Tout est inclus ici, donc il n’y a rien à récupérer et rien à faire approuver.

02

Des équipes fatiguées de boulonner du Python sur un produit

Beaucoup de logiciels font leur vrai travail dans un langage et leurs maths dans un autre, ce qui fait deux jeux de problèmes. Ici, les maths restent dans le même langage que le produit.

03

Enseignement et apprentissage

Les méthodes sont écrites en entier et peuvent être lues, au lieu d’être cachées dans le composant scellé d’un fournisseur. Les étudiants peuvent suivre ce qui se passe réellement.

Vous reconnaissez votre situation ? C’est ouvert aux tests bêta dès maintenant, et ce sont les retours des gens pour qui c’est construit qui le font réellement changer. Devenir bêta-testeur →
Pourquoi pas d’exceptions

Une bibliothèque numérique qui ne peut pas vous lever d’exception

Le code numérique échoue de façons ordinaires : une matrice singulière, une itération qui ne converge pas, une erreur de domaine dans une fonction spéciale. Signaler cela par une exception veut dire que chaque appelant soit enveloppe tout dans un try soit découvre l’échec en haut de la pile, sans contexte. MathScript fait de l’échec une partie du type de retour.

// 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.