ALEM WIND
Почасовой прогноз мощности двух ветротурбин на 24–48 часов с ежедневным переобучением, бэктестом против базовых методов, расчётом потерянной выручки…
О проекте
Команда: XY
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Почасовой прогноз мощности двух ветротурбин на 24–48 часов с ежедневным переобучением, бэктестом против базовых методов, расчётом потерянной выручки и PDF-отчётами. Веб-дашборд на карте MapLibre.
Как устроено
Программные агенты (data_agent, model_agent) готовят погодные данные и SCADA и обучают совместный Transformer двух турбин: история 72 ч, горизонт 24 ч, 10 эпох, seed 42. Физические ограничения проверяются отдельно. Оркестратор делает rolling expanding-переобучение по дням на CPU и NVIDIA L4 (CUDA/cuML) и сравнивает модель с persistence и кривой мощности по MAE/RMSE. Веб-приложение под Gunicorn показывает сохранённые прогнозы, считает Lost Energy Revenue и формирует PDF/HTML/ZIP-отчёты.
Ключевые решения
- Transformer (joint two-turbine)
- rolling expanding retraining
- persistence baseline
- power curve baseline
- MAE/RMSE backtest
- Lost Energy Revenue
- SHA-256 reproducibility manifest
Метрики
Holdout 25–29 янв: Transformer CPU T1 MAE 0.341/RMSE 0.386, T2 MAE 0.368/RMSE 0.407 p.u.; persistence T1 MAE 0.441; кривая мощности T1 MAE 0.288 (лучше модели по MAE)
Особенности
Протокол оценки воспроизводим: holdout задан заранее, verify_results.py пересчитывает MAE/RMSE по сохранённым прогнозам, есть хеши артефактов и проверка паритета CPU/GPU. Авторы прямо пишут, что простая кривая мощности обходит Transformer по MAE на holdout.
Стек
Python 3.11 · PyTorch · CUDA/cuML (RAPIDS) · Gunicorn · MapLibre · Docker · Render · GitHub Actions
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-c9937c44-xy.
README
README.mdALEM WIND
Почасовой прогноз мощности ветроэлектростанции на 24–48 часов.
HackAlem AI · трек 01 «Энергетика» · кейс Самрук-Казына.
Стартовый прототип: три программных агента готовят данные, обучают совместную модель двух турбин и проверяют физические ограничения. Оркестратор воспроизводит ежедневные прогнозы за 1–28 февраля 2026 года. Здесь есть Python-пайплайн, тесты и интерактивный макет интерфейса. Это первый инженерный baseline; качество прогноза на скрытом феврале ещё не измерено.
Материалы Open Design интегрированы: интерактивная географическая карта MapLibre,
синхронный выбор часа и турбины, анимация, мобильная компоновка. Расчёты CPU/GPU,
экономика и научные отчёты сохранены. Запуск: python -X utf8 -B serve_preview.py --port 8767,
адрес: http://localhost:8767/. Подложке OpenFreeMap нужен интернет;
без карты доступны карточки и расчёты. Происхождение материалов и детали интеграции.
Быстрый старт на localhost — без Docker
Основной способ проверки MVP — обычный Python 3.11. Docker, NVIDIA/CUDA, PyTorch, Flask и аккаунт хостинга для просмотра готовых прогнозов, расчёта экономики и создания отчётов не нужны.
Получите ветку main (для приватного репозитория нужен доступ GitHub):
git clone --branch main --single-branch https://github.com/BAITC-Hacks/hack-c9937c44-xy.git
cd hack-c9937c44-xy
macOS / Linux:
python3.11 -m venv .venv
.venv/bin/python -m pip install -r requirements-reports.txt
.venv/bin/python main_simulation.py --demo
.venv/bin/python serve_preview.py
Windows / PowerShell, из той же папки проекта:
py -3.11 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-reports.txt
.\.venv\Scripts\python.exe main_simulation.py --demo
.\.venv\Scripts\python.exe serve_preview.py
Откройте http://localhost:8767/ и оставьте терминал работающим. Главная страница сразу выбирает сохранённый GPU-прогноз за январь. Команда --demo подготавливает дополнительный источник «Python демо» без обучения и сетевых запросов. Для остановки сервера нажмите Ctrl+C; если порт занят, добавьте --port 8768 к команде запуска сервера.
Проверьте выбор выпуска и турбины, измените тариф в «Экономике», затем нажмите «Сформировать отчёт» и скачайте PDF/ZIP. Отчёты остаются в outputs/reports/ после остановки сервера. Это просмотр проверенных результатов; повторное обучение модели описано отдельно ниже.
Автоматическая проверка из второго терминала (на Windows замените .venv/bin/python на .\.venv\Scripts\python.exe):
.venv/bin/python verify_results.py
.venv/bin/python tests/smoke_web.py http://localhost:8767 . outputs/local-check.json
Она проверяет интерфейс, шесть источников, экономику, PDF/ZIP и контрольные суммы. Не запускайте вместо serve_preview.py обычный python -m http.server: у него нет API экономики и отчётов.
Объединённая версия с картой проверена: 62 Python-теста, 16 UI-тестов, сохранённые GPU-артефакты и полный HTTP-сценарий в чистом Python-окружении без Docker, PyTorch, RAPIDS, Flask и Gunicorn. Лог общих тестов, проверка localhost с версиями, хешами PDF/ZIP и исходников.
Опционально: Docker и онлайн-развёртывание
Развернуть бесплатно в Render — конфигурация render.yaml выбирает Docker, Free и Франкфурт. Репозиторий приватный: Render нужен доступ к этому репозиторию через GitHub App; организация может потребовать подтверждение администратора. Сервис пока не опубликован. После развёртывания Render выдаёт HTTPS-адрес *.onrender.com; свой домен не нужен. Последующие push в main запускают обновление сервиса.
Сервис открывает сохранённые GPU-прогнозы, считает Lost Energy Revenue и формирует PDF/HTML/ZIP. web_app.py работает через Gunicorn с одним процессом; тяжёлые отчёты формируются по одному. GPU на веб-сервере не требуется: новое обучение выполняется отдельно. Исходные SCADA, .env, .git и локальная среда исключены из Docker-образа; HTTP выдаёт только разрешённые файлы интерфейса и результатов.
По условиям Render Free, проверенным 23.09.2026, сервис засыпает после 15 минут простоя, получает 750 бесплатных часов в месяц на workspace и не имеет постоянного диска. У него нет заданного нами срока удаления через 14 дней, но непрерывная доступность не гарантируется. Прогнозы и доказательства сохранены в Git и входят в образ. Новые отчёты скачивайте: на Render Free они могут исчезнуть после перезапуска или развёртывания и затем формируются заново. Искусственный keep-alive не настроен.
Локальный запуск или запуск на собственном сервере с постоянным Docker volume для отчётов:
docker compose up --build -d
curl http://127.0.0.1:8080/healthz
# Открыть http://127.0.0.1:8080/
docker compose logs --tail 50
Compose ограничивает память 512 МБ, запускает процесс без root, делает образ доступным только для чтения и хранит отчёты в volume reports. Не добавляйте -v к docker compose down, если нужно сохранить отчёты. Для публичного собственного сервера перед портом 8080 нужен HTTPS reverse proxy; в Render TLS предоставляет платформа.
Проверки сервера: pip install -r requirements-web.txt и python -m unittest discover -s tests -p test_web_app.py -v. Полный набор дополнительно требует зависимостей прогнозного пайплайна из requirements.txt.
Проверка работающего контейнера: python tests/smoke_web.py http://127.0.0.1:8080 . /tmp/alem-web-check.json. Она проверяет шесть источников, закрытые пути, совпадение экономики с эталоном и создаёт PDF/ZIP с проверкой SHA-256 всех файлов архива. Лог 61 Python-теста и 12 UI-тестов, проверка Docker.
Проверенные результаты CPU и NVIDIA L4
Проверка выполнена 23.09.2026. В репозиторий включены реальные результаты, а не только описание успешного запуска. Быстрая проверка без GPU, сети и сторонних Python-пакетов:
python verify_results.py
Команда сверяет SHA-256, дневные CSV и общий submission, наличие checkpoints, временные границы в аудите, размер выборок и самостоятельно пересчитывает MAE/RMSE из сохранённых прогнозов и наблюдений. Она не запускает CUDA повторно и не подтверждает достоверность исходных измерений без исходных CSV. Ссылки на доказательства:
| Проверка | Артефакт |
|---|---|
| Исходный CPU-прогноз 30 января, сохранён без изменения | backtest |
| Повтор CPU-прогноза и оценка | replay |
| 14 ежедневных CPU-обучений и прогнозов | rolling-january |
| Паритет CPU/GPU с одинаковыми весами и отдельное CUDA-обучение | verification.json, полный лог |
| 14 ежедневных CUDA/cuML-обучений и прогнозов | rolling-january-gpu, лог |
| Реальный GPU и установленная среда | nvidia-smi, версии, Conda export |
| Исходная CPU/UI-проверка и тесты на L4 | CPU/UI, GPU tests |
| Хеши результатов, исполнявшегося кода и исходных CSV | manifest.json |
| Научный отчёт по GPU-выпуску 29 января: 6 рисунков и 48 фактических турбино-часов | PDF, HTML, рисунки, CSV и аудит в ZIP |
Протокол оценки
Горизонт 24 часа, история 72 часа, 14 суточных обучающих примеров, 10 эпох, seed 42, совместный Transformer двух турбин. Настройки одинаковы на всех датах; политика expanding ежедневно переобучает модель только на доступных до выпуска наблюдениях. Development: 16–24 января (9 выпусков); holdout: 25–29 января (5 выпусков). Граница была выбрана до расчёта этих метрик; отдельной внешней регистрации протокола нет. Уже просмотренное 30 января не включено в holdout.
В каждом rolling-запуске 672/672 сопоставленных турбино-часа, исключено 0; holdout содержит по 120 часов на турбину. Все методы оцениваются на одинаковых часах. Persistence — значение последнего наблюдаемого часа перед выпуском, фиксированное на весь горизонт. MAE = mean(|прогноз − факт|), RMSE = sqrt(mean((прогноз − факт)²)); единица p.u.
| Выборка / метод | T1 MAE | T1 RMSE | T2 MAE | T2 RMSE |
|---|---|---|---|---|
| Development · Transformer CPU | 0.285952 | 0.365977 | 0.281505 | 0.367128 |
| Development · Transformer L4 | 0.286086 | 0.366257 | 0.281391 | 0.368497 |
| Development · persistence | 0.336921 | 0.481892 | 0.322454 | 0.465179 |
| Development · кривая мощности | 0.357655 | 0.506047 | 0.342951 | 0.492558 |
| Holdout · Transformer CPU | 0.341337 | 0.386011 | 0.367809 | 0.406868 |
| Holdout · Transformer L4 | 0.345368 | 0.390735 | 0.366877 | 0.406949 |
| Holdout · persistence | 0.440778 | 0.563261 | 0.455472 | 0.580702 |
| Holdout · кривая мощности | 0.288436 | 0.431351 | 0.290770 | 0.437501 |
| 30 января · Transformer CPU | 0.382481 | 0.434209 | 0.314678 | 0.356434 |
| 30 января · Transformer L4 | 0.380936 | 0.432263 | 0.323644 | 0.365402 |
| 30 января · persistence | 0.280556 | 0.364332 | 0.267569 | 0.357635 |
| 30 января · кривая мощности | 0.709259 | 0.746397 | 0.722245 | 0.760259 |
На этом holdout Transformer лучше persistence по MAE/RMSE обеих турбин. Однако простая кривая мощности лучше Transformer по MAE holdout, а 30 января модель проигрывает persistence по MAE. Поэтому превосходство над всеми baselines не заявляется. Кривая использует некалиброванный ветер 10 м и не является паспортной характеристикой ВЭУ. Все значения, включая эту кривую и метрики каждого lead, сохранены в evaluation.json/evaluation.csv; сопоставленные GPU-строки доступны отдельно.
Что подтвердил GPU-тест
NVIDIA L4 в Brev/GCP, драйвер 595.91.07, PyTorch 2.13.0+cu126, CUDA runtime 12.6, cuDF/cuML 25.10, CuPy 14.2.0, Python 3.11.16. Проверены обработка обоих полных CSV через cuDF, нормализация cuML, размещение модели на CUDA и обучение с AMP.
Ran 42 tests in 3.621s
OK (skipped=1)
PASS: pandas/cudf hourly features and missing-value masks match
PASS: same-checkpoint CPU/cuda inference; max difference=3.8743019e-06
PASS: cuda training and evaluation completed, 48 rows
PASS: 14 CUDA/cuML training origins and 672 evaluated turbine-hours
На L4 пропущен только тест поведения при отсутствии CUDA. Набор из 42 тестов относится к версии прогнозного пайплайна до объединения с модулем научных отчётов; полный объединённый набор проверен отдельно: 53 Python-теста, OK, плюс 9 тестов отчётного UI и проверка отображения оценок; лог Python. Эти проверки настроены в CI, но запуск для коммита с результатами не начался: GitHub сообщил о блокировке аккаунта из-за billing issue. Успешная облачная проверка не заявляется; приведённые выше 53 теста выполнены локально. Числовой паритет использует один CPU-checkpoint и допуск rtol=atol=1e-4; повторное обучение с AMP и другой версией PyTorch не обязано давать те же веса или прогнозы. Превосходство GPU по скорости не измерялось. Инстанс удалён после скачивания результатов; повторный запуск потребует нового доступа к GPU.
Независимая перепроверка и воспроизведение
В Git опубликованы погода, прогнозы, аудит и checkpoints пяти зафиксированных запусков. Полные исходные SCADA остаются в data/raw/ вне Git; проверяющему нужны два CSV организатора с именами и SHA-256 из manifest.json. observations.csv — 720 уникальных почасовых фактов для опубликованных дат, полученных из этих CSV, без интерполяции. Он используется только для оценки и научных рисунков.
С оригинальными данными можно повторно вычислить наблюдения, persistence и метрики, а не доверять сохранённым фактам:
python -m pip install -r requirements.txt
python verify_results.py --data-dir data/raw
python -m unittest discover -s tests -q
node tests/test_preview.cjs
node tests/report-ui.test.cjs
SHA-256 обнаруживает изменение зафиксированных файлов, но сам по себе не является внешней аттестацией эксперимента. cpu-verification.txt — исторический лог до GPU-проверки; его строка «GPU not tested» описывает состояние на тот момент.
Воспроизведение одной даты без новых погодных запросов (новая папка обязательна):
python gpu_check.py --cpu-rehearsal --output outputs/recheck-cpu
# В настроенной среде NVIDIA, без --cpu-rehearsal:
python gpu_check.py --output outputs/recheck-gpu
Для повторения проверенного Linux x86_64 окружения используйте установленный Miniforge/Conda и драйвер NVIDIA, совместимый с CUDA 12.6:
conda create -y --prefix .gpu-env --file outputs/evidence/gpu-conda-explicit.txt
conda activate "$PWD/.gpu-env"
export LD_LIBRARY_PATH="$CONDA_PREFIX/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
python -m pip install torch==2.13.0 --index-url https://download.pytorch.org/whl/cu126
python gpu_check.py --output outputs/recheck-gpu
Conda export фиксирует нативные библиотеки, pandas 2.3.3 и scikit-learn 1.7.2. gpu-packages.txt — диагностический pip freeze, не переносимый requirements-файл: в нём есть пути сборки Conda. RAPIDS 26.08 требует pandas 3; cuML 25.10 не импортировался со scikit-learn 1.9.1. Переменная LD_LIBRARY_PATH нужна проверенной среде, чтобы PyTorch не загрузил старую системную библиотеку C++ перед RAPIDS. Это команды восстановления окружения, не команда аренды машины.
Повтор rolling-эксперимента на CPU; для L4 замените pandas/cpu на cudf/cuda и используйте другую новую папку:
python main_simulation.py --data-dir data/raw --data-timezone UTC --history-policy expanding --backend pandas --device cpu --start 2026-01-16 --end 2026-01-29 --horizon 24 --lookback 72 --train-days 14 --min-train-samples 14 --epochs 10 --seed 42 --output outputs/recheck-rolling
python evaluate.py --forecasts outputs/recheck-rolling --turbine-1 "data/raw/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv" --turbine-2 "data/raw/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv" --data-timezone UTC --holdout-start 2026-01-25T00:00:00Z
Фактические GPU-запуски выполнялись с выключенным TF32 и запретом сетевых запросов requests; использован опубликованный погодный кеш. Для точного повторения этого режима перед run(args) задайте torch.backends.cuda.matmul.allow_tf32 = False, torch.backends.cudnn.allow_tf32 = False и запретите requests.sessions.Session.request, как в gpu_check.py.
Пределы вывода: подтверждена работоспособность пайплайна и согласованность конкретных артефактов. Holdout — лишь пять соседних дней, турбины и часы зависимы; статистическая значимость, переносимость на другие сезоны и доверительные интервалы не оценены. UTC, координаты, высоты и задержка SCADA не подтверждены. Восьмичасовой погодный lag — допущение, а не журнал фактической публикации. Точность скрытого февраля, CFD/Modulus и соответствие IEC/ГОСТ не доказаны.
Как выглядит программа
Исходник макета · Код интерфейса
python -m pip install -r requirements-reports.txt
python serve_preview.py --port 8767
Откройте http://127.0.0.1:8767/preview/. Локальный сервер показывает интерфейс, читает опубликованные запуски в outputs/ и формирует научные отчёты. Сборка и JavaScript-зависимости не нужны.
Главный экран использует карту-схему: две выбираемые турбины, переключатель мощности/ветра и почасовая лента с воспроизведением. Выбор часа синхронизирован с графиками и таблицей. Работают дата выпуска, горизонт 24/48 часов, фильтр турбин и выгрузка CSV. Карта — условная схема, а не настоящая топография или погодный слой.
Источник «Демо интерфейса» генерирует синтетический сценарий в браузере. «Python демо» читает CSV и JSON из outputs/demo/; «Прогноз модели» — из outputs/backtest/. Для GPU-эксперимента откройте http://127.0.0.1:8767/preview/?run=rolling-january-gpu и выберите выпуск из manifest; на графике есть факт и persistence. Обучение из браузера пока не запускается; при отсутствии файла показывается ошибка. В режиме модели пороги ротора не применяются к ветру на 10 м.
Актуальные команды, результаты и план продолжения: HANDOFF.md. Дополнительные снимки исходников находятся в handoff/.
Научные отчёты
В разделе «Научные отчёты» → «Сформировать отчёт» создаётся PDF с методикой и четырьмя научными рисунками: почасовыми траекториями, рабочими точками P(v), кривыми обеспеченности и часовыми изменениями мощности. Доступны автономный HTML, SVG, PNG 300 dpi и ZIP с данными и контрольными суммами. Отчёт охватывает обе турбины и выбранные дату, источник и горизонт.
При наличии outputs/observations.csv для модельного прогноза добавляются сопоставление с фактом, распределение ошибок и MAE/RMSE/bias. Без факта показатели качества остаются недоступными. Формат наблюдений, методика и CLI: SCIENTIFIC_REPORTS.md. Раздел проверен с браузерным демо и артефактами Python.
В отчёты включена нормативная основа ВЭС: ГОСТ 7.32-2017 для структуры отчёта о НИР и IEC 61400-12-1:2022 с COR1:2025 для измерения характеристик ВЭУ. Полный шаблон НИР и измерительные испытания пока не реализованы; соответствие стандартам не заявляется. Профиль и официальные ссылки доступны в интерфейсе, PDF/HTML и JSON-аудите. После этих изменений весь набор — 52 теста, OK.
Экономика: Lost Energy Revenue
Откройте http://127.0.0.1:8767/preview/?run=rolling-january-gpu#economics. Панель переводит почасовой прогноз обеих турбин в энергию и риск недополученной выручки относительно заданного плана. Введите номиналы T1/T2, постоянный план отпуска, тариф продажи без НДС и его источник/дату. Изначальные 2+2 МВт, план 3 МВт и 25 ₸/кВт·ч — иллюстративный сценарий, не параметры ВЭС и не текущий тариф.
P(t), МВт = p.u.(T1,t) × номинал T1 + p.u.(T2,t) × номинал T2
Недобор, МВт·ч = Σ max(план МВт − P(t), 0) × 1 ч
Lost Energy Revenue, ₸ = недобор МВт·ч × 1000 × тариф ₸/кВт·ч
Избыток в другом часу не компенсирует дефицит без накопителя. Принято, что 1 p.u. соответствует номинальной мощности; до бизнес-применения нужно подтвердить базу нормировки исходных CSV. Низкий прогноз ветра на 10 м не используется как доказательство остановки ротора; прогноз мощности повторно не обнуляется. Это сценарный риск выручки, не установленный убыток или дефицит всей сети.
При вводе обеих цен закупки агент сравнивает стоимость покрытия почасового дефицита заранее и через балансирование. Разница затрат показывается отдельно от Lost Energy Revenue; положительная экономия не обещается без заданных цен. Комиссии, штрафы, сетевые потери, рыночные ограничения и ошибка прогноза не моделируются; заявки на рынок не отправляются. Цена продажи зависит от договора (РФЦ), балансирующая энергия рассчитывается отдельно (KOREM); источники проверены 23.09.2026, live-котировки не подключены.
economics.py выполняет единственный серверный расчёт через /api/economics; для модельного источника сервер читает сохранённые CSV и аудит. Текст рекомендации формируется из рассчитанных величин. Смена выпуска, горизонта или параметров очищает старый результат. JSON доступен в панели; PDF/HTML включают экономический раздел, ZIP — economics.csv, economics.json, параметры, допущения и SHA-256. Экономику можно отключить перед формированием отчёта.
Проверенный пример на GPU-прогнозе 29 января: 31.1181198 МВт·ч прогнозной энергии, план 72 МВт·ч, недобор 40.8818802 МВт·ч, риск 1 022 047.005 ₸ при сценарном тарифе 25. Сценарные цены закупки 15/30 ₸ дают разницу 613 228.203 ₸. JSON расчёта, PDF, полный ZIP. Это отдельный сценарный расчёт поверх сохранённых GPU-прогнозов; нового обучения или расходования GPU-кредитов нет.
После интеграции прошли 57 Python-тестов, 12 UI-тестов и прежняя проверка отображения оценок. В том числе проверены МВт → кВт·ч → ₸, недопустимые параметры, отсутствие взаимозачёта разных часов, выгода/невыгода закупки и защита от устаревших ответов. Запуск: python -m unittest discover -s tests -q, node tests/report-ui.test.cjs, node tests/economics-ui.test.cjs, node tests/test_preview.cjs. Предыдущие GPU-артефакты и лог из 53 тестов сохранены без изменения.
Архитектура
flowchart LR
SCADA[CSV двух турбин<br/>измерения каждые 10 минут] --> DATA
WEATHER[Open-Meteo<br/>архив прогнозов] --> DATA
CLOCK[Время симуляции T] --> DATA
DATA[Агент данных<br/>cuDF · почасовые признаки] --> MODEL
MODEL[ML-агент<br/>PyTorch Transformer] --> CHECK
CHECK[Валидатор<br/>мощность 0–1 · пороги ветра] --> OUTPUT[CSV + JSON-аудит + checkpoint]
MAIN[main_simulation.py<br/>ежедневный оркестратор] -.-> DATA
MAIN -.-> MODEL
MAIN -.-> CHECK
| Модуль | Реализация |
|---|---|
data_agent.py | Русские заголовки CSV, агрегация и rolling через cuDF, явный CPU-backend, прогнозы Open-Meteo, проверяемый кеш |
model_agent.py | Совместный encoder–decoder Transformer, CUDA AMP, AdamW, cuML StandardScaler по обучающим входам на GPU, сохранение модели |
validator_agent.py | Ограничения мощности и ветра, явная точка расширения для Modulus |
main_simulation.py | Календарь симуляции, проверка доступности данных, обучение/инференс, ежедневные файлы и общий submission.csv |
main.py | Совместимый вход для прежних команд запуска |
evaluate.py | Оценка завершённого запуска по позднее полученным SCADA: MAE/RMSE модели, persistence и простой кривой мощности |
preview/ | Статическая панель просмотра CSV/JSON, выбор источника, даты и горизонта |
tests/ | Проверки причинности, полноты данных, кеша, модели, физики и ежедневного цикла |
Агенты здесь — специализированные исполняемые модули, управляемые детерминированным оркестратором. LLM/NIM не участвует в численном прогнозе. TFT, GNN и модель потоков Modulus пока не реализованы; выбран Transformer как проверяемая начальная архитектура. cuDF выполняет агрегацию и rolling на GPU, cuML — нормализацию входов модели. Небольшие таблицы погоды, часовые пояса и метаданные обрабатываются на CPU.
Публичные функции: fetch_weather_forecast(lat, lon, current_date) в data_agent.py, train_model(TrainingData, config) и predict(model, ForecastData) в model_agent.py, validate_power(power, wind) в validator_agent.py. Контракты обучения и прогноза содержат временные метки доступности погоды; функции проверяют их до обращения к модели.
Данные и единицы
CSV содержат время, среднюю скорость ветра, нормализованную активную мощность и температуру. Пути передаются аргументами; полные исходные CSV исключены из Git. Погодный кеш и зафиксированные результаты с весами опубликованы для проверки; новые эксперименты остаются локальными.
Проверка реальных файлов обнаружила:
| Источник | Строк по 10 минут | Полных часов до 01.02.2026, при интерпретации UTC |
|---|---|---|
| Турбина 1 | 142 360 | 23 667 |
| Турбина 2 | 149 499 | 24 785 |
Оба файла фактически заканчиваются 31.01.2026 23:50, хотя названия упоминают 28.02.2026. Февральских измерений в них нет. В непрерывной почасовой сетке 25 392 интервала; пропуски сохраняются.
Почасовая мощность — среднее шести уникальных десятиминутных измерений. Это нормализованная средняя мощность (p.u.), а не сумма и не энергия в МВт·ч. Для энергии нужна номинальная мощность турбины. Неполные часы и окна не заполняются будущими значениями. Конфликтующие дубликаты отклоняются.
Временная метка считается началом измерительного интервала. Часовой пояс CSV не указан в материалах, поэтому реальный запуск требует --data-timezone. Координаты взяты из запроса: T1 (51.04, 71.46), T2 (51.05, 71.45). Перед финальной оценкой нужно сверить координаты, часовой пояс и соглашение о метках с владельцем данных.
Защита от утечки
- Сырые наблюдения отсекаются по
timestamp < Tдо численного преобразования, агрегации и rolling. Используются только полностью завершённые часы. - У обучающей последовательности история
[s−lookback, s)и целевые часы[s, s+horizon). Последний целевой час строго раньше обучающего cutoff. - Будущие погодные признаки для обучающего примера запрашиваются на момент s, а для прогноза — на момент T. Фактическая погода не подставляется в decoder.
- Нормализация обучается только на обучающих массивах. Внутренней случайной validation-разбивки нет; число эпох фиксировано. Train loss не считается оценкой качества backtest.
- Отсутствующий прогноз, неверные единицы, NaN и несовпадение времён останавливают расчёт. Автоматической замены на ERA5, reanalysis или live forecast нет.
- Кеш включает источник, модель, координаты, горизонт, cutoff, политику доступности и контрольную сумму ответа.
Обычный Historical Forecast API склеивает первые часы последовательных запусков. Для будущих признаков такого ряда недостаточно. Начальный адаптер использует Previous Runs API, модель gfs_global, переменные с суффиксом _previous_dayN.
Для каждого прогнозируемого часа v выбирается упреждение:
N = max(1, ceil((v − T + publication_lag) / 24 часов))
issued_at_upper_bound = v − N × 24 часа
available_at_upper_bound = issued_at_upper_bound + publication_lag
available_at_upper_bound ≤ T
По умолчанию publication_lag = 8 часов. Это консервативное предположение о публикации, не подтверждённый журнал фактического времени выдачи. Адаптер сохраняет вычисленные верхние границы, не выдавая их за точный run_id. Для окончательного доказательства доступности каждого исходного прогноза потребуется архив запусков с подтверждённым временем публикации. Single Runs API позволяет выбирать запуск, но доступность модели и происхождение архива нужно проверять отдельно.
Два режима истории
--history-policy frozen — явный режим для приложенных январских CSV. История и обучение фиксируются на первом моменте симуляции. Модель обучается один раз, затем ежедневно получает новый архивный погодный прогноз. Февральская мощность не выдумывается и не требуется. В JSON записываются context_origin и возраст контекста. Устаревание истории к концу месяца может ухудшать точность: это ограничение baseline, а не доказанная модель месячного горизонта.
--history-policy expanding — по умолчанию. На каждой дате модель заново обучается на уже доступных наблюдениях. Нужны новые фактические SCADA-измерения до текущего T. С приложенными файлами этот режим не сможет продолжить расчёт после 1 февраля: неполная история вызывает явную ошибку. До запуска на весь месяц добавьте новые наблюдения либо явно выберите frozen.
Быстрый запуск без GPU и сети
Python 3.11+:
python -m venv .venv
# Linux / WSL2:
source .venv/bin/activate
# Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install -r requirements-demo.txt
python main_simulation.py --demo
Получите 28 дневных CSV и 28 JSON-аудитов в outputs/demo/, а также run.json и общий submission.csv. При горизонте 48 часов каждый дневной CSV содержит 96 строк: 48 часов × 2 турбины; весь месяц — 2 688 строк. Последний прогноз сохраняет часы вплоть до 01.03.2026 23:00 UTC. Это демонстрация контракта вывода; она не обучает модель и не является конкурсной отправкой.
Запуск модели
Установите совместимые PyTorch, cuDF, cuML и CuPy в окружении NVIDIA-кластера. RAPIDS требует Linux либо Windows через WSL2; версию CUDA и RAPIDS выбирайте по официальному установщику. requirements.txt не устанавливает RAPIDS автоматически, чтобы не навязать несовместимый CUDA wheel. На CUDA нормализация по умолчанию требует cuML; CPU-проверки используют NumPy без scikit-learn.
python -m pip install -r requirements.txt
python -c "import cudf, cuml, cupy, torch; print(cudf.__version__, cuml.__version__, torch.__version__); assert torch.cuda.is_available()"
Пример для CSV, часовой пояс которых подтверждён как UTC:
python main_simulation.py --data-dir "data/raw" --data-timezone UTC --history-policy frozen --backend cudf --device cuda --start 2026-02-01 --end 2026-02-28 --horizon 48
В --data-dir ожидаются оба исходных файла с точными русскими именами из задания. Можно передать другие пути явно через --turbine-1 и --turbine-2.
Если метки локальные, укажите подтверждённый IANA timezone вместо UTC. --simulation-timezone задаёт часовой пояс ежедневного момента выпуска; по умолчанию это 00:00 UTC. Чтобы дополнительно воспроизвести выпуск 31 января, задайте --start 2026-01-31 — тогда и заморозка истории начнётся на сутки раньше.
Для CPU-проверки доступны --backend pandas --device cpu. Смена устройства выполняется явно. По умолчанию используются 72 часа контекста, 90 дней для выбора обучающих примеров, минимум 14 полных суточных примеров и 10 эпох. Первый запуск скачивает погоду для обучающих дат, последующие используют кеш. Неполные исторические окна исключаются; их число отражается в аудите.
Физические правила: 0 ≤ power ≤ 1. В реальном пайплайне обнуление по ветровым порогам отключено: прогноз на 10 м нельзя непосредственно применять к порогам ротора неизвестной высоты. Аудит сохраняет wind_limits_applied: false. Деморежим использует иллюстративные пороги 3/25 м/с. Пересчёт на высоту ротора и калибровка требуют подтверждённых данных. Плотность воздуха рассчитывается приближённо как P × 100 / (287.05 × (T°C + 273.15)).
Результаты и воспроизводимость
outputs/backtest/
├── run.json
├── submission.csv
├── forecast_20260201T0000Z.csv
├── forecast_20260201T0000Z.json
├── ...
└── checkpoints/
└── model_20260201T0000Z.pt
CSV: forecast_origin, valid_time, turbine_id, power_normalized, wind_speed_ms. Общий файл обновляется атомарно после каждого дня только из результатов текущего запуска; повторный запуск не дописывает дубликаты. run.json сообщает running, completed или failed; неполный результат нельзя считать завершённым submission.
JSON содержит режим, границу наблюдений, даты обучающих примеров, ограничения доступности погоды, физическую проверку и путь к весам. Checkpoint хранит конфигурацию, нормализацию и веса. Разные даты выпуска могут прогнозировать один час — это разные прогнозы; склеивать их без учёта forecast_origin нельзя. CSV-контракт нужно сверить с форматом финального submission организаторов.
python -m unittest discover -s tests -v
python main_simulation.py --demo --start 2026-02-28 --end 2026-02-28 --horizon 48
Результаты CPU, NVIDIA L4 и ссылки на логи приведены в разделе «Проверенные результаты CPU и NVIDIA L4» выше. Для полного набора модельных тестов нужен PyTorch; пропуски при его отсутствии не означают проверку модели.
evaluate.py принимает только завершённые запуски с актуальным run.json и оценивает перечисленные в нём дневные файлы. Для прежних результатов без статуса завершения нужно повторить запуск. Пропуски исключаются из общих масок сравнения и явно подсчитываются; отсутствие наблюдений не превращается в нулевую ошибку.
Следующий этап
- Подтвердить координаты, timezone, момент доступности SCADA и высоту ступицы.
- Расширить проверку за пределы пятидневного holdout, сохранив опубликованный эксперимент без изменения.
- Проверить горизонт 48 часов и устойчивость к пропускам/задержкам SCADA на отдельных временных отрезках.
- Сопоставить замороженный контекст с weather-only моделью, масками отсутствующей истории и TFT/GNN.
- Добавлять Modulus после получения рельефа и геометрии, с измеримой проверкой полезности физических признаков.
Авторы коммитов
История коммитов
- 2026-09-23 17:53Merge localhost workflow with completed interactive mapElias Ansariy
- 2026-09-23 17:50Make Python localhost startup the primary review pathElias Ansariy
- 2026-09-23 17:48merge: retain Elias deployment and verify map compatibilityCodex
- 2026-09-23 17:45feat: integrate Open Design assets with interactive forecast mapCodex
- 2026-09-23 17:42Deploy ALEM WIND MVP with Docker and Render FreeElias Ansariy
- 2026-09-23 17:29data: preserve cached February turbine one weather forecastCodex
- 2026-09-23 17:13feat: add auditable lost energy revenue scenariosElias Ansariy
- 2026-09-23 17:01docs: record GitHub Actions billing blockerElias Ansariy
Все коммиты (29)
- 2026-09-23 17:00feat: publish reproducible CPU and NVIDIA forecast evidenceElias Ansariy
- 2026-09-23 16:54docs: specify interactive wind map redesign for Open DesignCodex
- 2026-09-23 16:39fix: handle report connection failures and clear stale resultsCodex
- 2026-09-23 16:33feat: document wind standards scope in scientific reportsCodex
- 2026-09-23 16:20Merge remote-tracking branch 'origin/codex/initial-wind-forecast' into codex/initial-wind-forecastCodex
- 2026-09-23 16:17feat: generate scientific wind forecast reports with publication figuresCodex
- 2026-09-23 15:59docs: refresh tested IDE handoff and preview instructionsElias Ansariy
- 2026-09-23 15:56Merge remote-tracking branch 'origin/codex/initial-wind-forecast' into codex/initial-wind-forecastCodex
- 2026-09-23 15:43feat: add map-led wind forecast dashboard previewCodex
- 2026-09-23 15:42fix: select available forecast horizon in previewCodex
- 2026-09-23 15:37feat: display forecast artifacts and avoid 10m wind shutdownsCodex
- 2026-09-23 15:24docs: research wind forecast dashboards and prepare OpenDesign briefCodex
- 2026-09-23 14:55docs: include portable IDE handoff bundleCodex
- 2026-09-23 14:46fix: align forecast evaluation with completed simulation runsCodex
- 2026-09-23 14:43Merge remote-tracking branch 'origin/codex/initial-wind-forecast' into codex/initial-wind-forecastCodex
- 2026-09-23 14:42feat: complete daily WPF pipeline and IDE handoffCodex
- 2026-09-23 14:30feat: score historical forecasts against simple baselinesCodex
- 2026-09-23 14:22docs: clarify IDE handoff stepsCodex
- 2026-09-23 14:21docs: add handoff for IDE continuationCodex
- 2026-09-23 14:16feat: initialize wind forecasting agents and dashboard prototypeCodex
- 2026-09-23 13:58test 1Eliasans02
Структура репозитория (258 файлов)
.dockerignore .gitattributes .github/workflows/tests.yml .gitignore DESIGN_REFERENCES.md Dockerfile HANDOFF.md OPEN_DESIGN_PROMPT.md README.md SCIENTIFIC_REPORTS.md STANDARDS.md compose.yaml data/weather/020f43c0ad048a23a8a0c3208ccc48e8461dfb855fa8c1681ac88fce9c194338.json data/weather/08552c5eff3ad40cafbe2ba92fdd83cee5b985c7365eedb5ec7404f937aed96d.json data/weather/0a09f05e9fc9b0058452c31c3e835401e9ac36cd073f8255db8abb3984eceada.json data/weather/0b643b737e903db9dd237ec30c3f3476f8b197250f88c464a7c99a6d3a9fb5e7.json data/weather/12da9dd826a39920274788f8d16bb1fd04dcfe2edce8bf0ce136470dfdbc5377.json data/weather/193deaf32888fe4e2944392ea14254ac88db0fd78d30c399bd607699abbdf231.json data/weather/207c2971885d5bb780e94add80377cc2bb33eda45ac4ed2435cf2e5ed3b82e1b.json data/weather/2170bed412c8726e6810fc35455edfaf01230adfc818977c074ce37c7b254031.json data/weather/29013c9035d7e41c791d853d943f288d0d401d430f6b156b8e7b6abf69e40331.json data/weather/295278896ba926de6f7083b4299c02cccd442565ce4f1000694f551c4cfa36d0.json data/weather/2d8a46dac8ab60601bbb9b5afbaa7cac745bca7fd83bf6a44c17dbd79daffc97.json data/weather/3049bec72673fc1f19faeab7c73e763e996a00348594a388aaf5eec50e310823.json data/weather/30e1ebaf0f210c63e61da445eea3f30d4f6dc57ddda5f440cbf92f48b6ee476a.json data/weather/33f640becd5a6b8fe5ee998b550fe623cef2a2e5b7d9210486906ed56091aa0a.json data/weather/348939541a0471486fa8ac676d3017bda81e6f8318bd7d75955926e94f44a9ae.json data/weather/3662577e5f8e1b6c1998f6a26d2bda031f46bcbc4285719b0de4a85b43b829bd.json data/weather/371ed4d0822b718174f88ab2ba1dcba279aa150f5daf02322f1ed6d0eda0e294.json data/weather/3e1ce53e665281b4a0f1be10e09a19ff28c841c8665f51acb329a023afcea1ae.json data/weather/44fc0a25e4e4d62bd01ab09f111a4058e45a1c062dcd8b416f18a546ef625670.json data/weather/464d021e435eae1fcf884ca0c5319609280051d9bd25bb575618d0cc86732e2a.json data/weather/4992f41ccdc61f362d68b9177612537bf92c2eea4d97c4365201bcadeb346e06.json data/weather/54af189f6c77816e2c79f8cb621677f19c1a6a0bf095c60ef1ca4a9cecd5f1b2.json data/weather/5690f6cea3b265858b638e46302864c0da85c8a123cfc238b097ca4d6ed5ee68.json data/weather/655b67c32299472d550c6b6f6e0ca9ce3b6f3bc09b92a6dc59c9053db49ffa45.json data/weather/6e3f8cd67bd0593228585151824c94e0b3a046c7692096e046f2af499586a015.json data/weather/702b3f982dd1dafaf6bd000b1da17b98eb41cfede5055fa933d89ff92a42969e.json data/weather/70eed6b1abaf4ff3ab9887a13cf063733f17cc52b1b0a82690b5453491ba6b8d.json data/weather/71739208fe610a8fd05bc43d3f8863e838678e658b40dec8b0aa540565f8f557.json data/weather/795daa2e9b4dc0d28d43af8d437340790916556a79d4cc2266a5cce00a51ad3c.json data/weather/7b5b00b3082d5e28a1ad4333c88abae550ab7a870e26beb880a75496b1d04f0e.json data/weather/9125182b6321a38221e1db30e5a214d0006ba539b49e187904c62884d69148fb.json data/weather/919b1ee7bc5fc128612064d4af69b06af8137b7d5ed083b396448467199f9013.json data/weather/9ad1027da31c98c71ce17a8e4da713a4e0c7bd2f1ab653d574499a128187d1b5.json data/weather/9db272bcc4e53616025ca908d82563ce73ccdad40992670958367c8b174b3507.json data/weather/a033f0b16d2641e50aa75b287d40456adfdd8fd9c3e78d3c58389a5201710cec.json data/weather/a7f61d89c7929a4dba0679a6d5c18ebda9026a34323e8d208f464fd4b70f3118.json data/weather/aa84d7d94fc64d593abcf30dc71e76783658b2e50882898bad397160a3db2956.json data/weather/b0042fb0d21bb23413db4ab373f71e34bdeebc843781b42897f80661cdfc0c1b.json data/weather/b25726804ee3903840e47f2f3a6d08045e577942934bca7177a35618121a4357.json data/weather/b3de2a33edd13dd1b75f45da9589a56e3e671ba2cb021279b2fc43b3a585fe00.json data/weather/b8ced1e825c6de4586ddb5c611d4e81530ebb879cd60703f2ce1bab10786e2e6.json data/weather/bb37876727cc8b328253d45c42422c5f669802a407a0e5e25e57e48e4e796b16.json data/weather/bc58eac0b9d191d70d8011ea39b302be08507c9566a36cf45ba051e74f39b762.json data/weather/bcc29809f7f1e1c12c55aca7dfbf75cd2e41946f51468b71cbaa1bee8ced4e59.json data/weather/c3cd5ad0344464ca3d1fffaadfdc5fc3a2c7b03c6dbc836894ae043f8af6d47d.json data/weather/cc3f6a36a55e2d1aae886f6edc3d253df8179090b76bc223f438a2c565de36cd.json data/weather/cc634d9ea0f8b855ebe9a66bc7541b03f3b08b51afff4bb14f7a60e45a187536.json data/weather/cd0ca6f2b4f97f9bedca37d76ab0be583a62bf6645cb3caef458cd9461bfaa7a.json data/weather/cd79f81853fdb93d296a720d81104eddb4b3764f8a39370d82a9407987d0662c.json data/weather/d3859985d36d4c830cdd622e9d4837ec0db6ae33d99fb7ce2d11bd5f43fffd5b.json data/weather/dedf995e2cca3f06066a7b836fdbf9d1be059deb97c342daca75a07531e2f047.json data/weather/e5fbc873c1536aa3b9e3ab97ca802ad72f755b8478b141525978c2d58b8c9a6f.json data/weather/e663653e261f1d3e1132740323abb66675238dcd6e3905663d70f6a152d3ea52.json data/weather/e875348a86355edc0ec633ba1914956ac74fe839435c9b77d7bda9d80ce455b0.json data/weather/ec7e1736f3ef6fe7d18ff51ae466248ed1ba4bf46341e1ba79eedfdb710b38f6.json data/weather/ecc076c1e43e368e708d6e6937304593ff875777679c91b27bad1f0be94f636e.json data/weather/f8fbd3c1fd2ee7f4c27cd7111121b96c24742f186e90e70eda9339a506e2cf0a.json data/weather/fca85e5f78cc615995d7feade5c63262c9758145ede06cf9f5853ad5cc7622ef.json data/weather/ff1a0014bf34649cdb1c337eb98faffab19a2a6f5c0e7357a0f5b961773e5dcf.json data_agent.py docs/open-design/INTEGRATION.md docs/open-design/PRODUCT.md docs/open-design/brand-spec.md economics.py evaluate.py gpu_check.py gunicorn.conf.py handoff/COMPLETE_CODE.md handoff/build_handoff.py handoff/wpf-ide-handoff.zip main.py main_simulation.py model_agent.py outputs/backtest/checkpoints/model_20260130T0000Z.pt outputs/backtest/forecast_20260130T0000Z.csv outputs/backtest/forecast_20260130T0000Z.json outputs/backtest/run.json outputs/backtest/submission.csv outputs/evidence/cpu-verification.txt outputs/evidence/current-tests.txt outputs/evidence/docker-verification.json outputs/evidence/economics-example.json outputs/evidence/economics-example.pdf outputs/evidence/economics-example.zip outputs/evidence/gpu-conda-explicit.txt outputs/evidence/gpu-environment.json outputs/evidence/gpu-instance-after-delete.json outputs/evidence/gpu-nvidia-smi.txt outputs/evidence/gpu-packages.txt outputs/evidence/gpu-report-20260129.pdf outputs/evidence/gpu-report-20260129.zip outputs/evidence/gpu-rolling.txt outputs/evidence/gpu-session.json outputs/evidence/gpu-tests.txt outputs/evidence/gpu-verification.txt outputs/evidence/localhost-verification.json outputs/evidence/main-tests.txt outputs/evidence/manifest.json outputs/evidence/web-tests.txt outputs/gpu-check/checkpoints/model_20260130T0000Z.pt outputs/gpu-check/evaluation-hours.csv outputs/gpu-check/evaluation.csv outputs/gpu-check/evaluation.json outputs/gpu-check/forecast_20260130T0000Z.csv outputs/gpu-check/forecast_20260130T0000Z.json outputs/gpu-check/run.json outputs/gpu-check/submission.csv outputs/gpu-check/verification.json outputs/observations.csv outputs/replay/checkpoints/model_20260130T0000Z.pt outputs/replay/evaluation-hours.csv outputs/replay/evaluation.csv outputs/replay/evaluation.json outputs/replay/forecast_20260130T0000Z.csv outputs/replay/forecast_20260130T0000Z.json outputs/replay/run.json outputs/replay/submission.csv outputs/rolling-january-gpu/checkpoints/model_20260116T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260117T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260118T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260119T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260120T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260121T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260122T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260123T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260124T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260125T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260126T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260127T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260128T0000Z.pt outputs/rolling-january-gpu/checkpoints/model_20260129T0000Z.pt outputs/rolling-january-gpu/evaluation-hours.csv outputs/rolling-january-gpu/evaluation.csv outputs/rolling-january-gpu/evaluation.json outputs/rolling-january-gpu/forecast_20260116T0000Z.csv outputs/rolling-january-gpu/forecast_20260116T0000Z.json outputs/rolling-january-gpu/forecast_20260117T0000Z.csv outputs/rolling-january-gpu/forecast_20260117T0000Z.json outputs/rolling-january-gpu/forecast_20260118T0000Z.csv outputs/rolling-january-gpu/forecast_20260118T0000Z.json outputs/rolling-january-gpu/forecast_20260119T0000Z.csv outputs/rolling-january-gpu/forecast_20260119T0000Z.json outputs/rolling-january-gpu/forecast_20260120T0000Z.csv outputs/rolling-january-gpu/forecast_20260120T0000Z.json outputs/rolling-january-gpu/forecast_20260121T0000Z.csv outputs/rolling-january-gpu/forecast_20260121T0000Z.json outputs/rolling-january-gpu/forecast_20260122T0000Z.csv outputs/rolling-january-gpu/forecast_20260122T0000Z.json outputs/rolling-january-gpu/forecast_20260123T0000Z.csv outputs/rolling-january-gpu/forecast_20260123T0000Z.json outputs/rolling-january-gpu/forecast_20260124T0000Z.csv outputs/rolling-january-gpu/forecast_20260124T0000Z.json outputs/rolling-january-gpu/forecast_20260125T0000Z.csv outputs/rolling-january-gpu/forecast_20260125T0000Z.json outputs/rolling-january-gpu/forecast_20260126T0000Z.csv outputs/rolling-january-gpu/forecast_20260126T0000Z.json outputs/rolling-january-gpu/forecast_20260127T0000Z.csv outputs/rolling-january-gpu/forecast_20260127T0000Z.json outputs/rolling-january-gpu/forecast_20260128T0000Z.csv outputs/rolling-january-gpu/forecast_20260128T0000Z.json outputs/rolling-january-gpu/forecast_20260129T0000Z.csv outputs/rolling-january-gpu/forecast_20260129T0000Z.json outputs/rolling-january-gpu/run.json outputs/rolling-january-gpu/submission.csv outputs/rolling-january/checkpoints/model_20260116T0000Z.pt outputs/rolling-january/checkpoints/model_20260117T0000Z.pt outputs/rolling-january/checkpoints/model_20260118T0000Z.pt outputs/rolling-january/checkpoints/model_20260119T0000Z.pt outputs/rolling-january/checkpoints/model_20260120T0000Z.pt outputs/rolling-january/checkpoints/model_20260121T0000Z.pt outputs/rolling-january/checkpoints/model_20260122T0000Z.pt outputs/rolling-january/checkpoints/model_20260123T0000Z.pt outputs/rolling-january/checkpoints/model_20260124T0000Z.pt outputs/rolling-january/checkpoints/model_20260125T0000Z.pt outputs/rolling-january/checkpoints/model_20260126T0000Z.pt outputs/rolling-january/checkpoints/model_20260127T0000Z.pt outputs/rolling-january/checkpoints/model_20260128T0000Z.pt outputs/rolling-january/checkpoints/model_20260129T0000Z.pt outputs/rolling-january/evaluation-hours.csv outputs/rolling-january/evaluation.csv outputs/rolling-january/evaluation.json outputs/rolling-january/forecast_20260116T0000Z.csv outputs/rolling-january/forecast_20260116T0000Z.json outputs/rolling-january/forecast_20260117T0000Z.csv outputs/rolling-january/forecast_20260117T0000Z.json outputs/rolling-january/forecast_20260118T0000Z.csv outputs/rolling-january/forecast_20260118T0000Z.json outputs/rolling-january/forecast_20260119T0000Z.csv outputs/rolling-january/forecast_20260119T0000Z.json outputs/rolling-january/forecast_20260120T0000Z.csv outputs/rolling-january/forecast_20260120T0000Z.json outputs/rolling-january/forecast_20260121T0000Z.csv outputs/rolling-january/forecast_20260121T0000Z.json outputs/rolling-january/forecast_20260122T0000Z.csv outputs/rolling-january/forecast_20260122T0000Z.json outputs/rolling-january/forecast_20260123T0000Z.csv outputs/rolling-january/forecast_20260123T0000Z.json outputs/rolling-january/forecast_20260124T0000Z.csv outputs/rolling-january/forecast_20260124T0000Z.json outputs/rolling-january/forecast_20260125T0000Z.csv outputs/rolling-january/forecast_20260125T0000Z.json outputs/rolling-january/forecast_20260126T0000Z.csv outputs/rolling-january/forecast_20260126T0000Z.json outputs/rolling-january/forecast_20260127T0000Z.csv outputs/rolling-january/forecast_20260127T0000Z.json outputs/rolling-january/forecast_20260128T0000Z.csv outputs/rolling-january/forecast_20260128T0000Z.json outputs/rolling-january/forecast_20260129T0000Z.csv outputs/rolling-january/forecast_20260129T0000Z.json outputs/rolling-january/run.json outputs/rolling-january/submission.csv preview/app.js preview/assets/maplibre-LICENSE.txt preview/assets/maplibre-gl.css preview/assets/maplibre-gl.js preview/economics-ui.js preview/economics.css preview/evaluation.js preview/index.html preview/map-ui.css preview/map-ui.js preview/report-ui.js preview/styles.css render.yaml requirements-demo.txt requirements-reports.txt requirements-web.txt requirements.txt scientific_report.py serve_preview.py standards_profile.py tests/economics-ui.test.cjs tests/map-ui.test.cjs tests/report-ui.test.cjs tests/smoke_web.py tests/test_data_agent.py tests/test_evaluate.py tests/test_main.py tests/test_model_agent.py tests/test_preview.cjs tests/test_scientific_report.py tests/test_validator_agent.py tests/test_web_app.py validator_agent.py verify_results.py web_app.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.