MathScript · v1.0.0, пре-релиз

Одна библиотека на C++23 — от LU до CFD

Инженерный софт держится на тяжёлой математике, и почти никто не пишет её сам. Её сшивают из чужих библиотек и платных платформ — это трудно проверить, трудно изменить и трудно поставить там, где у сборочной машины нет интернета. MathScript делает математику сам, от матричной арифметики до гидродинамики, в одной библиотеке C++, и скачивать ничего не надо.

ЯзыкC++23
Наборы тестов816 CTest
Порог покрытия90%
Статических библиотек35
Последняя отправканедавно
Два решения, которые определяют всё
  • Матричные ядра в дереве. Базовые подпрограммы линейной алгебры (BLAS) и пакет линейной алгебры (LAPACK) реализованы здесь, а не подтянуты: без Eigen, без OpenBLAS. linalg владеет LU, QR, сингулярным разложением (SVD), eig, Холецким и ядрами в стиле LAPACK, поэтому развёртывание — это компиляция, а не охота за зависимостями.
  • Ограниченное подмножество C++. Никаких сырых указателей, никаких исключений, никаких небезопасных приведений — проверяется на этапе компиляции. Продакшен-код возвращает Result<T>, так что обработка ошибок детерминирована и видна в типе.
Простыми словами

Что это такое за минуту

Проблема

Напряжения, потоки, сигналы, риск — расчёты под инженерным софтом редко пишет та команда, которая его выпускает. Они приходят из десятка чужих библиотек и платных платформ, которые надо скачать, лицензировать и которым надо доверять. Когда ответ выглядит неверным, выкладки лежат в чужом коде; а на закрытой сборочной машине их может быть вообще не скачать.

Решение

MathScript — одна библиотека C++, которая делает математику сама: линейная алгебра, статистика, дифференциальные уравнения, конечные элементы, течения, оптимизация и система символьной алгебры — тридцать пять статических библиотек. Матричные процедуры, которые большинство проектов берёт из BLAS и LAPACK, написаны здесь. Все 816 наборов тестов проходят на сборке под Windows. v1.0.0 ещё не вышла.

Кому это нужно

Командам, у которых сборочные машины не выходят в интернет — оборона, медицина, авиакосмос, банки — где каждая скачанная зависимость это ещё одно согласование. Продуктам, которые делают основную работу на C++, а математику на Python, и несут за это два набора проблем. Преподавателям и студентам, которым нужен метод, выписанный так, чтобы его можно было прочитать.

Математика лежит в дереве, а не в списке зависимостей. Это и есть аргумент, а дальше на странице — доказательства: что лежит в тридцати пяти библиотеках, почему отказ возвращается в типе результата, а не исключением, и что именно покрывают цифры тестов.
Интерактив

Символьная система компьютерной алгебры (CAS) прямо в браузере

Введите выражение. Оно разбивается на токены, разбирается в абстрактное синтаксическое дерево (AST), символьно дифференцируется, упрощается, затем численно вычисляется для графика — вместе с интегралом по правилу Симпсона и поиском корня делением пополам на видимом интервале.

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 в дереве MathScript.
Не повторная реализация

Настоящая библиотека на C++, скомпилированная в WebAssembly

Всё выше — это JavaScript, написанный для этой страницы — честно, но это модель настоящего. Ниже настоящее: libms_symbolic собственной персоной, скомпилированный из того же исходника, из которого собирается нативная библиотека, и работающий в вашем браузере.

ms::sym_diff — WebAssembly

не загружено

Ничего не скачивается, пока вы не нажмёте загрузку, и потом скачивается один раз. Модуль — 113 килобайт (КБ) WebAssembly и 10 КБ загрузчика — полная сборка библиотеки весит 4,9 мегабайта (МБ), так что сюда линкуется только то, до чего дотягиваются эти четыре вызова. Панель показывает версию библиотеки и векторную архитектуру набора команд (ISA), о которой сообщает сборка.

Упрощено
—
Производная
—
Интеграл
—
Библиотека
—
Векторный ISA
—
Строка ISA — это библиотека, говорящая о себе правду. Она спрашивает ms::detect_isa(), тот же вызов, что и в нативной сборке. На вашем рабочем столе он отвечает одним из продвинутых векторных расширений (AVX2 или AVX-512); здесь векторная ISA одна, и он так и говорит.
Собрано Emscripten из дерева MathScript. Чтобы этого добиться, пришлось починить три дефекта переносимости, и все они также затрагивают нативные сборки на Apple clang и на ARM — см. tools/wasm/README.md.
Объём

Тридцать пять статических библиотек, шесть областей

Плотная и разреженная линейная алгебра, специальные функции, статистика и машинное обучение (ML). Обыкновенные дифференциальные уравнения (ODE) и уравнения в частных производных (PDE), метод конечных элементов (FEM) и вычислительная гидродинамика (CFD). Оптимизация, обработка сигналов и изображений, теория чисел, графы, геометрия, топология, квантовые примитивы, управление, финансы, сжатие — и символьная CAS. С LU, QR, SVD, решателями задач на собственные значения и Холецким прямо в дереве.

Шесть областей библиотеки — базовые системы, численные методы, статистика и машинное обучение, прикладные задачи, символьные вычисления и специализированное — поверх общей основы Result<T> без исключений и сырых указателей
прокрутите, чтобы увидеть всю схему →
Тридцать пять библиотек, одно соглашение об ошибках. Смысл в общей основе снизу: отказ живёт в возвращаемом типе, а не в исключении, которое вы обнаружите на вершине стека.
Ядро

Базовые системы

Плотная и разреженная линейная алгебра с LU, QR, SVD, решателями задач на собственные значения и Холецким прямо в дереве. Result<T> — обработка ошибок повсюду.

Численные

ODE, PDE, FEM, CFD

Интегрирование по времени, конечные элементы и вычислительная гидродинамика, плюс специальные функции и квадратуры.

Статистика

Статистика и ML

Распределения, вывод, регрессия и механика оптимизации под ними.

Прикладное

Сигналы, изображения, управление, финансы

Преобразования, фильтрация, обработка изображений, теория управления и примитивы количественных финансов.

Символьное

Компьютерная алгебра

Небольшая символьная CAS, стоящая рядом с численными методами, а не приделанная сверху.

Специализированное

Графы, геометрия, топология, кванты

Теория чисел, алгоритмы на графах, вычислительная геометрия, топология и квантовые примитивы.

Что поставляется

Три исполняемых файла, всё остальное опционально

Всё, что за пределами трёх исполняемых файлов, — это опция сборки — графический интерфейс пользователя (GUI) на Qt, CUDA, интерфейс передачи сообщений (MPI) и компилятор «на лету» (JIT) поверх слоя компиляции по запросу (ORC) из LLVM.

mathscriptcКомпилятор / пакетный движок
mathscript-replИнтерактивная сессия
mathscript-serverРежим службы
ОпциональноQt GUI, CUDA, MPI, LLVM ORC JIT
Проверка

Что дают 816 наборов тестов

Матрица непрерывной интеграции (CI) за барьерами ниже покрывает два компилятора: Microsoft Visual C++ (MSVC) под Windows и GNU Compiler Collection (GCC) 13 под Linux.

БарьерНастройка
Наборов CTest816, пройдено 100%
ПлатформаWindows MSVC Release
Матрица CIMSVC + Linux GCC 13
Порог покрытия90%
СанитайзерыВключено
ФаззингВключено
Регрессии бенчмарков28, допуск 10%
Пре-релиз значит пре-релиз. v1.0.0 не выпущена. Цифра в 816 наборов взята с 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.