u_a(t)
(the input to EX_rxn.lower_bound = −u_a), panel (C)
shows the FBA-realized exchange flux v_a(t) next to
the CRM envelope so the coupling is visible at a glance.
monodClassical Monod CRM coupled to the E. coli core GSM. With high initial glucose, FBA preferentially oxidizes glucose and secretes some acetate. Once glucose is depleted, the Monod uptake rate on acetate becomes non-negligible and FBA switches to acetate consumption — the canonical diauxic shift.
| Phenomenon | Sequential substrate utilization |
| GSM | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | monod |
| Integration | 360 steps × 0.05 hr = 18.0 hr simulated |
| Wall-clock time | 0.21 s |
| Final biomass | 1.377 gDW/L |
| Final glucose | 0.000 mmol/L |
| Final acetate | 0.000 mmol/L |
| Peak μ (FBA) | 0.882 1/hr |
| Peak glucose CRM→FBA | u=9.68 · |v|=9.68 mmol/gDW/hr |
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = monod
crm.params = {'kinetic_params': {'glucose': (0.5, 10.0), 'acetate': (0.5, 3.0)}}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -20.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
macarthurMacArthur external-resource CRM drives glucose uptake while the oxygen exchange is tightly capped (EX_o2_e lower = -5). Under O2 limitation the LP cannot fully oxidize the influx and secretes acetate as overflow — a Crabtree-like phenotype — even though no acetate was initially present.
| Phenomenon | Crabtree-like acetate secretion |
| GSM | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | macarthur |
| Integration | 300 steps × 0.05 hr = 15.0 hr simulated |
| Wall-clock time | 0.10 s |
| Final biomass | 0.908 gDW/L |
| Final glucose | 0.003 mmol/L |
| Final acetate | 1.562 mmol/L |
| Peak μ (FBA) | 0.608 1/hr |
| Peak glucose CRM→FBA | u=14.40 · |v|=14.40 mmol/gDW/hr |
| Peak acetate CRM→FBA | u=4.14 · |v|=3.35 mmol/gDW/hr |
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = macarthur
crm.params = {'c': {'glucose': 1.2, 'acetate': 0.4}, 'resource_mode': 'external'}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -5.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
adaptiveAdaptive CRM with an internal allocation vector A_a per resource, constrained by an energy budget E_star. Initial allocation is skewed to glucose (A0=[0.95, 0.05]) and the oxygen exchange is capped so FBA secretes acetate as overflow while glucose is abundant. Once glucose depletes, r_glucose → 0 so the gradient on A_glucose vanishes while A_acetate keeps climbing under the Picciani-Mori rule — the allocation vector reallocates toward acetate and growth continues on the acetate pool that the cell itself produced.
| Phenomenon | Dynamic trait reallocation |
| GSM | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | adaptive |
| Integration | 480 steps × 0.05 hr = 24.0 hr simulated |
| Wall-clock time | 0.37 s |
| Final biomass | 0.784 gDW/L |
| Final glucose | 0.000 mmol/L |
| Final acetate | 0.019 mmol/L |
| Peak μ (FBA) | 0.493 1/hr |
| Peak glucose CRM→FBA | u=9.51 · |v|=9.51 mmol/gDW/hr |
| Peak acetate CRM→FBA | u=4.61 · |v|=4.61 mmol/gDW/hr |
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = adaptive
crm.params = {'v': {'glucose': 10.0, 'acetate': 5.0}, 'K': {'glucose': 0.5, 'acetate': 0.5}, 'lam': 0.6, 'E_star': 1.0, 'A0': {'glucose': 0.9, 'acetate': 0.1}, 'n_substeps': 50}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -6.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
macarthurMacArthur CRM in 'tilman' mode: uptake rate u_a = c_a is independent of R_a. FBA drives glucose hard and at a constant rate until the extracellular concentration is exhausted, giving a sharply-cornered depletion profile characteristic of Tilman-style resource competition.
| Phenomenon | R-independent uptake |
| GSM | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | macarthur |
| Integration | 300 steps × 0.05 hr = 15.0 hr simulated |
| Wall-clock time | 0.10 s |
| Final biomass | 1185.977 gDW/L |
| Final glucose | 0.000 mmol/L |
| Final acetate | 0.000 mmol/L |
| Peak μ (FBA) | 0.797 1/hr |
| Peak glucose CRM→FBA | u=8.00 · |v|=8.00 mmol/gDW/hr |
| Peak acetate CRM→FBA | u=3.00 · |v|=0.00 mmol/gDW/hr |
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = macarthur
crm.params = {'c': {'glucose': 8.0, 'acetate': 3.0}, 'resource_mode': 'tilman'}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -20.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
micrmMiCRM-style mass-action uptake of glucose and acetate on a single organism. FBA secretes acetate as a byproduct while glucose is abundant (positive extracellular acetate trajectory); once glucose drops, the accumulated acetate pool supports a second growth phase — a single-species analogue of community cross-feeding.
| Phenomenon | Metabolic leakage and re-uptake |
| GSM | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | micrm |
| Integration | 360 steps × 0.05 hr = 18.0 hr simulated |
| Wall-clock time | 0.12 s |
| Final biomass | 0.663 gDW/L |
| Final glucose | 0.016 mmol/L |
| Final acetate | 0.836 mmol/L |
| Peak μ (FBA) | 0.444 1/hr |
| Peak glucose CRM→FBA | u=8.00 · |v|=8.00 mmol/gDW/hr |
| Peak acetate CRM→FBA | u=1.13 · |v|=1.10 mmol/gDW/hr |
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = micrm
crm.params = {'c': {'glucose': 1.0, 'acetate': 0.3}}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -6.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
monodSweep over initial glucose (1-80 mmol/L) with the Monod diauxie setup. Plot final biomass and apparent biomass yield per mmol glucose consumed. Biomass saturates with resource availability; apparent yield drops at high glucose as more carbon exits as acetate/CO2 overflow.
| Phenomenon | Saturating yield curve |
| GSM | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | monod |
| Integration | 240 steps × 0.05 hr = 12.0 hr simulated |
| Wall-clock time | 1.24 s |
| Range | glucose0 ∈ [1.0, 80.0] mmol/L (7 points) |
| Biomass range | 0.099 → 7.421 gDW/L |
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = monod
crm.params = {'kinetic_params': {'glucose': (0.5, 10.0), 'acetate': (0.5, 3.0)}}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -20.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
monodTwo E. coli core GSMs share a single glucose+acetate pool with no spatial separation. Species 'glucose_specialist' has a strong Monod preference for glucose (high Vmax_glc, low Vmax_ac) and a tight O2 cap that forces acetate overflow. Species 'acetate_specialist' has low glucose affinity and high acetate Vmax. Early on the glucose specialist dominates, secreting acetate; the acetate specialist then grows on the acetate byproduct — niche partitioning by cross-feeding, visible as two offset growth phases on the same GSM.
| Phenomenon | Niche differentiation and cross-feeding |
| GSM (glucose_specialist) | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| GSM (acetate_specialist) | textbook — Escherichia coli (core GSM, 95 rxns)biomass reaction: Biomass_Ecoli_core |
| CRM | monod |
| Integration | 360 steps × 0.05 hr = 18.0 hr simulated |
| Wall-clock time | 0.24 s |
| Final biomass (glucose_specialist) | 0.850 gDW/L · peak μ = 0.563 1/hr |
| Final biomass (acetate_specialist) | 0.032 gDW/L · peak μ = 0.221 1/hr |
| Final glucose (shared pool) | 0.000 mmol/L |
| Final acetate (shared pool) | 9.620 mmol/L |
# glucose_specialist
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = monod
crm.params = {'kinetic_params': {'glucose': (0.3, 12.0), 'acetate': (2.0, 1.0)}}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -6.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
# acetate_specialist
model_file = 'textbook' # Escherichia coli (core GSM, 95 rxns)
biomass_reaction = 'Biomass_Ecoli_core'
crm.type = monod
crm.params = {'kinetic_params': {'glucose': (5.0, 1.5), 'acetate': (0.2, 6.0)}}
substrate_update_reactions = {'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}
bounds = {'EX_o2_e': {'lower': -20.0, 'upper': 1000.0}, 'ATPM': {'lower': 1.0, 'upper': 1.0}}
| Experiment | Phenomenon | CRM | GSM | Sim time | Wall-clock |
|---|---|---|---|---|---|
| Diauxie | Sequential substrate utilization | monod | textbook | 18.0 h | 0.21 s |
| Overflow | Crabtree-like acetate secretion | macarthur | textbook | 15.0 h | 0.10 s |
| Adaptive | Dynamic trait reallocation | adaptive | textbook | 24.0 h | 0.37 s |
| Tilman | R-independent uptake | macarthur | textbook | 15.0 h | 0.10 s |
| Cross Feed | Metabolic leakage and re-uptake | micrm | textbook | 18.0 h | 0.12 s |
| Nutrient Sweep | Saturating yield curve | monod | textbook | 12.0 h | 1.24 s |
| Community | Niche differentiation and cross-feeding | monod | textbook, textbook | 18.0 h | 0.24 s |
| Total wall-clock | 2.38 s | ||||
Every experiment in this report is generated by the same CLI
(crm_dfba.experiments.test_suite) running against the
genome-scale metabolic models bundled under crm_dfba/models/.
Clone the repo and run the suite to regenerate this page.
git clone https://github.com/vivarium-collective/CRM-FBA cd CRM-FBA git checkout 936698b1 pip install -e . python -m crm_dfba.experiments.test_suite
python -m crm_dfba.experiments.test_suite --only diauxie community python -m crm_dfba.experiments.test_suite --no-open
Add an Experiment(...) entry to
EXPERIMENT_REGISTRY in
crm_dfba/experiments/test_suite.py. Point
build_cfg at a CRM+GSM config (helper
_cfg_from(model_key, crm, bounds) uses the bundled
model registry). For multi-consumer experiments set
runner_override=_simulate_community and list species in
extra_meta['species'].