7.4 KiB
in Agents.md steht alles drin, was du brauchst# AGENTS.md
Projektkontext
LEAG-COALLOG ist ein Proof of Concept zur Optimierung der Braunkohle-Logistik. Das System verarbeitet eine Excel-Parameterdatei, erzeugt daraus normalisierte Parquet-Tabellen und loest anschliessend ein Pyomo-Optimierungsmodell fuer Lieferungen von Tagebauen zu Kraftwerken und Veredlung.
Ziel ist eine planbare Rohkohleverteilung unter Beruecksichtigung von Nachfrage, Toleranzen, Mischungsverhaeltnissen, Foerder- und Verladungskapazitaeten, Verfuegbarkeiten, Schichtmustern, Bunkerlogik und Solver-Limits. Die Webapp dient als Bedienoberflaeche fuer Upload, Parametrisierung, Laufstatus, Logs, Visualisierung und Ergebnisdownload.
Architektur
Die Anwendung besteht aus drei Hauptteilen:
-
Preprocessing
- Datei:
src/preprocessing/exploration_preprocess.py - Liest die Excel-Datei aus
POC1_INPUT_XLSX. - Schreibt vorbereitete Tabellen als Parquet nach
POC1_OUTPUT_DIR. - Die Logik stammt aus einem Notebook-Export und ist stark an die Struktur der Eingabe-Excel gebunden.
- Datei:
-
Optimierung
- Einstieg:
src/optimization/run_optimization.py - Modell:
src/optimization/model_builder.py - Laedt alle Parquet-Dateien aus einem Datenverzeichnis.
- Baut ein Pyomo
ConcreteModel. - Loest mit
highs,gurobioderscip. - Exportiert
output.xlsxund optionalwarmstart.json.
- Einstieg:
-
Webapp
- Backend:
webapp/backend/main.py - Frontend:
webapp/frontend/src/App.jsx - FastAPI nimmt Uploads entgegen, legt Job-Verzeichnisse unter
var/jobsan und startet Preprocessing und Optimierung als Subprozesse. - React/Vite stellt Upload, Solver-Parameter, Job-Status, Logs, Plots, Warmstart und Downloads bereit.
- Backend:
Datenfluss
Standardablauf eines Webapp-Laufs:
- Browser sendet Excel-Datei, Solver und Parameter an
POST /api/run. - FastAPI erstellt ein Job-Verzeichnis unter
var/jobs/<job_id>/. - Die Upload-Datei wird als
input.xlsxgespeichert. exploration_preprocess.pyschreibtprocessed/*.parquet.run_optimization.pyliestprocessed/*.parquet, baut und loest das Modell.- Ergebnisse landen in
output/output.xlsxundoutput/warmstart.json. - Logs liegen unter
logs/preprocess.logundlogs/optimization.log. - Das Frontend pollt Status, Logs und abgeleitete Visualisierungsdaten.
Wichtige API-Endpunkte:
GET /api/healthPOST /api/runGET /api/jobs/{job_id}POST /api/jobs/{job_id}/cancelGET /api/jobs/{job_id}/outputGET /api/jobs/{job_id}/warmstartGET /api/jobs/{job_id}/monthly-flowsGET /api/jobs/{job_id}/capacity-timeseriesGET /api/jobs/{job_id}/logs/{log_name}GET /api/jobs/{job_id}/logs/{log_name}/stream
Optimierungsmodell
Das Modell bildet Liefermengen als ganzzahlige Schritte ab:
- Quellen
I:Reichwalde,Nochten,Welzow - Ziele
J:J,SP,B3,B4,V - Tage
D: Bergbauwoche Samstag bis Freitag - Schichten
S:F,S,N - Entscheidung
k[i,j,w,d,s]: ganzzahlige Anzahl Lieferschritte - Fluss
x[i,j,w,d,s] = step_size_tonnes * k[i,j,w,d,s]
Wichtige Nebenbedingungen und Konzepte:
- Tages-, Wochen- und Monatstoleranzen fuer Kraftwerke
- separate Veredlungsbedarfe fuer Nochten- und Welzower-Kohle
- harte Mix-Min/Max-Grenzen und weiche Zielabweichungen
- Foerderkapazitaeten pro Monat
- Verladungskapazitaeten pro Schicht und Tag
- Verfuegbarkeiten aus
Verfuegbarkeiten.parquet - feste Routenverbote und kombinierte Flussgrenzen
- Schichtglaettung und Schichtmuster
- optionale Bunkerlogik fuer Ziele mit Bunkerparametern
- Warmstart Import/Export fuer Folgelaeufe
Weitere fachliche Details stehen in:
README.mddocs/app-kommunikation.mdnotebooks/constraints_overview.mdlatex/modellierung.tex
Wichtige Verzeichnisse
src/preprocessing/: Excel-zu-Parquet-Datenaufbereitungsrc/optimization/: Pyomo-Modell, Solver-Lauf, Ergebnisexportwebapp/backend/: FastAPI-App und Job-Orchestrierungwebapp/frontend/: React/Vite-Frontenddata/input/: lokale Eingabedateiendata/processed/: lokale Preprocessing-Ausgabendata/out/: lokale Ergebnisartefaktevar/jobs/: persistente Webapp-Jobdatendocs/: Architektur- und Kommunikationsdokumentationnotebooks/: Analyse- und Modellnotizenresults/: Solver-Debugartefakte wieiis.ilp
Lokale Kommandos
Backend starten:
uv run python -m uvicorn webapp.backend.main:app --reload
Frontend starten:
cd webapp/frontend
npm install
npm run dev
Preprocessing direkt ausfuehren:
uv run python src/preprocessing/exploration_preprocess.py
Optimierung direkt ausfuehren:
uv run python src/optimization/run_optimization.py --data-dir data/processed --solver highs
Docker-All-in-One:
docker compose up --build
Laufzeit und Solver
Unterstuetzte Solver sind aktuell highs, gurobi und scip, sofern lokal
installiert und fuer Pyomo verfuegbar. Im Docker-Image wird gurobipy
installiert. Fuer Gurobi wird entweder eine Lizenzdatei ueber
GRB_LICENSE_FILE oder WLS-Umgebungsvariablen verwendet:
GRB_LICENSE_FILEGRB_WLSACCESSIDGRB_WLSSECRETGRB_LICENSEID
Die Webapp prueft Solver-Verfuegbarkeit ueber /api/health.
Entwicklungsregeln fuer Agenten
- Aendere keine Eingabe-, Ergebnis- oder Jobdaten ohne expliziten Grund.
- Behandle
var/jobs,data/out,data/processedundresultsals erzeugte Artefakte, sofern die Aufgabe nicht genau diese Dateien betrifft. - Respektiere bestehende fachliche Logik im Optimierungsmodell. Viele Grenzen sind hart kodiert und fachlich motiviert.
- Bei Aenderungen an
model_builder.pyimmer pruefen, ob Export, Visualisierung und Warmstart noch konsistent sind. - Bei Aenderungen am Excel-Output die Backend-Parser in
webapp/backend/main.pymitdenken. Sie lesen konkrete Sheet- und Spaltenstrukturen. - Bei Aenderungen an API-Antworten das Frontend in
webapp/frontend/src/App.jsxsynchron halten. - Die Preprocessing-Datei ist notebookartig und teilweise redundant. Kleine, lokale Korrekturen sind besser als grosse Refactors ohne Tests.
- Keine Gurobi-Lizenzdateien, Credentials oder lokale Pfade committen.
- UI und Backend muessen auch ohne Gurobi sinnvoll starten koennen, wenn HiGHS verfuegbar ist.
Validierung
Es gibt derzeit keine klar etablierte automatisierte Testsuite. Je nach Aenderung sind diese Checks sinnvoll:
uv run python src/preprocessing/exploration_preprocess.py
uv run python src/optimization/run_optimization.py --data-dir data/processed --solver highs --time-limit 60
cd webapp/frontend && npm run build
Bei Backend- oder Webapp-Aenderungen zusaetzlich:
uv run python -m uvicorn webapp.backend.main:app --reload
Dann im Browser oder per API pruefen:
/api/health- Upload ueber Frontend
- Statuspolling
- Logs
- Download von
output.xlsx - Download von
warmstart.json - Plots fuer Monatsfluesse und Kapazitaetszeitreihen
Bekannte Besonderheiten
- Die Bergbauwoche beginnt fachlich am Samstag. Im Modell wird dafuer ein Datum-plus-zwei-Tage-Shift zur ISO-Woche verwendet.
- Lieferabweichungen und Mischungsverhaeltnisse beziehen sich auf Lieferungen, nicht auf Bunkerabfluss.
no_three_in_a_rowist laut README aktuell auf<= 3gelockert.- Bei Infeasibility kann Gurobi ein IIS nach
results/iis.ilpschreiben. - Der Projektname in Metadaten und README ist teilweise noch
POC1; fachlich entspricht das dem aktuellen LEAG-COALLOG-Prototyp.