🚧 Implement continous simulation
This commit is contained in:
@@ -394,13 +394,17 @@ requirement ID for each item in parentheses.
|
||||
(FR-9.2.5). *(Plain `serve` without a scenario already works —
|
||||
see Completed above.)*
|
||||
|
||||
### Phase 3 — Long-duration (continuous) simulation (spec §8)
|
||||
The soak-testing feature requested 2026-10-03 — specified in §8,
|
||||
not yet implemented. Datasets are **optional**: signal logic
|
||||
(plugins, scheduled steps, degradation) runs in parallel with CSV
|
||||
### Phase 3 — Long-duration (continuous) simulation (spec §8) — IMPLEMENTED 2026-10-04
|
||||
The soak-testing feature specified in §8 is implemented: continuous
|
||||
mode with the fixed tick pipeline, optional streaming CSV datasets,
|
||||
degradation models, invariants/rate limits with bounded episode
|
||||
reporting, snapshots, and the gym-style `PlantEnv`. 30 new tests
|
||||
(`tests/test_continuous.py`); the shipped example
|
||||
`scenarios/pump_soak.example.yaml` demonstrates the full DSL.
|
||||
Datasets are **optional**: signal logic runs in parallel with CSV
|
||||
streaming, or entirely without it.
|
||||
|
||||
- [ ] Plant environment `scenario/plantenv.py` (FR-8.2.14–16, requested
|
||||
- [x] Plant environment `scenario/plantenv.py` (FR-8.2.14–16, requested
|
||||
2026-10-04): gym-style `PlantEnv` — deterministic engine-owned
|
||||
tick clock (never wall-clock); per tick:
|
||||
`observe()` returns the WAGO input image in engineering units
|
||||
@@ -411,44 +415,44 @@ streaming, or entirely without it.
|
||||
become thin adapters; external (non-Python) decision sources
|
||||
step the env over a socket; one decision source per output
|
||||
alias per tick (ownership conflicts are errors).
|
||||
- [ ] `scenario/datasets.py` — streaming CSV playback for designated
|
||||
- [x] `scenario/datasets.py` — streaming CSV playback for designated
|
||||
inputs (OPTIONAL driver): header-driven time column,
|
||||
`interpolation: linear|hold`, `repeat` with seamless seams,
|
||||
`time_factor` acceleration, `until` limits, bounded memory, ERROR
|
||||
verdict with file/line on malformed data (FR-8.2.1–8.2.11).
|
||||
- [ ] Parallel logic pipeline — fixed per-tick order: datasets → edge
|
||||
- [x] Parallel logic pipeline — fixed per-tick order: datasets → edge
|
||||
detection → plant plugins → degradation → invariants/rate
|
||||
limits → scheduled steps → snapshots; plugins may read
|
||||
dataset-driven and logic-driven aliases in the same tick
|
||||
(FR-8.2.12).
|
||||
- [ ] Logic-only continuous runs — no `datasets:` needed: demand
|
||||
- [x] Logic-only continuous runs — no `datasets:` needed: demand
|
||||
profiles generated inside plugins, top-level `until:` bounds the
|
||||
run; degradation/invariants/rate limits/snapshots apply
|
||||
identically (FR-8.2.13).
|
||||
- [ ] Continuous-mode run-end + validation rules: run ends when all
|
||||
- [x] Continuous-mode run-end + validation rules: run ends when all
|
||||
drivers exhausted; scenario with no datasets, no scheduled steps
|
||||
and no `until:` rejected (FR-8.2.1).
|
||||
- [ ] `scenario/degradation.py` — wear counters (runtime hours, start
|
||||
- [x] `scenario/degradation.py` — wear counters (runtime hours, start
|
||||
cycles, load-hours) and degradation models (`linear`,
|
||||
`exponential`, `staircase`, plugin shapes) computing plant
|
||||
parameters such as `pump_capacity` (FR-8.3.1–8.3.2).
|
||||
- [ ] Degradation hooks in plant plugins: `engine.parameter()` accessor
|
||||
- [x] Degradation hooks in plant plugins: `engine.parameter()` accessor
|
||||
used in loop physics, e.g. actual flow = nominal × capacity
|
||||
(FR-8.3.3).
|
||||
- [ ] `maintenance_at` thresholds: diagnosis injection via register
|
||||
- [x] `maintenance_at` thresholds: diagnosis injection via register
|
||||
`0x1050`, maintenance-alarm assertions, `maintenance_reset`
|
||||
action restoring capacity and clearing diagnoses (FR-8.3.4–8.3.5,
|
||||
FR-8.3.8).
|
||||
- [ ] `scenario/invariants.py` — per-tick `invariants` with bounded
|
||||
- [x] `scenario/invariants.py` — per-tick `invariants` with bounded
|
||||
episode aggregation and `rate_limits` over sliding one-hour
|
||||
windows (FR-8.4.1–8.4.2).
|
||||
- [ ] `snapshot_every` periodic dumps of aliases, wear counters, and
|
||||
- [x] `snapshot_every` periodic dumps of aliases, wear counters, and
|
||||
degradation parameters (FR-8.4.3).
|
||||
- [ ] Continuous-mode verdict rules and bounded reporting for unattended
|
||||
- [x] Continuous-mode verdict rules and bounded reporting for unattended
|
||||
multi-day runs (FR-8.4.4–8.4.5).
|
||||
- [ ] Scheduled sequence steps via `at: <duration>` interleaved with
|
||||
- [x] Scheduled sequence steps via `at: <duration>` interleaved with
|
||||
datasets on the sim-time axis (FR-8.4.6).
|
||||
- [ ] Acceptance tests per spec §8.8 (streaming 100k-row CSV,
|
||||
- [x] Acceptance tests per spec §8.8 (streaming 100k-row CSV,
|
||||
interpolation checks, repeat determinism, time_factor math,
|
||||
alias-ownership validation, degradation/recovery round-trip,
|
||||
episode recording, full 28-day soak, logic-only run, mixed
|
||||
|
||||
Reference in New Issue
Block a user