Пилот П-3: физическая кодировка входа и выхода — план для координатора air-nn

Составлен главной сессией 03.10.2026 по итогам П-2 и обсуждения с пользователем. Общий план модуля — docs/plan/air_nn.md (раздел 8.2, решения пользователя), контракты — docs/contracts/air-nn.md. Код — tools/research/air_nn_pilot/, данные — $AIR_NN_DATA/pilot/ (~/air_nn_data/pilot).

0. Итог P3 (04.10.2026, решение пользователя)

P3 закрыт: ни кодировка, ни архитектура, ни стратификация, ни чистка целей не дали больше нескольких процентов; заменимость не достигнута ни одним вариантом. Отложенные горные системы, 60 м, сошедшиеся (584), ветер медиана / p90 м/с, ρ медиана / p90 (порог 0,5 / 1):

вариантчтоветер«ок»ρ
P3E0контроль (кодировка P2, 100 мест, 3,2 М)0,683 / 1,9732 %1,22 / 3,54
P3E1×2 каналы (12,3 М, 48 мс ORT)0,665 / 1,9533 %1,19 / 3,47
P3E2новый вход (v5)0,706
P3E3новый выход (v5; вероятна ошибка потерь — смещение +0,37)0,864
P3E4вход и выход v5остановлен на эпохе ~90 (решение пользователя)
P3E5лучший на 300 местахне запускался (остановлен, «ситуация понятна»)
P3E6фоновая стратификация во FiLM0,689 / 1,9931 %1,23 / 3,61
P3E7U-FNO (neuraloperator)0,732 / 2,0929 %1,31 / 3,81
P3E8обучение только на уверенно сошедшихся0,692 / 1,95 (уверенно: 0,707 против E0 0,703; несошедшиеся хуже: 0,59 против 0,48)31 %1,24 / 3,56

Сеть P2 (300 мест, pilot/runs/2026-10-03_p2b): 0,62 / 1,84 — лучшая из всех; данные (×3 мест) дают больше любых правок P3. Ошибка на обучающих местах у всех вариантов ~0,36 м/с («ок» ~61 %, ρ ~0,5) — сеть не подгоняет даже чистые обучающие случаи. Фон стратификации в данных почти один (один месяц, Γ свободной атмосферы постоянен) — вариативность масс в наборе только утром. Решение пользователя: в игре — сеть P2 (пункт «Нейросеть (экспериментально)»), глубокий вопрос (почему не подгоняется) — фоновое исследование пользователя. Отчёты: tools/research/air_nn_pilot/p3/ (p3e6.md, p3e8.md, out/p3e7/p3e7.md), данные — ~/air_nn_data/pilot/reports/2026-10-03_p3*, 2026-10-04_p3e7_fno, 2026-10-04_p3e8.

1. Откуда и зачем

Итог П-2 (прогон 2026-10-03_p2b, отчёт reports/2026-10-03_p2b/report.md; ШП-2: «правим подход»). (г) отложенные горные системы, 60 м, сошедшиеся: ошибка ветра медиана 0,62 м/с (≈ 14 % при средней |V| ≈ 4,5 м/с), p90 1,84 м/с; «ок» ветра 35 % (порог 90 %), подъём 78 / 72 % (без / с нагревом); смещение +0,008 м/с (профиль притока +2,32) — смещения нет; сеть в 4 раза точнее профиля притока. Несошедшиеся: ошибка / собственный разброс решателя — медиана 0,91. Кривая по местам: 25 → 300 мест — 0,83 → 0,62 м/с, ≈ −7 % на удвоение, без полки. ONNX 13 МБ, 21 мс (4 потока CPU).

Полёт пользователя на сети П-2 (сборка air-onnx, 03.10): «в целом даже „летабельно“, совсем чего-то необычного в Аскарово нет». Сквозной путь работает; П-3 — про хвосты на крутом рельефе, не про спасение направления.

