Обновить README и PLAN до актуального состояния (физика v2, GPU, автономная эволюция)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-07-08 01:29:26 +05:00
parent a0f02e246a
commit 8708d0f922
2 changed files with 170 additions and 18 deletions

View File

@@ -1,21 +1,58 @@
# gausse
Симулятор и оптимизатор многоступенчатого электромагнитного ускорителя
(coilgun) на реальных, доступных в рознице компонентах.
(coilgun / пушка Гаусса) на реальных, доступных в рознице компонентах
(ChipDip, procontact74.ru, cable.ru — у каждой детали в базе ссылка на
магазин).
Полный план и чек-лист этапов — в [PLAN.md](PLAN.md).
Главный принцип — **честность**: все прогоны (включая нереализуемые, с
причиной отказа) пишутся в SQLite; физическая модель не приукрашивается ради
красивых цифр, а каждое известное упрощение задокументировано. История
проекта — это в том числе история найденных и исправленных завышений КПД
(80%+ → реалистичные единицы процентов), см. [PLAN.md](PLAN.md).
## Установка (Docker — основной способ)
## Что умеет
- **Физика** (`src/gausse/physics/`): RLC-разряд конденсаторной банки через
катушку с ферромагнитным снарядом; насыщение железа через единое
потокосцепление λ(x,I) (энергия сохраняется); вихревые потери в снаряде;
скин-эффект + эффект близости обмотки (метод Доуэлла); трение о трубку и
сопротивление воздуха; одиночный импульс (тиристор не перезапускается);
паспортные импульсные токи ключей (ITSM/IDM/ICM из даташитов).
- **Ступени** (`src/gausse/sim/`): у каждой катушки свой датчик
(оптика/Холл/индукционный) на своём расстоянии; подлёт → триггер →
задержки датчика и ключа → разряд → энергобаланс; цепочка до 10 ступеней.
- **Поиск** (`src/gausse/optim/`): геном переменной длины (число ступеней
эволюционирует), Monte-Carlo sweep и (μ+λ)-эволюция с Nelder-Mead
полировкой; всё в одну SQLite-базу (WAL, писатель поверх очереди).
- **GPU** (`src/gausse/gpu/`): батч-интегратор RK4 (numpy/cupy), весь шаг
слит в одно cupy.fuse-ядро — на GTX 1070 ~3.8x к CPU; многоступенчатый
GPU-sweep раунд-за-раундом; сверен с CPU-эталоном (<0.1%).
- **Отчёты** (`src/gausse/report/`, `src/gausse/web/`): веб-дашборд с
drill-down до каждой детали и энергобаланса ступени, графики ток/поле/
скорость, GIF-анимация выстрела (равномерное физическое время, результат
эксперимента в кадре), BOM с ценами и ссылками «купить».
## Запуск (Docker — основной способ)
```bash
docker compose build
docker compose run --rm --entrypoint pytest gausse -q # тесты
docker compose run --rm gausse sweep --n 1000 # CLI (после реализации Этапа 6)
docker compose run --rm --entrypoint pytest gausse -q # тесты
docker compose up -d web # дашборд :8000
docker compose run --rm gausse sweep --n 100000 --db /app/results/gausse.sqlite3
docker compose run --rm gausse evolve --generations 80 --population 300 \
--db /app/results/gausse.sqlite3
docker compose run --rm gausse report --top 3 --animate --db /app/results/gausse.sqlite3
```
Результаты (SQLite, отчёты) должны сохраняться в `./results`, примонтированный
в контейнер как `/app/results` (см. `docker-compose.yml`), чтобы переживать
пересборку образа.
GPU-режим (нужны NVIDIA-драйвер и `pip install cupy-cuda12x[ctk]`, вне Docker):
```bash
gausse sweep --gpu --n 1000000 --db results/gausse.sqlite3
```
Результаты (SQLite + лог хода эксперимента `<db>.log`) живут в `./results`,
примонтированном в контейнер, и переживают пересборку образа.
## Установка без Docker (локальная разработка)
@@ -25,3 +62,26 @@ source .venv/bin/activate
pip install -e ".[dev]"
pytest
```
## Автономная работа на сервере
Эволюция оформлена как systemd-сервис `gausse-evolve` (вечный цикл: 80
поколений × 300 особей, по окончании новый цикл со свежей случайной
популяцией; `Restart=always`, автозапуск при загрузке). Дашборд Docker-
сервис `web` на :8000, читает ту же базу. Счётчик «запланировано» на
дашборде план **текущего цикла**, а не всего поиска: поиск бесконечен.
## Ограничения модели (честно)
- Индуктивность инженерная модель (Уилер + размагничивание сфероида +
tanh-перекрытие), не МКЭ; точная картина поля требует FEA.
- Вихревые потери снаряда сосредоточенный виток на характерной частоте
импульса; диффузия поля (скин-эффект в самом снаряде) не решается.
- Доуэлл берёт одну характерную частоту ω=1/√(LC), без спектра импульса.
- Воздух лобовое сопротивление; поршневой эффект столба воздуха в трубе
не учтён. Трение константа 0.35 (сталь-пластик), не измерено.
- Гистерезис снаряда посчитан и сознательно не включён в динамику (<0.1%).
- Нагрев провода за импульс и от серии выстрелов не моделируется.
Версия физики пишется в каждую запись (`model_version`, сейчас
`gausse-physics-v2`) прогоны разных моделей не смешиваются.