# 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 ` | Путь к JSON с рецептами | | `-m, --modules ` | Модуль для применения (можно повторять) | | `-j, --json ` | Экспорт в JSON | | `-e, --excel ` | Экспорт в 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.