MathScript · v1.0.0 preliminar

Una sola biblioteca C++23, de LU a CFD

El software de ingeniería funciona sobre matemáticas pesadas, y casi nadie escribe las suyas. Se cose con bibliotecas de otros y plataformas de pago — difíciles de auditar, difíciles de cambiar y difíciles de instalar donde la máquina de compilación no tiene internet. MathScript hace las matemáticas él mismo, desde la aritmética de matrices hasta la dinámica de fluidos, en una sola biblioteca de C++ sin nada que descargar.

LenguajeC++23
Suites de pruebas816 CTest
Umbral de cobertura90%
Bibliotecas estáticas35
Último envíohace poco
Dos decisiones que lo condicionan todo
  • Kernels matriciales en el árbol. Los subprogramas básicos de álgebra lineal (BLAS) y el paquete de álgebra lineal (LAPACK) están implementados aquí en vez de descargarse: sin Eigen, sin OpenBLAS. linalg alberga LU, QR, descomposición en valores singulares (SVD), eig, Cholesky y los kernels al estilo LAPACK, así que desplegar es compilar y no ir a la caza de dependencias.
  • Un subconjunto restringido de C++. Sin punteros crudos, sin excepciones, sin conversiones inseguras — impuesto en tiempo de compilación. El código de producción devuelve Result<T>, así que el manejo de errores es determinista y visible en el tipo.
En lenguaje llano

Qué es esto, en un minuto

El problema

Tensión, flujo, señales, riesgo — los cálculos que hay debajo del software de ingeniería rara vez los escribe el equipo que lo entrega. Llegan de una docena de bibliotecas externas y plataformas de pago que hay que descargar, licenciar y creer. Cuando una respuesta parece mal, las operaciones están en el código de otro; en una máquina de compilación aislada puede que ni siquiera puedas descargarlas.

La solución

MathScript es una sola biblioteca de C++ que hace las matemáticas ella misma: álgebra lineal, estadística, ecuaciones diferenciales, elementos finitos, flujo de fluidos, optimización y un sistema de álgebra simbólica, repartidos en treinta y cinco bibliotecas estáticas. Las rutinas matriciales que casi todos los proyectos importan de BLAS y LAPACK están escritas aquí. Las 816 suites de prueba pasan en la compilación de Windows. v1.0.0 todavía no se ha publicado.

Para quién es

Equipos cuyas máquinas de compilación no llegan a internet — defensa, sanidad, aeroespacial, banca —, donde cada dependencia descargada es otra aprobación. Productos que hacen su trabajo de verdad en C++ y sus matemáticas en Python, y cargan con dos conjuntos de problemas por ello. Docentes y estudiantes que quieren el método escrito donde se pueda leer.

Las matemáticas están en el árbol, no en una lista de dependencias. Ese es el argumento, y el resto de esta página son las pruebas: qué contienen las treinta y cinco bibliotecas, por qué un fallo vuelve en el tipo de retorno y no como una excepción, y qué cubren exactamente las cifras de las pruebas.
Interactivo

Un sistema de álgebra computacional (CAS) simbólico, en tu navegador

Escribe una expresión. Se tokeniza, se analiza hasta un árbol de sintaxis abstracta (AST), se deriva simbólicamente, se simplifica y luego se evalúa numéricamente para la gráfica — junto a una integral por la regla de Simpson y una búsqueda de raíces por bisección sobre el intervalo visible.

mathscript-repl

f(x) =
f(x) f′(x), simbólica raíces de f

Derivada simbólica


          
∫ en el dominio
—
Raíces encontradas
—
Nodos del AST
—
Análisis
—

Result<T>

Ok
Analizado y derivado sin error.

Soportado: + - * / ^, sin cos tan exp log sqrt abs sinh cosh tanh asin acos atan, constantes pi y e. El CAS de verdad es bastante más grande; esto es la misma idea a escala legible.

Un tokenizador, un analizador por descenso recursivo, un derivador simbólico y un simplificador escritos para esta página. La implementación en C++ vive en la biblioteca symbolic de MathScript.
No es una reimplementación

La biblioteca C++ real, compilada a WebAssembly

Todo lo de arriba es JavaScript escrito para esta página — honesto, pero un modelo de la cosa real. Abajo está la cosa real: libms_symbolic en sí, compilado a partir del mismo código que construye la biblioteca nativa, corriendo en tu navegador.

ms::sym_diff — WebAssembly

sin cargar

No se descarga nada hasta que pulsas cargar, y entonces se descarga una sola vez. El módulo son 113 kilobytes (KB) de WebAssembly y 10 KB de cargador — la compilación completa de la biblioteca son 4,9 megabytes (MB), así que esto enlaza solo lo que alcanzan estas cuatro llamadas. El panel muestra la versión de la biblioteca y la arquitectura del juego de instrucciones (ISA) vectorial que reporta la compilación.

