Одна библиотека на C++23 — от LU до CFD
Инженерный софт держится на тяжёлой математике, и почти никто не пишет её сам. Её сшивают из чужих библиотек и платных платформ — это трудно проверить, трудно изменить и трудно поставить там, где у сборочной машины нет интернета. MathScript делает математику сам, от матричной арифметики до гидродинамики, в одной библиотеке C++, и скачивать ничего не надо.
- Матричные ядра в дереве. Базовые подпрограммы линейной алгебры (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
Символьная производная
Result<T>
Поддерживается: + - * / ^, sin cos tan exp log sqrt abs sinh cosh tanh
asin acos atan, константы pi и e. Настоящая CAS заметно больше; здесь та же идея в масштабе, который можно прочитать.
symbolic в дереве MathScript.
Настоящая библиотека на C++, скомпилированная в WebAssembly
Всё выше — это JavaScript, написанный для этой страницы — честно, но это модель настоящего. Ниже настоящее: libms_symbolic собственной персоной, скомпилированный из того же исходника, из которого собирается нативная библиотека, и работающий в вашем браузере.
ms::sym_diff — WebAssembly
не загруженоНичего не скачивается, пока вы не нажмёте загрузку, и потом скачивается один раз. Модуль — 113 килобайт (КБ) WebAssembly и 10 КБ загрузчика — полная сборка библиотеки весит 4,9 мегабайта (МБ), так что сюда линкуется только то, до чего дотягиваются эти четыре вызова. Панель показывает версию библиотеки и векторную архитектуру набора команд (ISA), о которой сообщает сборка.
ms::detect_isa(), тот же вызов, что и в нативной сборке. На вашем рабочем столе он отвечает одним из продвинутых векторных расширений (AVX2 или AVX-512); здесь векторная ISA одна, и он так и говорит.
tools/wasm/README.md.
Тридцать пять статических библиотек, шесть областей
Плотная и разреженная линейная алгебра, специальные функции, статистика и машинное обучение (ML). Обыкновенные дифференциальные уравнения (ODE) и уравнения в частных производных (PDE), метод конечных элементов (FEM) и вычислительная гидродинамика (CFD). Оптимизация, обработка сигналов и изображений, теория чисел, графы, геометрия, топология, квантовые примитивы, управление, финансы, сжатие — и символьная CAS. С LU, QR, SVD, решателями задач на собственные значения и Холецким прямо в дереве.
Базовые системы
Плотная и разреженная линейная алгебра с LU, QR, SVD, решателями задач на собственные значения и Холецким прямо в дереве. Result<T> — обработка ошибок повсюду.
ODE, PDE, FEM, CFD
Интегрирование по времени, конечные элементы и вычислительная гидродинамика, плюс специальные функции и квадратуры.
Статистика и ML
Распределения, вывод, регрессия и механика оптимизации под ними.
Сигналы, изображения, управление, финансы
Преобразования, фильтрация, обработка изображений, теория управления и примитивы количественных финансов.
Компьютерная алгебра
Небольшая символьная CAS, стоящая рядом с численными методами, а не приделанная сверху.
Графы, геометрия, топология, кванты
Теория чисел, алгоритмы на графах, вычислительная геометрия, топология и квантовые примитивы.
Три исполняемых файла, всё остальное опционально
Всё, что за пределами трёх исполняемых файлов, — это опция сборки — графический интерфейс пользователя (GUI) на Qt, CUDA, интерфейс передачи сообщений (MPI) и компилятор «на лету» (JIT) поверх слоя компиляции по запросу (ORC) из LLVM.
Что дают 816 наборов тестов
Матрица непрерывной интеграции (CI) за барьерами ниже покрывает два компилятора: Microsoft Visual C++ (MSVC) под Windows и GNU Compiler Collection (GCC) 13 под Linux.
| Барьер | Настройка |
|---|---|
| Наборов CTest | 816, пройдено 100% |
| Платформа | Windows MSVC Release |
| Матрица CI | MSVC + Linux GCC 13 |
| Порог покрытия | 90% |
| Санитайзеры | Включено |
| Фаззинг | Включено |
| Регрессии бенчмарков | 28, допуск 10% |
Полный математический инструментарий для программистов, одним куском
Серьёзные расчёты обычно означают, что вы скручиваете вместе десяток отдельных программ и надеетесь, что они согласуются друг с другом. Здесь одна библиотека закрывает всё это.
Команды, которым ничего нельзя скачивать
Сборочные системы в обороне, медицине, авиакосмосе и банках часто отрезаны от интернета. Здесь всё включено, так что нечего скачивать и нечего согласовывать.
Команды, уставшие прикручивать Python к продукту
Куча софта делает основную работу на одном языке, а математику на другом, а значит, получает два набора проблем. Здесь математика остаётся на том же языке, что и продукт.
Преподавание и обучение
Методы выписаны целиком, и их можно прочитать, а не искать внутри запечатанного компонента от поставщика. Студенты могут проследить, что на самом деле происходит.
Численная библиотека, которая не может бросить в вас исключение
Численный код падает обычными способами: вырожденная матрица, несходящаяся итерация, ошибка области определения в специальной функции. Сигнализировать об этом исключением означает, что каждый вызывающий либо оборачивает всё в 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.