main@43a3ab7 [uncommitted changes] ·
eranagmon@LT-0919936 ·
Darwin 24.2.0 arm64 (16 cores) ·
Python 3.12.9
2026-04-12 13:11 · Duration: 2520s (42.0 min) · Seed: 0 · 3 simulations in parallel · Total wall: 263s
Strategy: The partitioned architecture splits each biological process into three coordinated steps per timestep: Requester, Allocator, and Evolver. Requesters read the current state and compute how many molecules each process needs. The Allocator collects all requests and distributes available molecules using priority-based proportional scaling — high-priority processes (RNA Degradation +10, Protein Degradation +10) get resources first, then default-priority processes share the remainder, and low-priority processes (Two-Component System -5, Metabolism -10) get what is left. When total requests exceed supply, molecules are distributed proportionally within each priority level, with integer remainders allocated randomly. Evolvers then execute with their reconciled allocation.
Layers: 3 allocator layers execute sequentially: Layer 1 (Equilibrium, RNA Maturation, Two-Component System), Layer 2 (Complexation, Protein Degradation, RNA Degradation, Transcript Initiation, Polypeptide Initiation, Chromosome Replication), Layer 3 (Transcript Elongation, Polypeptide Elongation). Processes within a layer request simultaneously and compete for the same molecular pool.
Trade-offs: Highest fidelity to the original wcEcoli model. Guarantees fair resource distribution under scarcity. Cost: 55 steps per timestep (3 per process + allocators + listeners + infrastructure).
Standalone viewer: open in new tab
Strategy: The departitioned architecture wraps each biological process in a single DepartitionedStep that calls _do_update() — which runs calculate_request() followed by evolve_state() in sequence, with the requested molecules immediately applied to a local bulk copy. There is no allocator and no fairness mechanism. Each process gets exactly what it asks for, limited only by what remains after earlier processes have run.
Layers: Processes execute sequentially in the same order as the partitioned model, but without the request-allocate-evolve split. Earlier processes effectively have higher priority by virtue of running first and seeing the full molecular pool. Evolve-only optimization: RNA Maturation and Complexation skip calculate_request() entirely after the first timestep, since their evolve_state() recomputes everything independently.
Trade-offs: Simpler execution graph (41 steps). No allocation overhead. But no scarcity management — diverges from baseline by ~27% in water mass over a full cell cycle because different metabolite allocations cascade through metabolism (FBA) every timestep. The cell never reaches division threshold within 42 minutes.
Standalone viewer: open in new tab
Strategy: The reconciled architecture groups processes by allocator layer into ReconciledStep instances — one step per layer. For example, Layer 2 in the baseline needs 13 steps for 6 processes (6 Requesters + 1 Allocator + 6 Evolvers); here it is a single ReconciledStep. Each ReconciledStep implements the reconcile pattern from bigraph-schema: it collects calculate_request() outputs from all processes in the layer, then reconciles the requests against available supply using proportional scaling (same algorithm as the Allocator but without priority levels). Finally, it runs evolve_state() for each process with its reconciled allocation.
Layers: Same 3-layer grouping as baseline: Layer 1 (Equilibrium, Two-Component System), Layer 2 (Protein Degradation, RNA Degradation, Transcript Initiation, Polypeptide Initiation, Chromosome Replication), Layer 3 (Transcript Elongation, Polypeptide Elongation). Evolve-only: RNA Maturation and Complexation skip the request phase and run via _do_update() with full bulk state. A bulk delta clamping step prevents negative molecule counts when combined deltas from multiple evolvers overdraw a molecule.
Trade-offs: Fewest steps (33). Proportional allocation preserves fairness — diverges only ~4.5% from baseline (vs 27% departitioned). The cell reaches division within the same cell cycle. Remaining gap comes from: (a) no priority levels (all processes equal), (b) evolve-only processes not participating in reconciliation, (c) different stochastic remainder distribution.
Standalone viewer: open in new tab
| Component | Departitioned Max % | Reconciled Max % |
|---|---|---|
| Cell Mass | 6.1155% | 0.0000% |
| Dry Mass | 6.1173% | 0.0000% |
| Protein | 1.8607% | 0.0000% |
| RNA | 28.3227% | 0.0000% |
| DNA | 5.6974% | 0.0000% |
| Small Molecule | 11.3696% | 0.0000% |
| Water | 6.1155% | 0.0000% |
Signed count differences from the baseline for each architecture. Red/green bars show how far each model deviates. When the reconciled bar is shorter than the departitioned bar, reconciliation reduced the divergence for that molecule.
| # | Molecule | Baseline | Departitioned Δ | Reconciled Δ | Max |Δ| |
|---|---|---|---|---|---|
| 1 | WATER[c] | 54290529375 | -1259413732 | +0 | 1259413732 |
| 2 | polymerized_GTP[c] | 15465777 | -15465777 | +0 | 15465777 |
| 3 | polymerized_ATP[c] | 14227498 | -14227498 | +0 | 14227498 |
| 4 | polymerized_CTP[c] | 14090986 | -14090986 | +0 | 14090986 |
| 5 | polymerized_UTP[c] | 13232765 | -13232765 | +0 | 13232765 |
| 6 | GLT[c] | 28521731 | +7383097 | +0 | 7383097 |
| 7 | THR[c] | 1490080 | +1663498 | +0 | 1663498 |
| 8 | K+[c] | 118598388 | -1281989 | +0 | 1281989 |
| 9 | LEU[c] | 1568913 | +1126726 | +0 | 1126726 |
| 10 | glycogen-monomer[c] | 80920501 | -874713 | +0 | 874713 |
| 11 | GLN[c] | 1314851 | -726502 | +0 | 726502 |
| 12 | CPD-12819[c] | 51408029 | -555696 | +0 | 555696 |
| 13 | ILE[c] | 354143 | +492283 | +0 | 492283 |
| 14 | VAL[c] | 1066758 | +474558 | +0 | 474558 |
| 15 | L-ASPARTATE[c] | 3038687 | +464337 | +0 | 464337 |
| 16 | LYS[c] | 1992089 | -391600 | +0 | 391600 |
| 17 | GLUTATHIONE[c] | 14937398 | -346513 | +0 | 346513 |
| 18 | ATP[c] | 12231899 | -283751 | +0 | 283751 |
| 19 | ARG[c] | 365581 | +270096 | +0 | 270096 |
| 20 | PUTRESCINE[c] | 18619831 | -201272 | +0 | 201272 |
| 21 | FRUCTOSE-16-DIPHOSPHATE[c] | 8095325 | -187793 | +0 | 187793 |
| 22 | SER[c] | 893667 | +176177 | +0 | 176177 |
| 23 | L-ALPHA-ALANINE[c] | 1378014 | +171989 | +0 | 171989 |
| 24 | OROTATE[c] | 6947922 | -161175 | +0 | 161175 |
| 25 | UDP-N-ACETYL-D-GLUCOSAMINE[c] | 6294411 | -146016 | +0 | 146016 |
| 26 | UTP[c] | 5988931 | -138929 | +0 | 138929 |
| 27 | TTP[c] | 5868263 | -136130 | +0 | 136130 |
| 28 | CPD-8260[c] | 12336838 | -133355 | +0 | 133355 |
| 29 | GLC-6-P[c] | 5631374 | -130635 | +0 | 130635 |
| 30 | PRO[c] | 597354 | +128404 | +0 | 128404 |
| 31 | PYRUVATE[c] | 4648883 | -107843 | +0 | 107843 |
| 32 | GUANOSINE-5DP-3DP[c] | 89674 | -89674 | +0 | 89674 |
| 33 | CPD-12575[c] | 3175467 | -73663 | +0 | 73663 |
| 34 | NAD[c] | 2965886 | -68802 | +0 | 68802 |
| 35 | GLY[c] | 729212 | +67629 | +0 | 67629 |
| 36 | GTP[c] | 2711849 | -62908 | +0 | 62908 |
| 37 | URIDINE[c] | 2654691 | -61583 | +0 | 61583 |
| 38 | CPD-2961[c] | 2638178 | -61200 | +0 | 61200 |
| 39 | MAL[c] | 2519204 | -58440 | +0 | 58440 |
| 40 | DI-H-OROTATE[c] | 2471720 | -57338 | +0 | 57338 |