v2ecoli → PDMP Whole-Cell Model Reformulation in_progress
Investigation report · v2ecoli-pdmp · generated 2026-08-17 13:30 UTC · for expert review — results below reflect completed runs.
Investigation acceptance: in-progress. 0 of 6 acceptance criteria passing. code-computed from member-study verdicts
📋 Executive summary in-progress Updated 2026-06-12. The investigation's central thesis — that v2ecoli's hybrid WCM can be incrementally turned into a likelihood-bearing PDMP-class…
Incrementally transforms v2ecoli from a hybrid algorithmic whole-cell model into a piecewise-deterministic Markov process. Six phases each swap one WCM component -- characterization, a metabolism ODE, jump processes, an inference layer, a compiled runtime, and causal discovery -- while leaving the rest intact.
Question. Can v2ecoli's hybrid algorithmic whole-cell model be incrementally transformed into a piecewise-deterministic Markov process (PDMP) suitable for likelihood-based inference and causal discovery, without discarding the biological knowledge encoded in the current WCM, and while maintaining viable E. coli growth at every phase boundary?
Hypothesis. A six-phase incremental replacement — (0) Markov-blanket characterization, (1) v2ecoli's multi-objective FBA → kinetic ODE metabolism, (2) discrete-time → continuous-time jump processes, (3) observation-likelihood and Bayesian-interface infrastructure, (4) compiled column-centric runtime, (5) Bayesian gene-function annotation — yields a PDMP-class WCM that (a) reproduces Phase-0 interface statistics within tolerance at every later phase, (b) admits well-formed process likelihoods at Phase 3, (c) achieves ≥10³ parallel single-cell trajectories with near-zero marshalling overhead at Phase 4, and (d) recovers known E. coli gene functions with credible intervals on a benchmark set at Phase 5.
Each acceptance criterion is a behaviour test declared in a study: a measured field from the run (e.g. closure_gap_size) compared against an explicit pass_if band (a numeric threshold/range). The per-criterion result, each study’s gate verdict, and this roll-up are computed in code from the run outcomes (deterministic) — not human judgement. Expand a row to see the field, the passing band, and the observed value.
| Study | Behavior | Metric (field · pass-if → observed) | Result |
|---|---|---|---|
| pdmp-00-characterization | reference-xarray-3-conditions | — | in-progress |
| pdmp-01-metabolism-ode | interface-matches-reference | — | in-progress |
| pdmp-02-jump-processes | pdmp-trajectory-distribution-match | — | in-progress |
| pdmp-03-inference | abc-posterior-recovery-on-synthetic | — | in-progress |
| pdmp-04-compilation | 10cubed-parallel-trajectories | — | in-progress |
| pdmp-05-causal-discovery | benchmark-recovery-with-credible-intervals | — | in-progress |
🧬 Biology — the mechanism this investigation models E. coli grows by integrating metabolism, gene expression, replication, and division — processes on very different timescales that admit different mathematical idealizations.…
E. coli grows by integrating metabolism, gene expression, replication, and division — processes on very different timescales that admit different mathematical idealizations. The current v2ecoli WCM fuses these into a fixed-step loop: a single multi-objective FBA linear program solves metabolism each timestep (`wholecell.utils.modular_fba` with GLPK-linear: biomass production + homeostatic concentration targets + optional kinetic-constraint targets driving enzyme-catalysed flux toward Vmax×[E]; output fluxes converted to molecule count changes via `stochasticRound`), discrete-time Poisson draws fire transcription and translation events scaled by timestep, a teleonomic doubling-time target triggers division, and an allocator gates each layer's access to shared bulk pools (metabolism runs LAST in the timestep, deriver-style, on the post-partition state). This reproduces growth across roughly a dozen conditions, but its trajectory is that of an algorithm, not of any well-defined dynamical system.
A PDMP separates this into deterministic evolution between events (ODE flow on continuous state) and discrete jumps at event times (state-dependent probability kernels on countable state). Mass-action kinetics for central carbon metabolism, like Millard et al. 2017's curated ODE model, naturally inhabit the deterministic flow; gene-expression events, division, and resource competition inhabit the jump layer. The PDMP formalism makes both layers inspectable, compilable, and likelihood-bearing.
🔬 Scientific argument 18 for · 2 against The PDMP class — ODE segments interrupted by discrete jump events — is the appropriate mathematical model class for a next-generation E. coli WCM: it…
Main claim. The PDMP class — ODE segments interrupted by discrete jump events — is the appropriate mathematical model class for a next-generation E. coli WCM: it has process likelihoods by construction, enforces an explicit causal/teleonomic parameter partition, and aligns with the causal-modelling literature for dynamical systems.
Evidence for
- DUF final report Sec. 4.1.2 identifies PDMPs (a.k.a. jump-ODEs) as the suitable model class for reformulating v2ecoli; [[duf-final-report]].
- Millard et al. 2017 demonstrate that metabolic regulation in E. coli central carbon and energy metabolism is sufficient for coordinated glucose uptake, growth, and energy production via an ODE-only kinetic model — providing the foundational substrate for the Phase-1 reformulation; [[millard2017]].
- Vivarium's algebraic-effect interpretation (DUF Sec. 4.2.2) opens a path to extending it into a probabilistic programming language for observe / intervene effects in Phase 3.
- Phase 1 empirical — MillardPDMPMetabolism + JAX/Diffrax + consumption_matched ref-growth driver landed (PR #72, merged 2026-05-30), but the ±σ acceptance is not met: the cited figure (reports/figures/pdmp-01/pdmp_vs_phase0.html) shows cell_mass ~ -20σ / dry_mass ~ -18σ (up to -600σ) outside the band, and a real multi-replicate W₂ was never computed (compare_pdmp_vs_phase0.py is a single-replicate z-score). Phase 1 is being re-run for verification.
- Phase 2 empirical — per-promoter and per-protein Poisson tau-leap landed in `poisson` mode. A max |Δcell_mass| = 150 fg between configs (transient, single trajectory pair) was measured on the cell_mass quantity (scripts/trajectory_divergence.py, sprint 4) — not at rnap_data. The acceptance gate pdmp-trajectory-distribution-match failed (Poisson W₂ grows 9.73 → 49.46).
- Phase 3 pipeline empirical — emission → LikelihoodCollector → XArrayEmitter zarr → xarray.Dataset(replicate × time × channel) readback → mean-to-mean ε calibration → SMC sequential refinement was built (genuine infrastructure). The "observed" data are generated at the scale=1.0 grid node, so any apparent collapse to that node is tautological, not a recovered posterior; SBC/PPC were never run (cited scripts do not exist).
- Phase 3 architectural finding (sprints 11-13) — pipeline emits self-calibrated `log P(simulated | simulated_param)`, not the ABC-correct `log P(observed | proposed)`. Switching to count-based ABC distances is the architectural fix.
- Phase 3 grid-separation diagnostic — on a self-generated 3×3 toy grid (N=4, 60 s), the combined count vector `sqrt(d_rna² + d_ribosome²)` gives a next-nearest-CELL grid-separation ratio of 3.06× (vs 2.39× for aggregate log-likelihood). This is a separation diagnostic on a self-generated grid, not a posterior or credible interval.
- Phase 3 transcript-count signal — `total_rna_init` separates the truth row (27K) from off-truth rows (3.8M) along the Ts axis; the "~150× row-separation" figure is a hardcoded literal (no script computes it). Indicates the count metric tracks the parameter channel it is causally linked to.
- Phase 3 anti-diagonal ridge (sprint 10) — 2D (Ts, Ps) sweep under aggregate log-likelihood: reducing transcription while raising translation partially cancels (fewer mRNAs × more activations per mRNA → similar total log P/tick). Per-channel distance breaks the ridge.
- Phase 4 hot-path empirical — production composite per-tick wall = 52 ms (sprint 5) / 74 ms (sprint 1 single-tick). 76% lives in framework overhead (Python internals + numpy + v2ecoli library + other site-packages).
- Phase 4 marshalling hotspots (sprint 2) — 13,817 `isinstance` + 4,213 `__array_finalize__` + 52 `process_update` calls per tick. Marshalling dominates over per-Process compute.
- Phase 4 toy-prototype per-tick measurements (sprints 3-4-6) — 3.1× on pure-Poisson toy, 2.8× on 3-step toy, 1.5× on realistic TranscriptInitiation-shaped workload. These are isolated toy micro-benchmarks, not the WCM runtime.
- Phase 4 projection (NOT measured) — column-centric runtime × N-way lockstep is PROJECTED at "~1500×" total speedup at N=10³, but this is an illustrative projection: phase4_wcm_baseline_projection.py hardcodes a toy factor 3× and sets column wall = per_tick/3.0 with no N-dependence, so speedup = 3× × N by construction. The column-centric runtime was never built or timed. Choosing it over per-Process Catalyst.jl JIT is a hypothesis, not a validated result.
- Phase 5 sprint 1 (Bayes-factor stub) — model-comparison shape works on Phase-3 ABC infrastructure: 5-hypothesis sweep of transcript_init_prob_scale, exp(-d/2σ²) marginal-likelihood proxy with σ=sprint-8 noise floor, posterior peaks at truth (28.8%). Weak signal — log BF +0.32 vs runner-up θ=1.15 (within Jeffreys "weak" band). Confirms identifiability floor: posterior cannot peak sharper than the noise-floor σ allows.
- Phase 5 sprint 2 (pseudo-marginal + bias diagnostic) — sprint 1's biased "distance-of-the-mean" estimator overstated the signal. Unbiased per-replicate kernel average shrinks truth posterior from 28.8% → 24.4% (essentially the 20% uniform baseline over 5 hypotheses); log BF (truth vs runner-up) collapses from +0.32 → +0.01. Bootstrap 95% CI on truth posterior: [22.4%, 26.8%]. Per-θ Jensen bias was heterogeneous (Δlog 0.47–0.87), so sprint 1 was systematically wrong, not just noisily wrong. The unbiased estimator confirms: at N=4 with sprint-7 ensembles, the data have essentially zero power to discriminate ±15% scale variation.
- Phase 5 sprint 3 (N-scaling projection) — sharpens the Phase-5 bottleneck diagnosis. CLT + parametric projection from sprint-2's per-θ kernel statistics to N ∈ {4...1024} shows that N alone CANNOT rescue the signal: the kernel-mean gap between truth (log k̄=-0.998) and runner-up θ=1.15 (log k̄=-1.009) is only Δlog=+0.011, so as N→∞ the log-BF CI tightens AROUND that near-zero gap. Substantial/decisive Jeffreys thresholds never reached even at N=1024. The bottleneck is information-theoretic (observable + σ + hypothesis spacing), not statistical-power. Reclassifies the Phase-5 levers: (1) wider hypothesis spacing, (2) richer observable (the Phase-3 combined count vector), (3) tighter ε; N is the LEAST useful lever.
- Phase 5 sprint 4 (hypothesis-spacing sweep, no new sims) — tests sprint 3's diagnosis by computing the unbiased pseudo-marginal posterior over progressively-wider SUBSETS of the existing sprint-7 grid. Truth posterior climbs from 24% (5-way ±15%) → 43% (3-way ±30%) → 61% (2-way truth vs θ=1.3), confirming spacing IS a lever for the within-grid 1/n_H dilution effect. But log BF maxes at +0.45 even in the most favorable 2-way subset — STILL BELOW Jeffreys substantial threshold of 1. Sprint 4 separates two identifiability effects: within-grid dilution (spacing fixes) vs per-pair kernel-mean ceiling (only observable or σ can fix). After sprints 1-4, the SINGLE remaining Phase-5 lever in the current design space is observable choice.
Evidence against
- v2ecoli's current FBA metabolism (multi-objective: biomass + homeostatic + kinetic-constraint, via `wholecell.utils.modular_fba`) is tightly coupled to the rest of the WCM — enzyme abundances feed the kinetic-constraint bounds, doubling-time feeds the homeostatic concentration targets, and ppGpp couples to transcriptional regulation. ODE substitution must reconstruct all three coupling channels before interface statistics will match (Phase 1 risk).
- Continuous-time jump propensities require measured kinetic constants for transcription/translation/division that may not exist at the necessary precision (Phase 2 risk).
Key figures
·— Phase 2 closeout report — cell_mass is the wrong observable for jump-process variance.·— Phase 3 report — count-vector grid-separation diagnostic (3.06× next-nearest-cell ratio) on a self-generated 3×3 toy grid; not a posterior. Gate unmet.·— Phase 4 report — real per-tick profile is genuine; the "~1500×" speedup is an illustrative projection (toy factor 3× × N), not a measured result. Column-centric runtime not built or timed.·— Count-based ABC distance grid-separation diagnostic; the "~100× sharper" figure is a hardcoded literal, not computed.·— SMC sequential ε refinement on the toy grid; the "observed" data are generated at the truth node, so apparent concentration there is tautological, not a recovered posterior.·— 2D parameter sweep reveals anti-diagonal ridge under aggregate log-likelihood.·— Per-channel vs aggregate ABC — diagnoses the self-calibration issue.·— Phase-3 ensemble figure with intra-ensemble noise floor.·— Phase 4 hotspots: 13,817 isinstance + 4,213 __array_finalize__ + 52 process_update/tick.·— Per-tick decomposition: 76% framework overhead, no single Process dominates.·— Column-centric prototype: constant per-trajectory wall regardless of N.·— Real WCM per-tick baseline + an illustrative projection: the "~1500×" at N=10³ is a toy factor 3× × N by construction (no measured column-centric runtime), NOT a measured speedup.·— TI-shaped recalibration: 1.5× per-tick (vs toys' 3×) under realistic per-tick work.·— 3-step composite: speedup does not compound — pbg overhead is per-process.·— Phase-2 trajectory-shape divergence: max |Δcell_mass| = 150 fg between configs (transient, single trajectory pair), measured on the cell_mass quantity.·— Phase-2 sparse-injection ensemble — homeostat washes per-tick variance.
Caveats
- Resource estimates in the roadmap assume 2–4 FTE per phase; absent that staffing, phases will run serially over much longer wall time.
- Phases 1–2 are designated parallelizable with Phase 4; Phase 3 strictly depends on Phase 2; Phase 5 depends on all preceding phases.
- Phase 2 observable-choice — cell_mass is the wrong observable for jump-process variance. The consumption_matched homeostat washes per-tick variance out by construction. Three controller-tuning attempts (tau-EMA, open-loop, sparse) all failed; Phase 3 correctly pivoted to count-level listeners.
- Phase 3 self-calibration — emitted log-likelihood is `log P(simulated | simulated_param)`, not the ABC-correct `log P(observed | proposed)`. Log-likelihood-based ABC works but is the strictly weaker tool vs the count-based metric Phase 3 sprints 12-13 established.
- Phase 4 projection is not a measured speedup — the "3000×" and "~1500×" figures are an illustrative projection: the script hardcodes a toy factor 3× and sets column-centric wall = per_tick/3.0 with no N-dependence, so total speedup = 3× × N by construction. The column-centric runtime was never built or timed; treat these numbers as a toy order-of-magnitude motivation, not a result.
- Pbg wiring quirk (task #14) — scalar listener fields with no downstream consumer get silently pruned from the merged state. Bit sprints 1 and 12; worked around via pin-via-consumer input declarations. Real fix lives at the pbg merger layer.
- Phase 5 information-theoretic ceiling — sprints 2-3 together reclassify the Phase-5 bottleneck. Sprint 2 confirmed at N=4 the unbiased posterior is essentially uniform (log BF +0.01, truth 24.4% vs baseline 20%). Sprint 3 projected to N=1024 and found N CANNOT rescue the signal — the kernel-mean gap between truth and runner-up θ=1.15 is only Δlog=+0.011 nats; as N→∞, the log BF CI tightens around that near-zero gap, not toward a decisive threshold. Levers in order of impact: (1) wider hypothesis spacing, (2) richer observable (Phase-3 sprint 13 combined count vector), (3) tighter ε; (4) N — last and least useful at the current setup.
Open questions & decisions needed
✋ Decisions needed from reviewers 5 items next: Should Phase-3+ inference anchor on count-level listeners or on aggregate cell_mass / log-likelihood?
- Should Phase-3+ inference anchor on count-level listeners or on aggregate cell_mass / log-likelihood?Phase 2 sprints 6–9, confirmed by Phase 3 sprints 12-13: on a self-generated 3×3 toy grid (N=4, 60 s), the combined count vector sqrt(d_rna² + d_ribosome²) gives a larger next-nearest-CELL grid-separation ratio (3.06×) than aggregate log-likelihood (2.39×) — grid-separation diagnostics, not a posterior (the "~100× sharper" figure is a hardcoded literal). Count-level listeners are the right direction.
- Is the Phase-4 performance attack a column-centric runtime or per-Process Catalyst.jl JIT?Sprint 1-2 profile (real) shows ~76% framework overhead and ~14K isinstance/tick + 4K __array_finalize__/tick dominate, suggesting per-Process compilation buys at most ~10% of per-tick time. The "~1500× at N=10³" figure is an illustrative projection (toy factor 3× × N by construction in phase4_wcm_baseline_projection.py); the column-centric runtime was never built or timed, so this is not a measured speedup.
- Can Phase 5 (Bayesian gene-function annotation) reach its gate within the current design space?Depends on Phase 4 implementation; the per-particle wall budget must drop to <0.05 sec/tick before ABC-SMC at the gene-function scale is tractable. Phase-5 sprints 1-4 additionally show the current observable hits an information-theoretic ceiling (log BF +0.45 < Jeffreys substantial even at the widest spacing) — observable choice is the remaining lever, not replicate budget.
- What is the root-cause fix for the pbg scalar-pruning quirk (taskScalar listener fields with no downstream consumer get silently pruned from the merged state. Worked around in Phase 3 sprints 1 and 13 via pin-via-consumer input declarations; the real fix lives at the pbg merger layer.
- Why does the JAX/Diffrax metabolism backend fail in-WCM (taskThe backend works standalone but fails inside the WCM composite. Phase 1 perf #4 follow-up; blocks the JAX path for the in-WCM Millard ODE.
Investigation roadmap
- ⛔ pdmp-00-characterization (2 passed · 1 failed · 2 skipped)
- 🔄 pdmp-01-metabolism-ode (2 passed · 3 skipped)
- ◽ pdmp-02-jump-processes (4 pending)
- ◽ pdmp-03-inference (3 pending)
- ◽ pdmp-04-compilation (3 pending)
- ◽ pdmp-05-causal-discovery (3 pending)
Studies
Each study is collapsed to a one-glance control panel — scan top to bottom, then click any panel to expand its full detail.
1.Phase 0 — Characterization and Interface Extraction⛔ Blocked▶ Ran · 1 runTests: 2✓ · 1✗ · 2⏭🔶 In progressWhat is the Markov blanket of every major v2ecoli subprocess (metabolism, transcription, translation, replication, division, membrane), and how should every WCM state variable be categorized (ODE-amenable, stochastic discrete, teleonomic, or coupling artifact) so that subsequent phases have a typed interface contract to validate against?Confidence: design-stageEvidence: bootstrap-run-confirmedConclusion Predicted; every v2ecoli state variable will categorise as ODE-amenable, stochastic-discrete, teleonomic, or coupling-artifact; per-step compute will decompose into measurable marshalling vs. essential buckets across ≥3 conditions.variables categorised: planned — variable-categorisation-map not yet produced (65 MB/step raw state captured, but not categorised)interface schemas: 6 subprocessesreference zarr conditions: ≥3replicate ensemble per cond.: N≥642/3 tests passingInsight Phase 0 produces the Markov-blanket reference dataset that gates every later phase. A Phase-N replacement subprocess is only accepted when its interface statistics match the Phase 0 zarr ensemble within tolerance.Caveat Pre-execution scaffold: the acceptance bands (W₂ ratio < 0.05, stiffness κ > 10⁴, MCSE < 10% of inter-condition effect size, ±σ / |z|≤2) are ad-hoc, uncited, and none asserted as met; concrete bands will be fitted from the N≥64 runs once the diagnostic harness lands and the canonical reference is committed.
Biology
No biology is changed in Phase 0: v2ecoli (55-process partitioned whole-cell model) is run as-is to characterise what state each subprocess exchanges. The one biological sanity signal is growth-rate ordering across media: glucose+aa (doubling 25 min) > glucose (44 min) > acetate (136 min), which the N=32 ensemble reproduces in endpoint cell/dry mass.
Study card
| Goal | Phase 0 — Markov-blanket interface extraction. Run v2ecoli as-is under M9-glucose + acetate + glucose-aa with XArrayEmitter; produce the reference zarr ensemble every later phase validates against; profile per-step compute to decompose marshalling overhead vs. essential FBA-LP-solve cost. |
|---|---|
| Why before next | Before changing the model, we need to measure what the current model passes between subprocesses, so every later replacement can be judged against a reference. |
Literature anchors
The biological expectations this study tests, mapped to the model observable that will measure each one. Full citations live in the test cards.
Overview
This study asks whether what is the Markov blanket of every major v2ecoli subprocess (metabolism, transcription, translation, replication, division, membrane), and how should every WCM state variable be categorized (ODE-amenable, stochastic discrete, teleonomic, or coupling artifact) so that subsequent phases have a typed interface contract to validate against?. We recorded 2 findings confirm the expected biology. Gate decision: Blocked. Investigate why 1 test(s) failed.
Purpose & background (study design)
Detailed findings
Infrastructure / computational findings (2)
test_baseline_diverges_under_different_seedsTechnical details
test:test_baseline_diverges_under_different_seedsphase0-traj{,-acetate,-with_aa} (N=32 x 600s, 96 runs) · runs: phase0-traj, phase0-traj-acetate, phase0-traj-with_aaTechnical details
run:phase0-traj{,-acetate,-with_aa} (N=32 x 600s, 96 runs)Conclusion verdicts
Three-track verdict — each result is computed from canonical fields (gate evaluator, run status, finding tiers). The basis is the author's rationale.
Discovery implications
Where this study's results leave the mechanism model — and what to investigate next.
✓ Resolved uncertainties
- The per-process RNG-seeding bug (diagnosed via a 3-seed pilot that produced CV 0.000% across seeds) is fixed (each stochastic process seeds from crc32(process_name, master_seed)); multi-seed ensembles now diverge (CV > 1% at t=100 s), so every downstream ensemble is a genuine sample, not one trajectory in disguise.
- A fresh N=6 x 250 model-second M9-glucose pilot ensemble (.pbg/runs/phase0-traj/) ran successfully on the merged branch with trajectories that genuinely diverge across seeds (ATP[c] CV ~ 0.029%); a single-condition pilot, explicitly not the 3-condition x N=64 x 600 s canonical reference, which is not committed in this checkout and is being re-run. Earlier cross-condition ATP ratios (glucose:acetate 3.85x, +aa:glucose 1.97x) are from a prior uncommitted run and await the re-run before being re-asserted.
● Remaining uncertainties
- Multi-generation zarr trajectories via XArrayEmitter are not yet produced (composite.run() does not auto-attach the emitter; task #39); only single-generation endpoint + per-tick listener JSON exists today, so the multi-gen lineage statistics Phase 2 needs are missing.
- The typed PB Markov-blanket interface schemas (6 subprocesses) and the per-step marshalling-vs- essential compute profile are specified as planned readouts but not yet emitted as deliverables.
Alternate hypotheses (1)
marshalling_ms / total_ms fraction over >=1000 step samples with bootstrap 95% CI, FBA-LP-solve bucket vs marshalling bucketper-step-compute-profile, marshalling-overheadMechanism update proposals (1)
per-process-rng-seedingreviseFollow-up study proposals (2)
Click ➕ Add study to spawn a new study node in the investigation graph (seeds a child study.yaml from the proposal, with a leads-to edge back to this study).
Conditions — what we set up to test it
Baseline
v2ecoli.composites.diagnostic.diagnosticxarrayM9-glucoseVariants (4)
Each variant is a perturbation of the baseline — typically a parameter override or a swapped composite. These define the runs that test the assumption.
| Variant | Composite / base | Parameter overrides | Notes | Run |
|---|---|---|---|---|
v2ecoli-diagnostic-M9-glucose | v2ecoli.composites.diagnostic.diagnostic | condition M9-glucoseseed 0n_steps 600 | Canonical reference: M9 minimal + 22 mM glucose, aerobic, 37°C. The baseline against which all other Phase 0 conditions are compared. | vwb run study pdmp-00-characterization --variant v2ecoli-diagnostic-M9-glucose |
v2ecoli-diagnostic-M9-acetate | v2ecoli.composites.diagnostic.diagnostic | condition M9-acetateseed 0n_steps 600 | Slower-growth gluconeogenic regime; same cache, swap nutrient condition to acetate. Tests interface fidelity when the FBA solution sits on a different polytope facet. | vwb run study pdmp-00-characterization --variant v2ecoli-diagnostic-M9-acetate |
v2ecoli-diagnostic-M9-glucose-aa | v2ecoli.composites.diagnostic.diagnostic | condition M9-glucose+aaseed 0n_steps 400 | Faster-growth (partial relief on translation): M9 + glucose + 20 amino-acid mix at fully-supplemented concentrations. | vwb run study pdmp-00-characterization --variant v2ecoli-diagnostic-M9-glucose-aa |
v2ecoli-diagnostic-ensemble-N64 | v2ecoli.composites.diagnostic.diagnostic | condition M9-glucoseseed <replicate>n_steps 600 | N=64 stochastic replicates per condition (3 conditions × 64 = 192 runs). The full reference ensemble Phase 1+ phases validate against. Wall-clock estimate: ~30 hr serially, ~1 hr in parallel on a 32-core machine. | vwb run study pdmp-00-characterization --variant v2ecoli-diagnostic-ensemble-N64 |
What we ran (6 simulations)
One row per concrete run: the model composite, what changes vs the reference baseline, the condition / length, and its status.
| Simulation | Composite | Changes vs baseline | Run | CLI | Status |
|---|---|---|---|---|---|
| phase0-bootstrap | diagnostic | reference baseline | — | vwb run study pdmp-00-characterization | ran |
| phase0-warmup-x1 | diagnostic | same params, longer/other | — | vwb run study pdmp-00-characterization | planned |
| fix-per-process-rng-seeding | diagnostic | same params, longer/other | — | vwb run study pdmp-00-characterization | blocks-ensemble |
| phase0-conditions-3 | diagnostic | same params, longer/other | — | vwb run study pdmp-00-characterization | planned |
| phase0-ensemble-3x64 | diagnostic | same params, longer/other | — | vwb run study pdmp-00-characterization | planned |
| phase0-profile-instrumented-baseline | ecoli_baseline | different model ecoli_baseline | 1 seed | vwb run study pdmp-00-characterization | planned |
Measurements (4 readouts)
Quantities we extract from each simulation run to evaluate the study's tests.
| Readout | Status | Path | Description |
|---|---|---|---|
| reference-zarr-stores | running | studies/pdmp-00-characterization/phase0_ensemble_provenance.json (per-seed endpoint JSON + per-tick listener trajectory JSON (raw stores gitignored; committed run log = provenance JSON)) | Committed run log: phase0_ensemble_provenance.json records the real N=32 × 600 s, 3-condition (M9-glucose / M9-acetate / M9-glucose+aa) Phase-0 ensemble: 96 runs total, 2026-06-11, Ray fan-out (sequential for +aa to dodge a parquet-emitter makedirs race). Endpoint cell/dry mass ordered by doubling time as expected (glucose+aa 25 min > glucose 44 min > acetate 136 min); cross-seed CV 0.1–1.3%; per-process RNG-seeding fix gives distinct-but-tight replicates (not bit-identical). Scope: N=32 per condition, not the N=64 canonical target (the provenance explicitly says "Do NOT cite as N=64"), so the investigation gating criterion (N≥64) is not met. The raw per-seed stores (.pbg/runs/phase0-traj{,-acetate,-with_aa}/seed_*/{summary,trajectory}.json) are gitignored / not committed in this checkout; the committed artifacts are this provenance JSON + the phase0_*REAL / phase0_*AUTO figures. Multi-generation zarr via XArrayEmitter is still pending (composite.run() does not auto-attach the emitter; task #39). |
| interface-schemas | planned | (planned) v2ecoli/<process>/interface.schema.json (PB schema) | Typed PB interface schema per major subprocess (metabolism, transcription, translation, replication, division, membrane). |
| per-step-compute-profile | planned | (planned) .pbg/runs/<id>/profile.json (ms per bucket) | 5 buckets: FBA LP solve / RNG / store-process marshalling / topology traversal / emitter I/O. Mean +/- std over >=1000 step samples + bootstrap 95% CI. |
| variable-categorisation-map | planned | (planned) studies/pdmp-00/variable_categories.yaml (category enum + numerical-sensitivity tier) | Every state variable: ODE-amenable / stochastic-discrete / teleonomic / coupling-artifact + stiffness/CV/coupling-strength tier. |
Success criteria (5 tests — 2 ✓ passed · 1 ✗ failed · 2 ⏭ skipped)
Each test makes a specific scientific claim with a machine-checkable criterion (measure + pass_if). Tests are now evaluated by code against the run (the run/outcome spine: RunReader → evaluator): the pill shows the result, and the evidence line shows the measured value, whether it was computed by code or routed to an agent, and whether the code verdict agrees with the authored one (reconcile). ⏳ pending = the study hasn't run yet. Technical assertion + the exact evaluator are under "Technical details".
phase0-reference-ensemble-N32-3condensemble-rng-seeding-divergenceTechnical details
Measure: {"source":"scripts/run_phase0_pilot_ensemble.py","observable":"ATP[c]_count","reduce":"std/mean across seeds","units":"fraction (dimensionless)"}Pass condition: {"operator":"greater-than","threshold":0.01,"field":"cv_pct"}
Requires sim:
phase0-pilot-N4Cites:
v2ecoli_baseline, casella1992phase0-reference-ensemble-N32-3condreference-ensemble-N64Technical details
Measure: {"source":".pbg/runs/phase0-reference/store.zarr","observable":"interface_dataset","reduce":"MCSE / min_pairwise_effect_size","units":"ratio (dimensionless)"}Pass condition: {"operator":"less-than","threshold":0.1,"field":"mcse_ratio"}
Requires sim:
phase0-reference-3x64Cites:
casella1992, geyer1992phase0-reference-ensemble-N32-3condmarkov-blanket-covers-all-major-processesTechnical details
Measure: {"source":"investigations/v2ecoli-pdmp/markov_blankets/","observable":"schema_coverage","reduce":"len(written_schemas) / len(major_subprocesses)"}Pass condition: {"operator":"equal","threshold":1,"field":"coverage_fraction"}
Requires sim:
none (design deliverable)Cites:
pearl1988, koller2009phase0-reference-ensemble-N32-3condmarshalling-overhead-dominatesTechnical details
Measure: {"source":"scripts/run_phase0_pilot_ensemble.py --profile","observable":"per_step_compute_breakdown","reduce":"marshalling_ms / total_ms","units":"fraction (dimensionless)"}Pass condition: {"operator":"greater-than","threshold":0.35,"field":"marshalling_fraction"}
Requires sim:
phase0-profile-instrumentedphase0-reference-ensemble-N32-3condgrowth-rate-condition-monotoneTechnical details
Measure: {"source":".pbg/runs/phase0-reference/store.zarr","observable":"instantaneous_growth_rate","reduce":"mean over time, sorted by condition","units":"1/h"}Pass condition: {"operator":"ordering","expected":["M9+acetate","M9+glucose","M9+glucose+aa"]}
Requires sim:
phase0-reference-3x64Cites:
macklin2020Model changes
None. Phase 0 is pure characterisation: v2ecoli is run unmodified; the only code change is an infrastructure fix (per-process RNG seeding) that affects ensemble diversity, not biological mechanism.
Key assumptions
- Three media conditions (M9-glucose / M9-acetate / M9-glucose+aa) span the metabolic regime well enough to set downstream interface tolerances.
- N=64 replicates per condition would put the standard error of the mean at ~12.5% of σ (basis for the canonical target; only N=32 has run so far).
- Per-process RNG seeding (crc32(process_name, master_seed)) is the correct fix for the bit-identical-ensemble bug.
Build / fix list (3)
Concrete engineering work to fully exercise this study.
Conclusion synthesis
Read-only synthesis derived from the study's canonical fields (findings, limitations, follow-up proposals).
- Per-process RNG seeding (crc32(process_name, master_seed)) makes multi-seed ensembles genuinely diverge; v2ecoli's bare `seed` only seeded the allocator, leaving ensembles bit-identical.
- A real 3-condition Phase-0 reference ensemble exists (M9-glucose / acetate / +aa, N=32 x 600s each), replacing the previously-uncommitted 192-run claim. Scope: N=32, not the N>=64 canonical gating target, so the investigation gate is not met by this ensemble.
- N=6 x 250s M9-glucose pilot ATP[c] CV ~ 0.029% across seeds (>0); tests/test_seed_diversity.py PASS
- 96 trajectory runs (N=32 x 3 conditions); cell/dry/water masses finite and ordered by doubling time. Raw per-seed stores are gitignored / NOT committed; the committed artifacts are phase0_ensemble_provenance.json + the phase0_*REAL/AUTO figures.
- Multi-generation XArrayEmitter reference ensemble
- Typed PB Markov-blanket interface schemas for all six subprocesses
References cited by this study
macklin2020, agmon2022, birch2014, stumpf2021
Pipeline-gate decision
Blocked- growth-rate-condition-monotone
- ensemble-rng-seeding-divergence
- reference-ensemble-N64
Pipeline gate & conclusion logic (technical)
Prerequisites: none (root study)
Enables: —
Proceed when: Reference Xarray zarr stores produced for ≥3 conditions × N≥64 replicates × ≥3 generations, with per-observable MCSE reported and bootstrap CIs on every summary statistic. Per-step compute profile decomposed into FBA LP / RNG / marshalling / topology / emitter-I/O buckets.
2.Phase 1 — Metabolism: multi-objective FBA → Kinetic ODE✅ Passing▶ Ran · 1 runTests: 2✓ · 3⏭🔶 In progressCan the Millard et al.Confidence: design-stageEvidence: first-run-confirmedConclusion First run confirmed (2026-05-24): Millard 2017 SBML loads + simulates via pbg-copasi and recovers the published reference steady state for central carbon + energy metabolites (G6P, F6P, FDP, PEP, PYR, ATP/ADP, NADH/NADPH, MAL, AKG all match BioModels MODEL1505110000 initial values to solver tolerance). The FBA-bridge flux-pin now integrates the Millard ODE into the WCM FBA (24 active pins) and the LQR was fixed to a real stabilizing gain (||K|| ≈ 4.39, commit cc6a72d); the PDMP-vs-Phase-0 endpoint W₂ comparison is done on M9-glucose (±σ gate met; cell_mass W₂/σ = 1.00, dry_mass 1.09, commit 6a764fc), with acetate / +aa multi-condition still pending.✅ Millard ODE standalone (pbg-copasi)FBA-bridge compositeW₂ vs Phase-0 ensemble: ≤ 5σ MCFIM κ on causal params: < 10⁸2/2 tests passingLit match: Millard et al. 2017 (PLOS Comp Biol)Insight pbg-copasi gives us the published Millard model as a first-class PB process without re-deriving rate laws. Phase 1 effort goes to the LQR + FBA-bridge, not to ODE re-implementation.Caveat LQR reference trajectory must not reintroduce a teleonomic parameter in disguise; the causal/teleonomic partition is enforced per-parameter and audited via FIM conditioning (κ < 10⁸) before the model is declared inference-ready. Report figures are limited to the artifacts committed in this checkout (Millard ATP-drain / multi-perturbation, the FBA-bridge flux-pin, PDMP-vs-Phase-0 W₂); the broader perturbation-matrix / LQR-tuning figure set regenerates from a re-run of the standalone-Millard and LQR sweeps.
Biology
Replaces v2ecoli's multi-objective FBA central-carbon metabolism with the Millard 2017 mechanistic kinetic ODE (glycolysis, PPP, TCA, oxidative phosphorylation), coupled to the WCM either via a consumption_matched growth driver or by pinning the ODE-predicted central fluxes into the WCM FBA LP. On M9-glucose the closed-loop cell_mass distribution matches the Phase-0 ensemble within ±σ; the ~20 fg offset was traced to open-loop water drift (fraction had climbed to 0.7045), not the kinetics or control, and the fix regulates WATER[c] closed-loop to hold the birth water fraction (target_water_mass = dry*f/(1-f)). The FBA-bridge flux-pin keeps the WCM viable (dry_mass 379.8 -> 389.8 fg over 120 s).
Study card
| Goal | Phase 1 — substitute v2ecoli's multi-objective FBA (`wholecell.utils.modular_fba`, glpk-linear) with the Millard 2017 kinetic ODE (BioModels MODEL1505110000) wrapped via pbg-copasi, an LQR outer control layer for growth-rate regulation, and an FBA-bridge composite that couples the ODE to the remaining v2ecoli FBA during the incremental handover. |
|---|---|
| Why before next | This tests whether metabolism can be represented as continuous biochemical dynamics instead of an FBA optimization step, without breaking the rest of the cell model. |
Literature anchors
The biological expectations this study tests, mapped to the model observable that will measure each one. Full citations live in the test cards.
Overview
This study asks whether can the Millard et al. 2017 kinetic ODE of E. coli central carbon. We recorded 1 finding confirm the expected biology, 2 novel computational results. Gate decision: Passed. Gate cleared. No declared downstream studies — review pipeline_gate.enables.
Purpose & background (study design)
Detailed findings
Infrastructure / computational findings (3)
pdmp-ensemble-vs-phase0 (N=12 PDMP consumption_matched vs N=32 Phase-0, 600s) · runs: pdmp-ensemble-vs-phase0Technical details
run:pdmp-ensemble-vs-phase0 (N=12 PDMP consumption_matched vs N=32 Phase-0, 600s)millard_fba_bridge_harness (full WCM + Millard source + coupler, M9-glucose) · runs: millard_fba_bridge_harnessTechnical details
run:millard_fba_bridge_harness (full WCM + Millard source + coupler, M9-glucose)test_multistate_lqr_gain_is_nonzero_and_stabilizingTechnical details
test:test_multistate_lqr_gain_is_nonzero_and_stabilizingConclusion verdicts
Three-track verdict — each result is computed from canonical fields (gate evaluator, run status, finding tiers). The basis is the author's rationale.
Discovery implications
Where this study's results leave the mechanism model — and what to investigate next.
✓ Resolved uncertainties
- The Millard 2017 SBML loads and integrates via pbg-copasi's CopasiUTCProcess and recovers the BioModels MODEL1505110000 reference steady state to solver tolerance — ODE re-implementation is NOT needed; Phase-1 effort goes to the LQR + FBA-bridge.
● Remaining uncertainties
- The +/-sigma cell_mass + dry_mass acceptance gate is now met on M9-glucose (2026-06-11, closed-loop WATER[c] fix, commit 6a764fc). The ~20 fg cell_mass offset was entirely open-loop water drift; the fix regulates WATER[c] closed-loop to hold the birth water fraction (verified flat at 0.70000 over 600 s). Re-run of scripts/compare_pdmp_ensemble_vs_phase0.py (N=12 PDMP reps, consumption_matched, 600 s, seeds 1000-1011, vs the N=32 Phase-0 M9-glucose reference; 12/12 usable, 0 errors, 0 degeneracy) gives endpoint W2: cell_mass = 6.93 fg (W2/sigma = 1.00, 95% CI [5.16, 9.00]); dry_mass = 2.27 fg (W2/sigma = 1.09, 95% CI [1.70, 2.90]). Both <= 2 sigma, so the gate is met (was cell_mass W2/sigma = 3.0 under open-loop water). Notes: closing the loop slightly overshot (PDMP cell_mass 1481.0 -> 1456.8 fg, now ~4.4 fg below Phase-0 1461.1 rather than ~20 fg above) and nudged dry_mass W2/sigma up from 0.86 to 1.09 (still within +/-sigma); the PDMP ensemble remains much tighter than Phase-0 (per-rep sigma ~1.2 fg cell vs 6.9 fg), so the pass rests on a mean offset that now sits within sigma, not on matched variance. This is M9-glucose only; the acetate / +aa PDMP-vs-Phase-0 W2 remains pending and is the gating step before any acceptance. See reports/figures/pdmp-01/RUN_REPORT_2026-06-11.md.
- Reproducibility caveats surfaced in the just-attempted re-run: (a) the baseline_millard (lqr=True) composite had a pre-existing broken import (LikelihoodCollector imported from the nonexistent v2ecoli.steps.listeners.* instead of v2ecoli.steps.derivers.*); its likelihood path was unbuildable until fixed in this refresh; (b) in the default 'proportional' ref-growth mode the composite crashes mid-run with "ValueError: Negative values at equilibrium steady state" (v2ecoli/processes/equilibrium.py) and runs only in the 'consumption_matched' mode; (c) the LQR zero-gain Riccati bug (an A = I + J finite-difference artifact) was root-caused and fixed (commit cc6a72d; true Jacobian + conserved-moiety CARE shift giving ||K|| ≈ 4.39, regression-tested in tests/test_lqr_riccati_stabilizable.py), so the outer controller is no longer degenerate (gain_degenerate=False across 12/12 replicates).
- The FBA-bridge composite has not been shown to hold interface statistics across ANY Phase-0 condition; the M9-glucose, M9-acetate and M9-glucose+aa W2 audits are all pending (no condition is closed).
- The LQR outer-control weights have not passed a Sobol-sensitivity / FIM-conditioning (kappa < 1e8) audit, so the causal/teleonomic parameter partition is asserted but not yet proven free of disguised free parameters.
- Task #20 — the JAX/Diffrax backend works standalone but fails inside the WCM composite; the in-WCM path is unresolved.
Alternate hypotheses (1)
FIM conditioning kappa on the causal kinetic parameters, Sobol sensitivity indices of interface statistics to LQR weights, open-loop (driver-off) W2 vs the Phase-0 ensemblelqr-control-layer, causal-teleonomic-partitionMechanism update proposals (1)
metabolism (multi-objective FBA -> kinetic ODE)replaceneeds expert approvalFollow-up study proposals (2)
Click ➕ Add study to spawn a new study node in the investigation graph (seeds a child study.yaml from the proposal, with a leads-to edge back to this study).
Conditions — what we set up to test it
Baseline
pbg_copasi.composites.utc-processv2ecoli/models/sbml/millard2017_central_metabolism.xml1M9-glucose0.1737Variants (5)
Each variant is a perturbation of the baseline — typically a parameter override or a swapped composite. These define the runs that test the assumption.
| Variant | Composite / base | Parameter overrides | Notes | Run |
|---|---|---|---|---|
millard-with-lqr | pbg_copasi.composites.utc-process | (no overrides) | Millard 2017 ODE via pbg-copasi, wrapped with an outer LQR controller that drives growth rate toward a reference trajectory. Replaces v2ecoli's FBA biomass-production objective. | vwb run study pdmp-01-metabolism-ode --variant millard-with-lqr |
millard-fba-bridge | pbg_copasi.composites.utc-process | (no overrides) | Coupled composite. Millard 2017 ODE (pbg-copasi) for central carbon + v2ecoli's multi-objective FBA (`wholecell.utils.modular_fba`) for the rest of the metabolic network; transitional configuration during the incremental handover. | vwb run study pdmp-01-metabolism-ode --variant millard-fba-bridge |
millard-standalone | pbg_copasi.composites.utc-process | model_source v2ecoli/models/sbml/millard2017_central_metabolism.xmltime 100intervals 10 | Standalone Millard 2017 ODE via pbg-copasi CopasiUTCProcess on the published SBML, no coupling, no LQR. Steady-state recovery confirmed 2026-05-24. | vwb run study pdmp-01-metabolism-ode --variant millard-standalone |
millard-atp-drain-perturbation | pbg_copasi.composites.utc-process | perturbation ATP→0.3×SS at t=500sduration 3000 | ATP drained to 30% of steady state at t=500s (ADP gains the difference, mass-balanced). Tests transient response across all coupled subsystems; ran 2026-05-24. | vwb run study pdmp-01-metabolism-ode --variant millard-atp-drain-perturbation |
millard-fba-bridge-3-conditions | pbg_copasi.composites.utc-process | conditions ["M9-glucose","M9-acetate","M9-glucose+aa"] | FBA-bridge composite under M9-glucose, M9-acetate, M9-glucose+aa. Tests interface fidelity across the same conditions as Phase 0. | vwb run study pdmp-01-metabolism-ode --variant millard-fba-bridge-3-conditions |
What we ran (6 simulations)
One row per concrete run: the model composite, what changes vs the reference baseline, the condition / length, and its status.
| Simulation | Composite | Changes vs baseline | Run | CLI | Status |
|---|---|---|---|---|---|
| millard-standalone-bootstrap | utc-process | reference baseline | — | vwb run study pdmp-01-metabolism-ode | ran |
| millard-atp-drain-experiment | utc-process | same params, longer/other | — | vwb run study pdmp-01-metabolism-ode | ran |
| millard-with-lqr-tuning | utc-process | same params, longer/other | — | vwb run study pdmp-01-metabolism-ode | planned |
| millard-fba-bridge-pilot | utc-process | same params, longer/other | — | vwb run study pdmp-01-metabolism-ode | planned |
| millard-fba-bridge-3-conditions | utc-process | same params, longer/other | — | vwb run study pdmp-01-metabolism-ode | planned |
| millard-steady-state-10000s | millard2017_metabolism | different model millard2017_metabolism | 1 seed | vwb run study pdmp-01-metabolism-ode | completed |
Measurements (5 readouts)
Quantities we extract from each simulation run to evaluate the study's tests.
| Readout | Status | Path | Description |
|---|---|---|---|
| millard-standalone-steady-state | ran | — (mM) | Standalone Millard 2017 steady state verified 2026-05-24 vs BioModels MODEL1505110000 initial values (G6P 0.86, F6P 0.26, FDP 0.28, PEP 1.0, PYR 0.24, ATP 2.57, ADP 0.60, NADH 0.16, NADPH 0.09, MAL 1.03, AKG 0.60 mM). The raw CSV (was out/trajectories/millard_steady_approach_10000s.csv, a 10,000 s basico/LSODA run, see planned_runs[millard-steady-state-10000s]) is gitignored / not committed in this checkout, so no clickable artifact path is asserted; the verified values are recorded here and re-checked by the millard-published-ref-state-reproduced test (cites millard2017). |
| fba-bridge-flux-seam | planned | (planned) v2ecoli_pdmp/composites/fba_bridge.schema.json (flux name -> source (ODE or FBA)) | Which fluxes the Millard ODE exports vs which v2ecoli kFBA consumes. The contract negotiated in this study. |
| lqr-sobol-indices | planned | (planned) out/trajectories/lqr_sobol.csv (dimensionless Sobol index) | First-order + total Sobol on growth rate, glucose uptake, ATP yield. LQR weights with total < 0.01 are flagged free-parameter rot. |
| w2-per-metabolite | planned | (planned) out/trajectories/w2_millard_vs_phase0.csv (Wasserstein-2 distance (mM)) | Per interface variable. Gating: within Phase-0 bootstrap CI of self-replicate spread. |
| fim-conditioning | planned | (planned) out/trajectories/fim_kappa.csv (condition number kappa) | Per causal parameter. Required: kappa(FIM) < 10^8 before inference-ready claim. |
Success criteria (5 tests — 2 ✓ passed · 3 ⏭ skipped)
Each test makes a specific scientific claim with a machine-checkable criterion (measure + pass_if). Tests are now evaluated by code against the run (the run/outcome spine: RunReader → evaluator): the pill shows the result, and the evidence line shows the measured value, whether it was computed by code or routed to an agent, and whether the code verdict agrees with the authored one (reconcile). ⏳ pending = the study hasn't run yet. Technical assertion + the exact evaluator are under "Technical details".
phase1-pdmp-vs-phase0-and-fba-bridgemillard-published-ref-state-reproducedTechnical details
Measure: {"source":"v2ecoli.composites.millard2017_metabolism (long run)","observable":"species_concentrations at steady-state","reduce":"max relative-error vs Millard 2017 Fig 2 table","units":"fraction (dimensionless)","reference":"references/papers.bib#millard2017"}Pass condition: {"operator":"less-than","threshold":0.05,"field":"max_rel_error"}
Requires sim:
millard-standalone-steady-stateCites:
millard2017phase1-pdmp-vs-phase0-and-fba-bridgefba-bridge-round-trip-residualTechnical details
Measure: {"source":"tests/test_fba_bridge.py::test_mM_count_roundtrip","observable":"|mM -> count -> mM residual|","reduce":"max across {ATP, NAD, G6P, PEP, FUM} at concentrations {0.001, 0.1, 1.0, 2.5, 100.0}","units":"mM"}Pass condition: {"operator":"less-than","threshold":1e-9,"field":"max_residual_mM"}
Requires sim:
none (pure-function test)phase1-pdmp-vs-phase0-and-fba-bridgefba-bridge-coupled-pilot-runsTechnical details
Measure: {"source":"v2ecoli.composites.millard_fba_bridge","observable":"central_metabolites.ATP at t=100","reduce":"|simulated - 2.57|/2.57","units":"fraction"}Pass condition: {"operator":"less-than","threshold":0.2,"field":"rel_err_ATP"}
Requires sim:
millard-fba-bridge-pilotCites:
millard2017phase1-pdmp-vs-phase0-and-fba-bridgelqr-growth-rate-trackingTechnical details
Measure: {"source":"v2ecoli.composites.millard_lqr","observable":"biomass_production_rate(t)","reduce":"RMS(simulated - reference) / mean(reference)","units":"fraction"}Pass condition: {"operator":"less-than","threshold":0.1,"field":"rms_tracking_error"}
Requires sim:
lqr-tracking-3-conditionsCites:
millard2017, kwakernaak1972phase1-pdmp-vs-phase0-and-fba-bridgeinterface-statistics-match-phase0-W2Technical details
Measure: {"source":"compare .pbg/runs/phase0-reference vs .pbg/runs/phase1-millard","observable":"all interface observables","reduce":"W2_distance / inter_condition_effect_size","units":"fraction"}Pass condition: {"operator":"less-than","threshold":0.05,"field":"max_W2_ratio"}
Requires sim:
millard-fba-bridge-3-conditionsCites:
villani2008Model changes
Replace the multi-objective FBA (wholecell.utils.modular_fba, glpk-linear) central-carbon block with the Millard 2017 kinetic ODE + an LQR outer controller, integrated via an FBA-bridge that pins ODE-predicted central fluxes into the remaining WCM FBA. NOT yet accepted (requires_expert_approval: true).
Key assumptions
- Millard 2017 (BioModels MODEL1505110000) is an adequate kinetic model of E. coli central carbon + energy metabolism for the substitution.
- A Wasserstein-2 endpoint match within ±σ of the Phase-0 ensemble is an acceptable interface-fidelity gate (M9-glucose only so far).
- The causal/teleonomic parameter partition (kinetic constants causal; LQR weights/reference teleonomic) is meaningful and auditable via FIM conditioning + Sobol.
- COPASI/basico LSODA at rtol=1e-6/atol=1e-9 keeps numerical error below the Phase-0 MC noise floor.
Build / fix list (4)
Concrete engineering work to fully exercise this study.
Conclusion synthesis
Read-only synthesis derived from the study's canonical fields (findings, limitations, follow-up proposals).
- On M9-glucose the PDMP-Phase-1 cell_mass + dry_mass endpoint distributions match the Phase-0 reference within +/-sigma (the W2 acceptance gate) after the closed-loop WATER[c] fix.
- The FBA-bridge flux-pin integrates the Millard kinetic ODE into the WCM FBA: for the reactions whose pin holds, the resulting FBA flux equals the ODE-pinned bound exactly. The pinnable scope is glycolysis + pentose-phosphate, where Millard's standalone steady state matches the WCM glucose state. The TCA cycle relaxes because its flux is set by the WCM's growth/energy demand, not the standalone kinetic model (not a sign/scale bug -- the ODE fluxes are positive and sensible); glyoxylate/gluconeogenic/acetate-uptake reactions are off on glucose and were curated out of the default pin set.
- The multi-state LQR was silently running at zero gain (a +I linearization bug); fixing it to a real stabilizing gain did not change the cell_mass W2, ruling out control as the gap cause and localizing it to open-loop water injection.
- cell_mass W2/sigma = 1.00 (was 3.02); dry_mass W2/sigma = 1.09
- held pins (glycolysis+PPP): median |rel err| = 0, 100% within 10%; curating off-on-glucose pathways cut pin-relaxation 57%->45%; core TCA remains growth-coupled (relaxes); viable. Transformative, not confirmatory: all pinned reactions differ >10% from the unpinned WCM FBA (Millard drives ~2x glycolytic flux; PGK/ENO/PDH near-zero unpinned); the kinetic model genuinely steers the WCM. Bug found and parked: 6 isozyme-split reactions (PFK/FBA/PYK core glycolysis + SDH/PPC/PTA) had base-id pins silently ignored (WCM FBA has 9460 enzyme-resolved variant ids, no single base id); moved to needs_variant_pinning + a guard test. PFK/FBA then restored via variant-level pinning (pin the dominant isozyme variant the WCM uses: PfkA 6PFK-1-CPX, FbaA class-II); they now hold exactly, so core glycolysis (PGI->FBA->...->PDH) is driven by the kinetic ODE. PYK/SDH/PPC/PTA stay parked (PYK only a zero-flux reverse variant; the rest TCA/anaplerotic). Active pins 24, all valid fba ids.
- ||K|| ~ 4.4 (was 0); cell_mass W2/sigma unchanged 3.02 with working LQR
- FBA-bridge interface-statistic validation across all Phase-0 conditions
- LQR weight Sobol sensitivity + FIM-conditioning audit
References cited by this study
millard2017, birch2014, saa2017
Pipeline-gate decision
Passed- millard-published-ref-state-reproduced
- fba-bridge-round-trip-residual
Pipeline gate & conclusion logic (technical)
Prerequisites: none (root study)
Enables: —
Proceed when: Millard 2017 standalone reproduces published reference state via pbg-copasi (DONE 2026-05-24). FBA-bridge composite holds interface statistics across all Phase 0 conditions within W₂ tolerance. LQR weights pass Sobol sensitivity (no free-parameter rot). FIM conditioning κ < 10⁸ on causal parameters.
3.Phase 2 — Jump Process Layer: Discrete-Time → Continuous-Time Stochastic🧪 Preliminary○ Not runTests: 4⏳⛔ BlockedCan v2ecoli's discrete-time stochastic layer (Poisson gene-expression draws scaled by timestep/doubling time, the teleonomic division trigger, and the globally-acting resource reallocation correction) be replaced by a coherent continuous-time jump process that, coupled with the Phase 1 metabolism ODE, satisfies the Markov property of a piecewise-deterministic Markov process?Confidence: design-stageEvidence: scaffoldConclusion Predicted. Replacing scaled-Poisson stochastics with continuous-time jumps from measured kinetic constants (Anderson-Darling Exp(1) verified), plus a first-passage division trigger, will yield a PDMP whose trajectory ensembles match v2ecoli baseline summaries within W₂ tolerance.Anderson-Darling Exp(1) per jump: α=0.05OU first-passage analytical CDF: KS < 0.02trajectory W₂ vs baseline: N≥200Markov property (bit-identical)Insight The PDMP contract is the key test for stochastic correctness: between-jump deterministic ODE flow + Exp(1) cumulative-hazard distribution. An A-D test on ≥10⁴ inter-event intervals catches propensity bugs.Caveat τ-leaping trades unbiasedness for compute: the leap condition (max Δλ/λ < 0.03) is monitored every step and the process switches to exact SSA when violated >0.1% of the time. Provenance: the per-sprint σ/μ/W2 table (base_mu/base_sd/pdmp_mu/pdmp_sd/w2_cm, incl. the cell_mass W2 progression 9.73 → 15.35 → 49.46) is hand-entered in scripts/phase2_progress_report.py ("Hardcoded here"), transcribed not recomputed at render. Report figures cover only the artifacts committed in this checkout; the multi-gen inheritance / Gillespie / waiting-time figures regenerate from a re-run of the phase0-multigen and jump-process pilots.
Biology
Represents the cell's discrete molecular events (transcription/translation initiation, division, resource competition) as a continuous-time stochastic jump process rather than fixed-timestep updates. The empirical finding so far: aggregate observables (cell/dry mass, pools) wash out per-event variance via homeostatic regulation (~0.03% cross-seed CV), while direct event counts (rna_init) carry ~30× more variance, so the stochasticity lives at the count level.
Study card
| Goal | Phase 2 — replace v2ecoli's discrete-time scaled-Poisson stochastic layer (transcription, translation), teleonomic division trigger, and global resource reallocation step with continuous-time jump processes driven by propensities from measured kinetic constants. Couple with Phase 1 ODE metabolism to form the full PDMP. |
|---|---|
| Why before next | This converts random biological events — transcription, translation, division — from timestep-based draws into event-based stochastic dynamics. |
Literature anchors
The biological expectations this study tests, mapped to the model observable that will measure each one. Full citations live in the test cards.
Overview
This study asks whether can v2ecoli's discrete-time stochastic layer (Poisson gene-expression draws scaled by. We recorded 1 finding confirm the expected biology, 1 contradict it. Gate decision: Ready to run. Execute the simulation_set to gather evidence.
Purpose & background (study design)
Detailed findings
Infrastructure / computational findings (2)
phase2-progress (Poisson tau-leap vs baseline) · runs: phase2-progressTechnical details
run:phase2-progress (Poisson tau-leap vs baseline)baseline N=4 x 250 steps tick-by-tick (scripts/phase2_count_variance.py) · runs: phase2-count-variance-diagnosticTechnical details
run:baseline N=4 x 250 steps tick-by-tick (scripts/phase2_count_variance.py)Conclusion verdicts
Three-track verdict — each result is computed from canonical fields (gate evaluator, run status, finding tiers). The basis is the author's rationale.
Discovery implications
Where this study's results leave the mechanism model — and what to investigate next.
✓ Resolved uncertainties
- Continuous-time per-promoter / per-protein Poisson tau-leap samplers were implemented and land in `poisson` mode. The "150 fg" figure is max |Delta cell_mass| = 150 fg between configs, a transient on a single trajectory pair, computed in scripts/trajectory_divergence.py on the cell_mass quantity. It is not measured at the rnap_data listener (a narrative literal absent from the computing script), and it cuts against this study's own thesis that cell_mass is the wrong observable.
- cell_mass is the wrong observable for jump-process variance: the consumption_matched homeostat (from Phase 1) washes per-tick variance out of cell_mass by construction. Three controller- tuning attempts (tau-EMA, open-loop, sparse injection) all failed to recover mass variance.
● Remaining uncertainties
- The original Phase-2 gate `pdmp-trajectory-distribution-match` (trajectory-distribution W2 match to the v2ecoli baseline on cell_mass across all Phase-0 conditions) FAILED: the Poisson cell_mass W2 grows monotonically 9.73 → 15.35 → 49.46. Per the closeout this is the wrong gate (cell_mass is the wrong observable), a legitimate negative/structural result, but the gate status is FAILED, not passed/accepted. A replacement count-level trajectory-distribution criterion has not yet been formally specified or passed.
- The Anderson-Darling Exp(1) exponential-clock verification (>=1e4 inter-event intervals) and the OU first-passage division-trigger validation (KS < 0.02) remain unrun.
Alternate hypotheses (1)
cell_mass CV with the homeostat on vs off under identical jump seeds, count-listener variance (rnap_data, ribosome_data) vs cell_mass varianceconsumption_matched-driver, cell_mass-observable, jump-variance-propagationMechanism update proposals (1)
inference-observable (cell_mass -> count-level listeners)reviseneeds expert approvalFollow-up study proposals (2)
Click ➕ Add study to spawn a new study node in the investigation graph (seeds a child study.yaml from the proposal, with a leads-to edge back to this study).
Conditions — what we set up to test it
Baseline
v2ecoli_pdmp.composites.pdmp_runner.pdmp_runnerxarrayVariants (5)
Each variant is a perturbation of the baseline — typically a parameter override or a swapped composite. These define the runs that test the assumption.
| Variant | Composite / base | Parameter overrides | Notes | Run |
|---|---|---|---|---|
transcription-jump-from-kinetics | v2ecoli_pdmp.composites.pdmp_runner.pdmp_runner | backend exact-SSA-or-tau-leapleap_condition Δλ/λ < 0.03 | Replace v2ecoli's scaled-Poisson transcription with continuous-time jumps from measured initiation/elongation rate constants. Propensity λ = k_init × [RNAP_free] × [promoter] for each gene. | vwb run study pdmp-02-jump-processes --variant transcription-jump-from-kinetics |
translation-jump-from-kinetics | v2ecoli_pdmp.composites.pdmp_runner.pdmp_runner | backend hybrid-tau-leap-plus-exact | Same treatment for translation: propensity λ = k_elong × [ribosome_bound] × [aa_charged]. τ-leaping for the ribosome-elongation channel; exact next-reaction for rare initiation events. | vwb run study pdmp-02-jump-processes --variant translation-jump-from-kinetics |
division-first-passage | v2ecoli_pdmp.composites.pdmp_runner.pdmp_runner | threshold_observable cell_volumevalidation OU-FPT-analytical | Cell division as a first-passage time on cell volume crossing a threshold under the coupled ODE+jump dynamics. Validated against the OU-process analytical FPT before deployment. | vwb run study pdmp-02-jump-processes --variant division-first-passage |
competition-jumps | v2ecoli_pdmp.composites.pdmp_runner.pdmp_runner | affinities from-Michaelis-constants | Replace v2ecoli's global resource-reallocation correction step with affinity-based competition jumps. Each shared resource has affinity-weighted propensity to be drawn by each competing process. | vwb run study pdmp-02-jump-processes --variant competition-jumps |
full-pdmp-coupled | v2ecoli_pdmp.composites.pdmp_runner.pdmp_runner | runner Vivarium-PDMP-experimental | Phase 1 ODE + all 4 jump processes coupled under the PDMP runner. The complete deliverable. | vwb run study pdmp-02-jump-processes --variant full-pdmp-coupled |
What we ran (5 simulations)
One row per concrete run: the model composite, what changes vs the reference baseline, the condition / length, and its status.
| Simulation | Composite | Changes vs baseline | Run | CLI | Status |
|---|---|---|---|---|---|
| anderson-darling-validation | pdmp_runner | reference baseline | — | vwb run study pdmp-02-jump-processes | planned |
| ou-fpt-analytical | pdmp_runner | same params, longer/other | — | vwb run study pdmp-02-jump-processes | planned |
| trajectory-distribution-N200 | pdmp_runner | same params, longer/other | — | vwb run study pdmp-02-jump-processes | planned |
| jump-process-multigen-100-divisions | jump_multigen | different model jump_multigen | 8 seeds | vwb run study pdmp-02-jump-processes | planned |
| jump-process-event-rate-profile | jump_transcription_pilot | different model jump_transcription_pilot | 1 seed | vwb run study pdmp-02-jump-processes | planned |
Measurements (4 readouts)
Quantities we extract from each simulation run to evaluate the study's tests.
| Readout | Status | Path | Description |
|---|---|---|---|
| anderson-darling-results | planned | (planned) out/trajectories/ad_exp1_per_jump.csv (A-D statistic + p-value) | Per jump process (transcription, translation, division, competition). >=10^4 inter-event intervals each. Gating: p > 0.05. |
| fpt-distribution | planned | (planned) out/trajectories/fpt_division.csv (first-passage time (s)) | Cell-volume threshold crossing. OU analytical validation: KS distance < 0.02 vs analytical CDF. |
| trajectory-w2 | planned | (planned) out/trajectories/pdmp_w2_vs_baseline.csv (W2 distance per summary stat) | Growth rate, mean per-gene mRNA/protein, division-time CV. N>=200 trajectories. Within tolerance across all Phase 0 conditions = gating. |
| markov-property-record | planned | (planned) out/trajectories/markov_segments.json (bit-equivalence result per re-sim) | Re-simulate jump-segments with same (state, RNG-seed); verify bit-identical deterministic ODE flow between jumps. |
Success criteria (4 tests — 4 ⏳ pending)
Each test makes a specific scientific claim with a machine-checkable criterion (measure + pass_if). Tests are now evaluated by code against the run (the run/outcome spine: RunReader → evaluator): the pill shows the result, and the evidence line shows the measured value, whether it was computed by code or routed to an agent, and whether the code verdict agrees with the authored one (reconcile). ⏳ pending = the study hasn't run yet. Technical assertion + the exact evaluator are under "Technical details".
jump-process-likelihood-closed-formTechnical details
Measure: {"source":"v2ecoli.processes.jump_transcription","observable":"log p(event_sequence | theta) under our jump-process vs reference SSA","reduce":"|delta_log_lik| / |log_lik|","units":"fraction"}Pass condition: {"operator":"less-than","threshold":0.001,"field":"rel_logli_error"}
Requires sim:
jump-process-likelihood-testCites:
gillespie1977anderson-darling-jump-distributionTechnical details
Measure: {"source":"v2ecoli.composites.jump_transcription_pilot","observable":"inter_event_waiting_times","reduce":"Anderson-Darling A² statistic","units":"statistic (dimensionless)"}Pass condition: {"operator":"less-than","threshold":2.5,"field":"AD_statistic"}
Requires sim:
jump-process-AD-testCites:
anderson1954multi-gen-inheritance-binomialTechnical details
Measure: {"source":"v2ecoli.composites.jump_multigen","observable":"daughter copy-number difference per division event","reduce":"chi-squared GOF p-value vs binomial(mother, 0.5)"}Pass condition: {"operator":"greater-than","threshold":0.05,"field":"chi2_p_value"}
Requires sim:
jump-multigen-100-divisionsCites:
huh2011tau-leap-speedup-correctnessTechnical details
Measure: {"source":"scripts/benchmark_tauleap_vs_ssa.py","observable":"wall_seconds_tau_leap, W1(tau_leap_traj, ssa_traj)","reduce":"speedup_ratio AND max_W1_normalized"}Pass condition: {"operator":"all-of","conditions":[{"field":"speedup_ratio","operator":"greater-than","threshold":5},{"field":"max_W1_normalized","operator":"less-than","threshold":0.05}]}
Requires sim:
tauleap-benchmarkCites:
cao2006Model changes
Replace fixed-timestep discrete updates of the stochastic subprocesses with a continuous-time jump-process formulation (exponential clocks per reaction channel). Not yet implemented.
Key assumptions
- Discrete-time WCM updates can be re-expressed as a continuous-time jump process (transcription, translation, division, competition jumps) with exponential inter-event clocks.
- A trajectory-distribution match (Wasserstein-2) against the baseline ensemble is the right acceptance gate, but the right observable is count-level, not aggregate mass (see findings).
- First-passage-time division and binomial inheritance are the key stochastic structures to reproduce.
Build / fix list (3)
Concrete engineering work to fully exercise this study.
Conclusion synthesis
Read-only synthesis derived from the study's canonical fields (findings, limitations, follow-up proposals).
- The Phase-2 trajectory-distribution-match gate FAILED on cell_mass: the Poisson tau-leap Wasserstein-2 grows monotonically rather than converging. The negative finding is that cell_mass is the wrong observable for jump-process variance, because the consumption_matched homeostat washes per-tick variance out by construction. This redirects Phase-3 inference onto count-level listeners.
- Confirms the Phase-2 redirect: across 4 seeds at 250 steps, every aggregate observable (cell_mass, dry_mass, total monomer, ATP[c] count) washes out to ~0.028% cross-seed CV, while the direct jump-event count (cumulative transcription-initiation events, rnap_data.rna_init_event) shows 0.85% CV, ~30x higher. The jump-process stochasticity is real but lives at the per-event count level, not in the aggregate mass/pool observables the consumption_matched homeostat regulates. This is why Phase-3 inference must anchor on count-level listeners.
- cell_mass Poisson W2 grows 9.73 -> 15.35 -> 49.46 (monotonic; gate not met)
- CV: cell_mass 0.0285%, dry_mass 0.0288%, monomer 0.0273%, ATP 0.0283%, cumulative rna_init 0.846% (~30x)
- Count-level trajectory-distribution match as the Phase-2 acceptance gate
- Anderson-Darling Exp(1) exponential-clock + OU first-passage division validation
References cited by this study
kuritz2017
Pipeline-gate decision
Ready to runPipeline gate & conclusion logic (technical)
Prerequisites: none (root study)
Enables: —
Proceed when: Continuous-time jump propensities (transcription, translation, division, resource competition) pass the Anderson-Darling Exp(1) test (α=0.05, ≥10⁴ inter-event intervals each). OU first-passage analytical validation: KS distance < 0.02. Trajectory-distribution W₂ vs. v2ecoli baseline within tolerance across all Phase 0 conditions. Markov property bit-verified.
4.Phase 3 — Inference Infrastructure: Likelihoods and Bayesian Interface🧪 Preliminary○ Not runTests: 3⏳⛔ BlockedCan the Phase 2 PDMP support well-formed observation likelihoods for the dominant cell-biology measurement modalities (RNA-seq, proteomics, growth rate, metabolomics) and recover posteriors via ABC-SMC on synthetic data — establishing the inference-ready substrate that motivated the DUF rescoping?Confidence: design-stageEvidence: scaffoldConclusion Partial (surrogate). A real ABC-SMC (importance weights + perturbation kernel + adaptive-ε) recovers a transcription-init rate on a WCM-calibrated count surrogate (θ=1.2 → CI [1.1984,1.2006], robust; posterior shrinks ~1/√n) with a passing PPC (script gate cov≥0.80). SBC rank-uniformity at K=150 reproduces the recorded χ² p=0.576 but is a knife-edge single-seed pass (4/5 seeds; flips to FAIL under a 0.004% calibration change), so it is not yet a robust calibration certificate. The study acceptance gate — full-WCM-in-the-loop, K=1000, multi-modality — remains BLOCKED, deferred to the Phase-4 compiled runtime. Full per-modality likelihood library + observe/intervene effects remain design-stage.likelihood dispersion fits w/ 95% CI: 4 modalitieslog-accumulator underflows in 10⁴ runs: 0ABC-SMC ESS at terminate: ≥ 0.5·NSBC rank-uniformity χ²: p > 0.0590% CI empirical coverage: ≥ 85%Insight Simulation-Based Calibration (Talts et al. 2018) is the gate that converts 'we have likelihoods' into 'we have inference-ready likelihoods'. Uniformity of the SBC rank histogram is the only credible test before Phase 5.Caveat ABC-SMC is the baseline engine, robust but slow. Gradient-based / VI methods wait on the Phase 4 compiled runtime; planning ABC compute on Phase 2 PDMP trajectories sets a realistic wall-clock floor.
Biology
Builds the likelihood + Bayesian-inference layer that lets the PDMP whole-cell model be fit to (and questioned by) data: per-modality likelihoods, a streaming log-likelihood accumulator, ABC-SMC posteriors, and SBC/PPC validation. A methodological result fell out: the WCM Poisson count posterior is sharp (~300× tighter than a toy), so ABC needs n_generations=12 to converge, and SBC correctly rejected an under-converged ng=6 run before passing at ng=12.
Study card
| Goal | Phase 3 — build the Bayesian inference substrate: per-modality observation likelihoods (negative binomial RNA-seq, log-normal proteomics, normal log-growth, normal/log-normal metabolomics), an incremental log-likelihood accumulator over PDMP segments + jump events, Vivarium observe/intervene algebraic effects (à la ChiRho), and a baseline ABC-SMC inference engine validated by Simulation-Based Calibration. |
|---|---|
| Why before next | This asks whether the new model can assign probabilities to observations, which is what makes parameter fitting and Bayesian inference possible. |
Literature anchors
The biological expectations this study tests, mapped to the model observable that will measure each one. Full citations live in the test cards.
Overview
This study asks whether can the Phase 2 PDMP support well-formed observation likelihoods for the dominant cell-biology. We recorded 2 findings confirm the expected biology. Gate decision: Ready to run. Execute the simulation_set to gather evidence.
Purpose & background (study design)
Detailed findings
Infrastructure / computational findings (3)
phase3 ABC-SMC/SBC/PPC on the WCM-calibrated count surrogate (run_abc_smc/run_sbc/run_ppc) · runs: phase3-surrogate-calibration, phase3-abc-smc-recovery, phase3-sbc-k150, phase3-ppcTechnical details
run:phase3 ABC-SMC/SBC/PPC on the WCM-calibrated count surrogate (run_abc_smc/run_sbc/run_ppc)scripts/run_abc_smc_2d.py (N-D ABC-SMC + 2-param SBC on a synthetic NegBinom) · runs: phase3-abc-smc-2dTechnical details
run:scripts/run_abc_smc_2d.py (N-D ABC-SMC + 2-param SBC on a synthetic NegBinom)hardening seed+calibration sweep of scripts/run_sbc.py params (n_particles=300, n_generations=12, prior (0.2,3.0), n_obs=400) · runs: phase3-sbc-k150-robustness-sweepTechnical details
run:hardening seed+calibration sweep of scripts/run_sbc.py params (n_particles=300, n_generations=12, prior (0.2,3.0), n_obs=400)Conclusion verdicts
Three-track verdict — each result is computed from canonical fields (gate evaluator, run status, finding tiers). The basis is the author's rationale.
Discovery implications
Where this study's results leave the mechanism model — and what to investigate next.
✓ Resolved uncertainties
- The inference substrate is built and runs: per-tick emission for both initiation Processes, an aggregate LikelihoodCollector, XArrayEmitter persistence to per-replicate zarr, mean-to-mean epsilon calibration, SMC sequential refinement, and a 2D multi-parameter sweep.
- The emitted aggregate likelihood is self-calibrated log P(simulated | simulated_param), not the ABC-correct log P(observed | proposed); switching to count-based ABC distances is the architectural fix.
- On a self-generated 3x3 (Ts, Ps) toy grid (N=4 replicates, 60 s), count-based distances separate the truth node from its next-nearest cell better than aggregate log-likelihood: the combined count vector reaches a 3.06x grid-separation ratio (vs 2.39x for aggregate log-likelihood). These are grid-separation diagnostics, not a posterior or credible interval. No script computes a "row-separation" metric; the earlier "~150x row-separation" figure was not actually computed.
● Remaining uncertainties
- SBC rank-uniformity (chi^2 p > 0.05 over >=1000 draws) and >=85% empirical coverage of 90% credible intervals — the gate that converts "we have likelihoods" into "inference-ready likelihoods" — have not been demonstrated on the count-based pipeline.
- The pbg scalar-pruning quirk (task #14) was only worked around (pin-via-consumer declarations in sprints 1 and 13); the root cause at the merger layer is unresolved.
Alternate hypotheses (1)
truth-vs-next-nearest separation, aggregate-LL vs combined-count-vector, across 1D and 2D sweeps, presence of the anti-diagonal ridge under per-channel distanceabc-distance-metric, parameter-identifiabilityMechanism update proposals (1)
abc-distance (aggregate-LL -> count-based)replaceneeds expert approvalFollow-up study proposals (2)
Click ➕ Add study to spawn a new study node in the investigation graph (seeds a child study.yaml from the proposal, with a leads-to edge back to this study).
Conditions — what we set up to test it
Baseline
v2ecoli_pdmp.composites.inference.pdmp_with_likelihoodxarraytrueVariants (5)
Each variant is a perturbation of the baseline — typically a parameter override or a swapped composite. These define the runs that test the assumption.
| Variant | Composite / base | Parameter overrides | Notes | Run |
|---|---|---|---|---|
likelihood-library-4-modalities | v2ecoli_pdmp.composites.inference.pdmp_with_likelihood | modalities ["rna-seq","proteomics","growth","metabolomics"] | Per-modality observation likelihoods: NegBin(μ,φ) RNA-seq, log-normal proteomics, normal-on-log-growth, normal/log-normal metabolomics. φ MLE'd on held-out calibration data with 95% bootstrap CIs. | vwb run study pdmp-03-inference --variant likelihood-library-4-modalities |
likelihood-accumulator | v2ecoli_pdmp.composites.inference.pdmp_with_likelihood | underflow_protection log-space + log-sum-exp | Incremental log-likelihood accumulator running alongside the PDMP, log-sum-exp for mixtures, pairwise/Kahan summation for cross-cell population reductions. | vwb run study pdmp-03-inference --variant likelihood-accumulator |
observe-intervene-effects | v2ecoli_pdmp.composites.inference.pdmp_with_likelihood | effect_runtime vivarium-algebraic-effects | Vivarium algebraic-effect extensions: observe(variable, likelihood) and intervene(variable, value) — the ChiRho primitives, lifted into Vivarium's discrete-event runtime. | vwb run study pdmp-03-inference --variant observe-intervene-effects |
abc-smc-baseline | v2ecoli_pdmp.composites.inference.pdmp_with_likelihood | n_particles 1000epsilon_schedule adaptive-quantile | ABC-SMC as the baseline inference engine: adaptive ε-decay at q=0.5 of previous-population distance, N=1000 particles, terminate on ESS < 0.5·N or wall-clock cap. | vwb run study pdmp-03-inference --variant abc-smc-baseline |
sbc-validation-K1000 | v2ecoli_pdmp.composites.inference.pdmp_with_likelihood | K 1000n_bins 20ci_coverage_target 0.85 | Simulation-Based Calibration (Talts 2018): K=1000 synthetic (θ*, y*) draws from prior + forward model, verify uniformity of rank histogram and 90% CI empirical coverage ≥ 85%. | vwb run study pdmp-03-inference --variant sbc-validation-K1000 |
What we ran (4 simulations)
One row per concrete run: the model composite, what changes vs the reference baseline, the condition / length, and its status.
| Simulation | Composite | Changes vs baseline | Run | CLI | Status |
|---|---|---|---|---|---|
| likelihood-dispersion-fit | pdmp_with_likelihood | reference baseline | — | vwb run study pdmp-03-inference | planned |
| accumulator-numerical-stability | pdmp_with_likelihood | same params, longer/other | — | vwb run study pdmp-03-inference | planned |
| abc-smc-synthetic-recovery | pdmp_with_likelihood | same params, longer/other | — | vwb run study pdmp-03-inference | planned |
| sbc-K1000-validation | pdmp_with_likelihood | same params, longer/other | — | vwb run study pdmp-03-inference | planned |
Measurements (4 readouts)
Quantities we extract from each simulation run to evaluate the study's tests.
| Readout | Status | Path | Description |
|---|---|---|---|
| likelihood-dispersion-fits | planned | (planned) out/trajectories/likelihood_fits.csv (MLE +/- 95% CI) | Per modality: NegBin phi (RNA-seq), log-normal sigma (proteomics), normal-on-log sigma_mu (growth), per-metabolite sigma (metabolomics). |
| log-likelihood-accumulator | planned | (planned) .pbg/runs/<id>/log_likelihood.zarr (log-likelihood units) | Time-series of incremental log-L contributions from ODE segments + jump events. Required: zero underflows over 10^4 test runs. |
| abc-smc-posterior | planned | (planned) .pbg/runs/<id>/posterior_particles.zarr (particle samples + weights) | ABC-SMC convergence trace: ESS, proposal acceptance rate, epsilon-decay schedule per SMC step. |
| sbc-rank-histogram | planned | (planned) out/trajectories/sbc_ranks.csv (rank in [0, K]) | K=1000 SBC draws. Gating: chi^2 uniformity p > 0.05 + 90% CI coverage >= 85% empirical. |
Success criteria (3 tests — 3 ⏳ pending)
Each test makes a specific scientific claim with a machine-checkable criterion (measure + pass_if). Tests are now evaluated by code against the run (the run/outcome spine: RunReader → evaluator): the pill shows the result, and the evidence line shows the measured value, whether it was computed by code or routed to an agent, and whether the code verdict agrees with the authored one (reconcile). ⏳ pending = the study hasn't run yet. Technical assertion + the exact evaluator are under "Technical details".
sbc-calibration-uniform-rankTechnical details
Measure: {"source":"scripts/run_sbc.py","observable":"rank of θ_true within N=100 posterior draws, repeated L=200 times","reduce":"Cramér-von Mises test of rank histogram vs Uniform(0, N)"}Pass condition: {"operator":"greater-than","threshold":0.05,"field":"CvM_p_value"}
Requires sim:
sbc-L200-N100Cites:
talts2018, cook2006posterior-shrinks-with-dataTechnical details
Measure: {"source":"scripts/run_abc_smc.py --vary-data-size","observable":"posterior 95% interval width per parameter","reduce":"ratio to prior width"}Pass condition: {"operator":"less-than","threshold":0.3,"field":"shrinkage_at_N=1000"}
Requires sim:
abc-data-scalingCites:
beaumont2010ppc-coverage-95-pctTechnical details
Measure: {"source":"scripts/run_ppc.py","observable":"held-out observation coverage by posterior predictive 95% CI","reduce":"fraction"}Pass condition: {"operator":"within-band","lower":0.9,"upper":0.99,"field":"coverage"}
Requires sim:
ppc-heldout-100Cites:
gelman2013Model changes
Adds an inference layer (likelihoods + ABC-SMC + SBC/PPC) alongside the PDMP; no change to the forward biological mechanism. The observation models are the new modelling commitment.
Key assumptions
- A count-level likelihood (NegBin for RNA-seq, log-normal for proteomics, etc.) is an adequate observation model for Bayesian inference over the PDMP.
- ABC-SMC, Simulation-Based Calibration, and posterior-predictive checks together validate the inference machinery.
- A surrogate forward model calibrated once to real WCM count statistics is a faithful stand-in until the compiled full-WCM-in-the-loop runtime (Phase 4) lands.
Build / fix list (3)
Concrete engineering work to fully exercise this study.
Conclusion synthesis
Read-only synthesis derived from the study's canonical fields (findings, limitations, follow-up proposals).
- Phase-3 increment 1: a real ABC-SMC (importance weights + Gaussian perturbation kernel + adaptive-epsilon schedule) recovers a transcription-init rate from count-level observations, validated by Simulation-Based Calibration and a posterior-predictive check. The forward model is a negative-binomial count surrogate calibrated once to real WCM rna_init_event statistics (mu0=12593, Poisson limit). This replaces the prior grid-diagnostic phase3_abc_* scripts with the cited-but-missing run_abc_smc / run_sbc / run_ppc. Scope: validated on the WCM-calibrated count likelihood (single parameter, K=150 SBC), not the full WCM in the ABC loop (deferred to the Phase-4 compiled runtime) and not the K=1000 multi-modality full gate. A methodological result fell out: the WCM Poisson posterior is sharp (~300x tighter than a toy), so ABC needs n_generations=12 to converge; SBC correctly rejected an under-converged ng=6 run before passing at ng=12 (the gate is doing its job).
- Phase-3 increment 2: the ABC-SMC engine generalizes to vector theta (independent per-dim perturbation kernel + product importance weights; scalar back-compat preserved). A 2-parameter joint inference of (count mean-scale, dispersion-scale) from count data is recovered and per-parameter SBC-validated, with a weak posterior correlation -- i.e. the two parameters are jointly identifiable from the [mean, std] summary. Scope: uses a synthetic overdispersed surrogate (mu0=40, phi0=8) because the real WCM transcription count is Poisson (no dispersion to infer); this validates the multi-parameter machinery for when richer overdispersed/multi-modal WCM observables are added.
- Hardening re-derivation (2026-07-27): the recorded SBC K=150 PASS (chi2_p=0.576) reproduces EXACTLY under the current committed engine at the recorded calibration (mu0=12593.5, Poisson; rng seed 0) -- so it was not fabricated -- but it is a knife-edge single-seed result, NOT a robust calibration certificate. A 5-seed sweep passes only 4/5 (seed 2 chi2_p=0.0081 FAIL), and at seed 0 the pass is razor-thin in the calibration mean: mu0 in {12592, 12593, 12594, 12595} ALL FAIL (chi2_p 0.004-0.011); only the recorded mu0=12593.5 passes (0.576). Root cause (understood, no bug): the WCM Poisson count posterior is extraordinarily sharp -- theta std ~ 1/sqrt(mu0*n_obs) ~ 4.5e-4 vs prior width 2.8 (~6000x narrower) -- so at K=150 the ABC epsilon-resolution floor leaves the rank histogram only marginally uniform and the chi2 test sits on a knife edge. This is precisely why the study's own gate spec requires K=1000 (rank resolution 1/(K+1) ~ 1e-3); K=150 is under-resolved for this posterior. Separately verified and EXONERATED: engine refactor 28cad208 ("N-D generalization; scalar back-compat preserved") does NOT change scalar-mode numerics -- both the pre- and post-refactor engines give byte-identical SBC results across all 5 seeds -- so there is no regression and the back-compat claim holds. The recovery (theta=1.2 -> post_mean 1.1995, CI [1.1984,1.2006]) and PPC (script gate cov>=0.80; cov 0.84-0.91 by seed) remain robust; only the SBC uniformity leg is thin.
- recovery theta_true=1.2 -> post_mean 1.1995, 90% CI [1.1984, 1.2006]; SBC K=150 chi2_p=0.576 (uniform, PASS); PPC 90% coverage=0.907 (PASS). Posterior shrinks with data: CI90 width 0.0068 (n_obs=25) -> 0.0034 (100) -> 0.0019 (400) -> 0.0013 (1600), truth contained at every n; ~1/sqrt(n) through n=400 (ABC eps-resolution floors the shrinkage at the tightest end)
- recovery [1.185, 0.993] vs truth [1.2, 1.0]; posterior corr=+0.12 (weak -> identifiable); 2-param SBC K=80 chi2_p mean-scale=0.78 PASS, disp-scale=0.62 PASS
- SBC K=150 seed sweep {0:0.576 PASS, 1:0.081 PASS, 2:0.008 FAIL, 3:0.181 PASS, 4:0.052 PASS} = 4/5 PASS; mu0 sweep at seed 0 {12592:0.009 FAIL, 12593:0.004 FAIL, 12593.5:0.576 PASS, 12594:0.011 FAIL, 12595:0.005 FAIL}; pre- vs post-28cad208 engine byte-identical across the 5 seeds.
- Robust SBC rank-uniformity + credible-interval coverage (K>=1000, multi-seed) on the count-based pipeline
- Root-cause fix for the pbg scalar-pruning merger quirk (task
References cited by this study
saa2017, backman2023, talts2018sbc, cook2006posterior
Pipeline-gate decision
Ready to runPipeline gate & conclusion logic (technical)
Prerequisites: none (root study)
Enables: —
Proceed when: Likelihood library covers all 4 modalities (RNA-seq, proteomics, growth, metabolomics) with dispersion CIs. Log-likelihood accumulator runs alongside the PDMP with zero underflows over 10⁴ test runs. ABC-SMC posterior recovery: SBC rank-histogram passes χ² uniformity (p > 0.05), 90% credible intervals achieve ≥85% empirical coverage.
5.Phase 4 — Compilation and Performance📋 Not started○ Not runTests: 3⏳⛔ BlockedCan the Phase 2 PDMP be exported to a high-performance compiled representation (Catalyst.jl / ModelingToolkit with symbolic Jacobians and automatic sensitivity equations) on a column-centric Vivarium runtime, achieving ≥10³ parallel single-cell trajectories on a GPU or multi-core CPU with near-zero per-step marshalling overhead — turning the throughput bottleneck the DUF report identified into a non-issue for downstream inference?Confidence: design-stageEvidence: scaffoldConclusion Predicted — exporting the Phase 2 PDMP to Catalyst.jl + ModelingToolkit with a column-centric Vivarium runtime will achieve ≥10³ parallel trajectories on GPU or multi-core CPU, with 1/√N posterior variance scaling and bit-equivalent trajectory distributions vs. the Phase 2 reference.Catalyst.jl export round-tripsmarshalling fraction of per-step: < 10%parallel trajectories: ≥ 10³1/√N posterior variance scalingInsight Throughput is downstream of correctness. The gating test is W₂ equivalence to within 5σ of MC fluctuation between the compiled runner and the Phase 2 Python runner. FP summation order is the bug that hides here; pairwise/Kahan summation is required.Caveat FP32 on GPU promises 2× throughput but corrupts long-run ABC posteriors via catastrophic cancellation in propensity sums. Default FP64, FP32 only with explicit bit-equivalence + ABC-posterior KL < 0.01 vs. FP64.
Overview
This study asks whether can the Phase 2 PDMP be exported to a high-performance compiled representation (Catalyst.jl /. No simulations have run yet — the study is still in its design phase. Gate decision: Not started. Run the baseline simulation to begin evaluation.
Purpose & background (study design)
Conditions — what we set up to test it
Baseline
v2ecoli_pdmp.composites.catalyst.pdmp_catalystxarraycatalyst-jlfp64Variants (5)
Each variant is a perturbation of the baseline — typically a parameter override or a swapped composite. These define the runs that test the assumption.
| Variant | Composite / base | Parameter overrides | Notes | Run |
|---|---|---|---|---|
catalyst-export | v2ecoli_pdmp.composites.catalyst.pdmp_catalyst | backend catalyst-jlprecision fp64 | Export Phase 2 PDMP to Catalyst.jl + ModelingToolkit — symbolic Jacobians, automatic forward-mode sensitivity equations, LLVM-optimised. Bit-equivalent to Phase 2 runner within solver tolerance. | vwb run study pdmp-04-compilation --variant catalyst-export |
column-centric-runtime | v2ecoli_pdmp.composites.catalyst.pdmp_catalyst | runtime column-centric-tensor | Replace nested-dict row-centric state with pre-allocated column-centric tensors. Targets per-step marshalling overhead < 10% of essential compute. | vwb run study pdmp-04-compilation --variant column-centric-runtime |
vivarium-api-inversion | v2ecoli_pdmp.composites.catalyst.pdmp_catalyst | api declarative-process-spec | Invert the Vivarium API so process definitions declare local state + ODE vector fields + jump propensities only; runtime handles topology traversal and time-stepping. | vwb run study pdmp-04-compilation --variant vivarium-api-inversion |
gpu-parallel-1000 | v2ecoli_pdmp.composites.catalyst.pdmp_catalyst | hardware GPUparallelism 1000precision fp64 | ≥10³ parallel single-cell trajectories on GPU. The throughput gating criterion. | vwb run study pdmp-04-compilation --variant gpu-parallel-1000 |
multi-core-cpu-parallel | v2ecoli_pdmp.composites.catalyst.pdmp_catalyst | hardware CPUparallelism 1000 | Same throughput target on multi-core CPU (fallback for sites without GPU). | vwb run study pdmp-04-compilation --variant multi-core-cpu-parallel |
Success criteria (3 tests — 3 ⏳ pending)
Each test makes a specific scientific claim with a machine-checkable criterion (measure + pass_if). Tests are now evaluated by code against the run (the run/outcome spine: RunReader → evaluator): the pill shows the result, and the evidence line shows the measured value, whether it was computed by code or routed to an agent, and whether the code verdict agrees with the authored one (reconcile). ⏳ pending = the study hasn't run yet. Technical assertion + the exact evaluator are under "Technical details".
jax-compiled-throughput-10xTechnical details
Measure: {"source":"scripts/benchmark_compiled.py --backend jax","observable":"wall_seconds_per_trajectory","reduce":"v2ecoli_baseline_seconds / jax_seconds"}Pass condition: {"operator":"greater-than","threshold":10,"field":"speedup_ratio"}
Requires sim:
phase4-jax-benchmarkCites:
bradbury2018, kidger2021numerical-equivalence-with-phase3Technical details
Measure: {"source":"compare jax vs python-reference trajectories at seed=0","observable":"all interface observables(t)","reduce":"L_inf relative error"}Pass condition: {"operator":"less-than","threshold":0.0001,"field":"L_inf_error"}
Requires sim:
phase4-equivalence-testmemory-fits-1024-cells-per-nodeTechnical details
Measure: {"source":"scripts/profile_memory.py --n-cells 1024","observable":"RSS at end of 600-step run","reduce":"GB"}Pass condition: {"operator":"less-than","threshold":256,"field":"RSS_GB"}
Requires sim:
phase4-memory-1024Measurements (4 readouts)
Quantities we extract from each simulation run to evaluate the study's tests.
| Readout | Status | Path | Description |
|---|---|---|---|
| catalyst-export-artefact | planned | (planned) compiled_pdmp.jl (Julia source + binary) | Catalyst.jl + ModelingToolkit compiled model with symbolic Jacobian + automatic sensitivity equations. |
| per-step-profile-compiled | planned | (planned) out/trajectories/compiled_profile.csv (ms per bucket) | Same 5 buckets as Phase 0. Gating: marshalling fraction < 10% of total. |
| parallel-throughput | planned | (planned) out/trajectories/throughput_vs_n_trajectories.csv (trajectories per second) | Sweep parallelism N in {10, 100, 1000, 10000}. Gating: >=10^3 parallel. |
| abc-posterior-variance-vs-walltime | planned | (planned) out/trajectories/abc_posterior_efficiency.csv (posterior std * wall-clock-s) | Standard MCMC efficiency metric. Required: 1/sqrt(N) scaling on doubling parallelism. |
Model changes
No mechanistic change — a runtime/representation change: compile the PDMP to a fast backend and invert the per-step loop to a column-centric layout. Equivalence with Phase 3 must be proven.
Key assumptions
- The PDMP can be compiled (Catalyst.jl/ModelingToolkit or JAX/Diffrax) to a symbolic-Jacobian form that runs ≥10× faster than the Python+glpk baseline.
- A column-centric (struct-of-arrays) state layout removes the marshalling overhead Phase 0 motivates.
- Deterministic floating-point summation (pairwise/Kahan) preserves numerical equivalence with the Phase-3 reference.
Technical context (model changes · implementation tasks · follow-ups · limitations · refs)
Build / fix list (3)
Concrete engineering work to fully exercise this study.
Discovery implications
Where this study's results leave the mechanism model — and what to investigate next.
✓ Resolved uncertainties
- The production composite per-tick wall is ~52 ms (74 ms single-tick), of which ~76% is spent outside process_update (this bucket includes real numpy/scipy numeric work, e.g. Poisson logpmf, not all of it marshalling) — and no single Process dominates.
- The cProfile hotspots are 13,817 isinstance + 4,213 __array_finalize__ + 52 process_update calls per tick (genuine counts); much of the per-tick cost is outside process_update, though that bucket includes real numpy/scipy numeric work, so it is not purely marshalling.
- Column-centric prototypes give constant-in-N per-trajectory wall and a per-tick speedup of 1.5x on a realistic TranscriptInitiation-shaped workload (3.1x / 2.8x on toys): measured microbenchmarks and an extrapolation not validated on the 55-process WCM. The "~1500x at N=1e3 x 30 ticks (26 min -> ~1 s)" is an illustrative projection = toy factor x N (the script hardcodes 3x -> 3000x; the prose uses the 1.5x recalibration -> ~1500x), not a measured speedup: the column-centric vectorized runtime was never built and never timed; only the pbg sequential side was measured (at N=1,2,4).
● Remaining uncertainties
- The column-centric runtime is validated as prototypes + a projection, not as a built runner that reproduces the Phase-2 PDMP trajectory distribution to within 5 sigma MC; numerical equivalence of the vectorized path is unproven.
- Whether the column-centric refactor preserves the deterministic (pairwise/Kahan) FP summation order needed for reproducible ABC posteriors across hardware is untested.
Alternate hypotheses (1)
fraction of per-tick wall in per-Process compute vs framework marshalling, measured speedup of per-Process JIT vs column-centric vectorizationruntime-architecture, per-tick-computeMechanism update proposals (1)
runtime-architecturereplaceneeds expert approvalFollow-up study proposals (1)
Click ➕ Add study to spawn a new study node in the investigation graph (seeds a child study.yaml from the proposal, with a leads-to edge back to this study).
6.Phase 5 — Causal Discovery and Functional Annotation📋 Not started○ Not runTests: 3⏳⛔ BlockedCan the compiled, likelihood-equipped PDMP WCM support Bayesian model comparison for gene-function annotation — recovering known E.Confidence: design-stageEvidence: scaffoldConclusion Predicted — framing gene-function annotation as Bayesian model comparison with Russian Roulette marginal-likelihood estimators (Lyne et al. 2015) plus an active-inference loop (Toth et al. 2022) will recover ≥20 benchmark E. coli gene annotations at BH-FDR ≤ 0.1, with credible-interval widths shrinking at the ≥n⁻¹ᐟ² rate.RR estimator N_eff per Z: ≥ 100log Bayes factor CI clears Jeffreys: |log BF| > 1Model-level SBC χ² uniformity: p > 0.05EIG MCSE nonzero per proposalBenchmark BH-FDR: q ≤ 0.1CI shrinkage rate (log-log slope): ≤ -0.4Insight Active causal inference handles the experiment-design loop. Instead of passively observing, the agent selects in-silico knockouts/overexpression by expected information gain, which makes annotation hypothesis-driven.Caveat RR estimator variance is unbounded in pathological cases. N_eff ≥ 100 per marginal-likelihood estimate is the floor; below that, the run is flagged and falls back to thermodynamic integration / nested sampling with documented bias.
Overview
This study asks whether can the compiled, likelihood-equipped PDMP WCM support Bayesian model comparison for gene-function. No simulations have run yet — the study is still in its design phase. Gate decision: Not started. Run the baseline simulation to begin evaluation.
Purpose & background (study design)
Conditions — what we set up to test it
Baseline
v2ecoli_pdmp.composites.annotation.bayes_model_comparexarrayrussian-rouletteVariants (4)
Each variant is a perturbation of the baseline — typically a parameter override or a swapped composite. These define the runs that test the assumption.
| Variant | Composite / base | Parameter overrides | Notes | Run |
|---|---|---|---|---|
russian-roulette-marginal-likelihood | v2ecoli_pdmp.composites.annotation.bayes_model_compare | estimator russian-rouletten_eff_floor 100 | RR estimator (Lyne et al. 2015) for the marginal-likelihood ratio between candidate gene-function annotations. ESS-equivalent N_eff ≥ 100 per Z estimate. | vwb run study pdmp-05-causal-discovery --variant russian-roulette-marginal-likelihood |
active-causal-inference-loop | v2ecoli_pdmp.composites.annotation.bayes_model_compare | intervention_menu ["knockout","overexpression","promoter-swap"] | Active Bayesian causal inference (Toth et al. 2022): propose targeted in-silico interventions (knockouts, overexpression), score by expected information gain (EIG) with MCSE-bounded estimates. | vwb run study pdmp-05-causal-discovery --variant active-causal-inference-loop |
benchmark-gene-set | v2ecoli_pdmp.composites.annotation.bayes_model_compare | n_genes 20classes ["kinase","TF","transporter","structural"] | ≥20 E. coli genes with literature-established functions across diverse mechanism classes (kinases, TFs, transporters, structural). The validation target. | vwb run study pdmp-05-causal-discovery --variant benchmark-gene-set |
sbc-at-model-comparison-level | v2ecoli_pdmp.composites.annotation.bayes_model_compare | K 500 | Extended SBC over K=500 synthetic datasets generated under known true annotations; verify uniformity of posterior model probability ranks. | vwb run study pdmp-05-causal-discovery --variant sbc-at-model-comparison-level |
Success criteria (3 tests — 3 ⏳ pending)
Each test makes a specific scientific claim with a machine-checkable criterion (measure + pass_if). Tests are now evaluated by code against the run (the run/outcome spine: RunReader → evaluator): the pill shows the result, and the evidence line shows the measured value, whether it was computed by code or routed to an agent, and whether the code verdict agrees with the authored one (reconcile). ⏳ pending = the study hasn't run yet. Technical assertion + the exact evaluator are under "Technical details".
pc-recovers-known-edgesTechnical details
Measure: {"source":"scripts/run_pc_discovery.py","observable":"recovered DAG edges vs ground-truth WCM graph","reduce":"Recall = |recovered ∩ truth| / |truth|"}Pass condition: {"operator":"greater-than","threshold":0.8,"field":"recall"}
Requires sim:
pc-recovery-ground-truthCites:
spirtes2000intervention-eig-beats-observationalTechnical details
Measure: {"source":"scripts/compute_eig.py","observable":"EIG_interventional / EIG_observational","reduce":"ratio"}Pass condition: {"operator":"greater-than","threshold":10,"field":"eig_ratio"}
Requires sim:
phase5-eig-comparisonCites:
lindley1956bh-fdr-discovery-calibratedTechnical details
Measure: {"source":"scripts/run_per_gene_inference.py","observable":"fraction of declared-discoveries that are known-null","reduce":"empirical FDR"}Pass condition: {"operator":"less-than","threshold":0.05,"field":"empirical_FDR"}
Requires sim:
phase5-fdr-validationCites:
benjamini1995Measurements (5 readouts)
Quantities we extract from each simulation run to evaluate the study's tests.
| Readout | Status | Path | Description |
|---|---|---|---|
| rr-estimator-trace | planned | (planned) .pbg/runs/<id>/rr_estimate.zarr (log-marginal-likelihood + N_eff) | Per candidate annotation. Gating: N_eff >= 100 or fallback to thermodynamic integration. |
| log-bayes-factor-cis | planned | (planned) out/trajectories/log_bf_cis.csv (log Bayes factor + 95% bootstrap CI) | Per pairwise annotation comparison. Recovery claim requires CI entirely above Jeffreys |log BF| > 1. |
| model-comparison-sbc | planned | (planned) out/trajectories/model_sbc_ranks.csv (model-posterior rank) | K=500 synthetic datasets from known true annotations. Gating: chi^2 uniformity p > 0.05. |
| eig-per-intervention | planned | (planned) out/trajectories/eig_proposals.csv (expected information gain (nats)) | Per active-inference intervention proposal. MCSE-bounded; proposals with CI overlapping zero not selected. |
| benchmark-recovery | planned | (planned) out/trajectories/benchmark_recovery.csv (per-gene q-value (BH-adjusted)) | 20-gene benchmark E. coli set. Investigation success: BH-FDR q <= 0.10 + CI shrinkage rate log-log slope <= -0.4. |
Model changes
No change to the cell model — Phase 5 adds an analysis layer (Bayesian model comparison + active causal discovery) on top of the inferable PDMP. The annotation-as-causal-model mapping is the new commitment.
Key assumptions
- Functional gene annotations can be cast as competing causal models and discriminated by Bayesian model comparison (Russian-roulette marginal likelihood).
- Active experimental design (expected information gain) selects interventions that recover causal edges more efficiently than observation alone.
- A benchmark gene set with known edges provides ground truth for FDR-calibrated recovery.
Technical context (model changes · implementation tasks · follow-ups · limitations · refs)
Build / fix list (3)
Concrete engineering work to fully exercise this study.
Discovery implications
Where this study's results leave the mechanism model — and what to investigate next.
✓ Resolved uncertainties
- The Bayes-factor / model-comparison shape works on the Phase-3 ABC infrastructure (a 5-hypothesis transcript_init_prob_scale sweep).
- Sprint 1's "distance-of-the-mean" estimator was biased and overstated the signal; the unbiased per-replicate pseudo-marginal estimator collapses truth posterior 28.8% -> 24.4% (~ the 20% uniform baseline) and log BF +0.32 -> +0.01.
- Replicate count alone cannot rescue the signal: the truth-vs-runner-up kernel-mean gap is only Delta log +0.011 nats, so as N -> infinity the log-BF CI tightens around a near-zero gap (Jeffreys substantial/decisive never reached even at N=1024).
- Hypothesis spacing IS a lever for the within-grid 1/n_H dilution (truth posterior 24% -> 43% -> 61% as close neighbors are dropped), but log BF maxes at +0.45 even in the most favorable 2-way subset.
● Remaining uncertainties
- Whether the Phase-3 sprint-13 combined count-vector observable (or a tighter epsilon) raises log BF past the Jeffreys substantial threshold (>1) is untested — this is the open Phase-5 question.
- The full Phase-5 deliverable (>=20 benchmark gene annotations at BH-FDR <= 0.1 with credible intervals) depends on the Phase-4 compiled runtime (per-particle wall < 0.05 s/tick) and is not yet tractable.
- Model-comparison-level SBC (chi^2 rank-uniformity p > 0.05) and RR-estimator N_eff >= 100 per marginal-likelihood estimate have not been demonstrated.
Alternate hypotheses (2)
log BF (truth vs runner-up) under the combined count vector vs distance-of-the-mean, kernel-mean gap Delta log under the richer observableinference-observable, marginal-likelihood-separationlog BF vs spacing (does it cross 1 at any spacing?)hypothesis-grid-designMechanism update proposals (1)
phase-5-observablereviseneeds expert approvalFollow-up study proposals (2)
Click ➕ Add study to spawn a new study node in the investigation graph (seeds a child study.yaml from the proposal, with a leads-to edge back to this study).
Appendices
Method-grading and verification detail — kept at the back, after the main narrative.
How the verdict is computed — acceptance criteria & gating matrix
Each acceptance criterion is a behaviour test declared in a study: a measured field from the run (e.g. closure_gap_size) compared against an explicit pass_if band (a numeric threshold/range). The per-criterion result, each study’s gate verdict, and this roll-up are computed in code from the run outcomes (deterministic) — not human judgement. Expand a row to see the field, the passing band, and the observed value.
| Acceptance criterion | Gating study | Result |
|---|---|---|
| reference-xarray-3-conditions | pdmp-00-characterization | ◐ in-progress |
| interface-matches-reference | pdmp-01-metabolism-ode | ◐ in-progress |
| pdmp-trajectory-distribution-match | pdmp-02-jump-processes | ◐ in-progress |
| abc-posterior-recovery-on-synthetic | pdmp-03-inference | ◐ in-progress |
| 10cubed-parallel-trajectories | pdmp-04-compilation | ◐ in-progress |
| benchmark-recovery-with-credible-intervals | pdmp-05-causal-discovery | ◐ in-progress |
All 6 acceptance criteria are linked to a gating study.
🔬 Evidence & rigor — how well the method defends its claims 2/6 investigation rigor dimensions addressed · 4 gap(s)
Deterministic feedback on how well the method defends its claims against a skeptical reader — a method-level judgement, distinct from the per-study model verdicts above. Computed from declared fields, not judged. Gaps are an invitation to add negative controls, replicate across seeds, weigh alternative explanations, state falsifiability, or add an adversarial study.
Per-study rigor
pdmp-00-characterization — 3/12 rigor dimensions addressed · 7 gap(s)
pdmp-01-metabolism-ode — 3/12 rigor dimensions addressed · 7 gap(s)
pdmp-02-jump-processes — 6/12 rigor dimensions addressed · 4 gap(s)
pdmp-03-inference — 5/12 rigor dimensions addressed · 5 gap(s)
pdmp-04-compilation — 5/12 rigor dimensions addressed · 6 gap(s)
pdmp-05-causal-discovery — 5/12 rigor dimensions addressed · 6 gap(s)
📊 Framework scorecard framework-self metrics (n=14 investigations)
Framework-self metrics aggregated across every study and investigation in the workspace — how consistently the framework itself applies its own rigor practices (discriminating controls, emergent-mechanism labelling, threshold provenance, replication, verdict divergence, falsification exposure). Computed deterministically from declared fields by pbg_superpowers.rigor.framework_metrics.
References (10 cited across this investigation)
Union of bibliography.bib_keys and per-behavior cites: across all studies in this investigation. Click DOI or link to open the source.
agmon2022· Agmon, Eran and Spangler, Ryan K. and Skalnik, Christopher J. and Poole, William and Peirce, Shayn M. and Morrison, James H. and Covert, Markus W. (2022). Vivarium: an interface and engine for integrative multiscale modeling in computational biology. Bioinformatics 38(7), pp. 1972--1979 · doi:10.1093/bioinformatics/btac049Note: Vivarium framework — the discrete-event composition engine that hosts v2ecoli. DUF ref [2].backman2023· Backman, Tyler W. H. and Schenk, Christina and Radivojevic, Tijana and Ando, David and Singh, Jahnavi and Czajka, Jeffrey J. and others (2023). BayFlux: A Bayesian method to quantify metabolic fluxes and their uncertainty at the genome scale. PLOS Computational Biology 19(11), pp. e1011111 · doi:10.1371/journal.pcbi.1011111Note: MCMC for genome-scale bulk-flux inference. DUF ref [6].birch2014· Birch, Elsa W. and Udell, Madeleine and Covert, Markus W. (2014). Incorporation of flexible objectives and time-linked simulation with flux balance analysis. Journal of Theoretical Biology 345, pp. 12--21 · doi:10.1016/j.jtbi.2013.12.009Note: tFBA — the time-linked FBA formulation that v2ecoli currently uses for metabolism. The Phase 1 substitution target. DUF ref [3].cook2006posterior· Cook, Samantha R. and Gelman, Andrew and Rubin, Donald B. (2006). Validation of Software for Bayesian Models Using Posterior Quantiles. Journal of Computational and Graphical Statistics 15(3), pp. 675--692 · doi:10.1198/106186006X136976Note: Precursor to Talts et al. 2018; cited in pdmp-05 for the model-comparison-level SBC extension.kuritz2017· Kuritz, Karsten and St\"ohr, Daniela and Pollak, Nadine and Allg\"ower, Frank (2017). On the relationship between cell cycle analysis with ergodic principles and age-structured cell population models. Journal of Theoretical Biology 414, pp. 91--102 · doi:10.1016/j.jtbi.2016.11.024Note: DUF ref [18].macklin2020· Macklin, Derek N. and Ahn-Horst, Travis A. and Choi, Heejo and Ruggero, Nicholas A. and Carrera, Javier and Mason, John C. and others (2020). Simultaneous cross-evaluation of heterogeneous E. coli datasets via mechanistic simulation. Science 369(6502), pp. eaav3751 · doi:10.1126/science.aav3751Note: The v2ecoli (Covert-lab) WCM. DUF ref [1].millard2017· Millard, Pierre and Smallbone, Kieran and Mendes, Pedro (2017). Metabolic regulation is sufficient for global and robust coordination of glucose uptake, catabolism, energy production and growth in Escherichia coli. PLOS Computational Biology 13(2), pp. e1005396 · doi:10.1371/journal.pcbi.1005396Note: Kinetic ODE of E. coli central carbon + energy metabolism; substrate for the v2ecoli-pdmp Phase 1 ODE substitution. BioModels MODEL1505110000. DUF ref [4]. PDF in references/papers/.saa2017· Saa, Pedro A. and Nielsen, Lars K. (2017). Formulation, construction and analysis of kinetic models of metabolism: A review of modelling frameworks. Biotechnology Advances 35(8), pp. 981--1003 · doi:10.1016/j.biotechadv.2017.09.005Note: Survey of kinetic-model inference for metabolism. DUF ref [5].stumpf2021· Stumpf, Michael P. H. (2021). Statistical and computational challenges for whole cell modelling. Current Opinion in Systems Biology 26, pp. 58--63 · doi:10.1016/j.coisb.2021.04.005Note: DUF ref [13].talts2018sbc· Talts, Sean and Betancourt, Michael and Simpson, Daniel and Vehtari, Aki and Gelman, Andrew (2018). Validating Bayesian inference algorithms with simulation-based calibrationNote: SBC — the rank-histogram uniformity check used for the UQ acceptance criteria in pdmp-03-inference and pdmp-05-causal-discovery.