Usable Models for Simulation Studies — measured_replay_physical¶
For simulation studies that depend on realistic consumptions, fluxes, and heat
balances (not just climate curve-fit accuracy), the shipped measured_replay
calibration has a limitation: it achieves its climate RMSE using non-physical
fudge factors (pipe_heat_transfer_multiplier ≈ 1.5, vent_area_multiplier ≈ 2.2)
that absorb lumped-model structural error. The energy balance then rests on those
fudges — recalibrating for climate alone shifts them and changes the modeled
heating consumption by ~2×.
measured_replay_physical is a balanced calibration: climate RMSE plus a
penalty on each parameter's deviation from its physical (no-fudge) anchor
(pipe≈1, vent_area≈1, ventilation_opening_scale≈1, physical U / discharge /
wind coefficients), train/test validated, with heat-balance closure reported.
Parameters — fudge → physical¶
| param | anchor | HPS: measured_replay → _physical |
LED: measured_replay → _physical |
|---|---|---|---|
| pipe_heat_transfer_multiplier | 1.0 | 1.51 → 1.12 | 0.89 → 1.05 |
| vent_area_multiplier | 1.0 | 2.22 → 0.85 | 2.39 → 1.00 |
| ventilation_opening_scale | 1.0 | 1.33 → 0.99 | 0.25 → 1.26 |
| vent_discharge_coefficient | ~0.75 | 1.18 → 0.89 | 0.51 → 0.91 |
| effective_envelope_u_w_m2_k | physical | 4.50 → 4.77 | 4.43 → 4.85 |
| physical-deviation score | — | 5.73 → 2.16 | 8.66 → 2.27 |
The parameters are now physically interpretable (multipliers near 1, coefficients in Boulard-Baille ranges), so the fluxes and consumptions the model reports are grounded rather than fit artifacts.
Accuracy trade-off (honest)¶
| metric | measured_replay |
_physical |
|
|---|---|---|---|
| HPS | held-out strided T RMSE | 2.36 | 2.27 (better) |
| held-out RH | 9.3 | 7.4 (better) | |
| heat-balance residual (held-out) | 9.9 W | 7.6 W (better closure) | |
| contiguous 7-day window T | 1.97 | 2.68 (worse) | |
| LED | held-out T RMSE | 2.25 | 2.25 (same) |
| vent_area fudge | 2.39 | 1.00 (physical, free) |
- Over the 12 representative strided windows (the canonical GreenLight OOS set), the physical model is as good or better on climate AND closes the heat balance better.
- On the first contiguous 7-day window (what the timeseries/parity figures use), HPS is worse (2.68 vs 1.97). This one window is well-fit by the baseline's fudges; every recalibration degrades it. Weight the strided set — it samples the whole season — over this single window.
Validation — energy / balance study (HPS, 12 representative days)¶
| metric | measured_replay |
_physical |
reference |
|---|---|---|---|
| pipe_heat_transfer_multiplier | 1.51 (fudge) | 1.12 | physical ≈ 1 |
| vent_area_multiplier | 2.22 (fudge) | 0.85 | physical ≈ 1 |
| heating, ~200-day season | 162.8 kWh/m² | 128.0 kWh/m² | 100–180 (typical NL glasshouse) ✅ |
| heat-balance residual (closure) | 9.71 W/m² | 7.74 W/m² | lower = better |
| air-temp RMSE | 2.35 C | 2.30 C | |
| RH RMSE | 9.73 % | 8.42 % | |
| vapour RMSE | 296.9 Pa | 298.5 Pa | ~equal |
Both profiles land inside the realistic seasonal-heating band, but the physical model reaches it with a near-physical pipe transfer (1.12 vs the 1.51 fudge) and closes the heat balance better (residual 9.7 → 7.7 W/m²), so its consumption is grounded rather than fit-inflated — trustworthy for extrapolation to closed-loop or different-weather scenarios where fudge factors would mislead.
Validation — LED energy / balance (12 representative days)¶
| metric | measured_replay |
_physical |
note |
|---|---|---|---|
| pipe_heat_transfer_multiplier | 0.89 | 1.05 | now physical |
| vent_area_multiplier | 2.39 (fudge) | 1.00 | now physical (biggest win) |
| heating, ~200-day season | 160.3 kWh/m² | 189.9 kWh/m² | top of / just above band |
| heat-balance residual | 11.9 W/m² | 12.5 W/m² | ~equal |
| air-temp RMSE | 2.18 C | 2.18 C | identical |
| RH RMSE | 8.02 % | 8.10 % | ~equal |
| vapour RMSE | 259.9 Pa | 258.6 Pa | ~equal (slightly better) |
For LED the trade is different from HPS: the physical profile buys full parameter
realism at zero climate cost (identical T, ~equal RH/VP) — the vent_area
fudge collapses 2.39 → 1.00 — but seasonal heating rises to ~190 kWh/m² (top of /
marginally above the 100–180 band) and balance closure is unchanged. The LED win
is interpretability, not a strict accuracy improvement.
Validation — end-to-end closed-loop (project-run --solver ivp)¶
The physical profile was run through the production CLI path
(greenflux project-run … --calibration-profile measured_replay_physical --solver ivp)
for both installations — exercising the full builder → _apply_profile_to_project
→ IVP chain, not just the analysis script:
| HPS | LED | |
|---|---|---|
| solver | success (RK45, 6218 evals) | success (RK45, 5576 evals) |
| state clipping events | 0 | 2 supersaturation (condensation, physical) |
| heat (1-day case) | 1.03 kWh/m²/d | 0.79 kWh/m²/d |
| resource sanity checks | all PASS¹ | all PASS¹ |
¹ the only failing check is duration_days ≥ 7 — an artifact of the 1-day
measured_open_loop case, not a physics failure. The profile wiring, IVP
convergence, and consumption magnitudes are all clean end-to-end.
Default profile¶
Both GreenLight projects now declare "default_calibration_profile":
"measured_replay_physical", so an unqualified run
(greenflux project-run <project> --solver ivp, or any programmatic call passing
calibration_profile_name=None) applies the physical profile. The fudge-based
measured_replay is still selectable explicitly
(--calibration-profile measured_replay) and its values are unchanged — dataset
generation and any caller that names it are byte-for-byte unaffected. Projects
that omit default_calibration_profile keep the lenient measured_replay
default, so nothing else in the repo changes behaviour.
Recommendation¶
- Default (energy / flux / balance simulation studies):
measured_replay_physical— physical parameters, better balance closure, grounded consumptions. Now the project default, so no flag is needed. - Pure climate reproduction on the training window: select
measured_replayexplicitly — it still has the tightest curve-fit there. - CO2 is a diagnostic, not a prediction in either profile — the dataset's injection signal is uninformative (off 97% of the time while CO2 is dosed to ~780 ppm); see the CO2 notes in the uncertainty and residual-diagnostics notes (internal).
measured_replayis retained byte-stable (dataset generation unaffected).
Figures: outputs/calibration/validation_figures/{hps,led}_physical/.
Params: outputs/calibration/balanced_params_{hps,led}.json.