Simplificada
—
Derivada
—
Integral
—
Biblioteca
—
ISA vectorial
—
La línea de la ISA es la biblioteca diciendo la verdad sobre sí misma. Pregunta por ms::detect_isa(), la misma llamada que hace de forma nativa. En tu escritorio eso responde con una de las extensiones vectoriales avanzadas (AVX2 o AVX-512); aquí hay una sola ISA vectorial y lo dice.
Compilado con Emscripten desde el árbol de MathScript. Hubo que arreglar tres defectos de portabilidad para llegar hasta aquí, y todos ellos afectan también a las compilaciones nativas con Apple clang y en ARM — ver tools/wasm/README.md.
Alcance

Treinta y cinco bibliotecas estáticas, seis dominios

Álgebra lineal densa y dispersa, funciones especiales, estadística y aprendizaje automático (ML). Ecuaciones diferenciales ordinarias (ODE) y ecuaciones en derivadas parciales (PDE), el método de elementos finitos (FEM) y la dinámica de fluidos computacional (CFD). Optimización, procesamiento de señales e imágenes, teoría de números, grafos, geometría, topología, primitivas cuánticas, control, finanzas, compresión — y un CAS simbólico. Con LU, QR, SVD, resolutores de autovalores y Cholesky escritos en el árbol.

Seis dominios de biblioteca — sistemas base, numérico, estadística y aprendizaje automático, aplicado, simbólico y especializado — sobre un carril base Result<T> sin excepciones ni punteros crudos
desplaza para ver el diagrama completo →
Treinta y cinco bibliotecas, una sola convención de errores. El carril de debajo es lo que importa: el fallo está en el tipo de retorno, no en una excepción que te encuentras en lo alto de la pila.
Base

Sistemas base

Álgebra lineal densa y dispersa con LU, QR, SVD, resolutores de autovalores y Cholesky propios. Result<T> para el manejo de errores en todo el código.

Numérico

ODE, PDE, FEM, CFD

Integración temporal, elementos finitos y dinámica de fluidos computacional, más funciones especiales y cuadratura.

Estadística

Estadística y ML

Distribuciones, inferencia, regresión y la maquinaria de optimización que hay debajo.

Aplicado

Señal, imagen, control, finanzas

Transformadas, filtrado, procesamiento de imagen, teoría de control y primitivas de finanzas cuantitativas.

Simbólico

Álgebra por ordenador

Un CAS simbólico pequeño que va al lado de lo numérico en vez de atornillado encima.

Especializado

Grafos, geometría, topología, cuántica

Teoría de números, algoritmos de grafos, geometría computacional, topología y primitivas cuánticas.

Lo que se entrega

Tres ejecutables, todo lo demás opcional

Todo lo que pasa de los tres ejecutables es una opción de compilación — una interfaz gráfica de usuario (GUI) en Qt, CUDA, la interfaz de paso de mensajes (MPI) y un compilador justo a tiempo (JIT) construido sobre la capa de compilación bajo demanda (ORC) de LLVM.

mathscriptcCompilador / ejecución por lotes
mathscript-replSesión interactiva
mathscript-serverModo servicio
OpcionalGUI Qt, CUDA, MPI, LLVM ORC JIT
Verificación

Lo que te dan 816 suites

La matriz de integración continua (CI) que hay detrás de los controles de abajo cubre dos compiladores: Microsoft Visual C++ (MSVC) en Windows y la Colección de Compiladores de GNU (GCC) 13 en Linux.

ControlValor
Suites de CTest816, 100% pasadas
PlataformaWindows MSVC Release
Matriz de CIMSVC + Linux GCC 13
Umbral de cobertura90%
SanitizersActivados
FuzzingActivados
Regresiones de benchmark28, tolerancia del 10%
Preliminar significa preliminar. v1.0.0 no se ha publicado. La cifra de 816 suites es de Windows MSVC Release; la rama de Linux GCC 13 corre en CI, pero el número destacado es el que se midió en Windows.
Para quién es

Un juego de herramientas matemáticas completo para programadores, en una sola pieza

El trabajo de cálculo serio suele significar atornillar una docena de programas distintos y esperar que se pongan de acuerdo. Esto es una sola biblioteca que lo cubre todo.

01

Equipos que no tienen permiso para descargar nada

Los sistemas de compilación de defensa, medicina, aeroespacial y banca suelen estar aislados de internet. Aquí está todo incluido, así que no hay nada que descargar ni nada que aprobar.

02

Equipos cansados de atornillar Python a un producto

Mucho software hace su trabajo real en un lenguaje y sus matemáticas en otro, lo que significa dos conjuntos de problemas. Esto mantiene las matemáticas en el mismo lenguaje que el producto.

03

Enseñar y aprender

Los métodos están escritos por completo y se pueden leer, en lugar de estar escondidos dentro del componente sellado de un proveedor. Los estudiantes pueden seguir lo que está pasando de verdad.

¿Reconoces aquí tu situación? Esto está abierto a pruebas beta ahora, y las personas para las que está hecho son aquellas cuyos comentarios de verdad lo cambian. Hazte probador beta →
Por qué no hay excepciones

Una biblioteca numérica que no te puede lanzar nada

El código numérico falla de formas corrientes: una matriz singular, una iteración que no converge, un error de dominio en una función especial. Señalar eso con una excepción significa que cada llamante o envuelve todo en try o descubre el fallo en lo alto de la pila y sin contexto. MathScript hace que el fallo forme parte del tipo de retorno.

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