Ревью хранения: честная детализация прогона + общий rebuild + чистка мёртвого кода
По итогам код-ревью коммита5c11999: - run_detail: шапка и энергобаланс — СОХРАНЁННЫЕ при прогоне значения (пересчитанный на лету detail мог противоречить им: GPU-строки и старые model_version считались другим движком/моделью, а energy_breakdown прятался за feasible пересчёта). Пересчёт теперь явно помечен recomputed_with_model_version и обёрнут в try/except — /api/run был единственным эндпоинтом, где падение пересимуляции роняло ответ. - web/rebuild.py: один общий путь «строка БД -> симуляция» для детализации и рендера (раньше два дубля; клик по прогону гонял одну и ту же симуляцию до 5 раз и перечитывал базу компонентов с диска на каждый запрос — теперь кэш компонентов + кэш последних симуляций по run_id). - Мёртвый код после5c11999: ветка build_details=True (единственный вызов передавал False; дефолт True возвращал бы как раз ту дорогую запись, от которой уходили), _FEASIBLE, параметр bounds у _record, поле EvaluationResult.detail и его мёртвая ветка в build_run_record. - overview: n_stages=None (морда покажет «—»), а не 0, когда сводки нет. - PLAN.md/schema.py: убраны утверждения, что полный build_detail хранится в каждой записи (устарело с5c11999), отмечена старая форма записей.
This commit is contained in:
8
PLAN.md
8
PLAN.md
@@ -55,7 +55,7 @@ L(x, I)-модель с coenergy-выводом силы — в разделе "
|
||||
- **Найден и исправлен реальный баг именно на этом этапе**: КПД лучшего генома после `evolve` показал 387% — оказалось, `efficiency` считался как `exit_kinetic_energy / energy_in`, а `exit_kinetic_energy` включает фиксированный "бесплатный" толчок `initial_v_mps`, не учтённый в `energy_in`. Для лёгкого снаряда этот толчок доминировал и КПД пробивал 100%. Исправлено на `kinetic_energy_delta / energy_in` (энергия, реально добавленная катушками) — эта величина математически не может превысить 1 (следует из поэтапного энергобаланса). После исправления лучший результат на тот момент: **1 ступень, КПД 80.97%, скорость 26.4 м/с, снаряд Ст3 ⌀4мм x 30мм, стоимость 1029₽** (провод cu-petv2-1.0mm, конденсатор 22мкФ/400В, ключ IRG4PC50F, оптический датчик). *(Историческая запись: это физика v1 БЕЗ потерь в железе, скина и трения — после их добавления такие КПД невозможны, см. «хронологию честности» ниже.)*
|
||||
- **Честное сравнение датчиков** (запрос из первого обсуждения плана) — на 5000 прогонах: индукционный датчик (`inductive-pickup-lm393`) дал **0.2% реализуемых** конфигураций (6 из 2965, где он стоял хотя бы на одной ступени), тогда как оптический (TCST2103) и Холла (A3144E) — **~45-47%** реализуемых каждый. Это количественно подтверждает опасение, высказанное в самом начале обсуждения плана: индукционная катушка-датчик ненадёжна именно потому, что требует скорости выше её порога (здесь — фиксированный старт 3 м/с как раз ниже порога срабатывания реального компонента), тогда как оптика/Холл не зависят от скорости.
|
||||
- Итог: сквозная цепочка (реальные компоненты → физика → поиск → SQLite → отчёт с графиками/BOM/анимацией) работает и произвела не выдуманный, а посчитанный и перепроверенный результат.
|
||||
- [x] **Обогащённая БД + лог процесса + веб-морда** (по запросу пользователя при деплое): каждая запись `runs.decoded_summary_json` теперь содержит расстояния между катушками (`inter_stage_gaps_m`), абсолютные позиции катушек вдоль трубы, все номиналы деталей, геометрию намотки, вычисленную физику (индуктивность/сопротивление/пиковый ток/поле) и результат каждой ступени (вход/выход скорость, тайминги датчика, энергобаланс) — см. `optim/objective.py::build_detail`. Ход эксперимента пишется в `<db>.log` (`optim/progress_log.py`): прогресс, доля реализуемых, скорость, ETA, отметки нового лучшего КПД. Веб-дашборд `gausse serve` (`src/gausse/web/`, только stdlib `http.server`, self-contained HTML) — счётчики, гистограмма КПД, топ конфигураций с drill-down, причины отказа, хвост лога, автообновление 3с. В `docker-compose.yml` сервис `web` на порту 8000. 77 тестов, проверено в Docker.
|
||||
- [x] **Обогащённая БД + лог процесса + веб-морда** (по запросу пользователя при деплое): каждая запись `runs.decoded_summary_json` теперь содержит расстояния между катушками (`inter_stage_gaps_m`), абсолютные позиции катушек вдоль трубы, все номиналы деталей, геометрию намотки, вычисленную физику (индуктивность/сопротивление/пиковый ток/поле) и результат каждой ступени (вход/выход скорость, тайминги датчика, энергобаланс) — см. `optim/objective.py::build_detail`. *(УСТАРЕЛО с 2026-07-11, коммит 5c11999: полный build_detail больше НЕ хранится на каждый прогон — база раздувалась до 70ГБ; в decoded_summary_json теперь дешёвая сводка decoded_summary(), а полная детализация пересимулируется на лету из genome_json при просмотре прогона — web/rebuild.py + web/stats.run_detail.)* Ход эксперимента пишется в `<db>.log` (`optim/progress_log.py`): прогресс, доля реализуемых, скорость, ETA, отметки нового лучшего КПД. Веб-дашборд `gausse serve` (`src/gausse/web/`, только stdlib `http.server`, self-contained HTML) — счётчики, гистограмма КПД, топ конфигураций с drill-down, причины отказа, хвост лога, автообновление 3с. В `docker-compose.yml` сервис `web` на порту 8000. 77 тестов, проверено в Docker.
|
||||
|
||||
## Батареи конденсаторов + графики в веб-морде (по запросу пользователя)
|
||||
|
||||
@@ -168,11 +168,13 @@ L(x, I)-модель с coenergy-выводом силы — в разделе "
|
||||
катушку — repair()).
|
||||
- **Ссылки на магазины** (`url`) у каждого компонента: в JSON-базе, BOM
|
||||
(«Купить») и в детализации прогона.
|
||||
- **Максимально детальная запись** в БД (`build_detail`): труба
|
||||
- **Максимально детальная запись** (`build_detail`): труба
|
||||
внутр/стенка/внеш, масса снаряда в граммах и влезает-ли-в-бор,
|
||||
внутр/внеш диаметры катушки, состав банки конденсаторов, DC/AC
|
||||
сопротивление обмотки, все позиции датчиков и катушек вдоль трубы,
|
||||
энергобаланс каждой ступени.
|
||||
энергобаланс каждой ступени. *(С 2026-07-11 НЕ хранится в БД построчно,
|
||||
а строится на лету из genome_json при просмотре прогона/отчёте —
|
||||
хранение полной детализации на 12.9М строк раздуло базу до 70ГБ.)*
|
||||
- **Анимация переделана** (была «время вырезается, результата не видно»):
|
||||
кадры на равномерной сетке ФИЗИЧЕСКОГО времени (а не по индексам массива,
|
||||
из-за чего плотные точки разряда съедали все кадры и подлёт выпадал),
|
||||
|
||||
Reference in New Issue
Block a user