Диагноз. Сеть плохо повторяет решатель даже на обучающих местах (49 % «ок», медиана 0,46 м/с) — дело не только в данных: сеть на сетке 400 м и с кодировкой «отклонение от профиля притока на 13 высотах» учит слишком много с нуля и не видит того, что решает обтекание (масштаб рельефа по высоте, обрыв внутри клетки, порог отрыва). Хвосты — на крутом рельефе (Южные Альпы НЗ: «ок» 27 %, Аппалачи 45 %). Данные дороги (≈ 20× мест для 0,45 м/с), поэтому П-3 — кодировка и ёмкость на тех же данных П-2, без нового счёта решателя.

2. Решения пользователя (не обсуждаются)

  • Цель — заменимость решателя, не точность: сеть воспроизводит решатель в пределах собственной погрешности решателя (решатель против измерений: Askervein ≈ ±10–20 % в основном потоке; против себя: разброс поздних состояний, колебания, версии). Критерий: отличие сети от решателя заметно меньше отличия решателя от реальности (решение 03.10, журнал air-nn).
  • Скорость и стабильность важнее точности: ошибка ≈ 10–15 % ветра на месте допустима; гладкое среднее поле лучше точного, но в ~20 раз более медленного и нестабильного. На слабом ветре сеть даёт среднее — это правильно (Q2).
  • Стратегически решатель в игре заменяется ONNX-сетью (модуль air-onnx); решатель — офлайн-источник данных.
  • Не шлифовать: опыты — пачкой одним скриптом, решение по таблице.

3. Кодировка П-3 (предложение; контракт П2 v5 / П3 v4 — координатор фиксирует до исполнителей)

База (до сети, и в игре). Линейная теория обтекания (потенциальное течение / Jackson–Hunt, FFT по рельефу 400 м, нейтрально; код-основа — tools/research/air3d/, «линейное потенциальное (FFT)» в reference.md → «4. Askervein»): на 13 высотах — горизонтальный ветер V_base (модуль, направление) и w_base; уклоны рельефа ∇h_s(z), сглаженного на масштабе высоты z (возмущение от неровности L затухает ~ e^(−z/L)). На CPU — миллисекунды.

Вход — карты 96² × 400 м в системе по ветру (24) + FiLM (18, без изменений):

группакартызачем
без изменений (7)terrain, heat_flux, x, y, tpi_2k, tpi_8k, shelter
уклоны по масштабам (8)вдоль и поперёк ветра рельефа, сглаженного на 400 м, 1,2 км, 3,2 км, 8 км; вдоль ветра со знаком = V̂·∇h (+ наветренный, − подветренный)на высоте z поток чувствует рельеф масштаба ~z; заменяют slope_along, slope_cross
подсеточные из тайлов 25 м (5)sub_slope_std, sub_slope_p95, sub_steep_lee (доля площади клетки, круче 0,3 вниз по ветру), sub_steep_wind (то же вверх), sub_relief (перепад в клетке)обрыв внутри клетки 400 м, которого сеть не видит
отрыв (4)sep_400, sep_1k2, sep_3k2 = σ((−slope_along_s − 0,3)/0,05); sep_wake = max по клеткам выше по ветру sep·exp(−d/(k·H)), d — расстояние по ветру от кромки, H — перепад за кромкой, k ≈ 5–10порог отрыва (~0,3, ~17°) — резкая нелинейность; ротор лежит за склоном на несколько высот уступа — нелокально, как shelter
база (3)разгон линейной теории на 25, 150, 600 мподсказка; остаток учится на выходе

Пороги 0,3 и k — начальные (литература о подветренном отрыве); это вход, не правило — без пользы убрать.

Выход — 9 величин на высоту (m — без нагрева, h — с нагревом):

величинаформулаканалов
разгон к базеa = log(|V|/|V_base|), m и h2
поворот к базеδ = угол(V) − угол(V_base) как (sin δ, cos δ), m и h4
отрыв от склонаw_rel = w − V·∇h_s(z) (у земли ≈ 0 — непротекание), m и h2
температурная добавкаθ′ (h)1

