MathScript · pré-lançamento v1.0.0

Uma biblioteca C++23, de LU a CFD

Software de engenharia roda sobre matemática pesada, e quase ninguém escreve a sua. Ela é costurada a partir de bibliotecas de terceiros e plataformas pagas — difícil de auditar, difícil de mudar e difícil de instalar onde a máquina de build não tem internet. O MathScript faz a matemática ele mesmo, da aritmética de matrizes até a dinâmica dos fluidos, em uma única biblioteca C++ sem nada para baixar.

LinguagemC++23
Suítes de teste816 CTest
Controle de cobertura90%
Bibliotecas estáticas35
Último enviohá pouco
Duas decisões que moldam tudo
  • Kernels de matriz na própria árvore. As Sub-rotinas Básicas de Álgebra Linear (BLAS) e o Pacote de Álgebra Linear (LAPACK) são implementados aqui, não baixados: sem Eigen, sem OpenBLAS. linalg tem LU, QR, Decomposição em Valores Singulares (SVD), eig, Cholesky e os kernels no estilo LAPACK, então implantar é compilar e não caçar dependências.
  • Um subconjunto restrito de C++. Sem ponteiros crus, sem exceções, sem casts inseguros — imposto em tempo de compilação. O código de produção devolve Result<T>, então o tratamento de erro é determinístico e visível no tipo.
Em português claro

O que isto é, em um minuto

O problema

Tensão, escoamento, sinais, risco — os cálculos por baixo do software de engenharia raramente são escritos pela equipe que o entrega. Chegam de uma dúzia de bibliotecas externas e plataformas pagas que precisam ser baixadas, licenciadas e merecer confiança. Quando uma resposta parece errada, as contas estão no código de outra pessoa; em uma máquina de build lacrada, pode ser que você nem consiga baixá-las.

A solução

O MathScript é uma única biblioteca C++ que faz a matemática ela mesma: álgebra linear, estatística, equações diferenciais, elementos finitos, escoamento de fluidos, otimização e um sistema de álgebra simbólica, em trinta e cinco bibliotecas estáticas. As rotinas de matriz que a maioria dos projetos importa de BLAS e LAPACK estão escritas aqui. Todas as 816 suítes de teste passam no build do Windows. A v1.0.0 ainda não foi lançada.

Para quem é

Equipes cujas máquinas de build não alcançam a internet — defesa, saúde, aeroespacial, bancos — onde cada dependência baixada é mais uma aprovação. Produtos que fazem o trabalho de verdade em C++ e a matemática em Python, e carregam dois conjuntos de problemas por isso. Professores e estudantes que querem o método escrito onde dá para ler.

A matemática está na árvore, não em uma lista de dependências. Esse é o argumento, e o resto desta página é a evidência: o que as trinta e cinco bibliotecas contêm, por que uma falha volta no tipo de retorno em vez de como exceção, e exatamente o que os números de teste cobrem.
Interativo

Um Sistema de Álgebra Computacional (CAS) simbólico, rodando no seu navegador

Digite uma expressão. Ela é tokenizada, analisada para uma Árvore de Sintaxe Abstrata (AST), derivada simbolicamente, simplificada e então avaliada numericamente para o gráfico — junto com uma integral pela regra de Simpson e busca de raízes por bisseção no intervalo visível.

mathscript-repl

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

Derivada simbólica


          
∫ no domínio
—
Raízes encontradas
—
Nós da AST
—
Análise
—

Result<T>

Ok
Analisada e derivada sem erro.

Suportado: + - * / ^, sin cos tan exp log sqrt abs sinh cosh tanh asin acos atan, constantes pi e e. O CAS de verdade é bem maior; este é a mesma ideia numa escala que dá para ler.

Um tokenizador, um parser de descida recursiva, um derivador simbólico e um simplificador escritos para esta página. A implementação em C++ fica na biblioteca symbolic do repositório.
Não é uma reimplementação

A biblioteca C++ de verdade, compilada para WebAssembly

Tudo acima é JavaScript escrito para esta página — honesto, mas um modelo da coisa real. Abaixo está a coisa real: libms_symbolic ele mesmo, compilado a partir do mesmo código que constrói a biblioteca nativa, rodando no seu navegador.

ms::sym_diff — WebAssembly

não carregada

Nada é baixado até você apertar carregar, e então é buscado uma vez só. O módulo tem 113 kilobytes (KB) de WebAssembly e 10 KB de carregador — o build completo da biblioteca tem 4,9 megabytes (MB), então isto liga só o que estas quatro chamadas alcançam. O painel mostra a versão da biblioteca e a Arquitetura do Conjunto de Instruções (ISA) vetorial que o build informa.

Simplificada
—
Derivada
—
Integral
—
Biblioteca
—
ISA vetorial
—
A linha da ISA é a biblioteca dizendo a verdade sobre si mesma. Ela chama ms::detect_isa(), a mesma chamada que ela faz nativamente. No seu desktop isso responde com uma das Extensões Vetoriais Avançadas (AVX2 ou AVX-512); aqui há uma só ISA vetorial, e ela diz isso.
Compilado com Emscripten a partir da árvore do MathScript. Três defeitos de portabilidade tiveram de ser corrigidos para chegar até aqui, e todos os três também afetam builds nativos no Apple clang e em ARM — veja tools/wasm/README.md.
Escopo

