Задача
Между логикой на правилах и тяжелым ML-стеком есть целый класс задач: эвристики уже не держат сложность, а полноценная инфраструктура машинного обучения избыточна и не даёт объяснимости. cpp_bayesian - ядро вероятностного вывода на C++20 для таких случаев: явная причинно-следственная модель, неполные наблюдения, повторяемый вывод. Встраивается прямо в C++-систему, без Python-рантайма и внешнего сервиса.
Типовые применения, под которые проект писался: оценка рисков (срыв сроков, отказ подсистемы, деградация SLA), диагностика по шумной телеметрии, вероятностные кэш-политики admission / eviction / prefetch вместо статических эвристик, экспертные системы, где решение нужно объяснить.
Архитектура
Два контура.
Контур управления - DynamicBayesianNetwork: редакторский слой, который допускает промежуточно невалидное состояние и умеет validate(), commit(), rollback(), с настраиваемыми RemovalPolicy. Модель меняется транзакционно, а не правится напрямую в рабочей структуре - это удобно для графических редакторов, импорта и версионирования моделей.
Контур выполнения - после commit() состояние материализуется в неизменяемую BayesianNetwork и компилируется в JunctionTree для дешевого повторного вывода на фиксированной структуре. Редакторская сложность не попадает в горячий путь.
Внутри: базовые структуры Graph, FactorScope, FactorTable, BayesianNode; exact inference как эталон корректности; конвейер moralization → triangulation → извлечение максимальных клик → дерево сепараторов → message passing.
Инструменты
- Интерактивный CLI-визард для сборки и запроса сетей
- Собственный формат модели
.bn - Экспорт Sankey/SVG для визуализации вывода
- Опциональный просмотрщик на Qt6
- Контур измерения производительности: exact против junction tree
Результат
Библиотека доведена до состояния публичного проекта: TDD с собственным тестовым запускателем, CI на Linux (GCC, Clang) и Windows (MSVC), MIT-лицензия, CONTRIBUTING/SECURITY/CHANGELOG, документация в docs (architecture, usage, ADR), Dependabot.
Технический стек
- Язык: C++20
- Сборка: CMake
- GUI: Qt6 (опционально)
- Тестирование: self-hosted test runner, TDD-подход
- Окружение: Docker, devcontainer
