mikhail 1c735b124a refactor: DFS solver → matrix-based linear algebra (MathNet.Numerics)
- Rewrite ProductionSolver: system of linear equations A×x=b via LU/QR decomposition
- Add ResourceClassifier: classify resources as target/intermediate/raw
- Add RecipeMatrixBuilder: build coefficient matrix and RHS vector
- Add DI container (Microsoft.Extensions.DependencyInjection) in CLI
- Fix resource flow calculation (RecipeRate is total, not per-machine)
- Fix recipes.json: moduleCategory → machineCategory (recipe #19)
- Update tests: 30 tests covering solver, classifier, matrix builder
- Update README: document matrix model, architecture, principles
2026-07-02 14:46:14 +03:00

Factorio Space Age Production Calculator

Stack: C# .NET 10, MathNet.Numerics, Spectre.Console, ClosedXML, xUnit, Microsoft.Extensions.DependencyInjection

Калькулятор производственных цепочек для Factorio: Space Age. Рассчитывает количество машин, потоки ресурсов и сырьевые входы для заданных целей производства.

Математическая модель

Решение строится через систему линейных уравнений (не DFS):

A × x = b

Где:

  • A — матрица коэффициентов (строки = ресурсы, столбцы = рецепты)
  • x — скорости выполнения рецептов (cycles/sec) — неизвестные
  • b — целевые скорости производства (targets) / 0 (intermediates)

Решение: LU-разложение (квадратная матрица), QR (переопределённая), псевдообратная (недоопределённая).

Архитектура

FactorioCalc/
├── src/
│   ├── FactorioCalc.Domain/     # Сущности, интерфейсы (DDD)
│   ├── FactorioCalc.Data/       # JSON-хранилище рецептов
│   ├── FactorioCalc.Solver/     # Матричный решатель (MathNet.Numerics)
│   ├── FactorioCalc.Reporting/  # Console/JSON/Excel экспорт
│   └── FactorioCalc.CLI/        # Точка входа, DI, парсинг аргументов
├── tests/
│   └── FactorioCalc.Tests/      # xUnit unit-тесты (30 тестов)
├── data/
│   └── recipes.json             # База рецептов Space Age
└── README.md

Слои

Слой Описание
Domain Immutable-сущности: Resource, Recipe, Machine, Module, RecipeExecution, ProductionTarget, ProductionResult
Data JsonRecipeRepository — загрузка рецептов из JSON
Solver ResourceClassifier — классификация ресурсов, RecipeMatrixBuilder — построение матрицы, ProductionSolver — решение через MathNet.Numerics
Reporting ConsoleReporter, JsonReporter, ExcelReporter
CLI Парсинг аргументов, DI (Microsoft.Extensions.DependencyInjection), Spectre.Console

Классы Solver

Класс Ответственность
ResourceClassifier Определяет target / intermediate / raw ресурсы
RecipeMatrixBuilder Строит матрицу коэффициентов A и вектор b
ProductionSolver Решает систему, считает машины, потоки ресурсов

Быстрый старт

# Сборка
dotnet build src/FactorioCalc.CLI/FactorioCalc.CLI.csproj

# Тесты
dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj

# Запуск
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj

Использование

Расчёт производства

# Простой расчёт
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Steel Plate:5"

# Множественные цели
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Red Science Pack:10" "Processing Unit:30"

# С модулями
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Blue Science Pack:60" -m "Productivity Module 3"

# С экспортом
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Yellow Science Pack:15" -j result.json -e result.xlsx

Формат целей

"ResourceName:amount"

Например: "Steel Plate:5" → 5 стальных пластин в секунду.

Опции

Опция Описание
-r, --recipe-file <path> Путь к JSON с рецептами
-m, --modules <name> Модуль для применения (можно повторять)
-j, --json <path> Экспорт в JSON
-e, --excel <path> Экспорт в Excel (.xlsx)

Список ресурсов

dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --resources
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --recipes
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --machines
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --modules

Формула расчёта

Матрица A:  A[resource, recipe] = Σ(products) - Σ(ingredients)  (с учётом productivity)
Система:    A × x = b
Решение:    x = A⁻¹ × b  (LU decomposition)
Machine Count = recipe_rate / (effective_speed / craft_time)
Effective Speed = base_speed × (1 + speed_bonus)

Принципы

  • SOLID — разделение ответственности по слоям
  • Immutable entities — все сущности Domain-слоя неизменяемы
  • IReadOnlyCollection / IReadOnlyDictionary — публичные API
  • Matrix-based solver — система линейных уравнений через MathNet.Numerics
  • DI — Microsoft.Extensions.DependencyInjection
  • No recursion — никаких DFS, никаких раскрытий дерева

Тесты

dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj

30 тестов: валидация сущностей Domain-слоя + интеграционные тесты Solver-а + тесты ResourceClassifier и RecipeMatrixBuilder.

S
Description
No description provided
Readme 77 KiB
Languages
C# 100%