Trinta e cinco bibliotecas estáticas, seis domínios

Álgebra linear densa e esparsa, funções especiais, estatística e Aprendizado de Máquina (ML). Equações Diferenciais Ordinárias (EDO) e Equações Diferenciais Parciais (EDP), o Método dos Elementos Finitos (FEM) e a Dinâmica dos Fluidos Computacional (CFD). Otimização, processamento de sinais e de imagens, teoria dos números, grafos, geometria, topologia, primitivas quânticas, controle, finanças, compressão — e um CAS simbólico. Com LU, QR, SVD, resolvedores de autovalores e Cholesky escritos na própria árvore.

Seis domínios de bibliotecas — sistemas centrais, numérico, estatística e aprendizado de máquina, aplicado, simbólico e especializado — sobre um trilho base Result<T> sem exceções nem ponteiros crus
role para ver o diagrama inteiro →
Trinta e cinco bibliotecas, uma convenção de erro. O trilho por baixo é o ponto: a falha está no tipo de retorno, não numa exceção que você descobre no topo da pilha.
Núcleo

Sistemas centrais

Álgebra linear densa e esparsa com LU, QR, SVD, resolvedores de autovalores e Cholesky na própria árvore. Result<T> para tratamento de erro em toda parte.

Numérico

ODE, PDE, FEM, CFD

Integração no tempo, elementos finitos e dinâmica de fluidos computacional, mais funções especiais e quadratura.

Estatística

Estatística e ML

Distribuições, inferência, regressão e o maquinário de otimização por baixo delas.

Aplicado

Sinal, imagem, controle, finanças

Transformadas, filtragem, processamento de imagens, teoria de controle e primitivas de finanças quantitativas.

Simbólico

Álgebra computacional

Um pequeno CAS simbólico ao lado da parte numérica, e não parafusado em cima dela.

Especializado

Grafos, geometria, topologia, quântica

Teoria dos números, algoritmos de grafos, geometria computacional, topologia e primitivas quânticas.

O que é entregue

Três executáveis, todo o resto opcional

Tudo além dos três executáveis é opção de build — uma Interface Gráfica de Usuário (GUI) em Qt, CUDA, a Interface de Passagem de Mensagens (MPI) e um compilador em tempo de execução (JIT) construído sobre a camada de Compilação Sob Demanda (ORC) do LLVM.

mathscriptcCompilador / driver de lote
mathscript-replSessão interativa
mathscript-serverModo serviço
OpcionalGUI Qt, CUDA, MPI, LLVM ORC JIT
Verificação

O que 816 suítes te dão

A matriz de Integração Contínua (CI) por trás dos controles abaixo cobre dois compiladores: Microsoft Visual C++ (MSVC) no Windows e a Coleção de Compiladores GNU (GCC) 13 no Linux.

ControleConfiguração
Suítes CTest816, 100% passaram
PlataformaWindows MSVC Release
Matriz de CIMSVC + Linux GCC 13
Controle de cobertura90%
SanitizersAtivados
FuzzingAtivados
Regressões de benchmark28, tolerância de 10%
Pré-lançamento significa pré-lançamento. A v1.0.0 não foi lançada. O número de 816 suítes é do Windows MSVC Release; a perna do Linux GCC 13 roda em CI, mas o número da manchete é o medido no Windows.
Para quem é

Um kit de matemática completo para programadores, em uma peça só

Trabalho sério de cálculo normalmente significa parafusar uma dúzia de softwares separados e torcer para que concordem. Esta é uma única biblioteca que cobre tudo.

01

Equipes que não têm permissão para baixar nada

Sistemas de build de defesa, medicina, aeroespacial e bancos costumam ficar isolados da internet. Aqui tudo já vem incluído, então não há nada para buscar e nada para aprovar.

02

Equipes cansadas de parafusar Python em um produto

Muito software faz o trabalho de verdade em uma linguagem e a matemática em outra, o que significa dois conjuntos de problemas. Isto mantém a matemática na mesma linguagem do produto.

03

Ensino e aprendizado

Os métodos estão escritos por extenso e podem ser lidos, em vez de escondidos dentro do componente lacrado de um fornecedor. Os alunos conseguem acompanhar o que está de fato acontecendo.

Reconhece a sua situação aqui? Isto está aberto para teste beta agora, e as pessoas para quem ele é construído são aquelas cujo retorno de fato o muda. Seja um testador beta →
Por que não há exceções

Uma biblioteca numérica que não consegue lançar nada em você

Código numérico falha de maneiras comuns: uma matriz singular, uma iteração que não converge, um erro de domínio em uma função especial. Sinalizar isso com uma exceção significa que todo chamador ou embrulha tudo em try ou descobre a falha no topo da pilha sem contexto nenhum. O MathScript torna a falha parte do 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.