Упаковка по высоте (если проверка Б даст «да»). q(x, y, z) ≈ Σₖ cₖ(x, y)·φₖ(z), φₖ — главные формы профиля (POD/EOF) по обучению, K ≈ 4 → 36 каналов вместо 91.

Ошибка. Разгон и поворот — с весом скорости (по сути ошибка вектора); поворот не считается при |V| < 0,5 м/с (направление не определено: штиль, ядро ротора, возвратное течение); w_rel — свой вес (сейчас вертикаль тонет).

Восстановление в игре. База (FFT) → сеть → |V| = |V_base|·eᵃ, направление = база + δ, w = w_rel + V·∇h_s(z) → термики (масштаб 2) из w_h и θ′ как сейчас. Стык с air-onnx (docs/contracts/air-onnx.md, O1) — новая версия.

4. Задачи

Порядок: сначала дешёвые проверки (А–В, CPU, готовые данные), потом опыты (Г), потом итог (Д). Опыты — на 100 местах П-2 (точка кривой: 2083 обучающих случая, контроль — медиана 0,70 м/с на (г)), ≈ 25 мин GPU на вариант; лучший — на 300 местах (≈ 1,5 ч) для прямого сравнения с П-2. Оценка — на (г), (б), несошедшихся, тем же evaluate.py/report.py плюс сводка заменимости.

№ЗадачаАгентПриёмкаОценка
П3-АЛинейная база: FFT-теория на сетке 400 м по d400_hc, V_base, w_base, ∇h_s(z) на 13 высотах; доля разгона решателя, которую база объясняет на П-2dp-researcher (Sonnet)тест на аналитическом холме (Аньези/гаусс) против известного решения; таблица: ошибка «база против решателя» на (г) рядом с профилем притока; время на случай CPU0,5–1 д
П3-БФормы профиля: POD/EOF целей П-2 (нынешних и в кодировке П-3) по высоте; сколько форм на 95/99 % и ошибка восстановления в м/с на 60 мdp-researcher (Sonnet)таблица K → ошибка восстановления; решение «упаковка да/нет»: да, если при K ≤ 6 ошибка восстановления p90 ≪ 0,3 м/с2–3 ч
П3-ВВходные карты: уклоны по 4 масштабам, подсеточные из tiles/v3 (25 м), маски отрыва и sep_wake; где сидят ошибки П-2 — связь ошибки сети с V̂·∇h, крутизной, sub_steep_lee, кривизной (седловины), Frdp-researcher (Sonnet)контрактный тест карт (повороты ×4, отражение — знаки по П2), побитный повтор; таблица «ошибка П-2 по корзинам признака»1 д
П3-ГОпыты (одним скриптом, пачкой, продолжение после прерывания): (0) контроль — сеть П-2 на 100 местах; (1) та же кодировка, сеть шире (каналы ×2); (2) вход П-3, выход как П-2; (3) выход П-3 (база + разгон/поворот + w_rel), вход П-2; (4) вход и выход П-3; (5) = (4) + упаковка (если П3-Б «да»); лучший — на 300 местахdp-researcher (Opus — GPU, обучение)таблица вариантов: «ок» ветра/подъёма, медиана и p90 ветра на (г), смещение, заменимость; время эпохи и ONNX; лучший на 300 местах против П-21–1,5 д + ~4 ч GPU
П3-ДСводка заменимости и ШП-3: ошибка сети / погрешность решателя по точкам и группам (сошедшиеся, несошедшиеся, (г) по системам); вердикт; ONNX лучшего варианта по контракту air-onnxdp-researcher (Sonnet)отчёт: таблица, вердикт правилом, model.onnx проходит tools/air_onnx/test_contract_o1.py (новая версия О1)0,5 д

