AAYMA
RU
Войти

ALEM WIND

Почасовой прогноз мощности двух ветротурбин на 24–48 часов с ежедневным переобучением, бэктестом против базовых методов, расчётом потерянной выручки…

Доведённый продукт
Команда «XY» 23💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

ALEM 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-проверка и тесты на L4CPU/UI, GPU tests
Хеши результатов, исполнявшегося кода и исходных CSVmanifest.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 MAET1 RMSET2 MAET2 RMSE
Development · Transformer CPU0.2859520.3659770.2815050.367128
Development · Transformer L40.2860860.3662570.2813910.368497
Development · persistence0.3369210.4818920.3224540.465179
Development · кривая мощности0.3576550.5060470.3429510.492558
Holdout · Transformer CPU0.3413370.3860110.3678090.406868
Holdout · Transformer L40.3453680.3907350.3668770.406949
Holdout · persistence0.4407780.5632610.4554720.580702
Holdout · кривая мощности0.2884360.4313510.2907700.437501
30 января · Transformer CPU0.3824810.4342090.3146780.356434
30 января · Transformer L40.3809360.4322630.3236440.365402
30 января · persistence0.2805560.3643320.2675690.357635
30 января · кривая мощности0.7092590.7463970.7222450.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
Турбина 1142 36023 667
Турбина 2149 49924 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). Перед финальной оценкой нужно сверить координаты, часовой пояс и соглашение о метках с владельцем данных.

Защита от утечки

  1. Сырые наблюдения отсекаются по timestamp < T до численного преобразования, агрегации и rolling. Используются только полностью завершённые часы.
  2. У обучающей последовательности история [s−lookback, s) и целевые часы [s, s+horizon). Последний целевой час строго раньше обучающего cutoff.
  3. Будущие погодные признаки для обучающего примера запрашиваются на момент s, а для прогноза — на момент T. Фактическая погода не подставляется в decoder.
  4. Нормализация обучается только на обучающих массивах. Внутренней случайной validation-разбивки нет; число эпох фиксировано. Train loss не считается оценкой качества backtest.
  5. Отсутствующий прогноз, неверные единицы, NaN и несовпадение времён останавливают расчёт. Автоматической замены на ERA5, reanalysis или live forecast нет.
  6. Кеш включает источник, модель, координаты, горизонт, 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 после получения рельефа и геометрии, с измеримой проверкой полезности физических признаков.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
29
Авторы
3
Файлы
258
Ветки
3

Авторы коммитов

Codex 21Elias Ansariy 7Eliasans02 1

История коммитов

  • 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
Ветки (3)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.