Files
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

140 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` | Решает систему, считает машины, потоки ресурсов |
## Быстрый старт
```bash
# Сборка
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
```
## Использование
### Расчёт производства
```bash
# Простой расчёт
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) |
### Список ресурсов
```bash
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, никаких раскрытий дерева
## Тесты
```bash
dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj
```
30 тестов: валидация сущностей Domain-слоя + интеграционные тесты Solver-а + тесты ResourceClassifier и RecipeMatrixBuilder.