Шлюз ШП-3 (пользователю): сеть П-3 против П-2 на (г) — медиана и p90 ветра, «ок» подъёма, смещение, заменимость. Итог: «берём кодировку П-3 в волну 0 / air-onnx», «ёмкость важнее — сеть шире и каскад», «нужны данные — массовый счёт (с NN-19 батчем)».

5. Ограничения и правила

  • Решатель не пересчитывать: только готовые наборы main и terrain (П-2), tiles/v3. Новые карты и база — из них.
  • GPU — под замком (dp lock gpu / GpuLock пилота); опыты — пачкой одним скриптом, одно ожидание, итог одной таблицей (workflow.md, «Пачки запусков»). Памяти ОЗУ 31 ГБ — загрузка массивов без двойных копий (урок П-2, коммит ca543b6).
  • Новое имя прогона на каждое изменение кода обучения (манифест прогона сверяет входы).
  • Картинки не открывать (токены); проверка — числами.
  • Контракт: вход П2 v5 и выход П3 v4 — до исполнителей; потребитель — air-onnx (O1…O6): стык обновить в той же волне, если вариант пойдёт в игру.

6. Держим в уме (не в П-3)

  • Триплан — вертикальный разрез вдоль ветра как отдельная плоскость признаков (отрыв, ротор, волна).
  • Функция тока / потенциал — сохранение массы по построению.
  • Безразмерные числа во FiLM — Fr = U/(N·H), Ri, w*/U.
  • Вторая база — гидравлика мелкой воды (устойчивый слой под инверсией: подпор, проход через седловины, прыжок; Бернулли + неразрывность) — для малых Fr и слабого ветра, если линейная база там не помогает.
  • Каскад окон 50/25 м вокруг пилота (§ 3.1 плана): сети окон с грубым полем родителя на краях, данные — малые домены 2–4 км; сеть области 400 м остаётся.
  • NN-19 — батч случаев в решателе до массового счёта.
  • Признак седловины — кривизна рельефа разного знака по осям (Гессиан).
  • «Вымораживание» (идеи пользователя 03.10): сеть, применяемая итерационно — 2–4 шага уточнения поля (выученный решатель «оседает» за несколько дешёвых проходов; против хвостов на крутом рельефе); диффузионная модель мгновенных состояний поверх сети среднего (живая изменчивость слабого ветра из снимков поздних состояний) — дорого, не сейчас; тёплый старт решателя от сети — задача NN-20 в docs/plan/air_nn.md (8.2).
  • FNO / U-FNO (идея 03.10, после P3E2 «новый вход не помог»): заменить U-Net на Fourier Neural Operator (Li и др., 2020) или гибрид U-FNO (спектральные слои + свёрточная ветка для резких мест). Почему: линейная теория обтекания — умножение в спектре (û = H(k,z)·ĥ, затухание e^(−|k|z)), спектральный слой может выучить «свою» линейную базу с торможением; каждый слой видит всю область — давление, подпор, след за массивом (75–80 % ошибки P2 внутри случая, не привязано к местным признакам); выход без мелкой ряби. Камни: непериодичная область — отражение 2N×2N; срез высоких гармоник сглаживает кромки — нужен гибрид; ONNX DFT (opset 17) или DFT как матрицы 96² — проверить скорость ORT. Проверка: тот же конвейер, 100 мест, кодировка P2, ~3 млн параметров, ~1 ч GPU.
    • FNO и форма рельефа (пользователь): на гладком длинном гребне вроде Аскарово (хребет Биягода, склоны на запад и восток) спектр сосредоточен на низких гармониках вдоль одной линии — FNO должен быть почти точным (линейная теория там почти точна); хуже — крутые кромки с отрывом и изрезанные массивы (Южные Альпы НЗ). При проверке — ошибка по типу рельефа: гладкий гребень / холм / изрезанный массив; ожидание — наибольший выигрыш FNO над U-Net на гладких формах.
    • FNO на DCT вместо FFT: DCT = Фурье зеркально отражённого сигнала, без предположения о периодичности (линейная база P3 уже считалась с отражением 2N×2N); в литературе есть FNO на DCT ровно для непериодических границ.
  • Базис + линейная комбинация (идея пользователя 03.10, «как DCT в JPEG»): чистая суперпозиция по ортогональному базису рельефов работает только для линейного отклика — это линейная теория (гармоники Фурье/DCT — диагональный базис), что P3 уже показал недостаточным (нет торможения массивом, отрыва, блокирования). Обобщения: (1) POD-NN / DeepONet — ортогональный базис полей ветра (главные формы решений), маленькая сеть даёт K коэффициентов по рельефу и условиям, итог — линейная комбинация (нелинейность — в коэффициентах); (2) сокращённая модель с проекцией (reduced basis, Галёркин) — коэффициенты находят сами уравнения, спроецированные на базис: в игре решается система из K уравнений, физика и нелинейность сохраняются, цена — мс; (3) базис по режимам (нейтрально / устойчиво при малом Fr / конвективно) — внутри режима отклик почти линеен; (4) локально, как блоки JPEG — библиотека откликов участков (склон, гребень, седловина) со сшиванием, плохо с дальними эффектами (след, подпор). Базис можно строить на место (поля одного места похожи — десятки форм, «запомнить места»). Первый вопрос до работы: сколько базисных полей восстанавливают поля одного места и всех мест с ошибкой меньше погрешности решателя (как POD по высоте в P3, где на 0,1 м/с нужно ~8 форм).
  • Срезы рельефа как стенки (идея пользователя 03.10): рельеф режется горизонтальными плоскостями по высоте над морем; на срезе земля выше уровня — стенка; на каждом срезе — 2D-обтекание стенок (Лаплас с непротеканием, FFT/многосетка 96², мс на срез), проход снизу вверх: сходимость горизонтального течения в слое даёт w (∂w/∂z = −div u_h) и приток следующему срезу. Физика: точный предел сильной устойчивости Fr ≪ 1 — послойно двумерное обтекание (Drazin 1961, Hunt & Snyder 1980); гибрид — ниже разделяющей высоты H(1 − Fr) срезы и обход, выше — линейная теория (перевал), граница по Fr случая; конвекция — отдельно. Даёт то, чего нет у линейной базы P3: торможение массивом и подпор, обход, проходы и седловины (сужение сечения → разгон, Вентури), затекание в долины. Применение: (1) база для сети вместо линейной теории; (2) входные признаки по срезам — доля открытого сечения, расстояние до стенки, ширина прохода, тень выше по ветру на своей высоте (нелокальные, в отличие от уклонов P3E2); (3) самостоятельная модель режима «вечер, устойчиво». Цена — десятки мс на CPU для 20–30 срезов. Отличие от «слоёв как матриц» (heat_ca exp4): там полные уравнения послойно (упор — перенос тепла), здесь геометрия + 2D-течение в своём режиме.
  • Марш по ветру вертикальными срезами (идея пользователя 04.10): область режется вертикальными плоскостями поперёк ветра (срез — y–z), расчёт идёт от наветренной кромки: каждый срез получает поток массы от предыдущего; подрос рельеф снизу — тот же поток проталкивается через меньшее сечение, 2D-задача в срезе (96 × 13) распределяет массу вверх и в стороны. Родство: параболизованные уравнения Навье — Стокса (PNS, space marching). Даёт сам: разгон над гребнем (сужение сечения, нелинейно), обход сбоку, подветренные волны при устойчивости (развиваются по потоку — маршу естественно); цена — мс на CPU. Ломается: давление распространяется и против ветра (торможение и обтекание перед горой на ~ширину горы, блокирование низа при малом Fr) — лечится 2–3 парами проходов вперёд/назад с поправкой давления (стандарт PNS); отрыв за крутым склоном (обратный ток, марш невозможен) — огибающая зоны отрыва по маске склона > ~0,3, поток поверх пузыря. Пара к «срезам как стенкам»: горизонтальные срезы — предел обтекания (Fr ≪ 1), вертикальный марш — предел перевала; граница — разделяющая линия тока h = H·(1 − Fr) (Sheppard 1956): ниже срезы-стенки, выше марш. Применение: база для сети вместо линейной теории (поправка меньше), входной канал «карта разгона от марша», запасной режим ветра в игре. Проверка (если дойдёт): прототип NumPy на 100 местах P3 против решателя и базы линейной теории P3E3, 1 и 3 прохода — медиана/p90 на 60 м, гребни/долины/подветренные склоны.
  • Нити по ветру и Монте-Карло (идея пользователя 04.10: «нити, как рейкаст, но Безье вдоль земли по ветру; решать не численно, а Монте-Карло»). (1) Трубки тока: соседние нити ограничивают трубку с постоянным потоком массы, сужение над гребнем → разгон; лагранжева форма марша по ветру; форма нити сама не известна (подъём перед горой, отрыв, обход) — правилом получится эвристика как в 0.8.0, из физики — только вместе с давлением. Поршень в трубке (идея пользователя: «прошлый воздух, как поршень, давит на следующий до предела»): настоящая сжимаемость ничтожна (M ≈ 0,03, Δρ ≈ 0,05 %), но это (а) искусственная сжимаемость (Chorin 1967) — медленный выдуманный звук, давление расходится по трубкам волнами вперёд и назад и оседает в несжимаемое поле, локально, без уравнения на всю область; лечит подпор перед горой у марша; (б) под инверсией «предел» физичен — аналогия мелкая вода ↔ газ (толщина слоя ↔ плотность, Fr ↔ Mach): подпор при Fr < 1, запирание седловины при Fr = 1 (как сопло), прыжок за перевалом (фён/бора). (2) Блуждание по сферам (walk on spheres; Sawhney & Crane 2020; условие непротекания — walk on stars, 2023): значение в точке — среднее случайных блужданий до границы, без сетки; строго только для линейных уравнений → потенциальное течение (как массосогласованный WindNinja: разгон и поворот есть, торможения массивом, отрыва и затенения нет). Даёт: поле только вокруг пилота, любое разрешение у земли (каскад окон 50/25 м сам собой), идеально параллельно (GPU); шум ~1/√N похож на порывы, но спектр не физический. Для нелинейного — метод случайных вихрей (Chorin 1973), нестационарно и дороже. Применение: точная безсеточная потенциальная база, сеть учит поправку (торможение, отрыв, устойчивость).
  • Сетка, искажённая потоком: ячейки = трубки (идея пользователя 04.10). Два уровня. (1) σ-сетка по рельефу — стандарт метеомоделей (WRF); для решателя отвергнута в AM-01 (tools/research/air3d/reference.md, «σ-сетка или маска»: уклоны до ~40°, перекрёстные метрические члены одного порядка с главными, ложные потоки у крутых склонов); выход сети уже в координатах над рельефом (13 высот AGL). (2) Сетка по линиям тока — метод кривизны линий тока (streamline curvature, расчёт турбомашин с 1950–60-х), в 2D-разрезе вдоль ветра — координаты (s, ψ) (преобразование фон Мизеса): масса сохраняется по построению (сквозь стенку трубки нет потока), неизвестные — положения линий сетки, скорость = поток / сечение; вдоль трубки — Бернулли и «поршень» (искусственная сжимаемость), поперёк — баланс давления и кривизны (∂p/∂n = ρV²/R); разрешение само сгущается над гребнем; итерация: угадали трубки → скорости по сечениям → поперечный баланс → сдвинули. Камни: отрыв (трубка не разворачивается — огибающая над зоной отрыва), 3D-закрутка (поворот с высотой, обход — два семейства поверхностей тока; практично — разрезы вдоль ветра с 2D-трубками и связью соседних разрезов), пересечение/вырождение трубок (перестройка). Для игры: ответ — сама форма сетки (тысячи чисел, несколько итераций); модель перевала при сильном ветре в паре со «срезами как стенками» для обхода при слабом.