{"state":{"global_time":0.0,"ecoli core dFBA":{"address":{"protocol":"local","data":"DynamicFBA"},"config":{"model_file":"textbook","kinetic_params":{"glucose":[0.5,1.0],"acetate":[0.5,2.0]},"substrate_update_reactions":{"glucose":"EX_glc__D_e","acetate":"EX_ac_e"},"bounds":{"EX_o2_e":{"lower":-2.0,"upper":null},"ATPM":{"lower":1.0,"upper":1.0}},"solver":null,"box_volume_L":1.0},"_inputs":"substrates:map[concentration]|biomass:mass","_outputs":"substrates:map[concentration_delta]|biomass:mass_delta","inputs":{"substrates":{"glucose":["fields","glucose"],"acetate":["fields","acetate"]},"biomass":["fields","biomass"]},"outputs":{"substrates":{"glucose":["fields","glucose"],"acetate":["fields","acetate"]},"biomass":["fields","biomass"]},"interval":1.0,"_contract":{"summary":"Dynamic FBA \u2014 FBA growth integrated over time","description":"","inputs":{},"outputs":{},"config":{},"math":["\\mu=\\max\\ c^{\\mathsf T}v\\quad\\text{s.t.}\\ \\ Sv=0,\\ \\ v\\le v_{\\max}(s)","\\dot X=\\mu X,\\qquad \\dot s=-q(s)\\,X"],"symbols":{"\u03bc":"growth rate","v":"reaction fluxes","S":"stoichiometry","X":"biomass","s":"substrate","q":"uptake rate"},"assumptions":[],"references":[],"face":{"inputs":{"substrates":{"_type":"map","_value":{"_type":"concentration","_units":"mM"}},"biomass":{"_type":"mass","_units":"gDW"}},"outputs":{"substrates":"map[concentration_delta]","biomass":"mass_delta"}},"amendments":[]}},"fields":{"glucose":0.0,"acetate":0.0,"biomass":0.1},"emitter":{"address":{"protocol":"local","data":"RAMEmitter"},"config":{"emit":"global_time:node|fields:node","subsample":1,"max_len":null},"_inputs":"global_time:node|fields:node","_outputs":"results:node","inputs":{"global_time":["global_time"],"fields":["fields"]},"outputs":{"results":["results"]},"_contract":{"summary":"Store historical states in memory.","description":"every tick). Use this for long runs or composites with heavy\nstate (large fields, many agents) to keep RAM bounded \u2014 the\nsaved time-series still reflects the simulation's true cadence\nvia each row's ``global_time`` field.\n``max_len`` optionally bounds ``history`` to the most recent N\nrecorded rows (a ring buffer): once the cap is reached each new\nhistorical behaviour \u2014 consumers such as v2ecoli that read the\nfull ``history`` are unaffected unless they opt in). ``max_len``\ncounts *recorded* rows (i.e. post-``subsample``).","inputs":{},"outputs":{},"config":{},"math":["``subsample`` records only every Nth composite tick (default 1 =","record drops the oldest. Default ``None`` = unbounded (the"],"symbols":{},"assumptions":[],"references":[],"face":{"inputs":{"global_time":"node","fields":"node"},"outputs":{"results":"node"}},"amendments":[]}},"results":{}},"schema":{"global_time":"float","ecoli core dFBA":{"_type":"process","address":"local:DynamicFBA","config":"node","_inputs":"substrates:map[concentration]|biomass:mass","_outputs":"substrates:map[concentration_delta]|biomass:mass_delta","inputs":"wires","outputs":"wires","interval":1.0},"fields":"glucose:concentration|acetate:concentration|biomass:mass","emitter":{"_type":"step","address":"local:RAMEmitter","config":"node","_inputs":"global_time:node|fields:node","_outputs":"results:node","inputs":"wires","outputs":"wires","priority":0.0},"results":"node"}}