Zum Inhalt

Kalibrierungs-Artefakt

Das CalibrationArtifact ist die Schnittstelle zwischen Kalibrierung und Schätzung. Es ist eine versionierte YAML-Datei, die Calibration schreibt und Estimation beim Hochfahren des Live-Filters einliest.

Workflow

PyADM1ODE_calibration                     PyADM1ODE_estimate
  │                                            │
  │  optimiert kinetische Parameter,           │
  │  fittet gegen historische Messdaten        │
  │                                            │
  ▼                                            │
[ artifact.yaml ] ───────── handoff ──────────►│
                                               │
                                               │  load_artifact(...)
                                               │  apply_to_plant(...)
                                               │
                                               ▼
                                        kalibrierte BiogasPlant
                                               │
                                               ▼
                                        UKF startet von hier

Format-Übersicht

Das YAML hat fünf Hauptsektionen (jede außer metadata ist optional):

schema_version: 1

metadata:                # Provenienz: welche Anlage, welcher Datenraum
  plant_id: plant_id_xyz
  calibration_run_id: 2026-05-14-3w
  timestamp: 2026-05-14T12:30:00Z
  data_window_start: 2026-04-01
  data_window_end: 2026-04-21
  adm1_version: "ADM1da-0.3.4"
  fitted_against: [Q_gas, P_el]

kinetic:                 # adm1._kinetic-Overrides pro Fermenter
  primary:
    k_dis_PS: 0.045
    k_hyd_ch: 4.2
    k_m_ac: 8.5

substrates:              # Substrat-Disintegrations-Fraktionen
  maize_silage:
    f_ch_xc: 0.55

initial_state:           # ADM1da-Zustand am Ende des Cal-Fensters
  primary:
    _values: [...41 Werte in kanonischer ADM1da-Reihenfolge...]

residuals:               # Fit-Qualität pro Channel (informativ)
  Q_gas:
    rmse: 145.0
    units: m3/d

Vollständiges Beispiel: calibration_artifact_example.yaml.

Schreiben (Calibration-Seite)

from pyadm1ode_estimation.artifacts import (
    CalibrationArtifact, CalibrationMetadata, save_artifact,
)

artifact = CalibrationArtifact(
    metadata=CalibrationMetadata(
        plant_id="plant_id_xyz",
        calibration_run_id="2026-05-14-3w",
        timestamp="2026-05-14T12:30:00Z",
        fitted_against=["Q_gas", "P_el"],
    ),
    kinetic={"primary": {"k_dis_PS": 0.045, "k_hyd_ch": 4.2}},
    initial_state={"primary": {"_values": list_of_41_floats}},
)
save_artifact(artifact, "calibrated/plant_2026-05-14.yaml")

Lesen (Estimation-Seite)

from pyadm1ode_estimation.artifacts import load_artifact, apply_to_plant

artifact = load_artifact("calibrated/plant_2026-05-14.yaml")
plant = build_plant(schema)            # anlagenspezifischer Plant-Builder

# strict=True: bei Topologie-Mismatch fail-fast (empfohlen im Produktiv-Start)
# strict=False: nur Warnungen, graceful Degradation (gut für Tests, alte Artefakte)
diag = apply_to_plant(artifact, plant, strict=True)

print(f"Angewendet: {len(diag['applied'])} Parameter")
print(f"Übersprungen: {len(diag['skipped'])} Parameter")

Designentscheidungen

Entscheidung Warum
schema_version Pflicht Unbekannte Versionen → ValueError, kein Silent-Mis-Read
plant_id + run_id Pflicht Audit-Trail bei mehreren parallelen Kalibrierungen
Sektionen optional Partielle Calibrations (nur kinetic) erlaubt
strict=False Default Graceful Degradation bei evolvierter Topologie
strict=True für Produktion Live-Filter-Startup soll bei Inkompatibilität fail-fast
Dict-Strukturen statt feste Felder Plant-agnostisch — neue Anlage erfordert kein Schema-Update
_values: [41 Werte] Array-Form Pragmatisch ohne pyadm1-Index-Map-Introspektion