From ce1fdd8fa3d9cb9b7a08afba145dc8d0b1a1a1fe Mon Sep 17 00:00:00 2001 From: Eran Date: Sat, 1 Jun 2024 21:07:35 -0400 Subject: [PATCH 01/12] get started on comets notebook --- notebooks/comets.ipynb | 167 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 notebooks/comets.ipynb diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb new file mode 100644 index 0000000..9d92751 --- /dev/null +++ b/notebooks/comets.ipynb @@ -0,0 +1,167 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-06-02T01:06:40.712896Z", + "start_time": "2024-06-02T01:06:40.158218Z" + } + }, + "outputs": [], + "source": [ + "from process_bigraph import Process\n", + "\n", + "import cobra\n", + "from cobra.io import load_model\n", + "\n", + "model = load_model(\"textbook\")" + ] + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "class DynamicFBA(Process):\n", + " \"\"\"\n", + " Performs dynamic FBA.\n", + "\n", + " Parameters:\n", + " - model: The metabolic model for the simulation.\n", + " - kinetic_params: Kinetic parameters (Km and Vmax) for each substrate.\n", + " - biomass_reaction: The identifier for the biomass reaction in the model.\n", + " - substrate_update_reactions: A dictionary mapping substrates to their update reactions.\n", + " - biomass_identifier: The identifier for biomass in the current state.\n", + "\n", + " Returns:\n", + " - Updated state after the timestep.\n", + " \"\"\"\n", + " \n", + " config_schema = {\n", + " 'model_file': 'Any',\n", + " 'kinetic_params': 'Any',\n", + " 'biomass_reaction': 'Any',\n", + " 'biomass_identifier': 'Any',\n", + " }\n", + " \n", + " def __init__(self, config):\n", + " super().__init__(config)\n", + " self.model = cobra.io.read_sbml_model(self.config['model_file'])\n", + " \n", + " def inputs(self):\n", + " return {}\n", + " \n", + " def outputs(self):\n", + " return {}\n", + " \n", + " # TODO -- can we just put the inputs/outputs directly in the function?\n", + " def update(self, state, interval):\n", + " updated_state = state.copy()\n", + " \n", + " for substrate, reaction_id in substrate_update_reactions.items():\n", + " Km, Vmax = kinetic_params[substrate]\n", + " substrate_concentration = updated_state[substrate]\n", + " uptake_rate = Vmax * substrate_concentration / (Km + substrate_concentration)\n", + " self.model.reactions.get_by_id(reaction_id).lower_bound = -uptake_rate\n", + " \n", + " solution = self.model.optimize()\n", + " if solution.status == 'optimal':\n", + " current_biomass = state[self.config['biomass_identifier']]\n", + " biomass_growth_rate = solution.fluxes[self.config['biomass_reaction']]\n", + " updated_state[self.config['biomass_identifier']] += biomass_growth_rate * current_biomass * interval\n", + " \n", + " for substrate, reaction_id in substrate_update_reactions.items():\n", + " flux = solution.fluxes[reaction_id]\n", + " updated_state[substrate] = max(updated_state[substrate] + flux * current_biomass * interval, 0)\n", + " else:\n", + " # Handle non-optimal solutions if necessary\n", + " pass\n", + " \n", + " return updated_state" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-02T00:57:30.191607Z", + "start_time": "2024-06-02T00:57:30.187784Z" + } + }, + "id": "50a4fb171d2aafa5", + "execution_count": 2 + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "model.reactions.EX_o2_e.lower_bound = -2 # Limiting oxygen uptake\n", + "model.reactions.ATPM.lower_bound = 1 # Setting lower bound for ATP maintenance\n", + "model.reactions.ATPM.upper_bound = 1 # Setting upper bound for ATP maintenance\n", + "\n", + "# Define initial conditions, kinetic parameters, and other necessary inputs\n", + "initial_conditions = {\n", + " 'biomass': 0.1, # Initial biomass concentration\n", + " 'glucose': 20.0, # Initial glucose concentration\n", + " 'acetate': 0.0 # Initial acetate concentration\n", + "}\n", + "kinetic_params = {\n", + " 'glucose': (0.5, 2), # Km and Vmax for glucose\n", + " 'acetate': (0.5, 2) # Km and Vmax for acetate\n", + "}\n", + "substrate_update_reactions = {\n", + " 'glucose': 'EX_glc__D_e', # Exchange reaction ID for glucose\n", + " 'acetate': 'EX_ac_e' # Exchange reaction ID for acetate\n", + "}\n", + "\n", + "# simulation conditions\n", + "t_n = 100 # number of time points\n", + "dt = 0.5 # Time step, matching your setup\n", + "time_points = list(range(0, t_n)) # Simulation time points, matching your setup\n", + "\n", + "# Make sure to adjust the perform_dfba function if needed to initialize result arrays with sufficient size\n", + "dfba_results = perform_dfba(\n", + " model, \n", + " initial_conditions, \n", + " kinetic_params, \n", + " time_points, \n", + " 'Biomass_Ecoli_core', \n", + " substrate_update_reactions, \n", + " dt,\n", + " 'biomass'\n", + ")" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-02T00:57:30.194070Z", + "start_time": "2024-06-02T00:57:30.192679Z" + } + }, + "id": "c9b5adee14ee7d91", + "execution_count": 2 + } + ], + "metadata": { + "kernelspec": { + "name": "venv_kernel", + "language": "python", + "display_name": "Python (venv)" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 3602173e8ee8f24c904db4cee5367084dd8470ff Mon Sep 17 00:00:00 2001 From: Eran Date: Tue, 11 Jun 2024 17:38:15 -0400 Subject: [PATCH 02/12] more comets --- notebooks/comets.ipynb | 466 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 435 insertions(+), 31 deletions(-) diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index 9d92751..c56eec4 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -2,25 +2,35 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2024-06-02T01:06:40.712896Z", - "start_time": "2024-06-02T01:06:40.158218Z" + "end_time": "2024-06-04T22:20:05.460559Z", + "start_time": "2024-06-04T22:20:05.443470Z" } }, "outputs": [], "source": [ - "from process_bigraph import Process\n", + "from process_bigraph import Process, ProcessTypes, Composite\n", "\n", "import cobra\n", "from cobra.io import load_model\n", "\n", - "model = load_model(\"textbook\")" + "core = ProcessTypes()\n" ] }, + { + "cell_type": "markdown", + "source": [ + "# Dynamic FBA Process" + ], + "metadata": { + "collapsed": false + }, + "id": "bf3158b287046687" + }, { "cell_type": "code", "outputs": [], @@ -35,66 +45,460 @@ " - biomass_reaction: The identifier for the biomass reaction in the model.\n", " - substrate_update_reactions: A dictionary mapping substrates to their update reactions.\n", " - biomass_identifier: The identifier for biomass in the current state.\n", - "\n", - " Returns:\n", - " - Updated state after the timestep.\n", " \"\"\"\n", " \n", " config_schema = {\n", - " 'model_file': 'Any',\n", - " 'kinetic_params': 'Any',\n", - " 'biomass_reaction': 'Any',\n", - " 'biomass_identifier': 'Any',\n", + " 'model_file': 'string',\n", + " 'kinetic_params': 'map[tuple[float,float]]',\n", + " 'biomass_reaction': {\n", + " '_type': 'string',\n", + " '_default': 'Biomass_Ecoli_core'\n", + " },\n", + " 'substrate_update_reactions': 'map[string]',\n", + " 'biomass_identifier': 'string',\n", " }\n", " \n", - " def __init__(self, config):\n", - " super().__init__(config)\n", - " self.model = cobra.io.read_sbml_model(self.config['model_file'])\n", + " def __init__(self, config, core):\n", + " super().__init__(config, core)\n", + " \n", + " if not 'xml' in self.config['model_file']:\n", + " # use the textbook model if no model file is provided\n", + " self.model = load_model(self.config['model_file'])\n", + " else:\n", + " self.model = cobra.io.read_sbml_model(self.config['model_file'])\n", " \n", " def inputs(self):\n", - " return {}\n", + " return {'substrates': 'map[float]'}\n", " \n", " def outputs(self):\n", - " return {}\n", + " return {'substrates': 'map[float]'}\n", " \n", " # TODO -- can we just put the inputs/outputs directly in the function?\n", " def update(self, state, interval):\n", - " updated_state = state.copy()\n", + " substrates_input = state['substrates']\n", " \n", - " for substrate, reaction_id in substrate_update_reactions.items():\n", - " Km, Vmax = kinetic_params[substrate]\n", - " substrate_concentration = updated_state[substrate]\n", + " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", + " Km, Vmax = self.config['kinetic_params'][substrate]\n", + " substrate_concentration = substrates_input[substrate]\n", " uptake_rate = Vmax * substrate_concentration / (Km + substrate_concentration)\n", " self.model.reactions.get_by_id(reaction_id).lower_bound = -uptake_rate\n", " \n", + " substrate_update = {}\n", + " \n", " solution = self.model.optimize()\n", " if solution.status == 'optimal':\n", - " current_biomass = state[self.config['biomass_identifier']]\n", + " current_biomass = substrates_input[self.config['biomass_identifier']]\n", " biomass_growth_rate = solution.fluxes[self.config['biomass_reaction']]\n", - " updated_state[self.config['biomass_identifier']] += biomass_growth_rate * current_biomass * interval\n", + " substrate_update[self.config['biomass_identifier']] = biomass_growth_rate * current_biomass * interval\n", " \n", " for substrate, reaction_id in substrate_update_reactions.items():\n", " flux = solution.fluxes[reaction_id]\n", - " updated_state[substrate] = max(updated_state[substrate] + flux * current_biomass * interval, 0)\n", + " substrate_update[substrate] = flux * current_biomass * interval # TODO -- assert not negative?\n", " else:\n", " # Handle non-optimal solutions if necessary\n", + " print('Non-optimal solution, skipping update')\n", " pass\n", + " \n", + " print(substrate_update)\n", " \n", - " return updated_state" + " return {\n", + " 'substrates': substrate_update,\n", + " }\n", + "\n", + "core.register_process('DynamicFBA', DynamicFBA)" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-02T00:57:30.191607Z", - "start_time": "2024-06-02T00:57:30.187784Z" + "end_time": "2024-06-04T22:20:05.467717Z", + "start_time": "2024-06-04T22:20:05.461958Z" } }, "id": "50a4fb171d2aafa5", - "execution_count": 2 + "execution_count": 9 + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "from process_bigraph.experiments.parameter_scan import RunProcess\n", + "\n", + "# TODO -- this should be imported, or just part of Process?\n", + "def run_process(\n", + " address, \n", + " config, \n", + " core, \n", + " initial_state, \n", + " observables, \n", + " timestep=1, \n", + " runtime=10\n", + "):\n", + " config = {\n", + " 'process_address': address,\n", + " 'process_config': config,\n", + " 'observables': observables,\n", + " 'timestep': timestep,\n", + " 'runtime': runtime}\n", + " \n", + " run = RunProcess(config, core).composite\n", + " run.update(initial_state, runtime)\n", + " return run.gather_results()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-04T22:20:05.471497Z", + "start_time": "2024-06-04T22:20:05.468691Z" + } + }, + "id": "ef2fc9363b163d21", + "execution_count": 10 + }, + { + "cell_type": "code", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n", + "Non-optimal solution, skipping update\n", + "{}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/eranagmon/code/bigraph-schema/venv/lib/python3.9/site-packages/cobra/util/solver.py:554: UserWarning: Solver status is 'infeasible'.\n", + " warn(f\"Solver status is '{status}'.\", UserWarning)\n" + ] + } + ], + "source": [ + "config = {\n", + " 'model_file': 'textbook',\n", + " 'kinetic_params': {\n", + " 'glucose': (0.5, 2),\n", + " 'acetate': (0.5, 2)\n", + " },\n", + " 'biomass_reaction': 'Biomass_Ecoli_core',\n", + " 'substrate_update_reactions': {\n", + " 'glucose': 'EX_glc__D_e',\n", + " 'acetate': 'EX_ac_e'\n", + " },\n", + " 'biomass_identifier': 'biomass'\n", + "}\n", + "\n", + "initial_state = {\n", + " 'substrates': {\n", + " 'biomass': 0.1, # Initial biomass concentration\n", + " 'glucose': 20.0, # Initial glucose concentration\n", + " 'acetate': 0.0 # Initial acetate concentration\n", + " }\n", + "}\n", + "\n", + "results = run_process(\n", + " address='local:DynamicFBA', \n", + " config=config, \n", + " core=core, \n", + " initial_state=initial_state,\n", + " observables=[['substrates', 'glucose'], \n", + " ['substrates', 'acetate'],\n", + " ['substrates', 'biomass']], \n", + " timestep=1, \n", + " runtime=100,\n", + ")" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-04T22:20:05.830408Z", + "start_time": "2024-06-04T22:20:05.473383Z" + } + }, + "id": "33923108a654be95", + "execution_count": 11 + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "{('emitter',): [{'time': 0.0,\n 'substrates': {'glucose': 0.0, 'acetate': 0.0, 'biomass': 0.0}}]}" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-04T22:20:05.834832Z", + "start_time": "2024-06-04T22:20:05.831875Z" + } + }, + "id": "7f92f56a30057ef9", + "execution_count": 12 }, { "cell_type": "code", "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-04T22:20:05.837378Z", + "start_time": "2024-06-04T22:20:05.835751Z" + } + }, + "id": "8e6ba7e397d883bf", + "execution_count": 12 + }, + { + "cell_type": "code", + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-04T22:20:05.850999Z", + "start_time": "2024-06-04T22:20:05.838545Z" + } + }, + "id": "34221fba51751ea7", + "execution_count": 12 + }, + { + "cell_type": "code", + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-04T22:20:05.853761Z", + "start_time": "2024-06-04T22:20:05.851826Z" + } + }, + "id": "7d43602df6ddda69", + "execution_count": 12 + }, + { + "cell_type": "code", + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'model' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[13], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mmodel\u001B[49m\u001B[38;5;241m.\u001B[39mreactions\u001B[38;5;241m.\u001B[39mEX_o2_e\u001B[38;5;241m.\u001B[39mlower_bound \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m2\u001B[39m \u001B[38;5;66;03m# Limiting oxygen uptake\u001B[39;00m\n\u001B[1;32m 2\u001B[0m model\u001B[38;5;241m.\u001B[39mreactions\u001B[38;5;241m.\u001B[39mATPM\u001B[38;5;241m.\u001B[39mlower_bound \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m1\u001B[39m \u001B[38;5;66;03m# Setting lower bound for ATP maintenance\u001B[39;00m\n\u001B[1;32m 3\u001B[0m model\u001B[38;5;241m.\u001B[39mreactions\u001B[38;5;241m.\u001B[39mATPM\u001B[38;5;241m.\u001B[39mupper_bound \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m1\u001B[39m \u001B[38;5;66;03m# Setting upper bound for ATP maintenance\u001B[39;00m\n", + "\u001B[0;31mNameError\u001B[0m: name 'model' is not defined" + ] + } + ], "source": [ "model.reactions.EX_o2_e.lower_bound = -2 # Limiting oxygen uptake\n", "model.reactions.ATPM.lower_bound = 1 # Setting lower bound for ATP maintenance\n", @@ -135,12 +539,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-02T00:57:30.194070Z", - "start_time": "2024-06-02T00:57:30.192679Z" + "end_time": "2024-06-04T22:20:05.871184Z", + "start_time": "2024-06-04T22:20:05.855360Z" } }, "id": "c9b5adee14ee7d91", - "execution_count": 2 + "execution_count": 13 } ], "metadata": { From 4e538b2ee511fe73d588222cd832c4b690cd4942 Mon Sep 17 00:00:00 2001 From: Eran Date: Tue, 11 Jun 2024 18:35:36 -0400 Subject: [PATCH 03/12] pass core to composite in run_process --- notebooks/comets.ipynb | 742 +++++++++++++----- process_bigraph/experiments/parameter_scan.py | 2 +- 2 files changed, 541 insertions(+), 203 deletions(-) diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index c56eec4..95b8d70 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -2,25 +2,79 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.460559Z", - "start_time": "2024-06-04T22:20:05.443470Z" + "end_time": "2024-06-11T22:34:30.290199Z", + "start_time": "2024-06-11T22:34:30.262808Z" } }, "outputs": [], "source": [ "from process_bigraph import Process, ProcessTypes, Composite\n", - "\n", + "import matplotlib.pyplot as plt\n", "import cobra\n", "from cobra.io import load_model\n", "\n", "core = ProcessTypes()\n" ] }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "# create new types\n", + "def apply_non_negative(schema, current, update, core):\n", + " new_value = current + update\n", + " return max(0, new_value)\n", + "\n", + "positive_float = {\n", + " '_type': 'positive_float',\n", + " '_inherit': 'float',\n", + " '_apply': apply_non_negative\n", + "}\n", + "\n", + "core.register('positive_float', positive_float)\n", + "\n", + "# TODO -- check the function signature of the apply method and report missing keys upon registration" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-11T22:34:30.294928Z", + "start_time": "2024-06-11T22:34:30.291825Z" + } + }, + "id": "3e25a40151d79237", + "execution_count": 18 + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "{'_type': 'positive_float',\n '_check': 'check_float',\n '_apply': 'apply_non_negative',\n '_serialize': 'to_string',\n '_description': '64-bit floating point precision number',\n '_default': '0.0',\n '_deserialize': 'deserialize_float',\n '_divide': 'divide_float',\n '_dataclass': 'dataclass_float',\n '_inherit': ['float']}" + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "core.access('positive_float')" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-11T22:34:30.300213Z", + "start_time": "2024-06-11T22:34:30.296517Z" + } + }, + "id": "c943852149550230", + "execution_count": 19 + }, { "cell_type": "markdown", "source": [ @@ -45,6 +99,8 @@ " - biomass_reaction: The identifier for the biomass reaction in the model.\n", " - substrate_update_reactions: A dictionary mapping substrates to their update reactions.\n", " - biomass_identifier: The identifier for biomass in the current state.\n", + " \n", + " TODO -- check units\n", " \"\"\"\n", " \n", " config_schema = {\n", @@ -68,10 +124,10 @@ " self.model = cobra.io.read_sbml_model(self.config['model_file'])\n", " \n", " def inputs(self):\n", - " return {'substrates': 'map[float]'}\n", + " return {'substrates': 'map[positive_float]'}\n", " \n", " def outputs(self):\n", - " return {'substrates': 'map[float]'}\n", + " return {'substrates': 'map[positive_float]'}\n", " \n", " # TODO -- can we just put the inputs/outputs directly in the function?\n", " def update(self, state, interval):\n", @@ -91,16 +147,14 @@ " biomass_growth_rate = solution.fluxes[self.config['biomass_reaction']]\n", " substrate_update[self.config['biomass_identifier']] = biomass_growth_rate * current_biomass * interval\n", " \n", - " for substrate, reaction_id in substrate_update_reactions.items():\n", + " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", " flux = solution.fluxes[reaction_id]\n", " substrate_update[substrate] = flux * current_biomass * interval # TODO -- assert not negative?\n", " else:\n", " # Handle non-optimal solutions if necessary\n", " print('Non-optimal solution, skipping update')\n", - " pass\n", - " \n", - " print(substrate_update)\n", - " \n", + " # pass\n", + "\n", " return {\n", " 'substrates': substrate_update,\n", " }\n", @@ -110,12 +164,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.467717Z", - "start_time": "2024-06-04T22:20:05.461958Z" + "end_time": "2024-06-11T22:34:30.307442Z", + "start_time": "2024-06-11T22:34:30.301408Z" } }, "id": "50a4fb171d2aafa5", - "execution_count": 9 + "execution_count": 20 }, { "cell_type": "code", @@ -127,7 +181,7 @@ "def run_process(\n", " address, \n", " config, \n", - " core, \n", + " core_type, \n", " initial_state, \n", " observables, \n", " timestep=1, \n", @@ -139,20 +193,19 @@ " 'observables': observables,\n", " 'timestep': timestep,\n", " 'runtime': runtime}\n", - " \n", - " run = RunProcess(config, core).composite\n", - " run.update(initial_state, runtime)\n", - " return run.gather_results()" + " \n", + " run = RunProcess(config, core_type)\n", + " return run.update(initial_state)" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.471497Z", - "start_time": "2024-06-04T22:20:05.468691Z" + "end_time": "2024-06-11T22:34:30.311663Z", + "start_time": "2024-06-11T22:34:30.309116Z" } }, "id": "ef2fc9363b163d21", - "execution_count": 10 + "execution_count": 21 }, { "cell_type": "code", @@ -162,213 +215,449 @@ "output_type": "stream", "text": [ "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n", "Non-optimal solution, skipping update\n", - "{}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/eranagmon/code/bigraph-schema/venv/lib/python3.9/site-packages/cobra/util/solver.py:554: UserWarning: Solver status is 'infeasible'.\n", - " warn(f\"Solver status is '{status}'.\", UserWarning)\n" + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n" ] } ], @@ -376,7 +665,7 @@ "config = {\n", " 'model_file': 'textbook',\n", " 'kinetic_params': {\n", - " 'glucose': (0.5, 2),\n", + " 'glucose': (1, 1),\n", " 'acetate': (0.5, 2)\n", " },\n", " 'biomass_reaction': 'Biomass_Ecoli_core',\n", @@ -398,49 +687,110 @@ "results = run_process(\n", " address='local:DynamicFBA', \n", " config=config, \n", - " core=core, \n", + " core_type=core, \n", " initial_state=initial_state,\n", " observables=[['substrates', 'glucose'], \n", " ['substrates', 'acetate'],\n", " ['substrates', 'biomass']], \n", - " timestep=1, \n", + " timestep=0.1, \n", " runtime=100,\n", ")" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.830408Z", - "start_time": "2024-06-04T22:20:05.473383Z" + "end_time": "2024-06-11T22:34:31.526511Z", + "start_time": "2024-06-11T22:34:30.312897Z" } }, "id": "33923108a654be95", - "execution_count": 11 + "execution_count": 22 }, { "cell_type": "code", "outputs": [ { "data": { - "text/plain": "{('emitter',): [{'time': 0.0,\n 'substrates': {'glucose': 0.0, 'acetate': 0.0, 'biomass': 0.0}}]}" + "text/plain": "dict_keys(['substrates', 'time'])" }, - "execution_count": 12, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "results" + "results['results'].keys()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-11T22:34:31.529815Z", + "start_time": "2024-06-11T22:34:31.527401Z" + } + }, + "id": "925de7fff7845089", + "execution_count": 23 + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "# plot results\n", + "def plot_results(results):\n", + " fig, ax = plt.subplots()\n", + " for key, value in results['substrates'].items():\n", + " ax.plot(results['time'], value, label=key)\n", + " ax.legend()\n", + " plt.show()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-11T22:34:31.533348Z", + "start_time": "2024-06-11T22:34:31.531024Z" + } + }, + "id": "e220f9251bb22532", + "execution_count": 24 + }, + { + "cell_type": "code", + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(results['results'])" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.834832Z", - "start_time": "2024-06-04T22:20:05.831875Z" + "end_time": "2024-06-11T22:34:31.609587Z", + "start_time": "2024-06-11T22:34:31.534147Z" + } + }, + "id": "7ccc1e363e9bb98e", + "execution_count": 25 + }, + { + "cell_type": "code", + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-11T22:34:31.613187Z", + "start_time": "2024-06-11T22:34:31.611814Z" } }, "id": "7f92f56a30057ef9", - "execution_count": 12 + "execution_count": 25 }, { "cell_type": "code", @@ -449,12 +799,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.837378Z", - "start_time": "2024-06-04T22:20:05.835751Z" + "end_time": "2024-06-11T22:34:31.615650Z", + "start_time": "2024-06-11T22:34:31.613938Z" } }, "id": "8e6ba7e397d883bf", - "execution_count": 12 + "execution_count": 25 }, { "cell_type": "code", @@ -463,12 +813,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.850999Z", - "start_time": "2024-06-04T22:20:05.838545Z" + "end_time": "2024-06-11T22:34:31.618261Z", + "start_time": "2024-06-11T22:34:31.616551Z" } }, "id": "34221fba51751ea7", - "execution_count": 12 + "execution_count": 25 }, { "cell_type": "code", @@ -477,74 +827,62 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.853761Z", - "start_time": "2024-06-04T22:20:05.851826Z" + "end_time": "2024-06-11T22:34:31.620626Z", + "start_time": "2024-06-11T22:34:31.619069Z" } }, "id": "7d43602df6ddda69", - "execution_count": 12 + "execution_count": 25 }, { "cell_type": "code", - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'model' is not defined", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[0;32mIn[13], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mmodel\u001B[49m\u001B[38;5;241m.\u001B[39mreactions\u001B[38;5;241m.\u001B[39mEX_o2_e\u001B[38;5;241m.\u001B[39mlower_bound \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m2\u001B[39m \u001B[38;5;66;03m# Limiting oxygen uptake\u001B[39;00m\n\u001B[1;32m 2\u001B[0m model\u001B[38;5;241m.\u001B[39mreactions\u001B[38;5;241m.\u001B[39mATPM\u001B[38;5;241m.\u001B[39mlower_bound \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m1\u001B[39m \u001B[38;5;66;03m# Setting lower bound for ATP maintenance\u001B[39;00m\n\u001B[1;32m 3\u001B[0m model\u001B[38;5;241m.\u001B[39mreactions\u001B[38;5;241m.\u001B[39mATPM\u001B[38;5;241m.\u001B[39mupper_bound \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m1\u001B[39m \u001B[38;5;66;03m# Setting upper bound for ATP maintenance\u001B[39;00m\n", - "\u001B[0;31mNameError\u001B[0m: name 'model' is not defined" - ] - } - ], + "outputs": [], "source": [ - "model.reactions.EX_o2_e.lower_bound = -2 # Limiting oxygen uptake\n", - "model.reactions.ATPM.lower_bound = 1 # Setting lower bound for ATP maintenance\n", - "model.reactions.ATPM.upper_bound = 1 # Setting upper bound for ATP maintenance\n", - "\n", - "# Define initial conditions, kinetic parameters, and other necessary inputs\n", - "initial_conditions = {\n", - " 'biomass': 0.1, # Initial biomass concentration\n", - " 'glucose': 20.0, # Initial glucose concentration\n", - " 'acetate': 0.0 # Initial acetate concentration\n", - "}\n", - "kinetic_params = {\n", - " 'glucose': (0.5, 2), # Km and Vmax for glucose\n", - " 'acetate': (0.5, 2) # Km and Vmax for acetate\n", - "}\n", - "substrate_update_reactions = {\n", - " 'glucose': 'EX_glc__D_e', # Exchange reaction ID for glucose\n", - " 'acetate': 'EX_ac_e' # Exchange reaction ID for acetate\n", - "}\n", - "\n", - "# simulation conditions\n", - "t_n = 100 # number of time points\n", - "dt = 0.5 # Time step, matching your setup\n", - "time_points = list(range(0, t_n)) # Simulation time points, matching your setup\n", - "\n", - "# Make sure to adjust the perform_dfba function if needed to initialize result arrays with sufficient size\n", - "dfba_results = perform_dfba(\n", - " model, \n", - " initial_conditions, \n", - " kinetic_params, \n", - " time_points, \n", - " 'Biomass_Ecoli_core', \n", - " substrate_update_reactions, \n", - " dt,\n", - " 'biomass'\n", - ")" + "# model.reactions.EX_o2_e.lower_bound = -2 # Limiting oxygen uptake\n", + "# model.reactions.ATPM.lower_bound = 1 # Setting lower bound for ATP maintenance\n", + "# model.reactions.ATPM.upper_bound = 1 # Setting upper bound for ATP maintenance\n", + "# \n", + "# # Define initial conditions, kinetic parameters, and other necessary inputs\n", + "# initial_conditions = {\n", + "# 'biomass': 0.1, # Initial biomass concentration\n", + "# 'glucose': 20.0, # Initial glucose concentration\n", + "# 'acetate': 0.0 # Initial acetate concentration\n", + "# }\n", + "# kinetic_params = {\n", + "# 'glucose': (0.5, 2), # Km and Vmax for glucose\n", + "# 'acetate': (0.5, 2) # Km and Vmax for acetate\n", + "# }\n", + "# substrate_update_reactions = {\n", + "# 'glucose': 'EX_glc__D_e', # Exchange reaction ID for glucose\n", + "# 'acetate': 'EX_ac_e' # Exchange reaction ID for acetate\n", + "# }\n", + "# \n", + "# # simulation conditions\n", + "# t_n = 100 # number of time points\n", + "# dt = 0.5 # Time step, matching your setup\n", + "# time_points = list(range(0, t_n)) # Simulation time points, matching your setup\n", + "# \n", + "# # Make sure to adjust the perform_dfba function if needed to initialize result arrays with sufficient size\n", + "# dfba_results = perform_dfba(\n", + "# model, \n", + "# initial_conditions, \n", + "# kinetic_params, \n", + "# time_points, \n", + "# 'Biomass_Ecoli_core', \n", + "# substrate_update_reactions, \n", + "# dt,\n", + "# 'biomass'\n", + "# )" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-04T22:20:05.871184Z", - "start_time": "2024-06-04T22:20:05.855360Z" + "end_time": "2024-06-11T22:34:31.623596Z", + "start_time": "2024-06-11T22:34:31.621429Z" } }, "id": "c9b5adee14ee7d91", - "execution_count": 13 + "execution_count": 26 } ], "metadata": { diff --git a/process_bigraph/experiments/parameter_scan.py b/process_bigraph/experiments/parameter_scan.py index dfcf4ee..f95eddf 100644 --- a/process_bigraph/experiments/parameter_scan.py +++ b/process_bigraph/experiments/parameter_scan.py @@ -185,7 +185,7 @@ def __init__(self, config, core): **self.inputs_config), 'outputs': {}}}} - self.composite = Composite(composite_config) + self.composite = Composite(composite_config, core=core) def inputs(self): From 9f51b7b5d80db00fe66b4409a4b07defdac179f5 Mon Sep 17 00:00:00 2001 From: Eran Date: Fri, 14 Jun 2024 18:37:57 -0400 Subject: [PATCH 04/12] more work on comets notebook. dfba process working well --- notebooks/comets.ipynb | 308 +++++++++++++++++++++++++++++++++++------ 1 file changed, 267 insertions(+), 41 deletions(-) diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index 95b8d70..2faa9ba 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -7,8 +7,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2024-06-11T22:34:30.290199Z", - "start_time": "2024-06-11T22:34:30.262808Z" + "end_time": "2024-06-14T22:27:04.784127Z", + "start_time": "2024-06-14T22:27:04.764307Z" } }, "outputs": [], @@ -35,16 +35,22 @@ " '_inherit': 'float',\n", " '_apply': apply_non_negative\n", "}\n", - "\n", "core.register('positive_float', positive_float)\n", "\n", + "bounds_type = {\n", + " 'lower': 'maybe[float]',\n", + " 'upper': 'maybe[float]'\n", + "}\n", + "core.register_process('bounds', bounds_type)\n", + "\n", + "\n", "# TODO -- check the function signature of the apply method and report missing keys upon registration" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:30.294928Z", - "start_time": "2024-06-11T22:34:30.291825Z" + "end_time": "2024-06-14T22:27:04.795483Z", + "start_time": "2024-06-14T22:27:04.792476Z" } }, "id": "3e25a40151d79237", @@ -68,8 +74,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:30.300213Z", - "start_time": "2024-06-11T22:34:30.296517Z" + "end_time": "2024-06-14T22:27:04.799570Z", + "start_time": "2024-06-14T22:27:04.796742Z" } }, "id": "c943852149550230", @@ -112,6 +118,7 @@ " },\n", " 'substrate_update_reactions': 'map[string]',\n", " 'biomass_identifier': 'string',\n", + " 'bounds': 'map[bounds]',\n", " }\n", " \n", " def __init__(self, config, core):\n", @@ -122,6 +129,12 @@ " self.model = load_model(self.config['model_file'])\n", " else:\n", " self.model = cobra.io.read_sbml_model(self.config['model_file'])\n", + " \n", + " for reaction_id, bounds in self.config['bounds'].items():\n", + " if bounds['lower'] is not None:\n", + " self.model.reactions.get_by_id(reaction_id).lower_bound = bounds['lower']\n", + " if bounds['upper'] is not None:\n", + " self.model.reactions.get_by_id(reaction_id).upper_bound = bounds['upper']\n", " \n", " def inputs(self):\n", " return {'substrates': 'map[positive_float]'}\n", @@ -149,11 +162,13 @@ " \n", " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", " flux = solution.fluxes[reaction_id]\n", - " substrate_update[substrate] = flux * current_biomass * interval # TODO -- assert not negative?\n", + " substrate_update[substrate] = flux * current_biomass * interval \n", + " # TODO -- assert not negative?\n", " else:\n", " # Handle non-optimal solutions if necessary\n", " print('Non-optimal solution, skipping update')\n", - " # pass\n", + " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", + " substrate_update[substrate] = 0\n", "\n", " return {\n", " 'substrates': substrate_update,\n", @@ -164,8 +179,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:30.307442Z", - "start_time": "2024-06-11T22:34:30.301408Z" + "end_time": "2024-06-14T22:27:04.815764Z", + "start_time": "2024-06-14T22:27:04.809114Z" } }, "id": "50a4fb171d2aafa5", @@ -200,8 +215,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:30.311663Z", - "start_time": "2024-06-11T22:34:30.309116Z" + "end_time": "2024-06-14T22:27:04.820307Z", + "start_time": "2024-06-14T22:27:04.817521Z" } }, "id": "ef2fc9363b163d21", @@ -657,6 +672,189 @@ "Non-optimal solution, skipping update\n", "Non-optimal solution, skipping update\n", "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", + "Non-optimal solution, skipping update\n", "Non-optimal solution, skipping update\n" ] } @@ -665,7 +863,7 @@ "config = {\n", " 'model_file': 'textbook',\n", " 'kinetic_params': {\n", - " 'glucose': (1, 1),\n", + " 'glucose': (0.5, 1),\n", " 'acetate': (0.5, 2)\n", " },\n", " 'biomass_reaction': 'Biomass_Ecoli_core',\n", @@ -673,7 +871,11 @@ " 'glucose': 'EX_glc__D_e',\n", " 'acetate': 'EX_ac_e'\n", " },\n", - " 'biomass_identifier': 'biomass'\n", + " 'biomass_identifier': 'biomass',\n", + " 'bounds': {\n", + " 'EX_o2_e': {'lower': -2, 'upper': None},\n", + " 'ATPM': {'lower': 1, 'upper': 1}\n", + " }\n", "}\n", "\n", "initial_state = {\n", @@ -699,8 +901,8 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.526511Z", - "start_time": "2024-06-11T22:34:30.312897Z" + "end_time": "2024-06-14T22:27:06.310136Z", + "start_time": "2024-06-14T22:27:04.821413Z" } }, "id": "33923108a654be95", @@ -724,13 +926,37 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.529815Z", - "start_time": "2024-06-11T22:34:31.527401Z" + "end_time": "2024-06-14T22:27:06.314387Z", + "start_time": "2024-06-14T22:27:06.311534Z" } }, "id": "925de7fff7845089", "execution_count": 23 }, + { + "cell_type": "code", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.0, 0.0016745886864195005, 0.0033624239164152196, 0.005063608230860864, 0.0067782449233747665, 0.008506438045045486, 0.010248292409169827, 0.012003913596002669, 0.01377340795751824, 0.015556882622182437, 0.01735444549973555, 0.01916620528598513, 0.020992271467608216, 0.022832754326962704, 0.024687764946907012, 0.026557415215627666, 0.028441817831474075, 0.030341086307800205, 0.032255334977812, 0.03418467899942049, 0.03612923436009944, 0.03808911788174716, 0.04006444722555163, 0.04205534089685836, 0.044061918250039786, 0.0460842994933661, 0.04812260569387628, 0.05017695878224835, 0.05224748155766848, 0.054334297692697694, 0.05643753173813543, 0.05855730912787891, 0.06069375618377739, 0.06284700012048035, 0.06501716905027861, 0.0672043919879372, 0.0694087988555189, 0.07163052048719747, 0.07386968863405928, 0.0761264359688922, 0.07840089609096058, 0.08069320353076469, 0.08300349375478404, 0.08533190317020252, 0.08767856912961426, 0.09004362993570886, 0.09242722484593453, 0.09482949407713732, 0.09725057881017535, 0.09969062119450597, 0.10214976435274463, 0.10462815238519343, 0.10712593037433785, 0.1096432443893096, 0.11218024149031397, 0.11473706973301961, 0.11731387817290914, 0.11991081686958774, 0.12252803689104876, 0.12516569031789318, 0.12782393024750166, 0.13050291079815576, 0.13320278711310735, 0.13592371536459266, 0.13866585275778923, 0.14142935753471292, 0.144214388978052, 0.14702110741493687, 0.14984967422064094, 0.15270025182221106, 0.15557300370202443, 0.15846809440126813, 0.16138568952333934, 0.16432595573716213, 0.16728906078041803, 0.1702751734626867, 0.17328446366849373, 0.17631710236026107, 0.1793732615811574, 0.1824531144578441, 0.18555683520311272, 0.18868459911841073, 0.19183658259625055, 0.19501296312249802, 0.19821391927853593, 0.201439630743298, 0.20469027829516884, 0.20796604381374484, 0.21126711028145123, 0.21459366178501035, 0.21794588351675576, 0.22132396177578678, 0.2247280839689584, 0.2281584386117001, 0.23161521532865842, 0.23509860485415693, 0.23860879903246748, 0.24214599081788646, 0.24571037427460918, 0.24930214457639593, 0.25292149800602276, 0.25656863195450946, 0.26024374492011765, 0.2639470365071115, 0.26767870742427285, 0.27143895948316293, 0.2752279955961222, 0.27904601977400023, 0.2828932371236059, 0.2867698538448699, 0.29067607722770933, 0.2946121156485849, 0.2985781785667419, 0.30257447652012237, 0.3066012211209405, 0.31065862505090897, 0.31474690205610467, 0.3188662669414638, 0.323016935564893, 0.3271991248309848, 0.3314130526843248, 0.3356589381023777, 0.3399370010879379, 0.34424746266113226, 0.34859054485095925, 0.35296647068635073, 0.35737546418674054, 0.36181775035212504, 0.36629355515259826, 0.37080310551734624, 0.3753466293230824, 0.3799243553819065, 0.3845365134285694, 0.38918333410712325, 0.3938650489569396, 0.3985818903980736, 0.4033340917159546, 0.40812188704538055, 0.41294551135379565, 0.4178052004238266, 0.42270119083505525, 0.42763371994500254, 0.4326030258692983, 0.4376093474610116, 0.4426529242891145, 0.4477339966160509, 0.4528528053743823, 0.45800959214248094, 0.463204599119239, 0.46843806909776264, 0.4737102454380181, 0.4790213720383956, 0.484371693306157, 0.48976145412672883, 0.4951908998318062, 0.5006602761662261, 0.5061698292535718, 0.5117198055604658, 0.517310451859509, 0.522942015190821, 0.5286147428221365, 0.5343288822074092, 0.5400846809438742, 0.5458823867275183, 0.5517222473069049, 0.5576045104352979, 0.5635294238210302, 0.569497235076055, 0.5755081916626216, 0.5815625408380106, 0.5876605295972647, 0.5938024046138451, 0.5999884121781464, 0.6062187981337923, 0.6124938078116419, 0.6188136859614234, 0.6251786766809165, 0.6315890233425979, 0.6380449685176617, 0.6445467538973249, 0.6510946202113224, 0.6576888071434932, 0.664329553244357, 0.6710170958405728, 0.677751670941172, 0.6845335131404497, 0.691362855517397, 0.698239929531547, 0.7051649649151115, 0.712138189561269, 0.7191598294084685, 0.726230108320603, 0.7333492479629018, 0.7405174676733854, 0.7477349843297199, 0.7550020122112994, 0.7623187628563812, 0.7696854449140889, 0.7771022639910892, 0.7845694224927457, 0.7920871194585372, 0.799655550391525, 0.8072749070816421, 0.8149453774225652, 0.822667145221926, 0.8304403900045995, 0.8382652868088036, 0.8461420059747276, 0.8540707129253938, 0.8620515679394496, 0.8700847259155648, 0.8781703361281031, 0.8863085419737133, 0.8944994807084781, 0.9027432831752328, 0.9110400735206564, 0.9193899689017124, 0.9277930791810016, 0.9362495066105654, 0.9447593455036581, 0.953322681893982, 0.961939593181856, 0.9706101477667631, 0.979334404665692, 0.9881124131166639, 0.9969442121668021, 1.005829830244271, 1.0147692847133765, 1.023762581412087, 1.0328097141711925, 1.0419106643142808, 1.05106540013767, 1.0602738763693869, 1.069536033606238, 1.0788517977279664, 1.0882210792874336, 1.097643772875716, 1.1071197564609339, 1.116648890699578, 1.1262310182190236, 1.1358659628698538, 1.1455535289465357, 1.1552935003749132, 1.1650856398648897, 1.174929688026588, 1.1848253624481693, 1.194772356733394, 1.2047703394968938, 1.2148189533150031, 1.2249178136298737, 1.2350665076044605, 1.245264592925818, 1.255511596553999, 1.2658070134136703, 1.2761503050253973, 1.2865408980733426, 1.296978182905937, 1.3074615119658504, 1.3179901981453614, 1.3285635130629756, 1.339180685256865, 1.3498408982904222, 1.3605432887648996, 1.3712869442337798, 1.382070901013154, 1.3928941418819982, 1.4037555936658248, 1.4146541246967232, 1.4255885421423247, 1.4365575891956939, 1.4475599421175824, 1.4585942071218618, 1.469658917094283, 1.4807525281339902, 1.4918734159064286, 1.503019871795437, 1.5141900988413872, 1.5253822074512293, 1.5365942108652104, 1.5478240203638352, 1.5590694401973486, 1.5703281622185965, 1.5815977601985787, 1.5928756838023184, 1.6041592522008215, 1.6154456472928789, 1.6267319065082462, 1.638014915161298, 1.64929139832159, 1.6605579121648157, 1.6718108347644158, 1.6830463562805338, 1.694260468499086, 1.7054489536693693, 1.7166073725838344, 1.7277310518383457, 1.7388150702053582, 1.749854244045915, 1.760843111679112, 1.7717759166195992, 1.7826465895847066, 1.7934487291627321, 1.8041755810227382, 1.8148200155336527, 1.8253745036464224, 1.8358310908772089, 1.846181369211887, 1.8564164467321715, 1.8665269147412065, 1.8765028121410525, 1.886333586785783, 1.8960080535013282, 1.9055143484262504, 1.9148398792855652, 1.9239712711618218, 1.9328943072729199, 1.9415938642035508, 1.950053840965363, 1.9582570811785054, 1.9661852875722592, 1.9738189278929112, 1.9811371311803387, 1.9881175732278917, 1.9947363498695099, 2.0009678365392176, 2.0067845323160114, 2.0121568863953927, 2.0170531046098024, 2.0214389332447875, 2.025277416954663, 2.0285286270571086, 2.0311493558638984, 2.0330927719643994, 2.034308030494572, 2.03473983136614, 2.034327917160403, 2.0330065008619034, 2.030703611760842, 2.027340345617881, 2.022830002471863, 2.0170770921698953, 2.00997618367434, 2.0014105692852584, 1.9912507089054907, 1.9793524121216532, 1.9655547068837247, 1.949677332597549, 1.9315177821198575, 1.910847801076178, 1.8874092337742256, 1.8609090826088301, 1.831013622531781, 1.7973413850690463, 1.7594548004192965, 1.7168502674929518, 1.6689464222970005, 1.6150704170283539, 1.5544421453779236, 1.486156622826685, 1.409165269232401, 1.3222578269907435, 1.2240483462946363, 1.1129714048071877, 0.9872987472111101, 0.8451915692225587, 0.6848080208703818, 0.5050615981676918, 0.3253589719933728, 0.18371645223043578, 0.08680520528758337, 0.03331019257806781, 0.010685784994457805, 0.003099864155934498, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791]\n" + ] + } + ], + "source": [ + "print(results['results']['substrates']['acetate'])" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-06-14T22:27:06.318366Z", + "start_time": "2024-06-14T22:27:06.315631Z" + } + }, + "id": "74a1e083bb756f6b", + "execution_count": 24 + }, { "cell_type": "code", "outputs": [], @@ -746,12 +972,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.533348Z", - "start_time": "2024-06-11T22:34:31.531024Z" + "end_time": "2024-06-14T22:27:06.322030Z", + "start_time": "2024-06-14T22:27:06.319608Z" } }, "id": "e220f9251bb22532", - "execution_count": 24 + "execution_count": 25 }, { "cell_type": "code", @@ -759,7 +985,7 @@ { "data": { "text/plain": "
", - "image/png": "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" + "image/png": "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" }, "metadata": {}, "output_type": "display_data" @@ -771,12 +997,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.609587Z", - "start_time": "2024-06-11T22:34:31.534147Z" + "end_time": "2024-06-14T22:27:06.406720Z", + "start_time": "2024-06-14T22:27:06.323474Z" } }, "id": "7ccc1e363e9bb98e", - "execution_count": 25 + "execution_count": 26 }, { "cell_type": "code", @@ -785,12 +1011,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.613187Z", - "start_time": "2024-06-11T22:34:31.611814Z" + "end_time": "2024-06-14T22:27:06.410848Z", + "start_time": "2024-06-14T22:27:06.409105Z" } }, "id": "7f92f56a30057ef9", - "execution_count": 25 + "execution_count": 26 }, { "cell_type": "code", @@ -799,12 +1025,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.615650Z", - "start_time": "2024-06-11T22:34:31.613938Z" + "end_time": "2024-06-14T22:27:06.413266Z", + "start_time": "2024-06-14T22:27:06.411849Z" } }, "id": "8e6ba7e397d883bf", - "execution_count": 25 + "execution_count": 26 }, { "cell_type": "code", @@ -813,12 +1039,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.618261Z", - "start_time": "2024-06-11T22:34:31.616551Z" + "end_time": "2024-06-14T22:27:06.415621Z", + "start_time": "2024-06-14T22:27:06.413833Z" } }, "id": "34221fba51751ea7", - "execution_count": 25 + "execution_count": 26 }, { "cell_type": "code", @@ -827,12 +1053,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.620626Z", - "start_time": "2024-06-11T22:34:31.619069Z" + "end_time": "2024-06-14T22:27:06.418101Z", + "start_time": "2024-06-14T22:27:06.416594Z" } }, "id": "7d43602df6ddda69", - "execution_count": 25 + "execution_count": 26 }, { "cell_type": "code", @@ -877,12 +1103,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-11T22:34:31.623596Z", - "start_time": "2024-06-11T22:34:31.621429Z" + "end_time": "2024-06-14T22:27:06.421074Z", + "start_time": "2024-06-14T22:27:06.418943Z" } }, "id": "c9b5adee14ee7d91", - "execution_count": 26 + "execution_count": 27 } ], "metadata": { From 62bd73540a6d8c485ed3ead24371d4f3b607a423 Mon Sep 17 00:00:00 2001 From: Eran Date: Tue, 18 Jun 2024 18:31:50 -0400 Subject: [PATCH 05/12] working on comets demo, found a bug with .. in wire path, still debugging --- notebooks/comets.ipynb | 929 ++++---------------------- process_bigraph/composite.py | 5 +- process_bigraph/experiments/comets.py | 204 ++++++ 3 files changed, 343 insertions(+), 795 deletions(-) create mode 100644 process_bigraph/experiments/comets.py diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index 2faa9ba..07c53a8 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -2,17 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 17, + "execution_count": 1, "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2024-06-14T22:27:04.784127Z", - "start_time": "2024-06-14T22:27:04.764307Z" + "end_time": "2024-06-18T22:20:02.080909Z", + "start_time": "2024-06-18T22:20:00.556549Z" } }, "outputs": [], "source": [ + "import numpy as np\n", "from process_bigraph import Process, ProcessTypes, Composite\n", "import matplotlib.pyplot as plt\n", "import cobra\n", @@ -49,12 +50,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:04.795483Z", - "start_time": "2024-06-14T22:27:04.792476Z" + "end_time": "2024-06-18T22:20:02.085129Z", + "start_time": "2024-06-18T22:20:02.082276Z" } }, "id": "3e25a40151d79237", - "execution_count": 18 + "execution_count": 2 }, { "cell_type": "code", @@ -63,7 +64,7 @@ "data": { "text/plain": "{'_type': 'positive_float',\n '_check': 'check_float',\n '_apply': 'apply_non_negative',\n '_serialize': 'to_string',\n '_description': '64-bit floating point precision number',\n '_default': '0.0',\n '_deserialize': 'deserialize_float',\n '_divide': 'divide_float',\n '_dataclass': 'dataclass_float',\n '_inherit': ['float']}" }, - "execution_count": 19, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -74,17 +75,17 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:04.799570Z", - "start_time": "2024-06-14T22:27:04.796742Z" + "end_time": "2024-06-18T22:20:02.089537Z", + "start_time": "2024-06-18T22:20:02.085807Z" } }, "id": "c943852149550230", - "execution_count": 19 + "execution_count": 3 }, { "cell_type": "markdown", "source": [ - "# Dynamic FBA Process" + "## Dynamic FBA Process" ], "metadata": { "collapsed": false @@ -166,7 +167,7 @@ " # TODO -- assert not negative?\n", " else:\n", " # Handle non-optimal solutions if necessary\n", - " print('Non-optimal solution, skipping update')\n", + " # print('Non-optimal solution, skipping update')\n", " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", " substrate_update[substrate] = 0\n", "\n", @@ -179,12 +180,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:04.815764Z", - "start_time": "2024-06-14T22:27:04.809114Z" + "end_time": "2024-06-18T22:20:02.096869Z", + "start_time": "2024-06-18T22:20:02.090609Z" } }, "id": "50a4fb171d2aafa5", - "execution_count": 20 + "execution_count": 4 }, { "cell_type": "code", @@ -192,6 +193,24 @@ "source": [ "from process_bigraph.experiments.parameter_scan import RunProcess\n", "\n", + "def dfba_config(\n", + " model_file='textbook', \n", + " kinetic_params={'glucose': (0.5, 1), 'acetate': (0.5, 2)},\n", + " biomass_reaction='Biomass_Ecoli_core', \n", + " substrate_update_reactions={'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}, \n", + " biomass_identifier='biomass', \n", + " bounds={'EX_o2_e': {'lower': -2, 'upper': None},'ATPM': {'lower': 1, 'upper': 1}}\n", + "):\n", + " return {\n", + " 'model_file': model_file,\n", + " 'kinetic_params': kinetic_params,\n", + " 'biomass_reaction': biomass_reaction,\n", + " 'substrate_update_reactions': substrate_update_reactions,\n", + " 'biomass_identifier': biomass_identifier,\n", + " 'bounds': bounds\n", + " }\n", + "\n", + "\n", "# TODO -- this should be imported, or just part of Process?\n", "def run_process(\n", " address, \n", @@ -215,669 +234,27 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:04.820307Z", - "start_time": "2024-06-14T22:27:04.817521Z" + "end_time": "2024-06-18T22:20:02.118565Z", + "start_time": "2024-06-18T22:20:02.098708Z" } }, "id": "ef2fc9363b163d21", - "execution_count": 21 + "execution_count": 5 }, { "cell_type": "code", "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n", - "Non-optimal solution, skipping update\n" + "/Users/eranagmon/code/bigraph-schema/venv/lib/python3.9/site-packages/cobra/util/solver.py:554: UserWarning: Solver status is 'infeasible'.\n", + " warn(f\"Solver status is '{status}'.\", UserWarning)\n" ] } ], "source": [ - "config = {\n", - " 'model_file': 'textbook',\n", - " 'kinetic_params': {\n", - " 'glucose': (0.5, 1),\n", - " 'acetate': (0.5, 2)\n", - " },\n", - " 'biomass_reaction': 'Biomass_Ecoli_core',\n", - " 'substrate_update_reactions': {\n", - " 'glucose': 'EX_glc__D_e',\n", - " 'acetate': 'EX_ac_e'\n", - " },\n", - " 'biomass_identifier': 'biomass',\n", - " 'bounds': {\n", - " 'EX_o2_e': {'lower': -2, 'upper': None},\n", - " 'ATPM': {'lower': 1, 'upper': 1}\n", - " }\n", - "}\n", - "\n", + "config = dfba_config()\n", "initial_state = {\n", " 'substrates': {\n", " 'biomass': 0.1, # Initial biomass concentration\n", @@ -901,61 +278,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.310136Z", - "start_time": "2024-06-14T22:27:04.821413Z" + "end_time": "2024-06-18T22:20:03.448389Z", + "start_time": "2024-06-18T22:20:02.119565Z" } }, "id": "33923108a654be95", - "execution_count": 22 - }, - { - "cell_type": "code", - "outputs": [ - { - "data": { - "text/plain": "dict_keys(['substrates', 'time'])" - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results['results'].keys()" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.314387Z", - "start_time": "2024-06-14T22:27:06.311534Z" - } - }, - "id": "925de7fff7845089", - "execution_count": 23 - }, - { - "cell_type": "code", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.0, 0.0016745886864195005, 0.0033624239164152196, 0.005063608230860864, 0.0067782449233747665, 0.008506438045045486, 0.010248292409169827, 0.012003913596002669, 0.01377340795751824, 0.015556882622182437, 0.01735444549973555, 0.01916620528598513, 0.020992271467608216, 0.022832754326962704, 0.024687764946907012, 0.026557415215627666, 0.028441817831474075, 0.030341086307800205, 0.032255334977812, 0.03418467899942049, 0.03612923436009944, 0.03808911788174716, 0.04006444722555163, 0.04205534089685836, 0.044061918250039786, 0.0460842994933661, 0.04812260569387628, 0.05017695878224835, 0.05224748155766848, 0.054334297692697694, 0.05643753173813543, 0.05855730912787891, 0.06069375618377739, 0.06284700012048035, 0.06501716905027861, 0.0672043919879372, 0.0694087988555189, 0.07163052048719747, 0.07386968863405928, 0.0761264359688922, 0.07840089609096058, 0.08069320353076469, 0.08300349375478404, 0.08533190317020252, 0.08767856912961426, 0.09004362993570886, 0.09242722484593453, 0.09482949407713732, 0.09725057881017535, 0.09969062119450597, 0.10214976435274463, 0.10462815238519343, 0.10712593037433785, 0.1096432443893096, 0.11218024149031397, 0.11473706973301961, 0.11731387817290914, 0.11991081686958774, 0.12252803689104876, 0.12516569031789318, 0.12782393024750166, 0.13050291079815576, 0.13320278711310735, 0.13592371536459266, 0.13866585275778923, 0.14142935753471292, 0.144214388978052, 0.14702110741493687, 0.14984967422064094, 0.15270025182221106, 0.15557300370202443, 0.15846809440126813, 0.16138568952333934, 0.16432595573716213, 0.16728906078041803, 0.1702751734626867, 0.17328446366849373, 0.17631710236026107, 0.1793732615811574, 0.1824531144578441, 0.18555683520311272, 0.18868459911841073, 0.19183658259625055, 0.19501296312249802, 0.19821391927853593, 0.201439630743298, 0.20469027829516884, 0.20796604381374484, 0.21126711028145123, 0.21459366178501035, 0.21794588351675576, 0.22132396177578678, 0.2247280839689584, 0.2281584386117001, 0.23161521532865842, 0.23509860485415693, 0.23860879903246748, 0.24214599081788646, 0.24571037427460918, 0.24930214457639593, 0.25292149800602276, 0.25656863195450946, 0.26024374492011765, 0.2639470365071115, 0.26767870742427285, 0.27143895948316293, 0.2752279955961222, 0.27904601977400023, 0.2828932371236059, 0.2867698538448699, 0.29067607722770933, 0.2946121156485849, 0.2985781785667419, 0.30257447652012237, 0.3066012211209405, 0.31065862505090897, 0.31474690205610467, 0.3188662669414638, 0.323016935564893, 0.3271991248309848, 0.3314130526843248, 0.3356589381023777, 0.3399370010879379, 0.34424746266113226, 0.34859054485095925, 0.35296647068635073, 0.35737546418674054, 0.36181775035212504, 0.36629355515259826, 0.37080310551734624, 0.3753466293230824, 0.3799243553819065, 0.3845365134285694, 0.38918333410712325, 0.3938650489569396, 0.3985818903980736, 0.4033340917159546, 0.40812188704538055, 0.41294551135379565, 0.4178052004238266, 0.42270119083505525, 0.42763371994500254, 0.4326030258692983, 0.4376093474610116, 0.4426529242891145, 0.4477339966160509, 0.4528528053743823, 0.45800959214248094, 0.463204599119239, 0.46843806909776264, 0.4737102454380181, 0.4790213720383956, 0.484371693306157, 0.48976145412672883, 0.4951908998318062, 0.5006602761662261, 0.5061698292535718, 0.5117198055604658, 0.517310451859509, 0.522942015190821, 0.5286147428221365, 0.5343288822074092, 0.5400846809438742, 0.5458823867275183, 0.5517222473069049, 0.5576045104352979, 0.5635294238210302, 0.569497235076055, 0.5755081916626216, 0.5815625408380106, 0.5876605295972647, 0.5938024046138451, 0.5999884121781464, 0.6062187981337923, 0.6124938078116419, 0.6188136859614234, 0.6251786766809165, 0.6315890233425979, 0.6380449685176617, 0.6445467538973249, 0.6510946202113224, 0.6576888071434932, 0.664329553244357, 0.6710170958405728, 0.677751670941172, 0.6845335131404497, 0.691362855517397, 0.698239929531547, 0.7051649649151115, 0.712138189561269, 0.7191598294084685, 0.726230108320603, 0.7333492479629018, 0.7405174676733854, 0.7477349843297199, 0.7550020122112994, 0.7623187628563812, 0.7696854449140889, 0.7771022639910892, 0.7845694224927457, 0.7920871194585372, 0.799655550391525, 0.8072749070816421, 0.8149453774225652, 0.822667145221926, 0.8304403900045995, 0.8382652868088036, 0.8461420059747276, 0.8540707129253938, 0.8620515679394496, 0.8700847259155648, 0.8781703361281031, 0.8863085419737133, 0.8944994807084781, 0.9027432831752328, 0.9110400735206564, 0.9193899689017124, 0.9277930791810016, 0.9362495066105654, 0.9447593455036581, 0.953322681893982, 0.961939593181856, 0.9706101477667631, 0.979334404665692, 0.9881124131166639, 0.9969442121668021, 1.005829830244271, 1.0147692847133765, 1.023762581412087, 1.0328097141711925, 1.0419106643142808, 1.05106540013767, 1.0602738763693869, 1.069536033606238, 1.0788517977279664, 1.0882210792874336, 1.097643772875716, 1.1071197564609339, 1.116648890699578, 1.1262310182190236, 1.1358659628698538, 1.1455535289465357, 1.1552935003749132, 1.1650856398648897, 1.174929688026588, 1.1848253624481693, 1.194772356733394, 1.2047703394968938, 1.2148189533150031, 1.2249178136298737, 1.2350665076044605, 1.245264592925818, 1.255511596553999, 1.2658070134136703, 1.2761503050253973, 1.2865408980733426, 1.296978182905937, 1.3074615119658504, 1.3179901981453614, 1.3285635130629756, 1.339180685256865, 1.3498408982904222, 1.3605432887648996, 1.3712869442337798, 1.382070901013154, 1.3928941418819982, 1.4037555936658248, 1.4146541246967232, 1.4255885421423247, 1.4365575891956939, 1.4475599421175824, 1.4585942071218618, 1.469658917094283, 1.4807525281339902, 1.4918734159064286, 1.503019871795437, 1.5141900988413872, 1.5253822074512293, 1.5365942108652104, 1.5478240203638352, 1.5590694401973486, 1.5703281622185965, 1.5815977601985787, 1.5928756838023184, 1.6041592522008215, 1.6154456472928789, 1.6267319065082462, 1.638014915161298, 1.64929139832159, 1.6605579121648157, 1.6718108347644158, 1.6830463562805338, 1.694260468499086, 1.7054489536693693, 1.7166073725838344, 1.7277310518383457, 1.7388150702053582, 1.749854244045915, 1.760843111679112, 1.7717759166195992, 1.7826465895847066, 1.7934487291627321, 1.8041755810227382, 1.8148200155336527, 1.8253745036464224, 1.8358310908772089, 1.846181369211887, 1.8564164467321715, 1.8665269147412065, 1.8765028121410525, 1.886333586785783, 1.8960080535013282, 1.9055143484262504, 1.9148398792855652, 1.9239712711618218, 1.9328943072729199, 1.9415938642035508, 1.950053840965363, 1.9582570811785054, 1.9661852875722592, 1.9738189278929112, 1.9811371311803387, 1.9881175732278917, 1.9947363498695099, 2.0009678365392176, 2.0067845323160114, 2.0121568863953927, 2.0170531046098024, 2.0214389332447875, 2.025277416954663, 2.0285286270571086, 2.0311493558638984, 2.0330927719643994, 2.034308030494572, 2.03473983136614, 2.034327917160403, 2.0330065008619034, 2.030703611760842, 2.027340345617881, 2.022830002471863, 2.0170770921698953, 2.00997618367434, 2.0014105692852584, 1.9912507089054907, 1.9793524121216532, 1.9655547068837247, 1.949677332597549, 1.9315177821198575, 1.910847801076178, 1.8874092337742256, 1.8609090826088301, 1.831013622531781, 1.7973413850690463, 1.7594548004192965, 1.7168502674929518, 1.6689464222970005, 1.6150704170283539, 1.5544421453779236, 1.486156622826685, 1.409165269232401, 1.3222578269907435, 1.2240483462946363, 1.1129714048071877, 0.9872987472111101, 0.8451915692225587, 0.6848080208703818, 0.5050615981676918, 0.3253589719933728, 0.18371645223043578, 0.08680520528758337, 0.03331019257806781, 0.010685784994457805, 0.003099864155934498, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791, 0.0008652770397027791]\n" - ] - } - ], - "source": [ - "print(results['results']['substrates']['acetate'])" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.318366Z", - "start_time": "2024-06-14T22:27:06.315631Z" - } - }, - "id": "74a1e083bb756f6b", - "execution_count": 24 + "execution_count": 6 }, { "cell_type": "code", @@ -972,12 +300,12 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.322030Z", - "start_time": "2024-06-14T22:27:06.319608Z" + "end_time": "2024-06-18T22:20:03.452506Z", + "start_time": "2024-06-18T22:20:03.449442Z" } }, "id": "e220f9251bb22532", - "execution_count": 25 + "execution_count": 7 }, { "cell_type": "code", @@ -997,118 +325,135 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.406720Z", - "start_time": "2024-06-14T22:27:06.323474Z" + "end_time": "2024-06-18T22:20:03.595004Z", + "start_time": "2024-06-18T22:20:03.453198Z" } }, "id": "7ccc1e363e9bb98e", - "execution_count": 26 + "execution_count": 8 }, { - "cell_type": "code", - "outputs": [], - "source": [], + "cell_type": "markdown", + "source": [ + "## Spatial dFBA composite simulation" + ], "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.410848Z", - "start_time": "2024-06-14T22:27:06.409105Z" - } + "collapsed": false }, - "id": "7f92f56a30057ef9", - "execution_count": 26 + "id": "983b47cbb5623b3d" }, { "cell_type": "code", - "outputs": [], - "source": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> \u001B[0;32m/Users/eranagmon/code/bigraph-schema/bigraph_schema/type_system.py\u001B[0m(910)\u001B[0;36mfill_ports\u001B[0;34m()\u001B[0m\n", + "\u001B[0;32m 909 \u001B[0;31m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0m\u001B[0;32m--> 910 \u001B[0;31m subschema, substate = self.set_slice(\n", + "\u001B[0m\u001B[0;32m 911 \u001B[0;31m \u001B[0mtop_schema\u001B[0m\u001B[0;34m,\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0m\n" + ] + } + ], + "source": [ + "n_bins = (2, 2)\n", + "\n", + "initial_glucose = np.random.uniform(low=0, high=20, size=n_bins)\n", + "initial_acetate = np.random.uniform(low=0, high=0, size=n_bins)\n", + "initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins)\n", + "\n", + "dfba_processes_dict = {}\n", + "for i in range(n_bins[0]):\n", + " for j in range(n_bins[1]):\n", + " dfba_processes_dict[f'[{i},{j}]'] = {\n", + " '_type': 'process',\n", + " 'address': 'local:DynamicFBA',\n", + " 'config': dfba_config(),\n", + " 'inputs': {\n", + " 'substrates': {\n", + " 'glucose': ['..', '..', 'fields', 'glucose', i, j],\n", + " 'acetate': ['..', '..', 'fields', 'acetate', i, j],\n", + " 'biomass': ['..', '..', 'fields', 'biomass', i, j],\n", + " }\n", + " },\n", + " 'outputs': {\n", + " 'substrates': {\n", + " 'glucose': ['..', '..', 'fields', 'glucose', i, j],\n", + " 'acetate': ['..', '..', 'fields', 'acetate', i, j],\n", + " 'biomass': ['..', '..', 'fields', 'biomass', i, j]\n", + " }\n", + " }\n", + " }\n", + "\n", + "composite_state = {\n", + " 'fields': {\n", + " '_type': 'map',\n", + " '_value': {\n", + " '_type': 'array',\n", + " '_size': n_bins,\n", + " '_value': 'positive_float'\n", + " },\n", + " 'glucose': initial_glucose,\n", + " 'acetate': initial_acetate,\n", + " 'biomass': initial_biomass,\n", + " },\n", + " 'spatial_dfba': dfba_processes_dict\n", + "}\n", + "\n", + "sim = Composite({'state': composite_state}, core=core)\n" + ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.413266Z", - "start_time": "2024-06-14T22:27:06.411849Z" + "end_time": "2024-06-18T22:20:20.354240Z", + "start_time": "2024-06-18T22:20:03.598052Z" } }, - "id": "8e6ba7e397d883bf", - "execution_count": 26 + "id": "7f92f56a30057ef9", + "execution_count": 9 }, { "cell_type": "code", "outputs": [], - "source": [], + "source": [ + "sim.state['spatial_dfba']" + ], "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.415621Z", - "start_time": "2024-06-14T22:27:06.413833Z" - } + "collapsed": false }, - "id": "34221fba51751ea7", - "execution_count": 26 + "id": "8e6ba7e397d883bf", + "execution_count": null }, { "cell_type": "code", "outputs": [], - "source": [], + "source": [ + "composite_state" + ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.418101Z", - "start_time": "2024-06-14T22:27:06.416594Z" + "end_time": "2024-06-18T22:20:20.356451Z", + "start_time": "2024-06-18T22:20:20.356230Z" } }, - "id": "7d43602df6ddda69", - "execution_count": 26 + "id": "34221fba51751ea7", + "execution_count": null }, { "cell_type": "code", "outputs": [], - "source": [ - "# model.reactions.EX_o2_e.lower_bound = -2 # Limiting oxygen uptake\n", - "# model.reactions.ATPM.lower_bound = 1 # Setting lower bound for ATP maintenance\n", - "# model.reactions.ATPM.upper_bound = 1 # Setting upper bound for ATP maintenance\n", - "# \n", - "# # Define initial conditions, kinetic parameters, and other necessary inputs\n", - "# initial_conditions = {\n", - "# 'biomass': 0.1, # Initial biomass concentration\n", - "# 'glucose': 20.0, # Initial glucose concentration\n", - "# 'acetate': 0.0 # Initial acetate concentration\n", - "# }\n", - "# kinetic_params = {\n", - "# 'glucose': (0.5, 2), # Km and Vmax for glucose\n", - "# 'acetate': (0.5, 2) # Km and Vmax for acetate\n", - "# }\n", - "# substrate_update_reactions = {\n", - "# 'glucose': 'EX_glc__D_e', # Exchange reaction ID for glucose\n", - "# 'acetate': 'EX_ac_e' # Exchange reaction ID for acetate\n", - "# }\n", - "# \n", - "# # simulation conditions\n", - "# t_n = 100 # number of time points\n", - "# dt = 0.5 # Time step, matching your setup\n", - "# time_points = list(range(0, t_n)) # Simulation time points, matching your setup\n", - "# \n", - "# # Make sure to adjust the perform_dfba function if needed to initialize result arrays with sufficient size\n", - "# dfba_results = perform_dfba(\n", - "# model, \n", - "# initial_conditions, \n", - "# kinetic_params, \n", - "# time_points, \n", - "# 'Biomass_Ecoli_core', \n", - "# substrate_update_reactions, \n", - "# dt,\n", - "# 'biomass'\n", - "# )" - ], + "source": [], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-14T22:27:06.421074Z", - "start_time": "2024-06-14T22:27:06.418943Z" + "end_time": "2024-06-18T22:20:20.357449Z", + "start_time": "2024-06-18T22:20:20.357343Z" } }, - "id": "c9b5adee14ee7d91", - "execution_count": 27 + "id": "24508915eb52af63" } ], "metadata": { diff --git a/process_bigraph/composite.py b/process_bigraph/composite.py index ad8439a..9d0f4ec 100644 --- a/process_bigraph/composite.py +++ b/process_bigraph/composite.py @@ -10,7 +10,7 @@ from typing import Dict from bigraph_schema import Edge, TypeSystem, get_path, set_path, deep_merge -from bigraph_schema.registry import Registry +from bigraph_schema.registry import Registry, is_schema_key from process_bigraph.process_types import process_types from process_bigraph.protocols import local_lookup, local_lookup_module @@ -400,7 +400,7 @@ def find_instances(state, instance_type='process_bigraph.composite.Process'): if isinstance(inner, dict): if isinstance(inner.get('instance'), process_class): found[key] = inner - elif not key.startswith('_'): + elif not is_schema_key(key): inner_instances = find_instances( inner, instance_type=instance_type) @@ -605,7 +605,6 @@ class Composite(Process): Composite parent class. """ - config_schema = { 'composition': 'schema', 'state': 'tree[any]', diff --git a/process_bigraph/experiments/comets.py b/process_bigraph/experiments/comets.py new file mode 100644 index 0000000..ea697e6 --- /dev/null +++ b/process_bigraph/experiments/comets.py @@ -0,0 +1,204 @@ +import numpy as np +from process_bigraph import Process, ProcessTypes, Composite +import matplotlib.pyplot as plt +import cobra +from cobra.io import load_model + +core = ProcessTypes() + + +# create new types +def apply_non_negative(schema, current, update, core): + new_value = current + update + return max(0, new_value) + +positive_float = { + '_type': 'positive_float', + '_inherit': 'float', + '_apply': apply_non_negative +} +core.register('positive_float', positive_float) + +bounds_type = { + 'lower': 'maybe[float]', + 'upper': 'maybe[float]' +} +core.register_process('bounds', bounds_type) + + +# TODO -- check the function signature of the apply method and report missing keys upon registration + +class DynamicFBA(Process): + """ + Performs dynamic FBA. + + Parameters: + - model: The metabolic model for the simulation. + - kinetic_params: Kinetic parameters (Km and Vmax) for each substrate. + - biomass_reaction: The identifier for the biomass reaction in the model. + - substrate_update_reactions: A dictionary mapping substrates to their update reactions. + - biomass_identifier: The identifier for biomass in the current state. + + TODO -- check units + """ + + config_schema = { + 'model_file': 'string', + 'kinetic_params': 'map[tuple[float,float]]', + 'biomass_reaction': { + '_type': 'string', + '_default': 'Biomass_Ecoli_core' + }, + 'substrate_update_reactions': 'map[string]', + 'biomass_identifier': 'string', + 'bounds': 'map[bounds]', + } + + def __init__(self, config, core): + super().__init__(config, core) + + if not 'xml' in self.config['model_file']: + # use the textbook model if no model file is provided + self.model = load_model(self.config['model_file']) + else: + self.model = cobra.io.read_sbml_model(self.config['model_file']) + + for reaction_id, bounds in self.config['bounds'].items(): + if bounds['lower'] is not None: + self.model.reactions.get_by_id(reaction_id).lower_bound = bounds['lower'] + if bounds['upper'] is not None: + self.model.reactions.get_by_id(reaction_id).upper_bound = bounds['upper'] + + def inputs(self): + return {'substrates': 'map[positive_float]'} + + def outputs(self): + return {'substrates': 'map[positive_float]'} + + # TODO -- can we just put the inputs/outputs directly in the function? + def update(self, state, interval): + substrates_input = state['substrates'] + + for substrate, reaction_id in self.config['substrate_update_reactions'].items(): + Km, Vmax = self.config['kinetic_params'][substrate] + substrate_concentration = substrates_input[substrate] + uptake_rate = Vmax * substrate_concentration / (Km + substrate_concentration) + self.model.reactions.get_by_id(reaction_id).lower_bound = -uptake_rate + + substrate_update = {} + + solution = self.model.optimize() + if solution.status == 'optimal': + current_biomass = substrates_input[self.config['biomass_identifier']] + biomass_growth_rate = solution.fluxes[self.config['biomass_reaction']] + substrate_update[self.config['biomass_identifier']] = biomass_growth_rate * current_biomass * interval + + for substrate, reaction_id in self.config['substrate_update_reactions'].items(): + flux = solution.fluxes[reaction_id] + substrate_update[substrate] = flux * current_biomass * interval + # TODO -- assert not negative? + else: + # Handle non-optimal solutions if necessary + # print('Non-optimal solution, skipping update') + for substrate, reaction_id in self.config['substrate_update_reactions'].items(): + substrate_update[substrate] = 0 + + return { + 'substrates': substrate_update, + } + + +core.register_process('DynamicFBA', DynamicFBA) + +from process_bigraph.experiments.parameter_scan import RunProcess + + +def dfba_config( + model_file='textbook', + kinetic_params={'glucose': (0.5, 1), 'acetate': (0.5, 2)}, + biomass_reaction='Biomass_Ecoli_core', + substrate_update_reactions={'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}, + biomass_identifier='biomass', + bounds={'EX_o2_e': {'lower': -2, 'upper': None}, 'ATPM': {'lower': 1, 'upper': 1}} +): + return { + 'model_file': model_file, + 'kinetic_params': kinetic_params, + 'biomass_reaction': biomass_reaction, + 'substrate_update_reactions': substrate_update_reactions, + 'biomass_identifier': biomass_identifier, + 'bounds': bounds + } + + +# TODO -- this should be imported, or just part of Process? +def run_process( + address, + config, + core_type, + initial_state, + observables, + timestep=1, + runtime=10 +): + config = { + 'process_address': address, + 'process_config': config, + 'observables': observables, + 'timestep': timestep, + 'runtime': runtime} + + run = RunProcess(config, core_type) + return run.update(initial_state) + + +def run_dfba_spatial(): + n_bins = (2, 2) + + initial_glucose = np.random.uniform(low=0, high=20, size=n_bins) + initial_acetate = np.random.uniform(low=0, high=0, size=n_bins) + initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins) + + dfba_processes_dict = {} + for i in range(n_bins[0]): + for j in range(n_bins[1]): + dfba_processes_dict[f'[{i},{j}]'] = { + '_type': 'process', + 'address': 'local:DynamicFBA', + 'config': dfba_config(), + 'inputs': { + 'substrates': { + 'glucose': ['..', '..', 'fields', 'glucose', i, j], + 'acetate': ['..', '..', 'fields', 'acetate', i, j], + 'biomass': ['..', '..', 'fields', 'biomass', i, j], + } + }, + 'outputs': { + 'substrates': { + 'glucose': ['..', '..', 'fields', 'glucose', i, j], + 'acetate': ['..', '..', 'fields', 'acetate', i, j], + 'biomass': ['..', '..', 'fields', 'biomass', i, j] + } + } + } + + composite_state = { + 'fields': { + '_type': 'map', + '_value': { + '_type': 'array', + '_size': n_bins, + '_value': 'positive_float' + }, + 'glucose': initial_glucose, + 'acetate': initial_acetate, + 'biomass': initial_biomass, + }, + 'spatial_dfba': dfba_processes_dict + } + + sim = Composite({'state': composite_state}, core=core) + + +if __name__ == '__main__': + run_dfba_spatial() From 7eabb91ccbf4ebf04cc7d055e99ebaadc4bed301 Mon Sep 17 00:00:00 2001 From: Ryan Spangler Date: Fri, 21 Jun 2024 13:00:53 -0700 Subject: [PATCH 06/12] debugging nested fields --- process_bigraph/experiments/comets.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/process_bigraph/experiments/comets.py b/process_bigraph/experiments/comets.py index ea697e6..811d237 100644 --- a/process_bigraph/experiments/comets.py +++ b/process_bigraph/experiments/comets.py @@ -168,16 +168,16 @@ def run_dfba_spatial(): 'config': dfba_config(), 'inputs': { 'substrates': { - 'glucose': ['..', '..', 'fields', 'glucose', i, j], - 'acetate': ['..', '..', 'fields', 'acetate', i, j], - 'biomass': ['..', '..', 'fields', 'biomass', i, j], + 'glucose': ['..', 'fields', 'glucose', i, j], + 'acetate': ['..', 'fields', 'acetate', i, j], + 'biomass': ['..', 'fields', 'biomass', i, j], } }, 'outputs': { 'substrates': { - 'glucose': ['..', '..', 'fields', 'glucose', i, j], - 'acetate': ['..', '..', 'fields', 'acetate', i, j], - 'biomass': ['..', '..', 'fields', 'biomass', i, j] + 'glucose': ['..', 'fields', 'glucose', i, j], + 'acetate': ['..', 'fields', 'acetate', i, j], + 'biomass': ['..', 'fields', 'biomass', i, j] } } } @@ -197,8 +197,12 @@ def run_dfba_spatial(): 'spatial_dfba': dfba_processes_dict } + import ipdb; ipdb.set_trace() + sim = Composite({'state': composite_state}, core=core) + import ipdb; ipdb.set_trace() + if __name__ == '__main__': run_dfba_spatial() From b258c39751e514ba2fe9e501ba30f4fe79a87786 Mon Sep 17 00:00:00 2001 From: Ryan Spangler Date: Fri, 21 Jun 2024 21:29:40 -0700 Subject: [PATCH 07/12] arrays have shape and data --- process_bigraph/experiments/comets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/process_bigraph/experiments/comets.py b/process_bigraph/experiments/comets.py index 811d237..b4e8d6d 100644 --- a/process_bigraph/experiments/comets.py +++ b/process_bigraph/experiments/comets.py @@ -187,8 +187,8 @@ def run_dfba_spatial(): '_type': 'map', '_value': { '_type': 'array', - '_size': n_bins, - '_value': 'positive_float' + '_shape': n_bins, + '_data': 'positive_float' }, 'glucose': initial_glucose, 'acetate': initial_acetate, From 7f0de4822b925450aab8721de58d8dcd57639830 Mon Sep 17 00:00:00 2001 From: Ryan Spangler Date: Sat, 22 Jun 2024 03:56:09 -0700 Subject: [PATCH 08/12] moved hierarchy_depth to bigraph_schema/registry --- process_bigraph/composite.py | 22 +--------------------- process_bigraph/experiments/comets.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/process_bigraph/composite.py b/process_bigraph/composite.py index 9d0f4ec..42b8eb9 100644 --- a/process_bigraph/composite.py +++ b/process_bigraph/composite.py @@ -10,7 +10,7 @@ from typing import Dict from bigraph_schema import Edge, TypeSystem, get_path, set_path, deep_merge -from bigraph_schema.registry import Registry, is_schema_key +from bigraph_schema.registry import Registry, is_schema_key, hierarchy_depth from process_bigraph.process_types import process_types from process_bigraph.protocols import local_lookup, local_lookup_module @@ -231,26 +231,6 @@ def initialize_edge_state(self, schema, path, edge): return state -def hierarchy_depth(hierarchy, path=()): - """ - Create a mapping of every path in the hierarchy to the node living at - that path in the hierarchy. - """ - - base = {} - - for key, inner in hierarchy.items(): - down = tuple(path + (key,)) - if key.startswith('_'): - base[path] = inner - elif isinstance(inner, dict) and 'instance' not in inner: - base.update(hierarchy_depth(inner, down)) - else: - base[down] = inner - - return base - - class SyncUpdate(): def __init__(self, update): self.update = update diff --git a/process_bigraph/experiments/comets.py b/process_bigraph/experiments/comets.py index b4e8d6d..685e433 100644 --- a/process_bigraph/experiments/comets.py +++ b/process_bigraph/experiments/comets.py @@ -70,10 +70,12 @@ def __init__(self, config, core): self.model.reactions.get_by_id(reaction_id).upper_bound = bounds['upper'] def inputs(self): - return {'substrates': 'map[positive_float]'} + return { + 'substrates': 'map[positive_float]'} def outputs(self): - return {'substrates': 'map[positive_float]'} + return { + 'substrates': 'map[positive_float]'} # TODO -- can we just put the inputs/outputs directly in the function? def update(self, state, interval): @@ -203,6 +205,10 @@ def run_dfba_spatial(): import ipdb; ipdb.set_trace() + sim.update({}, 10.0) + + import ipdb; ipdb.set_trace() + if __name__ == '__main__': run_dfba_spatial() From 4778197d3acc3caafb7bbed4b97c0037b9f4c3b6 Mon Sep 17 00:00:00 2001 From: Ryan Spangler Date: Sat, 22 Jun 2024 04:16:13 -0700 Subject: [PATCH 09/12] update to view interface --- process_bigraph/composite.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/process_bigraph/composite.py b/process_bigraph/composite.py index 42b8eb9..93f9523 100644 --- a/process_bigraph/composite.py +++ b/process_bigraph/composite.py @@ -866,7 +866,8 @@ def apply_updates(self, updates): self.interface()['outputs'], self.bridge['outputs'], (), - update) + top_schema=self.composition, + top_state=update) if bridge_update: self.bridge_updates.append(bridge_update) From f8e616b642de84eec2efc2fd21857b5356595670 Mon Sep 17 00:00:00 2001 From: Eran Date: Fri, 28 Jun 2024 18:33:44 -0400 Subject: [PATCH 10/12] diffusion_advection process for process_bigraph --- notebooks/comets.ipynb | 3 +- process_bigraph/experiments/comets.py | 197 ++++++++++++++++++++++++-- 2 files changed, 187 insertions(+), 13 deletions(-) diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index 07c53a8..1aa9a38 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -453,7 +453,8 @@ "start_time": "2024-06-18T22:20:20.357343Z" } }, - "id": "24508915eb52af63" + "id": "24508915eb52af63", + "execution_count": null } ], "metadata": { diff --git a/process_bigraph/experiments/comets.py b/process_bigraph/experiments/comets.py index 685e433..a148491 100644 --- a/process_bigraph/experiments/comets.py +++ b/process_bigraph/experiments/comets.py @@ -1,6 +1,8 @@ import numpy as np from process_bigraph import Process, ProcessTypes, Composite +from process_bigraph.experiments.parameter_scan import RunProcess import matplotlib.pyplot as plt +from scipy.ndimage import convolve import cobra from cobra.io import load_model @@ -71,11 +73,13 @@ def __init__(self, config, core): def inputs(self): return { - 'substrates': 'map[positive_float]'} + 'substrates': 'map[positive_float]' + } def outputs(self): return { - 'substrates': 'map[positive_float]'} + 'substrates': 'map[positive_float]' + } # TODO -- can we just put the inputs/outputs directly in the function? def update(self, state, interval): @@ -109,19 +113,142 @@ def update(self, state, interval): 'substrates': substrate_update, } - core.register_process('DynamicFBA', DynamicFBA) -from process_bigraph.experiments.parameter_scan import RunProcess + +# Laplacian for 2D diffusion +LAPLACIAN_2D = np.array([[0, 1, 0], + [1, -4, 1], + [0, 1, 0]]) + +class DiffusionAdvection(Process): + config_schema = { + 'n_bins': 'tuple[integer,integer]', + 'bounds': 'tuple[float,float]', + 'default_diffusion_rate': {'_type': 'float', '_default': 1e-1}, + 'default_diffusion_dt': {'_type': 'float', '_default': 1e-1}, + 'diffusion_coeffs': 'map[float]', + 'advection_coeffs': 'map[tuple[float,float]]', + } + + def __init__(self, config, core): + super().__init__(config, core) + + # get diffusion rates + bins_x = self.config['n_bins'][0] + bins_y = self.config['n_bins'][1] + length_x = self.config['bounds'][0] + length_y = self.config['bounds'][1] + dx = length_x / bins_x + dy = length_y / bins_y + dx2 = dx * dy + + # general diffusion rate + diffusion_rate = self.config['default_diffusion_rate'] + self.diffusion_rate = diffusion_rate / dx2 + + # diffusion rates for each individual molecules + self.molecule_specific_diffusion = { + mol_id: diff_rate / dx2 + for mol_id, diff_rate in self.config['diffusion_coeffs'].items()} + + # get diffusion timestep + diffusion_dt = 0.5 * dx ** 2 * dy ** 2 / (2 * diffusion_rate * (dx ** 2 + dy ** 2)) + self.diffusion_dt = min(diffusion_dt, self.config['default_diffusion_dt']) + + def inputs(self): + return { + 'fields': { + '_type': 'map', + '_value': { + '_type': 'array', + '_shape': self.config['n_bins'], + '_data': 'positive_float' + }, + } + } + + def outputs(self): + return { + 'fields': { + '_type': 'map', + '_value': { + '_type': 'array', + '_shape': self.config['n_bins'], + '_data': 'positive_float' + }, + } + } + + def update(self, state, interval): + fields = state['fields'] + + fields_update = {} + for species, field in fields.items(): + fields_update[species] = self.diffusion_delta( + field, + interval, + diffusion_coeff=self.config['diffusion_coeffs'][species], + advection_coeff=self.config['advection_coeffs'][species] + ) + + return { + 'fields': fields_update + } + + def diffusion_delta(self, state, interval, diffusion_coeff, advection_coeff): + t = 0.0 + dt = min(interval, self.diffusion_dt) + updated_state = state.copy() + + while t < interval: + + # Diffusion + laplacian = convolve( + updated_state, + LAPLACIAN_2D, + mode='reflect', + ) * diffusion_coeff + + # Advection + advective_flux_x = convolve( + updated_state, + np.array([[-1, 0, 1]]), + mode='reflect', + ) * advection_coeff[0] + advective_flux_y = convolve( + updated_state, + np.array([[-1], [0], [1]]), + mode='reflect', + ) * advection_coeff[1] + + # Update the current state + updated_state += (laplacian + advective_flux_x + advective_flux_y) * dt + + # # Ensure non-negativity + # current_states[species] = np.maximum(updated_state, 0) + + # Update time + t += dt + + return updated_state - state + +core.register_process('DiffusionAdvection', DiffusionAdvection) def dfba_config( model_file='textbook', - kinetic_params={'glucose': (0.5, 1), 'acetate': (0.5, 2)}, + kinetic_params={ + 'glucose': (0.5, 1), + 'acetate': (0.5, 2)}, biomass_reaction='Biomass_Ecoli_core', - substrate_update_reactions={'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}, + substrate_update_reactions={ + 'glucose': 'EX_glc__D_e', + 'acetate': 'EX_ac_e'}, biomass_identifier='biomass', - bounds={'EX_o2_e': {'lower': -2, 'upper': None}, 'ATPM': {'lower': 1, 'upper': 1}} + bounds={ + 'EX_o2_e': {'lower': -2, 'upper': None}, + 'ATPM': {'lower': 1, 'upper': 1}} ): return { 'model_file': model_file, @@ -199,16 +326,62 @@ def run_dfba_spatial(): 'spatial_dfba': dfba_processes_dict } - import ipdb; ipdb.set_trace() - sim = Composite({'state': composite_state}, core=core) - import ipdb; ipdb.set_trace() sim.update({}, 10.0) - import ipdb; ipdb.set_trace() + +def run_diffusion_process(): + n_bins = (4, 4) + + initial_glucose = np.random.uniform(low=0, high=20, size=n_bins) + initial_acetate = np.random.uniform(low=0, high=0, size=n_bins) + initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins) + + composite_state = { + 'fields': { + 'glucose': initial_glucose, + 'acetate': initial_acetate, + 'biomass': initial_biomass, + }, + 'diffusion': { + '_type': 'process', + 'address': 'local:DiffusionAdvection', + 'config': { + 'n_bins': n_bins, + 'bounds': (10, 10), + 'default_diffusion_rate': 1e-1, + 'default_diffusion_dt': 1e-1, + 'diffusion_coeffs': { + 'glucose': 1e-1, + 'acetate': 1e-1, + 'biomass': 1e-1, + }, + 'advection_coeffs': { + 'glucose': (0, 0), + 'acetate': (0, 0), + 'biomass': (0, 0), + }, + }, + 'inputs': { + 'fields': ['fields'] + }, + 'outputs': { + 'fields': ['fields'] + } + } + } + + sim = Composite({'state': composite_state}, core=core) + + sim.update({}, 10.0) + + data = sim.gather_results() + + print(data) if __name__ == '__main__': - run_dfba_spatial() + # run_dfba_spatial() + run_diffusion_process() From 177c420c9b7aed40654c29b2d57efb99c25d6603 Mon Sep 17 00:00:00 2001 From: Eran Date: Tue, 9 Jul 2024 18:44:31 -0400 Subject: [PATCH 11/12] working COMETS composite --- notebooks/comets.ipynb | 1216 +++++++++++++++++++++---- process_bigraph/composite.py | 8 +- process_bigraph/experiments/comets.py | 100 +- 3 files changed, 1143 insertions(+), 181 deletions(-) diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index 1aa9a38..eedb667 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -3,12 +3,33 @@ { "cell_type": "code", "execution_count": 1, + "id": "0094fcaa-a07c-454d-803a-9fd2bb3bb535", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/eranagmon/code/process-bigraph/venv/bin/python3'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import sys\n", + "sys.executable" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "initial_id", "metadata": { - "collapsed": true, "ExecuteTime": { - "end_time": "2024-06-18T22:20:02.080909Z", - "start_time": "2024-06-18T22:20:00.556549Z" + "end_time": "2024-07-09T22:07:58.941647Z", + "start_time": "2024-07-09T22:07:52.700195Z" } }, "outputs": [], @@ -18,12 +39,25 @@ "import matplotlib.pyplot as plt\n", "import cobra\n", "from cobra.io import load_model\n", + "from scipy.ndimage import convolve\n", "\n", "core = ProcessTypes()\n" ] }, { "cell_type": "code", + "execution_count": 3, + "id": "3e25a40151d79237", + "metadata": { + "ExecuteTime": { + "end_time": "2024-06-18T22:20:02.085129Z", + "start_time": "2024-06-18T22:20:02.082276Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [], "source": [ "# create new types\n", @@ -42,58 +76,75 @@ " 'lower': 'maybe[float]',\n", " 'upper': 'maybe[float]'\n", "}\n", - "core.register_process('bounds', bounds_type)\n", - "\n", - "\n", - "# TODO -- check the function signature of the apply method and report missing keys upon registration" - ], + "core.register_process('bounds', bounds_type)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c943852149550230", "metadata": { - "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-18T22:20:02.085129Z", - "start_time": "2024-06-18T22:20:02.082276Z" + "end_time": "2024-06-18T22:20:02.089537Z", + "start_time": "2024-06-18T22:20:02.085807Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "3e25a40151d79237", - "execution_count": 2 - }, - { - "cell_type": "code", "outputs": [ { "data": { - "text/plain": "{'_type': 'positive_float',\n '_check': 'check_float',\n '_apply': 'apply_non_negative',\n '_serialize': 'to_string',\n '_description': '64-bit floating point precision number',\n '_default': '0.0',\n '_deserialize': 'deserialize_float',\n '_divide': 'divide_float',\n '_dataclass': 'dataclass_float',\n '_inherit': ['float']}" + "text/plain": [ + "{'_type': 'positive_float',\n", + " '_check': 'check_float',\n", + " '_apply': 'apply_non_negative',\n", + " '_serialize': 'to_string',\n", + " '_description': '64-bit floating point precision number',\n", + " '_default': '0.0',\n", + " '_deserialize': 'deserialize_float',\n", + " '_divide': 'divide_float',\n", + " '_dataclass': 'dataclass_float',\n", + " '_inherit': ['float']}" + ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "core.access('positive_float')" - ], + ] + }, + { + "cell_type": "markdown", + "id": "bf3158b287046687", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-18T22:20:02.089537Z", - "start_time": "2024-06-18T22:20:02.085807Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "c943852149550230", - "execution_count": 3 - }, - { - "cell_type": "markdown", "source": [ "## Dynamic FBA Process" - ], - "metadata": { - "collapsed": false - }, - "id": "bf3158b287046687" + ] }, { "cell_type": "code", + "execution_count": 5, + "id": "50a4fb171d2aafa5", + "metadata": { + "ExecuteTime": { + "end_time": "2024-06-18T22:20:02.096869Z", + "start_time": "2024-06-18T22:20:02.090609Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [], "source": [ "class DynamicFBA(Process):\n", @@ -106,10 +157,10 @@ " - biomass_reaction: The identifier for the biomass reaction in the model.\n", " - substrate_update_reactions: A dictionary mapping substrates to their update reactions.\n", " - biomass_identifier: The identifier for biomass in the current state.\n", - " \n", + "\n", " TODO -- check units\n", " \"\"\"\n", - " \n", + "\n", " config_schema = {\n", " 'model_file': 'string',\n", " 'kinetic_params': 'map[tuple[float,float]]',\n", @@ -121,49 +172,53 @@ " 'biomass_identifier': 'string',\n", " 'bounds': 'map[bounds]',\n", " }\n", - " \n", + "\n", " def __init__(self, config, core):\n", " super().__init__(config, core)\n", - " \n", + "\n", " if not 'xml' in self.config['model_file']:\n", " # use the textbook model if no model file is provided\n", " self.model = load_model(self.config['model_file'])\n", " else:\n", " self.model = cobra.io.read_sbml_model(self.config['model_file'])\n", - " \n", + "\n", " for reaction_id, bounds in self.config['bounds'].items():\n", " if bounds['lower'] is not None:\n", " self.model.reactions.get_by_id(reaction_id).lower_bound = bounds['lower']\n", " if bounds['upper'] is not None:\n", " self.model.reactions.get_by_id(reaction_id).upper_bound = bounds['upper']\n", - " \n", + "\n", " def inputs(self):\n", - " return {'substrates': 'map[positive_float]'}\n", - " \n", + " return {\n", + " 'substrates': 'map[positive_float]'\n", + " }\n", + "\n", " def outputs(self):\n", - " return {'substrates': 'map[positive_float]'}\n", - " \n", + " return {\n", + " 'substrates': 'map[positive_float]'\n", + " }\n", + "\n", " # TODO -- can we just put the inputs/outputs directly in the function?\n", " def update(self, state, interval):\n", " substrates_input = state['substrates']\n", - " \n", + "\n", " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", " Km, Vmax = self.config['kinetic_params'][substrate]\n", " substrate_concentration = substrates_input[substrate]\n", " uptake_rate = Vmax * substrate_concentration / (Km + substrate_concentration)\n", " self.model.reactions.get_by_id(reaction_id).lower_bound = -uptake_rate\n", - " \n", + "\n", " substrate_update = {}\n", - " \n", + "\n", " solution = self.model.optimize()\n", " if solution.status == 'optimal':\n", " current_biomass = substrates_input[self.config['biomass_identifier']]\n", " biomass_growth_rate = solution.fluxes[self.config['biomass_reaction']]\n", " substrate_update[self.config['biomass_identifier']] = biomass_growth_rate * current_biomass * interval\n", - " \n", + "\n", " for substrate, reaction_id in self.config['substrate_update_reactions'].items():\n", " flux = solution.fluxes[reaction_id]\n", - " substrate_update[substrate] = flux * current_biomass * interval \n", + " substrate_update[substrate] = flux * current_biomass * interval\n", " # TODO -- assert not negative?\n", " else:\n", " # Handle non-optimal solutions if necessary\n", @@ -176,30 +231,39 @@ " }\n", "\n", "core.register_process('DynamicFBA', DynamicFBA)" - ], + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ef2fc9363b163d21", "metadata": { - "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-18T22:20:02.096869Z", - "start_time": "2024-06-18T22:20:02.090609Z" + "end_time": "2024-06-18T22:20:02.118565Z", + "start_time": "2024-06-18T22:20:02.098708Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "50a4fb171d2aafa5", - "execution_count": 4 - }, - { - "cell_type": "code", "outputs": [], "source": [ "from process_bigraph.experiments.parameter_scan import RunProcess\n", "\n", "def dfba_config(\n", - " model_file='textbook', \n", - " kinetic_params={'glucose': (0.5, 1), 'acetate': (0.5, 2)},\n", - " biomass_reaction='Biomass_Ecoli_core', \n", - " substrate_update_reactions={'glucose': 'EX_glc__D_e', 'acetate': 'EX_ac_e'}, \n", - " biomass_identifier='biomass', \n", - " bounds={'EX_o2_e': {'lower': -2, 'upper': None},'ATPM': {'lower': 1, 'upper': 1}}\n", + " model_file='textbook',\n", + " kinetic_params={\n", + " 'glucose': (0.5, 1),\n", + " 'acetate': (0.5, 2)},\n", + " biomass_reaction='Biomass_Ecoli_core',\n", + " substrate_update_reactions={\n", + " 'glucose': 'EX_glc__D_e',\n", + " 'acetate': 'EX_ac_e'},\n", + " biomass_identifier='biomass',\n", + " bounds={\n", + " 'EX_o2_e': {'lower': -2, 'upper': None},\n", + " 'ATPM': {'lower': 1, 'upper': 1}}\n", "):\n", " return {\n", " 'model_file': model_file,\n", @@ -213,12 +277,12 @@ "\n", "# TODO -- this should be imported, or just part of Process?\n", "def run_process(\n", - " address, \n", - " config, \n", - " core_type, \n", - " initial_state, \n", - " observables, \n", - " timestep=1, \n", + " address,\n", + " config,\n", + " core_type,\n", + " initial_state,\n", + " observables,\n", + " timestep=1,\n", " runtime=10\n", "):\n", " config = {\n", @@ -227,66 +291,335 @@ " 'observables': observables,\n", " 'timestep': timestep,\n", " 'runtime': runtime}\n", - " \n", + "\n", " run = RunProcess(config, core_type)\n", " return run.update(initial_state)" - ], + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "33923108a654be95", "metadata": { - "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-18T22:20:02.118565Z", - "start_time": "2024-06-18T22:20:02.098708Z" + "end_time": "2024-06-18T22:20:03.448389Z", + "start_time": "2024-06-18T22:20:02.119565Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "ef2fc9363b163d21", - "execution_count": 5 - }, - { - "cell_type": "code", "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/eranagmon/code/bigraph-schema/venv/lib/python3.9/site-packages/cobra/util/solver.py:554: UserWarning: Solver status is 'infeasible'.\n", - " warn(f\"Solver status is '{status}'.\", UserWarning)\n" - ] + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "config = dfba_config()\n", - "initial_state = {\n", - " 'substrates': {\n", - " 'biomass': 0.1, # Initial biomass concentration\n", - " 'glucose': 20.0, # Initial glucose concentration\n", - " 'acetate': 0.0 # Initial acetate concentration\n", + "n_bins = (5, 5)\n", + "\n", + "initial_glucose = np.random.uniform(low=0, high=20, size=n_bins)\n", + "initial_acetate = np.random.uniform(low=0, high=0, size=n_bins)\n", + "initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins)\n", + "\n", + "dfba_processes_dict = {}\n", + "for i in range(n_bins[0]):\n", + " for j in range(n_bins[1]):\n", + " dfba_processes_dict[f'[{i},{j}]'] = {\n", + " '_type': 'process',\n", + " 'address': 'local:DynamicFBA',\n", + " 'config': dfba_config(),\n", + " 'inputs': {\n", + " 'substrates': {\n", + " 'glucose': ['..', 'fields', 'glucose', i, j],\n", + " 'acetate': ['..', 'fields', 'acetate', i, j],\n", + " 'biomass': ['..', 'fields', 'biomass', i, j],\n", + " }\n", + " },\n", + " 'outputs': {\n", + " 'substrates': {\n", + " 'glucose': ['..', 'fields', 'glucose', i, j],\n", + " 'acetate': ['..', 'fields', 'acetate', i, j],\n", + " 'biomass': ['..', 'fields', 'biomass', i, j]\n", + " }\n", + " }\n", + " }\n", + "\n", + "composite_state = {\n", + " 'fields': {\n", + " '_type': 'map',\n", + " '_value': {\n", + " '_type': 'array',\n", + " '_shape': n_bins,\n", + " '_data': 'positive_float'\n", + " },\n", + " 'glucose': initial_glucose,\n", + " 'acetate': initial_acetate,\n", + " 'biomass': initial_biomass,\n", + " },\n", + " 'spatial_dfba': dfba_processes_dict,\n", + " 'emitter': {\n", + " '_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': {\n", + " 'emit': {\n", + " 'fields': 'map',\n", + " 'time': 'float',\n", + " }\n", + " },\n", + " 'inputs': {\n", + " 'fields': ['fields'],\n", + " 'time': ['global_time']\n", + " }\n", " }\n", "}\n", "\n", - "results = run_process(\n", - " address='local:DynamicFBA', \n", - " config=config, \n", - " core_type=core, \n", - " initial_state=initial_state,\n", - " observables=[['substrates', 'glucose'], \n", - " ['substrates', 'acetate'],\n", - " ['substrates', 'biomass']], \n", - " timestep=0.1, \n", - " runtime=100,\n", - ")" + "sim = Composite({'state': composite_state}, core=core)\n", + "\n", + "sim.update({}, 10.0)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e6157d21-e613-45dd-83cf-67e136c63d1e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.05494692, 3.21135777, 7.62934694, 18.13914579, 19.5392402 ],\n", + " [14.3321519 , 19.17272223, 13.75329196, 19.95907999, 15.48155216],\n", + " [17.34048488, 6.20481708, 8.71169331, 10.15838692, 5.57509712],\n", + " [10.76296875, 13.49779122, 8.41667 , 13.88647257, 17.98651318],\n", + " [15.87549511, 4.4793677 , 16.28180449, 15.1458885 , 6.9025743 ]]),\n", + " 'acetate': array([[0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0.]]),\n", + " 'biomass': array([[0.00403388, 0.07873172, 0.09651373, 0.0857904 , 0.09322035],\n", + " [0.09099417, 0.05576586, 0.06044433, 0.09543499, 0.08556801],\n", + " [0.00485139, 0.05965545, 0.07130176, 0.03765414, 0.0931261 ],\n", + " [0.0540483 , 0.03666924, 0.01203241, 0.01498518, 0.07911831],\n", + " [0.08204151, 0.06513374, 0.08889333, 0.08826353, 0.07138507]])},\n", + " 'time': 0.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.05221015, 3.14323291, 7.53876934, 18.05565674, 19.4483458 ],\n", + " [14.2442252 , 19.11837371, 13.69496799, 19.86597733, 15.39866124],\n", + " [17.33576945, 6.14961033, 8.64426173, 10.12249918, 5.48963559],\n", + " [10.71131983, 13.4624318 , 8.40531231, 13.8720082 , 17.90953477],\n", + " [15.7959586 , 4.42077433, 16.19555967, 15.06044563, 6.83601086]]),\n", + " 'acetate': array([[0. , 0. , 0.00901003, 0.01394927, 0.0155062 ],\n", + " [0.01354449, 0.00922429, 0.00883192, 0.01597214, 0.01315101],\n", + " [0.00077719, 0.00401267, 0.00768517, 0.00461238, 0.00482678],\n", + " [0.0068923 , 0.00531111, 0.00125375, 0.0021993 , 0.01282942],\n", + " [0.01273231, 0.00102065, 0.01392687, 0.013447 , 0.0058035 ]]),\n", + " 'biomass': array([[0.0042642 , 0.08457543, 0.10411853, 0.09268685, 0.1007221 ],\n", + " [0.09828017, 0.06025233, 0.06528037, 0.1031172 , 0.09242906],\n", + " [0.00524112, 0.06432022, 0.07694364, 0.04064633, 0.10037506],\n", + " [0.05834949, 0.03960201, 0.0129835 , 0.01618434, 0.0854776 ],\n", + " [0.08862264, 0.07014961, 0.0960271 , 0.09533799, 0.07699007]])},\n", + " 'time': 1.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.04931954, 3.07026468, 7.44112683, 17.96546743, 19.35014827],\n", + " [14.14927786, 19.05965699, 13.63198704, 19.76539174, 15.309139 ],\n", + " [17.33067527, 6.0901265 , 8.57152529, 10.08376607, 5.3976396 ],\n", + " [10.6555726 , 13.42424796, 8.39305778, 13.85638692, 17.82637873],\n", + " [15.71005513, 4.35775262, 16.10240839, 14.96817111, 6.7642682 ]]),\n", + " 'acetate': array([[0. , 0. , 0.01858594, 0.02899755, 0.03223737],\n", + " [0.02813405, 0.01918222, 0.01835168, 0.03320698, 0.0273264 ],\n", + " [0.00161674, 0.0082596 , 0.01591694, 0.00957843, 0.00979393],\n", + " [0.01430926, 0.01103984, 0.00260475, 0.00457346, 0.02667074],\n", + " [0.02645959, 0.00195243, 0.02894187, 0.0279384 , 0.01196846]]),\n", + " 'biomass': array([[0.00450746, 0.09083335, 0.11231924, 0.10013717, 0.10882701],\n", + " [0.10614867, 0.06509955, 0.07050291, 0.11141727, 0.09983955],\n", + " [0.00566214, 0.06934791, 0.08303053, 0.043876 , 0.10818286],\n", + " [0.06299244, 0.04276916, 0.01400973, 0.01747943, 0.0923476 ],\n", + " [0.09573107, 0.07554789, 0.10373268, 0.10297872, 0.08303299]])},\n", + " 'time': 2.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.04626674, 2.99215214, 7.33587959, 17.86804173, 19.24406247],\n", + " [14.0467522 , 18.99622157, 13.56397858, 19.65672342, 15.2124571 ],\n", + " [17.3251719 , 6.02604009, 8.4930712 , 10.04196287, 5.29862845],\n", + " [10.59540352, 13.38301457, 8.37983572, 13.83951625, 17.73655066],\n", + " [15.61727689, 4.28998075, 16.00179974, 14.86852112, 6.68695037]]),\n", + " 'acetate': array([[0. , 0. , 0.02874457, 0.04522913, 0.05028792],\n", + " [0.0438451 , 0.02993131, 0.02861094, 0.05180198, 0.0426028 ],\n", + " [0.00252364, 0.01274453, 0.02472724, 0.01492397, 0.01486619],\n", + " [0.02228837, 0.01721833, 0.00406038, 0.00713629, 0.04160178],\n", + " [0.04125686, 0.00275708, 0.04512694, 0.04355178, 0.01850572]]),\n", + " 'biomass': array([[0.00476434, 0.09753094, 0.12116192, 0.10818576, 0.11758349],\n", + " [0.11464606, 0.07033649, 0.07614275, 0.12038481, 0.10784337],\n", + " [0.00611699, 0.07476645, 0.08959728, 0.04736194, 0.11659153],\n", + " [0.06800418, 0.04618942, 0.01511703, 0.01887813, 0.09976922],\n", + " [0.10340896, 0.08135701, 0.11205579, 0.11123089, 0.08954766]])},\n", + " 'time': 3.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.043043 , 2.9085855 , 7.22244889, 17.76280091, 19.12945668],\n", + " [13.93604674, 18.92768893, 13.49054284, 19.53932483, 15.10804551],\n", + " [17.31922649, 5.95700196, 8.40845538, 9.99684728, 5.19209029],\n", + " [10.53046386, 13.33848867, 8.36556989, 13.82129637, 17.63951686],\n", + " [15.51707595, 4.21711615, 15.8931392 , 14.76090902, 6.60363259]]),\n", + " 'acetate': array([[0. , 0. , 0.03949839, 0.0627343 , 0.06975908],\n", + " [0.06075878, 0.04153343, 0.03966487, 0.07186165, 0.05906196],\n", + " [0.00350328, 0.01746867, 0.03414832, 0.02067651, 0.01999573],\n", + " [0.03086931, 0.02388109, 0.00562852, 0.00990265, 0.057706 ],\n", + " [0.05720426, 0.00338704, 0.06256955, 0.06036979, 0.0254235 ]]),\n", + " 'biomass': array([[0.00503558, 0.10469438, 0.13069607, 0.11688055, 0.1270438 ],\n", + " [0.12382242, 0.07599446, 0.08223315, 0.13007337, 0.11648786],\n", + " [0.00660838, 0.0806058 , 0.0966814 , 0.05112443, 0.12564604],\n", + " [0.07341391, 0.04988297, 0.01631178, 0.02038872, 0.10778668],\n", + " [0.11170179, 0.08760738, 0.12104577, 0.12014328, 0.09657041]])},\n", + " 'time': 4.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.03963912, 2.81924857, 7.10021491, 17.64912033, 19.00564893],\n", + " [13.81651298, 18.8536503 , 13.41124858, 19.41249691, 14.99528932],\n", + " [17.31280354, 5.88263789, 8.31720037, 9.94815807, 5.07748115],\n", + " [10.46037773, 13.29040803, 8.35017806, 13.80161948, 17.53470122],\n", + " [15.40886112, 4.13879488, 15.77578539, 14.64470204, 6.51385944]]),\n", + " 'acetate': array([[0. , 0. , 0.05085384, 0.08160974, 0.09075932],\n", + " [0.07896108, 0.05405511, 0.05157233, 0.09349797, 0.07679093],\n", + " [0.0045615 , 0.02242993, 0.04421234, 0.02686522, 0.02511876],\n", + " [0.04009397, 0.0310651 , 0.00731765, 0.01288856, 0.0750728 ],\n", + " [0.07438727, 0.00378337, 0.08136301, 0.07848031, 0.03272647]]),\n", + " 'biomass': array([[0.00532195, 0.11235028, 0.14097482, 0.12627328, 0.13726439],\n", + " [0.13373176, 0.08210724, 0.08880999, 0.1405408 , 0.12582413],\n", + " [0.00713923, 0.08689819, 0.10432329, 0.05518535, 0.1353944 ],\n", + " [0.07925308, 0.05387162, 0.0176009 , 0.02202015, 0.11644769],\n", + " [0.12065866, 0.09433146, 0.13075588, 0.12976851, 0.10414031]])},\n", + " 'time': 5.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.03604549, 2.72382235, 6.96851449, 17.52632582, 18.87190311],\n", + " [13.68745176, 18.77366429, 13.32563061, 19.27548507, 14.87352527],\n", + " [17.30586471, 5.80254709, 8.21879298, 9.89561364, 4.95422434],\n", + " [10.38474009, 13.23848964, 8.33357154, 13.78036918, 17.42148196],\n", + " [15.29199464, 4.05463109, 15.64904639, 14.51921782, 6.41714302]]),\n", + " 'acetate': array([[0. , 0. , 0.06280927, 0.10195881, 0.11340471],\n", + " [0.09854287, 0.06756787, 0.06439601, 0.11683085, 0.09588229],\n", + " [0.00570458, 0.02762196, 0.05495085, 0.03352106, 0.03015131],\n", + " [0.05000648, 0.03880999, 0.00913682, 0.01611128, 0.09379783],\n", + " [0.09289695, 0.00387305, 0.10160663, 0.09797662, 0.04041458]]),\n", + " 'biomass': array([[0.00562426, 0.12052535, 0.15205522, 0.13641984, 0.14830621],\n", + " [0.14443235, 0.08871135, 0.09591201, 0.15184956, 0.13590734],\n", + " [0.00771272, 0.09367818, 0.11256642, 0.05956826, 0.14588789],\n", + " [0.08555564, 0.05817888, 0.01899181, 0.02378206, 0.1258038 ],\n", + " [0.13033258, 0.10156387, 0.1412436 , 0.14016337, 0.11229928]])},\n", + " 'time': 6.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.03225199, 2.62198992, 6.82663902, 17.39368988, 18.72742478],\n", + " [13.54810955, 18.68725431, 13.23318723, 19.12747485, 14.7420381 ],\n", + " [17.29836856, 5.71630068, 8.11268194, 9.83891045, 4.8217103 ],\n", + " [10.30311452, 13.18242813, 8.31565472, 13.75741981, 17.29918803],\n", + " [15.1657886 , 3.96421674, 15.51217592, 14.38372058, 6.31296121]]),\n", + " 'acetate': array([[0. , 0. , 0.07535217, 0.1238919 , 0.13781933],\n", + " [0.11959989, 0.0821485 , 0.07820255, 0.14198849, 0.11643423],\n", + " [0.00693931, 0.03303289, 0.06639402, 0.04067674, 0.03498382],\n", + " [0.06065312, 0.0471582 , 0.01109573, 0.01958939, 0.11398335],\n", + " [0.11283013, 0.00356571, 0.12340597, 0.11895744, 0.04848153]]),\n", + " 'biomass': array([[0.00594334, 0.12924602, 0.16399843, 0.14738054, 0.16023504],\n", + " [0.15598706, 0.0958462 , 0.10358098, 0.16406707, 0.146797 ],\n", + " [0.00833228, 0.10098289, 0.12145759, 0.06429861, 0.15718108],\n", + " [0.09235815, 0.06283016, 0.02049254, 0.02568489, 0.13591061],\n", + " [0.14078071, 0.10934151, 0.15257096, 0.15138911, 0.12109233]])},\n", + " 'time': 7.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.02824806, 2.5134432 , 6.67383252, 17.25042756, 18.57135657],\n", + " [13.39767439, 18.59390576, 13.13337744, 18.96758731, 14.60005662],\n", + " [17.29027035, 5.62344022, 7.99827544, 9.77772138, 4.67929713],\n", + " [10.21503098, 13.12189399, 8.29632445, 13.73263567, 17.16709531],\n", + " [15.02950115, 3.86712166, 15.36436917, 14.23741721, 6.20075578]]),\n", + " 'acetate': array([[0. , 0. , 0.08845577, 0.14752671, 0.16413566],\n", + " [0.14223262, 0.09787946, 0.0930627 , 0.1691078 , 0.13855067],\n", + " [0.00827304, 0.03864382, 0.07856971, 0.0483668 , 0.03947405],\n", + " [0.07208227, 0.05615512, 0.01320472, 0.0233429 , 0.13573851],\n", + " [0.13428957, 0.00274946, 0.14687294, 0.14152702, 0.05691289]]),\n", + " 'biomass': array([[0.0062801 , 0.13853775, 0.17686995, 0.1592205 , 0.17312193],\n", + " [0.16846364, 0.10355438, 0.111862 , 0.17726614, 0.15855731],\n", + " [0.00900161, 0.10885208, 0.13104709, 0.06940383, 0.169332 ],\n", + " [0.09970006, 0.06785287, 0.02211176, 0.02773991, 0.14682819],\n", + " [0.15206477, 0.1177036 , 0.16480489, 0.16351181, 0.13056774]])},\n", + " 'time': 8.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.02402263, 2.39789207, 6.50929001, 17.09569204, 18.40277344],\n", + " [13.2352716 , 18.49306309, 13.02561795, 18.79487403, 14.44674953],\n", + " [17.28152173, 5.52347628, 7.87493857, 9.71169397, 4.52631213],\n", + " [10.11998326, 13.0565317 , 8.27546957, 13.70587028, 17.02442254],\n", + " [14.88233237, 3.76289417, 15.20475847, 14.0794529 , 6.07993081]]),\n", + " 'acetate': array([[0. , 0. , 0.10207448, 0.17298854, 0.19249493],\n", + " [0.16654603, 0.1148492 , 0.10905134, 0.19833479, 0.16234128],\n", + " [0.00971367, 0.0444269 , 0.09150221, 0.05662754, 0.04343796],\n", + " [0.08434423, 0.06584927, 0.01547485, 0.02739334, 0.15917968],\n", + " [0.15738402, 0.00146205, 0.17212589, 0.16579502, 0.06568362]]),\n", + " 'biomass': array([[0.00663544, 0.14842421, 0.1907399 , 0.17200997, 0.18704355],\n", + " [0.18193518, 0.11188187, 0.12080369, 0.19152536, 0.17125753],\n", + " [0.00972469, 0.1173284 , 0.14138901, 0.07491347, 0.18240218],\n", + " [0.10762387, 0.07327659, 0.02385879, 0.02995927, 0.15862135],\n", + " [0.16425134, 0.12668768, 0.1780176 , 0.17660276, 0.14077722]])},\n", + " 'time': 9.0},\n", + " {'fields': {'_type': 'map',\n", + " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", + " 'glucose': array([[ 1.01956415, 2.27507685, 6.33215633, 16.92856992, 18.2206774 ],\n", + " [13.05995934, 18.38412656, 12.90928 , 18.60831178, 14.28122093],\n", + " [17.27207049, 5.41588715, 7.74199075, 9.64044853, 4.36205469],\n", + " [10.01742644, 12.98595774, 8.25297018, 13.67696548, 16.87032691],\n", + " [14.72341999, 3.65106584, 15.0324085 , 13.9089067 , 5.94985105]]),\n", + " 'acetate': array([[0. , 0. , 0.11613807, 0.20041054, 0.22304739],\n", + " [0.1926492 , 0.13315253, 0.12624757, 0.22982488, 0.18792134],\n", + " [0.01126975, 0.05034287, 0.10521073, 0.06549702, 0.04663776],\n", + " [0.09749099, 0.07629242, 0.01791791, 0.03176389, 0.18443065],\n", + " [0.18222825, 0.00072332, 0.19928956, 0.19187633, 0.07475505]]),\n", + " 'biomass': array([[0.00701033, 0.15892619, 0.20568319, 0.18582481, 0.20208267],\n", + " [0.19648045, 0.12087831, 0.13045852, 0.20692957, 0.18497234],\n", + " [0.01050586, 0.12645746, 0.15254147, 0.08085942, 0.19645658],\n", + " [0.11617537, 0.07913326, 0.0257437 , 0.03235609, 0.17136005],\n", + " [0.17741222, 0.13631017, 0.19228697, 0.1907388 , 0.15177616]])},\n", + " 'time': 10.0}]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } ], + "source": [ + "results = sim.gather_results()[('emitter',)]\n", + "results" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e220f9251bb22532", "metadata": { - "collapsed": false, "ExecuteTime": { - "end_time": "2024-06-18T22:20:03.448389Z", - "start_time": "2024-06-18T22:20:02.119565Z" + "end_time": "2024-06-18T22:20:03.452506Z", + "start_time": "2024-06-18T22:20:03.449442Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "33923108a654be95", - "execution_count": 6 - }, - { - "cell_type": "code", "outputs": [], "source": [ "# plot results\n", @@ -296,67 +629,538 @@ " ax.plot(results['time'], value, label=key)\n", " ax.legend()\n", " plt.show()" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-18T22:20:03.452506Z", - "start_time": "2024-06-18T22:20:03.449442Z" - } - }, - "id": "e220f9251bb22532", - "execution_count": 7 + ] }, { "cell_type": "code", - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(results['results'])" - ], + "execution_count": 10, + "id": "7ccc1e363e9bb98e", "metadata": { - "collapsed": false, "ExecuteTime": { "end_time": "2024-06-18T22:20:03.595004Z", "start_time": "2024-06-18T22:20:03.453198Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "7ccc1e363e9bb98e", - "execution_count": 8 + "outputs": [ + { + "ename": "TypeError", + "evalue": "list indices must be integers or slices, not str", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m plot_results(\u001b[43mresults\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mresults\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m)\n", + "\u001b[0;31mTypeError\u001b[0m: list indices must be integers or slices, not str" + ] + } + ], + "source": [ + "# plot_results(results['results'])" + ] }, { "cell_type": "markdown", + "id": "5ef5f3a7-6865-45a0-ab14-fb8c6d5b7eaf", + "metadata": {}, "source": [ - "## Spatial dFBA composite simulation" - ], - "metadata": { - "collapsed": false - }, - "id": "983b47cbb5623b3d" + "## Diffusion Advection Process" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7264d1ae-f8b7-49bf-9550-a98cf5f95baf", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Laplacian for 2D diffusion\n", + "LAPLACIAN_2D = np.array([[0, 1, 0],\n", + " [1, -4, 1],\n", + " [0, 1, 0]])\n", + "\n", + "\n", + "class DiffusionAdvection(Process):\n", + " config_schema = {\n", + " 'n_bins': 'tuple[integer,integer]',\n", + " 'bounds': 'tuple[float,float]',\n", + " 'default_diffusion_rate': {'_type': 'float', '_default': 1e-1},\n", + " 'default_diffusion_dt': {'_type': 'float', '_default': 1e-1},\n", + " 'diffusion_coeffs': 'map[float]',\n", + " 'advection_coeffs': 'map[tuple[float,float]]',\n", + " }\n", + "\n", + " def __init__(self, config, core):\n", + " super().__init__(config, core)\n", + "\n", + " # get diffusion rates\n", + " bins_x = self.config['n_bins'][0]\n", + " bins_y = self.config['n_bins'][1]\n", + " length_x = self.config['bounds'][0]\n", + " length_y = self.config['bounds'][1]\n", + " dx = length_x / bins_x\n", + " dy = length_y / bins_y\n", + " dx2 = dx * dy\n", + "\n", + " # general diffusion rate\n", + " diffusion_rate = self.config['default_diffusion_rate']\n", + " self.diffusion_rate = diffusion_rate / dx2\n", + "\n", + " # diffusion rates for each individual molecules\n", + " self.molecule_specific_diffusion = {\n", + " mol_id: diff_rate / dx2\n", + " for mol_id, diff_rate in self.config['diffusion_coeffs'].items()}\n", + "\n", + " # get diffusion timestep\n", + " diffusion_dt = 0.5 * dx ** 2 * dy ** 2 / (2 * diffusion_rate * (dx ** 2 + dy ** 2))\n", + " self.diffusion_dt = min(diffusion_dt, self.config['default_diffusion_dt'])\n", + "\n", + " def inputs(self):\n", + " return {\n", + " 'fields': {\n", + " '_type': 'map',\n", + " '_value': {\n", + " '_type': 'array',\n", + " '_shape': self.config['n_bins'],\n", + " '_data': 'positive_float'\n", + " },\n", + " }\n", + " }\n", + "\n", + " def outputs(self):\n", + " return {\n", + " 'fields': {\n", + " '_type': 'map',\n", + " '_value': {\n", + " '_type': 'array',\n", + " '_shape': self.config['n_bins'],\n", + " '_data': 'positive_float'\n", + " },\n", + " }\n", + " }\n", + "\n", + " def update(self, state, interval):\n", + " fields = state['fields']\n", + "\n", + " fields_update = {}\n", + " for species, field in fields.items():\n", + " fields_update[species] = self.diffusion_delta(\n", + " field,\n", + " interval,\n", + " diffusion_coeff=self.config['diffusion_coeffs'][species],\n", + " advection_coeff=self.config['advection_coeffs'][species]\n", + " )\n", + "\n", + " return {\n", + " 'fields': fields_update\n", + " }\n", + "\n", + " def diffusion_delta(self, state, interval, diffusion_coeff, advection_coeff):\n", + " t = 0.0\n", + " dt = min(interval, self.diffusion_dt)\n", + " updated_state = state.copy()\n", + "\n", + " while t < interval:\n", + "\n", + " # Diffusion\n", + " laplacian = convolve(\n", + " updated_state,\n", + " LAPLACIAN_2D,\n", + " mode='reflect',\n", + " ) * diffusion_coeff\n", + "\n", + " # Advection\n", + " advective_flux_x = convolve(\n", + " updated_state,\n", + " np.array([[-1, 0, 1]]),\n", + " mode='reflect',\n", + " ) * advection_coeff[0]\n", + " advective_flux_y = convolve(\n", + " updated_state,\n", + " np.array([[-1], [0], [1]]),\n", + " mode='reflect',\n", + " ) * advection_coeff[1]\n", + "\n", + " # Update the current state\n", + " updated_state += (laplacian + advective_flux_x + advective_flux_y) * dt\n", + "\n", + " # # Ensure non-negativity\n", + " # current_states[species] = np.maximum(updated_state, 0)\n", + "\n", + " # Update time\n", + " t += dt\n", + "\n", + " return updated_state - state\n", + "\n", + "core.register_process('DiffusionAdvection', DiffusionAdvection)" + ] }, { "cell_type": "code", + "execution_count": 12, + "id": "dbc094e9-29c5-4d32-a3cc-60c15be6f3f5", + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "> \u001B[0;32m/Users/eranagmon/code/bigraph-schema/bigraph_schema/type_system.py\u001B[0m(910)\u001B[0;36mfill_ports\u001B[0;34m()\u001B[0m\n", - "\u001B[0;32m 909 \u001B[0;31m\u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0m\u001B[0;32m--> 910 \u001B[0;31m subschema, substate = self.set_slice(\n", - "\u001B[0m\u001B[0;32m 911 \u001B[0;31m \u001B[0mtop_schema\u001B[0m\u001B[0;34m,\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0m\n" + "[{'fields': {'glucose': array([[11.49673574, 0.68256312, 18.54146763, 0.95746649],\n", + " [ 3.19256133, 7.66018853, 5.83104959, 15.26516279],\n", + " [11.02857073, 8.32815473, 13.70634628, 3.93032842],\n", + " [17.69033152, 17.09328189, 9.9747383 , 3.19076489]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.05699761, 0.09481982, 0.02570525, 0.02258643],\n", + " [0.01204724, 0.01354382, 0.08648323, 0.00512884],\n", + " [0.04747683, 0.04636961, 0.06420193, 0.01107399],\n", + " [0.02910536, 0.04286344, 0.03248139, 0.09196548]])}, 'time': 0.0}, {'fields': {'glucose': array([[ 9.84321673, 3.73152289, 14.39153868, 3.76520899],\n", + " [ 5.00816707, 6.9420476 , 8.21497622, 12.28942337],\n", + " [10.77908124, 9.56199548, 11.56953882, 5.64172408],\n", + " [16.88162215, 15.68484685, 10.22024593, 4.04455588]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.05583965, 0.07821721, 0.03585772, 0.02217968],\n", + " [0.02031254, 0.02884648, 0.06638537, 0.0145901 ],\n", + " [0.04272558, 0.04489545, 0.05684999, 0.02269962],\n", + " [0.03197847, 0.04140733, 0.04104784, 0.07901724]])}, 'time': 1.0}, {'fields': {'glucose': array([[ 8.89969323, 5.4619349 , 12.00368391, 5.46458495],\n", + " [ 6.14917075, 7.03922604, 9.08402553, 10.64203344],\n", + " [10.7418569 , 10.07143104, 10.54527385, 6.58638811],\n", + " [16.10231093, 14.69053841, 10.2186389 , 4.8689211 ]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.05432848, 0.06795805, 0.04046046, 0.02334962],\n", + " [0.02681797, 0.03661665, 0.05537098, 0.0208532 ],\n", + " [0.04014386, 0.04402434, 0.05211067, 0.03015918],\n", + " [0.0338317 , 0.04108512, 0.04550276, 0.07023723]])}, 'time': 2.0}, {'fields': {'glucose': array([[ 8.37387799, 6.47715147, 10.60116401, 6.51165215],\n", + " [ 6.91987863, 7.3841729 , 9.31217732, 9.71101493],\n", + " [10.76619303, 10.27355099, 10.02975927, 7.14524345],\n", + " [15.39142651, 13.93602068, 10.13830896, 5.59811968]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.05285174, 0.06131141, 0.04230678, 0.02512742],\n", + " [0.03169022, 0.04051777, 0.04926208, 0.02525544],\n", + " [0.03891794, 0.04346113, 0.04910138, 0.03493071],\n", + " [0.03512195, 0.04124004, 0.04761817, 0.06413609]])}, 'time': 3.0}, {'fields': {'glucose': array([[ 8.09901016, 7.0959645 , 9.76254908, 7.16723594],\n", + " [ 7.47139617, 7.75522564, 9.29206162, 9.17615043],\n", + " [10.79418703, 10.34283899, 9.75254988, 7.50414786],\n", + " [14.75766886, 13.33608694, 10.04436751, 6.21827139]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.05153669, 0.0567995 , 0.0428363 , 0.02704465],\n", + " [0.03523499, 0.04242577, 0.04584205, 0.02850574],\n", + " [0.03850262, 0.04308757, 0.04719454, 0.03798041],\n", + " [0.03609919, 0.04154836, 0.04843036, 0.05978155]])}, 'time': 4.0}, {'fields': {'glucose': array([[ 7.97682768, 7.49024957, 9.25422001, 7.5839478 ],\n", + " [ 7.88266151, 8.07749046, 9.19428493, 8.86624808],\n", + " [10.80644637, 10.35216603, 9.59180615, 7.7551075 ],\n", + " [14.1979645 , 12.84511977, 9.95921444, 6.73595719]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.05040417, 0.05360403, 0.04278217, 0.02888652],\n", + " [0.03776676, 0.04330798, 0.04391777, 0.03099612],\n", + " [0.03854789, 0.04284548, 0.04597557, 0.03992983],\n", + " [0.03689612, 0.04186489, 0.04853825, 0.05658672]])}, 'time': 5.0}, {'fields': {'glucose': array([[ 7.9477474 , 7.754542 , 8.94380025, 7.85299323],\n", + " [ 8.19776391, 8.3350965 , 9.08849365, 8.68758522],\n", + " [10.79899193, 10.33246239, 9.49175335, 7.94450688],\n", + " [13.70519795, 12.43590563, 9.88837203, 7.16449965]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.049437 , 0.05125844, 0.04250934, 0.03056526],\n", + " [0.03955171, 0.04366608, 0.04283744, 0.03295528],\n", + " [0.03883623, 0.04269792, 0.0451816 , 0.04117543],\n", + " [0.03758117, 0.0421347 , 0.04828408, 0.05417858]])}, 'time': 6.0}, {'fields': {'glucose': array([[ 7.97478488, 7.94183345, 8.75461426, 8.02991617],\n", + " [ 8.44329871, 8.53350052, 8.99955938, 8.58751595],\n", + " [10.77357056, 10.29753093, 9.42600231, 8.09628602],\n", + " [13.27136677, 12.0904719 , 9.83125125, 7.51820893]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.0486086 , 0.04948709, 0.04219193, 0.03205517],\n", + " [0.04079703, 0.04376128, 0.04223955, 0.03452502],\n", + " [0.03923628, 0.04261741, 0.04464991, 0.04196927],\n", + " [0.03818862, 0.04234526, 0.04786082, 0.05231702]])}, 'time': 7.0}, {'fields': {'glucose': array([[ 8.03458828, 8.08234764, 8.64127314, 8.14908682],\n", + " [ 8.63657843, 8.68398459, 8.93337387, 8.53565783],\n", + " [10.73367854, 10.25415817, 9.38133741, 8.22318919],\n", + " [12.88881376, 11.79599617, 9.78547418, 7.81017396]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.04789379, 0.04812025, 0.04190638, 0.03335951],\n", + " [0.04165707, 0.04372969, 0.04192053, 0.03579888],\n", + " [0.03967133, 0.04258275, 0.04428118, 0.0424717 ],\n", + " [0.03873535, 0.04250162, 0.04737526, 0.05084498]])}, 'time': 8.0}, {'fields': {'glucose': array([[ 8.1122641 , 8.19359018, 8.57632741, 8.23204396],\n", + " [ 8.78962989, 8.79778518, 8.88846882, 8.51398657],\n", + " [10.68299176, 10.20614969, 9.35057911, 8.33228627],\n", + " [12.5506566 , 11.54286193, 9.74849609, 8.05159442]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.04727192, 0.04704867, 0.04168033, 0.03449378],\n", + " [0.04224402, 0.04364196, 0.04176403, 0.03684216],\n", + " [0.04009852, 0.04257781, 0.04401514, 0.04278507],\n", + " [0.03922979, 0.04261446, 0.04688479, 0.04965781]])}, 'time': 9.0}, {'fields': {'glucose': array([[ 8.19829013, 8.2858391 , 8.54282389, 8.29240713],\n", + " [ 8.91122664, 8.884254 , 8.86107722, 8.51151391],\n", + " [10.62479728, 10.15591766, 9.32944038, 8.42771718],\n", + " [12.25088594, 11.32364015, 9.71813105, 8.25175031]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.04672699, 0.04619884, 0.04151806, 0.03547752],\n", + " [0.04263833, 0.04353426, 0.04170255, 0.03770259],\n", + " [0.04049559, 0.04259083, 0.04381527, 0.04297512],\n", + " [0.0396766 , 0.04269474, 0.04641867, 0.0486843 ]])}, 'time': 10.0}]\n" ] } ], + "source": [ + " n_bins = (4, 4)\n", + "\n", + "initial_glucose = np.random.uniform(low=0, high=20, size=n_bins)\n", + "initial_acetate = np.random.uniform(low=0, high=0, size=n_bins)\n", + "initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins)\n", + "\n", + "composite_state = {\n", + " 'fields': {\n", + " 'glucose': initial_glucose,\n", + " 'acetate': initial_acetate,\n", + " 'biomass': initial_biomass,\n", + " },\n", + " 'diffusion': {\n", + " '_type': 'process',\n", + " 'address': 'local:DiffusionAdvection',\n", + " 'config': {\n", + " 'n_bins': n_bins,\n", + " 'bounds': (10, 10),\n", + " 'default_diffusion_rate': 1e-1,\n", + " 'default_diffusion_dt': 1e-1,\n", + " 'diffusion_coeffs': {\n", + " 'glucose': 1e-1,\n", + " 'acetate': 1e-1,\n", + " 'biomass': 1e-1,\n", + " },\n", + " 'advection_coeffs': {\n", + " 'glucose': (0, 0),\n", + " 'acetate': (0, 0),\n", + " 'biomass': (0, 0),\n", + " },\n", + " },\n", + " 'inputs': {\n", + " 'fields': ['fields']\n", + " },\n", + " 'outputs': {\n", + " 'fields': ['fields']\n", + " }\n", + " },\n", + " 'emitter': {\n", + " '_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': {\n", + " 'emit': {\n", + " 'fields': 'map',\n", + " 'time': 'float',\n", + " }\n", + " },\n", + " 'inputs': {\n", + " 'fields': ['fields'],\n", + " 'time': ['global_time'],\n", + " }\n", + " }\n", + "}\n", + "\n", + "sim = Composite({'state': composite_state}, core=core)\n", + "# sim.add_emitter()\n", + "\n", + "sim.update({}, 10.0)\n", + "\n", + "data = sim.gather_results()[('emitter',)]\n", + "\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "id": "654b6495-4d6e-4a54-a3da-097dcef50903", + "metadata": {}, + "source": [ + "## COMETS" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e84f5056-e953-4038-bdf7-a973eae4ff6a", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'_type'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[13], line 87\u001b[0m\n\u001b[1;32m 30\u001b[0m composite_state \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 31\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfields\u001b[39m\u001b[38;5;124m'\u001b[39m: {\n\u001b[1;32m 32\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_type\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 82\u001b[0m }\n\u001b[1;32m 83\u001b[0m }\n\u001b[1;32m 85\u001b[0m sim \u001b[38;5;241m=\u001b[39m Composite({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstate\u001b[39m\u001b[38;5;124m'\u001b[39m: composite_state}, core\u001b[38;5;241m=\u001b[39mcore)\n\u001b[0;32m---> 87\u001b[0m \u001b[43msim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m10.0\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:1087\u001b[0m, in \u001b[0;36mComposite.update\u001b[0;34m(self, state, interval)\u001b[0m\n\u001b[1;32m 1078\u001b[0m projection \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcore\u001b[38;5;241m.\u001b[39mproject(\n\u001b[1;32m 1079\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minterface()[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minputs\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 1080\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbridge[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minputs\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 1081\u001b[0m [],\n\u001b[1;32m 1082\u001b[0m state)\n\u001b[1;32m 1084\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmerge(\n\u001b[1;32m 1085\u001b[0m projection)\n\u001b[0;32m-> 1087\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43minterval\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1089\u001b[0m updates \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbridge_updates\n\u001b[1;32m 1090\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbridge_updates \u001b[38;5;241m=\u001b[39m []\n", + "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:927\u001b[0m, in \u001b[0;36mComposite.run\u001b[0;34m(self, interval, force_complete)\u001b[0m\n\u001b[1;32m 925\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m path \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprocess_paths:\n\u001b[1;32m 926\u001b[0m process \u001b[38;5;241m=\u001b[39m get_path(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate, path)\n\u001b[0;32m--> 927\u001b[0m full_step \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_process\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 928\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 929\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocess\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 930\u001b[0m \u001b[43m \u001b[49m\u001b[43mend_time\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 931\u001b[0m \u001b[43m \u001b[49m\u001b[43mfull_step\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 932\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_complete\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 934\u001b[0m \u001b[38;5;66;03m# apply updates based on process times in self.front\u001b[39;00m\n\u001b[1;32m 935\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m full_step \u001b[38;5;241m==\u001b[39m math\u001b[38;5;241m.\u001b[39minf:\n\u001b[1;32m 936\u001b[0m \u001b[38;5;66;03m# no processes ran, jump to next process\u001b[39;00m\n", + "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:824\u001b[0m, in \u001b[0;36mComposite.run_process\u001b[0;34m(self, path, process, end_time, full_step, force_complete)\u001b[0m\n\u001b[1;32m 821\u001b[0m full_step \u001b[38;5;241m=\u001b[39m interval\n\u001b[1;32m 823\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m future \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m end_time:\n\u001b[0;32m--> 824\u001b[0m update \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess_update\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 825\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 826\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocess\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 827\u001b[0m \u001b[43m \u001b[49m\u001b[43mstate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 828\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocess_interval\u001b[49m\n\u001b[1;32m 829\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 831\u001b[0m \u001b[38;5;66;03m# update front, to be applied at its projected time\u001b[39;00m\n\u001b[1;32m 832\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfront[path][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m future\n", + "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:766\u001b[0m, in \u001b[0;36mComposite.process_update\u001b[0;34m(self, path, process, states, interval, ports_key)\u001b[0m\n\u001b[1;32m 739\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mprocess_update\u001b[39m(\n\u001b[1;32m 740\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 741\u001b[0m path,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 744\u001b[0m interval,\n\u001b[1;32m 745\u001b[0m ports_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m 747\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Start generating a process's update.\u001b[39;00m\n\u001b[1;32m 748\u001b[0m \n\u001b[1;32m 749\u001b[0m \u001b[38;5;124;03m This function is similar to :py:meth:`_invoke_process` except in\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 764\u001b[0m \u001b[38;5;124;03m ``store``.\u001b[39;00m\n\u001b[1;32m 765\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 766\u001b[0m update \u001b[38;5;241m=\u001b[39m \u001b[43mprocess\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43minstance\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 768\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdefer_project\u001b[39m(update, args):\n\u001b[1;32m 769\u001b[0m schema, state, path \u001b[38;5;241m=\u001b[39m args\n", + "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:319\u001b[0m, in \u001b[0;36mProcess.invoke\u001b[0;34m(self, state, interval)\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\u001b[38;5;28mself\u001b[39m, state, interval):\n\u001b[0;32m--> 319\u001b[0m update \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 320\u001b[0m sync \u001b[38;5;241m=\u001b[39m SyncUpdate(update)\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sync\n", + "Cell \u001b[0;32mIn[11], line 74\u001b[0m, in \u001b[0;36mDiffusionAdvection.update\u001b[0;34m(self, state, interval)\u001b[0m\n\u001b[1;32m 69\u001b[0m fields_update \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m species, field \u001b[38;5;129;01min\u001b[39;00m fields\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 71\u001b[0m fields_update[species] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdiffusion_delta(\n\u001b[1;32m 72\u001b[0m field,\n\u001b[1;32m 73\u001b[0m interval,\n\u001b[0;32m---> 74\u001b[0m diffusion_coeff\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdiffusion_coeffs\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[43mspecies\u001b[49m\u001b[43m]\u001b[49m,\n\u001b[1;32m 75\u001b[0m advection_coeff\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madvection_coeffs\u001b[39m\u001b[38;5;124m'\u001b[39m][species]\n\u001b[1;32m 76\u001b[0m )\n\u001b[1;32m 78\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 79\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfields\u001b[39m\u001b[38;5;124m'\u001b[39m: fields_update\n\u001b[1;32m 80\u001b[0m }\n", + "\u001b[0;31mKeyError\u001b[0m: '_type'" + ] + } + ], + "source": [ + "n_bins = (5, 5)\n", + "\n", + "initial_glucose = np.random.uniform(low=0, high=20, size=n_bins)\n", + "initial_acetate = np.random.uniform(low=0, high=0, size=n_bins)\n", + "initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins)\n", + "\n", + "dfba_processes_dict = {}\n", + "for i in range(n_bins[0]):\n", + " for j in range(n_bins[1]):\n", + " dfba_processes_dict[f'[{i},{j}]'] = {\n", + " '_type': 'process',\n", + " 'address': 'local:DynamicFBA',\n", + " 'config': dfba_config(),\n", + " 'inputs': {\n", + " 'substrates': {\n", + " 'glucose': ['..', 'fields', 'glucose', i, j],\n", + " 'acetate': ['..', 'fields', 'acetate', i, j],\n", + " 'biomass': ['..', 'fields', 'biomass', i, j],\n", + " }\n", + " },\n", + " 'outputs': {\n", + " 'substrates': {\n", + " 'glucose': ['..', 'fields', 'glucose', i, j],\n", + " 'acetate': ['..', 'fields', 'acetate', i, j],\n", + " 'biomass': ['..', 'fields', 'biomass', i, j]\n", + " }\n", + " }\n", + " }\n", + "\n", + "composite_state = {\n", + " 'fields': {\n", + " '_type': 'map',\n", + " '_value': {\n", + " '_type': 'array',\n", + " '_shape': n_bins,\n", + " '_data': 'positive_float'\n", + " },\n", + " 'glucose': initial_glucose,\n", + " 'acetate': initial_acetate,\n", + " 'biomass': initial_biomass,\n", + " },\n", + " 'spatial_dfba': dfba_processes_dict,\n", + " 'diffusion': {\n", + " '_type': 'process',\n", + " 'address': 'local:DiffusionAdvection',\n", + " 'config': {\n", + " 'n_bins': n_bins,\n", + " 'bounds': (10, 10),\n", + " 'default_diffusion_rate': 1e-1,\n", + " 'default_diffusion_dt': 1e-1,\n", + " 'diffusion_coeffs': {\n", + " 'glucose': 1e-1,\n", + " 'acetate': 1e-1,\n", + " 'biomass': 1e-1,\n", + " },\n", + " 'advection_coeffs': {\n", + " 'glucose': (0, 0),\n", + " 'acetate': (0, 0),\n", + " 'biomass': (0, 0),\n", + " },\n", + " },\n", + " 'inputs': {\n", + " 'fields': ['fields']\n", + " },\n", + " 'outputs': {\n", + " 'fields': ['fields']\n", + " }\n", + " },\n", + " 'emitter': {\n", + " '_type': 'step',\n", + " 'address': 'local:ram-emitter',\n", + " 'config': {\n", + " 'emit': {\n", + " 'fields': 'map',\n", + " 'time': 'float',\n", + " }\n", + " },\n", + " 'inputs': {\n", + " 'fields': ['fields'],\n", + " 'time': ['global_time']\n", + " }\n", + " }\n", + "}\n", + "\n", + "sim = Composite({'state': composite_state}, core=core)\n", + "\n", + "sim.update({}, 10.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "812b9fdd-f810-4310-86c5-d6aa8367c294", + "metadata": {}, + "outputs": [], + "source": [ + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57864d93-398d-4872-9aea-7880c5d5c5ec", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1fbb10bb-2f75-4262-83f2-e4c9c0352c34", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dcd0440-800c-4ba1-96b5-3b2d3c5c8f29", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "983b47cbb5623b3d", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Spatial dFBA composite simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7f92f56a30057ef9", + "metadata": { + "ExecuteTime": { + "end_time": "2024-06-18T22:20:20.354240Z", + "start_time": "2024-06-18T22:20:03.598052Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], "source": [ "n_bins = (2, 2)\n", "\n", @@ -403,77 +1207,133 @@ "}\n", "\n", "sim = Composite({'state': composite_state}, core=core)\n" - ], + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6f24905-9ae4-458f-b794-9eef774a35b4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e4fd7e9-9ddf-4bca-a8f6-92c20670e2bb", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3316851-5ba8-4e5c-b915-3bc74665dadb", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d67aebf9-f5fb-4b9d-be22-6edd064103f2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "768e3533-398d-4a02-a041-24dab9fe8517", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43b0f28a-2679-420b-97f2-2faac5f0cdcf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e917a6d-8e58-46c7-8865-b487d6dba616", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e6ba7e397d883bf", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-06-18T22:20:20.354240Z", - "start_time": "2024-06-18T22:20:03.598052Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "7f92f56a30057ef9", - "execution_count": 9 - }, - { - "cell_type": "code", "outputs": [], "source": [ "sim.state['spatial_dfba']" - ], - "metadata": { - "collapsed": false - }, - "id": "8e6ba7e397d883bf", - "execution_count": null + ] }, { "cell_type": "code", - "outputs": [], - "source": [ - "composite_state" - ], + "execution_count": null, + "id": "34221fba51751ea7", "metadata": { - "collapsed": false, "ExecuteTime": { "end_time": "2024-06-18T22:20:20.356451Z", "start_time": "2024-06-18T22:20:20.356230Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "34221fba51751ea7", - "execution_count": null + "outputs": [], + "source": [ + "composite_state" + ] }, { "cell_type": "code", - "outputs": [], - "source": [], + "execution_count": null, + "id": "24508915eb52af63", "metadata": { - "collapsed": false, "ExecuteTime": { "end_time": "2024-06-18T22:20:20.357449Z", "start_time": "2024-06-18T22:20:20.357343Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "24508915eb52af63", - "execution_count": null + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "name": "venv_kernel", + "display_name": "Python 3 (ipykernel)", "language": "python", - "display_name": "Python (venv)" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.9.6" } }, "nbformat": 4, diff --git a/process_bigraph/composite.py b/process_bigraph/composite.py index 93f9523..1df335f 100644 --- a/process_bigraph/composite.py +++ b/process_bigraph/composite.py @@ -10,7 +10,7 @@ from typing import Dict from bigraph_schema import Edge, TypeSystem, get_path, set_path, deep_merge -from bigraph_schema.registry import Registry, is_schema_key, hierarchy_depth +from bigraph_schema.registry import Registry, is_schema_key, hierarchy_depth, strip_schema_keys from process_bigraph.process_types import process_types from process_bigraph.protocols import local_lookup, local_lookup_module @@ -594,7 +594,8 @@ class Composite(Process): 'bridge': { 'inputs': 'wires', 'outputs': 'wires'}, - 'global_time_precision': 'maybe[float]'} + 'global_time_precision': 'maybe[float]', + } def __init__(self, config=None, core=None): @@ -763,6 +764,9 @@ def process_update( Tuple of the deferred update (in absolute terms) and ``store``. """ + + states = strip_schema_keys(states) + update = process['instance'].invoke(states, interval) def defer_project(update, args): diff --git a/process_bigraph/experiments/comets.py b/process_bigraph/experiments/comets.py index a148491..215a9e4 100644 --- a/process_bigraph/experiments/comets.py +++ b/process_bigraph/experiments/comets.py @@ -121,6 +121,7 @@ def update(self, state, interval): [1, -4, 1], [0, 1, 0]]) + class DiffusionAdvection(Process): config_schema = { 'n_bins': 'tuple[integer,integer]', @@ -374,6 +375,7 @@ def run_diffusion_process(): } sim = Composite({'state': composite_state}, core=core) + # sim.add_emitter() sim.update({}, 10.0) @@ -382,6 +384,102 @@ def run_diffusion_process(): print(data) +def run_comets(): + n_bins = (10, 10) + + initial_glucose = np.random.uniform(low=0, high=20, size=n_bins) + initial_acetate = np.random.uniform(low=0, high=0, size=n_bins) + initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins) + + dfba_processes_dict = {} + for i in range(n_bins[0]): + for j in range(n_bins[1]): + dfba_processes_dict[f'[{i},{j}]'] = { + '_type': 'process', + 'address': 'local:DynamicFBA', + 'config': dfba_config(), + 'inputs': { + 'substrates': { + 'glucose': ['..', 'fields', 'glucose', i, j], + 'acetate': ['..', 'fields', 'acetate', i, j], + 'biomass': ['..', 'fields', 'biomass', i, j], + } + }, + 'outputs': { + 'substrates': { + 'glucose': ['..', 'fields', 'glucose', i, j], + 'acetate': ['..', 'fields', 'acetate', i, j], + 'biomass': ['..', 'fields', 'biomass', i, j] + } + } + } + + composite_state = { + 'fields': { + '_type': 'map', + '_value': { + '_type': 'array', + '_shape': n_bins, + '_data': 'positive_float' + }, + 'glucose': initial_glucose, + 'acetate': initial_acetate, + 'biomass': initial_biomass, + }, + 'spatial_dfba': dfba_processes_dict, + 'diffusion': { + '_type': 'process', + 'address': 'local:DiffusionAdvection', + 'config': { + 'n_bins': n_bins, + 'bounds': (10, 10), + 'default_diffusion_rate': 1e-1, + 'default_diffusion_dt': 1e-1, + 'diffusion_coeffs': { + 'glucose': 1e-1, + 'acetate': 1e-1, + 'biomass': 1e-1, + }, + 'advection_coeffs': { + 'glucose': (0, 0), + 'acetate': (0, 0), + 'biomass': (0, 0), + }, + }, + 'inputs': { + 'fields': ['fields'] + }, + 'outputs': { + 'fields': ['fields'] + } + }, + 'emitter': { + '_type': 'step', + 'address': 'local:ram-emitter', + 'config': { + 'emit': { + 'fields': 'map', + 'time': 'float', + } + }, + 'inputs': { + 'fields': ['fields'], + 'time': ['global_time'] + } + } + } + + sim = Composite({'state': composite_state}, core=core) + + sim.update({}, 10.0) + + results = sim.gather_results() + + print(results) + + + if __name__ == '__main__': # run_dfba_spatial() - run_diffusion_process() + # run_diffusion_process() + run_comets() From 4bbb8c94185b6fbfe195b3edd92d602ba0d5fa25 Mon Sep 17 00:00:00 2001 From: Eran Date: Wed, 10 Jul 2024 09:07:01 -0400 Subject: [PATCH 12/12] comets notebook running --- notebooks/comets.ipynb | 1384 +++++++++++++++++++++++++--------------- 1 file changed, 877 insertions(+), 507 deletions(-) diff --git a/notebooks/comets.ipynb b/notebooks/comets.ipynb index eedb667..c188587 100644 --- a/notebooks/comets.ipynb +++ b/notebooks/comets.ipynb @@ -9,7 +9,7 @@ { "data": { "text/plain": [ - "'/Users/eranagmon/code/process-bigraph/venv/bin/python3'" + "'/Users/eranagmon/code/process-bigraph/venv/bin/python'" ] }, "execution_count": 1, @@ -396,203 +396,181 @@ { "data": { "text/plain": [ - "[{'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.05494692, 3.21135777, 7.62934694, 18.13914579, 19.5392402 ],\n", - " [14.3321519 , 19.17272223, 13.75329196, 19.95907999, 15.48155216],\n", - " [17.34048488, 6.20481708, 8.71169331, 10.15838692, 5.57509712],\n", - " [10.76296875, 13.49779122, 8.41667 , 13.88647257, 17.98651318],\n", - " [15.87549511, 4.4793677 , 16.28180449, 15.1458885 , 6.9025743 ]]),\n", + "[{'fields': {'glucose': array([[ 8.5526694 , 17.5842017 , 15.39583692, 7.60193967, 19.13203451],\n", + " [12.65809497, 12.21049038, 5.7792075 , 10.33968228, 19.25409282],\n", + " [ 3.14530227, 13.69455267, 1.14230224, 5.90495666, 10.12746262],\n", + " [13.03804887, 19.10655932, 10.22930332, 3.11076213, 8.7102663 ],\n", + " [ 1.26206527, 7.72923753, 3.72448763, 7.74081364, 3.94338213]]),\n", " 'acetate': array([[0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0.]]),\n", - " 'biomass': array([[0.00403388, 0.07873172, 0.09651373, 0.0857904 , 0.09322035],\n", - " [0.09099417, 0.05576586, 0.06044433, 0.09543499, 0.08556801],\n", - " [0.00485139, 0.05965545, 0.07130176, 0.03765414, 0.0931261 ],\n", - " [0.0540483 , 0.03666924, 0.01203241, 0.01498518, 0.07911831],\n", - " [0.08204151, 0.06513374, 0.08889333, 0.08826353, 0.07138507]])},\n", + " 'biomass': array([[0.03124297, 0.0828025 , 0.06932402, 0.05347029, 0.06634931],\n", + " [0.06510462, 0.01836797, 0.07575297, 0.09252517, 0.05390586],\n", + " [0.03899395, 0.05617419, 0.00645221, 0.09252719, 0.02600646],\n", + " [0.08406056, 0.08744284, 0.04027866, 0.01781626, 0.08739853],\n", + " [0.08358264, 0.04685661, 0.01132015, 0.03643865, 0.02227665]])},\n", " 'time': 0.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.05221015, 3.14323291, 7.53876934, 18.05565674, 19.4483458 ],\n", - " [14.2442252 , 19.11837371, 13.69496799, 19.86597733, 15.39866124],\n", - " [17.33576945, 6.14961033, 8.64426173, 10.12249918, 5.48963559],\n", - " [10.71131983, 13.4624318 , 8.40531231, 13.8720082 , 17.90953477],\n", - " [15.7959586 , 4.42077433, 16.19555967, 15.06044563, 6.83601086]]),\n", - " 'acetate': array([[0. , 0. , 0.00901003, 0.01394927, 0.0155062 ],\n", - " [0.01354449, 0.00922429, 0.00883192, 0.01597214, 0.01315101],\n", - " [0.00077719, 0.00401267, 0.00768517, 0.00461238, 0.00482678],\n", - " [0.0068923 , 0.00531111, 0.00125375, 0.0021993 , 0.01282942],\n", - " [0.01273231, 0.00102065, 0.01392687, 0.013447 , 0.0058035 ]]),\n", - " 'biomass': array([[0.0042642 , 0.08457543, 0.10411853, 0.09268685, 0.1007221 ],\n", - " [0.09828017, 0.06025233, 0.06528037, 0.1031172 , 0.09242906],\n", - " [0.00524112, 0.06432022, 0.07694364, 0.04064633, 0.10037506],\n", - " [0.05834949, 0.03960201, 0.0129835 , 0.01618434, 0.0854776 ],\n", - " [0.08862264, 0.07014961, 0.0960271 , 0.09533799, 0.07699007]])},\n", + " {'fields': {'glucose': array([[ 8.52315205, 17.50368856, 15.32869347, 7.55176922, 19.06737503],\n", + " [12.59546429, 12.19284496, 5.70948658, 10.251425 , 19.20155138],\n", + " [ 3.11165685, 13.64035721, 1.13781441, 5.81965257, 10.10267971],\n", + " [12.95709292, 19.02134642, 10.1909017 , 3.09541297, 8.6276124 ],\n", + " [ 1.20219987, 7.68522788, 3.7145073 , 7.70658586, 3.9236122 ]]),\n", + " 'acetate': array([[0.003308 , 0.01332736, 0.01063111, 0.0049695 , 0.01096793],\n", + " [0.00913333, 0.00252771, 0.00433095, 0.01147866, 0.00892789],\n", + " [0. , 0.0081917 , 0. , 0.00557878, 0.00317853],\n", + " [0.01197159, 0.01444904, 0.0049588 , 0. , 0.00941867],\n", + " [0. , 0.00444414, 0. , 0.00346225, 0. ]]),\n", + " 'biomass': array([[0.03371375, 0.08945563, 0.07488205, 0.05768298, 0.07168708],\n", + " [0.0703048 , 0.01983397, 0.0816589 , 0.09988102, 0.05824295],\n", + " [0.04187947, 0.06066822, 0.00683072, 0.09974753, 0.0280729 ],\n", + " [0.09077895, 0.09447744, 0.04347998, 0.01913251, 0.09431406],\n", + " [0.08864454, 0.05055028, 0.01217735, 0.03931123, 0.02397542]])},\n", " 'time': 1.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.04931954, 3.07026468, 7.44112683, 17.96546743, 19.35014827],\n", - " [14.14927786, 19.05965699, 13.63198704, 19.76539174, 15.309139 ],\n", - " [17.33067527, 6.0901265 , 8.57152529, 10.08376607, 5.3976396 ],\n", - " [10.6555726 , 13.42424796, 8.39305778, 13.85638692, 17.82637873],\n", - " [15.71005513, 4.35775262, 16.10240839, 14.96817111, 6.7642682 ]]),\n", - " 'acetate': array([[0. , 0. , 0.01858594, 0.02899755, 0.03223737],\n", - " [0.02813405, 0.01918222, 0.01835168, 0.03320698, 0.0273264 ],\n", - " [0.00161674, 0.0082596 , 0.01591694, 0.00957843, 0.00979393],\n", - " [0.01430926, 0.01103984, 0.00260475, 0.00457346, 0.02667074],\n", - " [0.02645959, 0.00195243, 0.02894187, 0.0279384 , 0.01196846]]),\n", - " 'biomass': array([[0.00450746, 0.09083335, 0.11231924, 0.10013717, 0.10882701],\n", - " [0.10614867, 0.06509955, 0.07050291, 0.11141727, 0.09983955],\n", - " [0.00566214, 0.06934791, 0.08303053, 0.043876 , 0.10818286],\n", - " [0.06299244, 0.04276916, 0.01400973, 0.01747943, 0.0923476 ],\n", - " [0.09573107, 0.07554789, 0.10373268, 0.10297872, 0.08303299]])},\n", + " {'fields': {'glucose': array([[ 8.49130648, 17.4167173 , 15.25617681, 7.49766825, 18.99751976],\n", + " [12.52784381, 12.17379229, 5.63440301, 10.156189 , 19.14478656],\n", + " [ 3.0755752 , 13.58183421, 1.13306901, 5.72779689, 10.07593067],\n", + " [12.86968687, 18.92928883, 10.14945523, 3.07894115, 8.53846475],\n", + " [ 1.13959356, 7.63776549, 3.70377465, 7.66966974, 3.90234672]]),\n", + " 'acetate': array([[0.00686545, 0.02770348, 0.02209462, 0.01028624, 0.02280618],\n", + " [0.01897066, 0.005255 , 0.00885379, 0.02379438, 0.01856625],\n", + " [0. , 0.0170224 , 0. , 0.01138304, 0.00660346],\n", + " [0.02485972, 0.03003947, 0.0102972 , 0. , 0.01949003],\n", + " [0. , 0.00920563, 0. , 0.00717758, 0. ]]),\n", + " 'biomass': array([[0.03637966, 0.09664283, 0.08088524, 0.06222654, 0.07745399],\n", + " [0.07591975, 0.02141693, 0.08802192, 0.10781993, 0.06292881],\n", + " [0.04497362, 0.06552139, 0.00723092, 0.10752648, 0.0303034 ],\n", + " [0.09803336, 0.10207748, 0.0469354 , 0.02054496, 0.10177467],\n", + " [0.09393191, 0.05453437, 0.01309914, 0.0424098 , 0.02580262]])},\n", " 'time': 2.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.04626674, 2.99215214, 7.33587959, 17.86804173, 19.24406247],\n", - " [14.0467522 , 18.99622157, 13.56397858, 19.65672342, 15.2124571 ],\n", - " [17.3251719 , 6.02604009, 8.4930712 , 10.04196287, 5.29862845],\n", - " [10.59540352, 13.38301457, 8.37983572, 13.83951625, 17.73655066],\n", - " [15.61727689, 4.28998075, 16.00179974, 14.86852112, 6.68695037]]),\n", - " 'acetate': array([[0. , 0. , 0.02874457, 0.04522913, 0.05028792],\n", - " [0.0438451 , 0.02993131, 0.02861094, 0.05180198, 0.0426028 ],\n", - " [0.00252364, 0.01274453, 0.02472724, 0.01492397, 0.01486619],\n", - " [0.02228837, 0.01721833, 0.00406038, 0.00713629, 0.04160178],\n", - " [0.04125686, 0.00275708, 0.04512694, 0.04355178, 0.01850572]]),\n", - " 'biomass': array([[0.00476434, 0.09753094, 0.12116192, 0.10818576, 0.11758349],\n", - " [0.11464606, 0.07033649, 0.07614275, 0.12038481, 0.10784337],\n", - " [0.00611699, 0.07476645, 0.08959728, 0.04736194, 0.11659153],\n", - " [0.06800418, 0.04618942, 0.01511703, 0.01887813, 0.09976922],\n", - " [0.10340896, 0.08135701, 0.11205579, 0.11123089, 0.08954766]])},\n", + " {'fields': {'glucose': array([[ 8.45694987, 17.32277147, 15.17785835, 7.43933201, 18.92205202],\n", + " [12.45483781, 12.15322029, 5.55355554, 10.05342809, 19.08345941],\n", + " [ 3.03689058, 13.51863926, 1.12805199, 5.6289032 , 10.04705993],\n", + " [12.77531976, 18.82983825, 10.10472349, 3.06126644, 8.44232016],\n", + " [ 1.07430652, 7.58658182, 3.69223353, 7.6298555 , 3.87947466]]),\n", + " 'acetate': array([[0.01068995, 0.04320862, 0.03445366, 0.01596958, 0.03558261],\n", + " [0.02956363, 0.00819743, 0.01355585, 0.03699953, 0.02897083],\n", + " [0. , 0.02654028, 0. , 0.01738944, 0.0102933 ],\n", + " [0.03873023, 0.04685932, 0.01604279, 0. , 0.03024829],\n", + " [0. , 0.01430361, 0. , 0.01116245, 0. ]]),\n", + " 'biomass': array([[0.03925604, 0.10440688, 0.08736915, 0.06712679, 0.0836845 ],\n", + " [0.08198246, 0.02312616, 0.09487678, 0.1163878 , 0.06799145],\n", + " [0.0482906 , 0.07076236, 0.00765398, 0.11590632, 0.03271095],\n", + " [0.10586641, 0.11028832, 0.05066504, 0.02206048, 0.10982292],\n", + " [0.09943808, 0.05883157, 0.01409035, 0.04575207, 0.02776778]])},\n", " 'time': 3.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.043043 , 2.9085855 , 7.22244889, 17.76280091, 19.12945668],\n", - " [13.93604674, 18.92768893, 13.49054284, 19.53932483, 15.10804551],\n", - " [17.31922649, 5.95700196, 8.40845538, 9.99684728, 5.19209029],\n", - " [10.53046386, 13.33848867, 8.36556989, 13.82129637, 17.63951686],\n", - " [15.51707595, 4.21711615, 15.8931392 , 14.76090902, 6.60363259]]),\n", - " 'acetate': array([[0. , 0. , 0.03949839, 0.0627343 , 0.06975908],\n", - " [0.06075878, 0.04153343, 0.03966487, 0.07186165, 0.05906196],\n", - " [0.00350328, 0.01746867, 0.03414832, 0.02067651, 0.01999573],\n", - " [0.03086931, 0.02388109, 0.00562852, 0.00990265, 0.057706 ],\n", - " [0.05720426, 0.00338704, 0.06256955, 0.06036979, 0.0254235 ]]),\n", - " 'biomass': array([[0.00503558, 0.10469438, 0.13069607, 0.11688055, 0.1270438 ],\n", - " [0.12382242, 0.07599446, 0.08223315, 0.13007337, 0.11648786],\n", - " [0.00660838, 0.0806058 , 0.0966814 , 0.05112443, 0.12564604],\n", - " [0.07341391, 0.04988297, 0.01631178, 0.02038872, 0.10778668],\n", - " [0.11170179, 0.08760738, 0.12104577, 0.12014328, 0.09657041]])},\n", + " {'fields': {'glucose': array([[ 8.41988519, 17.22129361, 15.09327559, 7.3764327 , 18.84052189],\n", + " [12.37601951, 12.13100798, 5.46651521, 9.94255451, 19.0172039 ],\n", + " [ 2.99542668, 13.45040077, 1.12274866, 5.52245259, 10.01589969],\n", + " [12.6734407 , 18.72240274, 10.05644724, 3.04230324, 8.33863787],\n", + " [ 1.00644999, 7.53138786, 3.67982372, 7.58691726, 3.8548771 ]]),\n", + " 'acetate': array([[0.01480011, 0.05992874, 0.04777577, 0.0220389 , 0.04937014],\n", + " [0.04096711, 0.01137172, 0.01841789, 0.05114784, 0.04020164],\n", + " [0. , 0.03679688, 0. , 0.02356413, 0.01426783],\n", + " [0.05365283, 0.06500295, 0.02222491, 0. , 0.04172688],\n", + " [0. , 0.01975762, 0. , 0.01543398, 0. ]]),\n", + " 'biomass': array([[0.04235947, 0.11279397, 0.09437219, 0.07241151, 0.09041582],\n", + " [0.0885285 , 0.02497173, 0.10226073, 0.12563407, 0.07346113],\n", + " [0.05184546, 0.07642203, 0.00810113, 0.12493234, 0.03530958],\n", + " [0.11432403, 0.11915894, 0.05469059, 0.0236864 , 0.11850461],\n", + " [0.10515175, 0.06346632, 0.01515613, 0.04935712, 0.0298811 ]])},\n", " 'time': 4.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.03963912, 2.81924857, 7.10021491, 17.64912033, 19.00564893],\n", - " [13.81651298, 18.8536503 , 13.41124858, 19.41249691, 14.99528932],\n", - " [17.31280354, 5.88263789, 8.31720037, 9.94815807, 5.07748115],\n", - " [10.46037773, 13.29040803, 8.35017806, 13.80161948, 17.53470122],\n", - " [15.40886112, 4.13879488, 15.77578539, 14.64470204, 6.51385944]]),\n", - " 'acetate': array([[0. , 0. , 0.05085384, 0.08160974, 0.09075932],\n", - " [0.07896108, 0.05405511, 0.05157233, 0.09349797, 0.07679093],\n", - " [0.0045615 , 0.02242993, 0.04421234, 0.02686522, 0.02511876],\n", - " [0.04009397, 0.0310651 , 0.00731765, 0.01288856, 0.0750728 ],\n", - " [0.07438727, 0.00378337, 0.08136301, 0.07848031, 0.03272647]]),\n", - " 'biomass': array([[0.00532195, 0.11235028, 0.14097482, 0.12627328, 0.13726439],\n", - " [0.13373176, 0.08210724, 0.08880999, 0.1405408 , 0.12582413],\n", - " [0.00713923, 0.08689819, 0.10432329, 0.05518535, 0.1353944 ],\n", - " [0.07925308, 0.05387162, 0.0176009 , 0.02202015, 0.11644769],\n", - " [0.12065866, 0.09433146, 0.13075588, 0.12976851, 0.10414031]])},\n", + " {'fields': {'glucose': array([[ 8.37990017, 17.11168209, 15.00192946, 7.30861792, 18.75244354],\n", + " [12.29092874, 12.10702476, 5.37282403, 9.82293593, 18.94562472],\n", + " [ 2.95099741, 13.3767178 , 1.11714364, 5.40789247, 9.98226898],\n", + " [12.56345585, 18.60634328, 10.00434704, 3.0219602 , 8.22683705],\n", + " [ 0.93619876, 7.47187268, 3.66648059, 7.54061181, 3.82842676]]),\n", + " 'acetate': array([[0.01921559, 0.07795583, 0.06213311, 0.02851334, 0.06424711],\n", + " [0.05323936, 0.01479586, 0.02341231, 0.06629397, 0.05232322],\n", + " [0. , 0.04784719, 0. , 0.02985999, 0.01854821],\n", + " [0.06970111, 0.0845715 , 0.02887467, 0. , 0.05395769],\n", + " [0. , 0.02558745, 0. , 0.02000991, 0. ]]),\n", + " 'biomass': array([[0.04570778, 0.12185397, 0.1019358 , 0.07811061, 0.09768813],\n", + " [0.09559626, 0.02696451, 0.1102137 , 0.13561199, 0.07937054],\n", + " [0.05565404, 0.08253375, 0.00857366, 0.13465297, 0.03811443],\n", + " [0.12345581, 0.12874225, 0.05903544, 0.02543052, 0.12786904],\n", + " [0.11105582, 0.06846497, 0.01630204, 0.05324548, 0.03215349]])},\n", " 'time': 5.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.03604549, 2.72382235, 6.96851449, 17.52632582, 18.87190311],\n", - " [13.68745176, 18.77366429, 13.32563061, 19.27548507, 14.87352527],\n", - " [17.30586471, 5.80254709, 8.21879298, 9.89561364, 4.95422434],\n", - " [10.38474009, 13.23848964, 8.33357154, 13.78036918, 17.42148196],\n", - " [15.29199464, 4.05463109, 15.64904639, 14.51921782, 6.41714302]]),\n", - " 'acetate': array([[0. , 0. , 0.06280927, 0.10195881, 0.11340471],\n", - " [0.09854287, 0.06756787, 0.06439601, 0.11683085, 0.09588229],\n", - " [0.00570458, 0.02762196, 0.05495085, 0.03352106, 0.03015131],\n", - " [0.05000648, 0.03880999, 0.00913682, 0.01611128, 0.09379783],\n", - " [0.09289695, 0.00387305, 0.10160663, 0.09797662, 0.04041458]]),\n", - " 'biomass': array([[0.00562426, 0.12052535, 0.15205522, 0.13641984, 0.14830621],\n", - " [0.14443235, 0.08871135, 0.09591201, 0.15184956, 0.13590734],\n", - " [0.00771272, 0.09367818, 0.11256642, 0.05956826, 0.14588789],\n", - " [0.08555564, 0.05817888, 0.01899181, 0.02378206, 0.1258038 ],\n", - " [0.13033258, 0.10156387, 0.1412436 , 0.14016337, 0.11229928]])},\n", + " {'fields': {'glucose': array([[ 8.33676605, 16.99328758, 14.90328149, 7.23550887, 18.65729244],\n", + " [12.19906936, 12.08112967, 5.27199369, 9.69389242, 18.86829502],\n", + " [ 2.90340684, 13.29715787, 1.11122084, 5.28463552, 9.94597259],\n", + " [12.44472528, 18.48097012, 9.94812165, 3.00013996, 8.10629421],\n", + " [ 0.86380604, 7.40770187, 3.65213488, 7.49067736, 3.79998749]]),\n", + " 'acetate': array([[0.02395706, 0.09738818, 0.0776027 , 0.03541136, 0.08029759],\n", + " [0.06644207, 0.01848921, 0.02850097, 0.08249279, 0.06540494],\n", + " [0. , 0.05974987, 0. , 0.03621289, 0.023157 ],\n", + " [0.08695249, 0.10567323, 0.03602504, 0. , 0.06696997],\n", + " [0. , 0.03181291, 0. , 0.02490847, 0. ]]),\n", + " 'biomass': array([[0.04932024, 0.13164072, 0.11010473, 0.08425628, 0.10554484],\n", + " [0.10322715, 0.02911622, 0.11877841, 0.14637892, 0.08575497],\n", + " [0.059733 , 0.08913352, 0.00907291, 0.14511998, 0.04114182],\n", + " [0.13331518, 0.13909536, 0.06372483, 0.02730116, 0.1379692 ],\n", + " [0.11712613, 0.07385585, 0.01753402, 0.0574393 , 0.03459663]])},\n", " 'time': 6.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.03225199, 2.62198992, 6.82663902, 17.39368988, 18.72742478],\n", - " [13.54810955, 18.68725431, 13.23318723, 19.12747485, 14.7420381 ],\n", - " [17.29836856, 5.71630068, 8.11268194, 9.83891045, 4.8217103 ],\n", - " [10.30311452, 13.18242813, 8.31565472, 13.75741981, 17.29918803],\n", - " [15.1657886 , 3.96421674, 15.51217592, 14.38372058, 6.31296121]]),\n", - " 'acetate': array([[0. , 0. , 0.07535217, 0.1238919 , 0.13781933],\n", - " [0.11959989, 0.0821485 , 0.07820255, 0.14198849, 0.11643423],\n", - " [0.00693931, 0.03303289, 0.06639402, 0.04067674, 0.03498382],\n", - " [0.06065312, 0.0471582 , 0.01109573, 0.01958939, 0.11398335],\n", - " [0.11283013, 0.00356571, 0.12340597, 0.11895744, 0.04848153]]),\n", - " 'biomass': array([[0.00594334, 0.12924602, 0.16399843, 0.14738054, 0.16023504],\n", - " [0.15598706, 0.0958462 , 0.10358098, 0.16406707, 0.146797 ],\n", - " [0.00833228, 0.10098289, 0.12145759, 0.06429861, 0.15718108],\n", - " [0.09235815, 0.06283016, 0.02049254, 0.02568489, 0.13591061],\n", - " [0.14078071, 0.10934151, 0.15257096, 0.15138911, 0.12109233]])},\n", + " {'fields': {'glucose': array([[ 8.29023643, 16.86540947, 14.79675083, 7.15669867, 18.55450228],\n", + " [12.09990657, 12.05317058, 5.16350448, 9.55469323, 18.78475384],\n", + " [ 2.85244932, 13.21125449, 1.10496347, 5.15205911, 9.90680004],\n", + " [12.3165595 , 18.34553884, 9.88744641, 2.97673881, 7.9763406 ],\n", + " [ 0.78962082, 7.33851589, 3.63671231, 7.4368322 , 3.76941373]]),\n", + " 'acetate': array([[0.0290462 , 0.11833076, 0.09426657, 0.04275031, 0.09761177],\n", + " [0.08064041, 0.02247253, 0.03363235, 0.09979852, 0.07952137],\n", + " [0. , 0.07256737, 0. , 0.04253712, 0.02811824],\n", + " [0.10548815, 0.12842389, 0.04371079, 0. , 0.08078901],\n", + " [0. , 0.0384535 , 0. , 0.03014831, 0. ]]),\n", + " 'biomass': array([[0.05321758, 0.14221233, 0.11892726, 0.09088314, 0.11403282],\n", + " [0.11146583, 0.03143953, 0.12800058, 0.15799656, 0.09265255],\n", + " [0.06409982, 0.0962602 , 0.00960029, 0.15638862, 0.04440935],\n", + " [0.14395979, 0.15027993, 0.06878596, 0.02930719, 0.14886208],\n", + " [0.12332984, 0.07966947, 0.01885844, 0.06196242, 0.03722298]])},\n", " 'time': 7.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.02824806, 2.5134432 , 6.67383252, 17.25042756, 18.57135657],\n", - " [13.39767439, 18.59390576, 13.13337744, 18.96758731, 14.60005662],\n", - " [17.29027035, 5.62344022, 7.99827544, 9.77772138, 4.67929713],\n", - " [10.21503098, 13.12189399, 8.29632445, 13.73263567, 17.16709531],\n", - " [15.02950115, 3.86712166, 15.36436917, 14.23741721, 6.20075578]]),\n", - " 'acetate': array([[0. , 0. , 0.08845577, 0.14752671, 0.16413566],\n", - " [0.14223262, 0.09787946, 0.0930627 , 0.1691078 , 0.13855067],\n", - " [0.00827304, 0.03864382, 0.07856971, 0.0483668 , 0.03947405],\n", - " [0.07208227, 0.05615512, 0.01320472, 0.0233429 , 0.13573851],\n", - " [0.13428957, 0.00274946, 0.14687294, 0.14152702, 0.05691289]]),\n", - " 'biomass': array([[0.0062801 , 0.13853775, 0.17686995, 0.1592205 , 0.17312193],\n", - " [0.16846364, 0.10355438, 0.111862 , 0.17726614, 0.15855731],\n", - " [0.00900161, 0.10885208, 0.13104709, 0.06940383, 0.169332 ],\n", - " [0.09970006, 0.06785287, 0.02211176, 0.02773991, 0.14682819],\n", - " [0.15206477, 0.1177036 , 0.16480489, 0.16351181, 0.13056774]])},\n", + " {'fields': {'glucose': array([[ 8.24004594, 16.72729184, 14.68171091, 7.0717504 , 18.44346175],\n", + " [11.99286402, 12.02298331, 5.04680438, 9.40455353, 18.69450351],\n", + " [ 2.79790965, 13.11850455, 1.09835399, 5.00950515, 9.86452435],\n", + " [12.17821587, 18.19924606, 9.82197146, 2.95164638, 7.83625956],\n", + " [ 0.71410729, 7.26392834, 3.62013327, 7.37877326, 3.73655001]]),\n", + " 'acetate': array([[0.03450567, 0.1408954 , 0.11221202, 0.05054576, 0.11628631],\n", + " [0.09590296, 0.02676814, 0.03873807, 0.11826354, 0.09475253],\n", + " [0. , 0.08636606, 0. , 0.04871937, 0.03345753],\n", + " [0.12539278, 0.15294713, 0.05196857, 0. , 0.09543436],\n", + " [0. , 0.04552804, 0. , 0.03574824, 0. ]]),\n", + " 'biomass': array([[0.05742216, 0.15363154, 0.12845549, 0.09802844, 0.12320266],\n", + " [0.12036046, 0.0339481 , 0.13792902, 0.17053134, 0.10010445],\n", + " [0.06877275, 0.10395568, 0.01015726, 0.16851771, 0.04793603],\n", + " [0.15545178, 0.16236255, 0.07424818, 0.03145803, 0.16060888],\n", + " [0.12962371, 0.08593869, 0.02028211, 0.0668405 , 0.04004587]])},\n", " 'time': 8.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.02402263, 2.39789207, 6.50929001, 17.09569204, 18.40277344],\n", - " [13.2352716 , 18.49306309, 13.02561795, 18.79487403, 14.44674953],\n", - " [17.28152173, 5.52347628, 7.87493857, 9.71169397, 4.52631213],\n", - " [10.11998326, 13.0565317 , 8.27546957, 13.70587028, 17.02442254],\n", - " [14.88233237, 3.76289417, 15.20475847, 14.0794529 , 6.07993081]]),\n", - " 'acetate': array([[0. , 0. , 0.10207448, 0.17298854, 0.19249493],\n", - " [0.16654603, 0.1148492 , 0.10905134, 0.19833479, 0.16234128],\n", - " [0.00971367, 0.0444269 , 0.09150221, 0.05662754, 0.04343796],\n", - " [0.08434423, 0.06584927, 0.01547485, 0.02739334, 0.15917968],\n", - " [0.15738402, 0.00146205, 0.17212589, 0.16579502, 0.06568362]]),\n", - " 'biomass': array([[0.00663544, 0.14842421, 0.1907399 , 0.17200997, 0.18704355],\n", - " [0.18193518, 0.11188187, 0.12080369, 0.19152536, 0.17125753],\n", - " [0.00972469, 0.1173284 , 0.14138901, 0.07491347, 0.18240218],\n", - " [0.10762387, 0.07327659, 0.02385879, 0.02995927, 0.15862135],\n", - " [0.16425134, 0.12668768, 0.1780176 , 0.17660276, 0.14077722]])},\n", + " {'fields': {'glucose': array([[ 8.18590879, 16.57811926, 14.55748602, 6.98019527, 18.32351094],\n", + " [11.87732073, 11.99039064, 4.92130856, 9.24263093, 18.59700669],\n", + " [ 2.73956361, 13.01836558, 1.09137415, 4.8562808 , 9.81890083],\n", + " [12.02889476, 18.04122493, 9.75131988, 2.9247453 , 7.68528383],\n", + " [ 0.63786589, 7.18352414, 3.6023125 , 7.31617456, 3.70123038]]),\n", + " 'acetate': array([[0.04035902, 0.16520109, 0.13153169, 0.05881069, 0.13642472],\n", + " [0.11230171, 0.03139999, 0.04372831, 0.13793684, 0.11118436],\n", + " [0. , 0.10121632, 0. , 0.05461097, 0.03920208],\n", + " [0.14675422, 0.17937477, 0.06083682, 0. , 0.11091752],\n", + " [0. , 0.05305413, 0. , 0.04172708, 0. ]]),\n", + " 'biomass': array([[0.06195807, 0.16596604, 0.13874564, 0.10573221, 0.13310902],\n", + " [0.12996297, 0.03665667, 0.1486158 , 0.18405467, 0.10815514],\n", + " [0.0737708 , 0.11226519, 0.01074534, 0.18156979, 0.05174234],\n", + " [0.1678581 , 0.17541506, 0.08014311, 0.03376371, 0.17327532],\n", + " [0.13595225, 0.09269881, 0.02181236, 0.0721012 , 0.0430795 ]])},\n", " 'time': 9.0},\n", - " {'fields': {'_type': 'map',\n", - " '_value': {'_type': 'array', '_shape': (5, 5), '_data': 'positive_float'},\n", - " 'glucose': array([[ 1.01956415, 2.27507685, 6.33215633, 16.92856992, 18.2206774 ],\n", - " [13.05995934, 18.38412656, 12.90928 , 18.60831178, 14.28122093],\n", - " [17.27207049, 5.41588715, 7.74199075, 9.64044853, 4.36205469],\n", - " [10.01742644, 12.98595774, 8.25297018, 13.67696548, 16.87032691],\n", - " [14.72341999, 3.65106584, 15.0324085 , 13.9089067 , 5.94985105]]),\n", - " 'acetate': array([[0. , 0. , 0.11613807, 0.20041054, 0.22304739],\n", - " [0.1926492 , 0.13315253, 0.12624757, 0.22982488, 0.18792134],\n", - " [0.01126975, 0.05034287, 0.10521073, 0.06549702, 0.04663776],\n", - " [0.09749099, 0.07629242, 0.01791791, 0.03176389, 0.18443065],\n", - " [0.18222825, 0.00072332, 0.19928956, 0.19187633, 0.07475505]]),\n", - " 'biomass': array([[0.00701033, 0.15892619, 0.20568319, 0.18582481, 0.20208267],\n", - " [0.19648045, 0.12087831, 0.13045852, 0.20692957, 0.18497234],\n", - " [0.01050586, 0.12645746, 0.15254147, 0.08085942, 0.19645658],\n", - " [0.11617537, 0.07913326, 0.0257437 , 0.03235609, 0.17136005],\n", - " [0.17741222, 0.13631017, 0.19228697, 0.1907388 , 0.15177616]])},\n", + " {'fields': {'glucose': array([[ 8.1275173 , 16.41701224, 14.42334757, 6.88153054, 18.19393764],\n", + " [11.75260781, 11.95520137, 4.78639939, 9.0680221 , 18.49168328],\n", + " [ 2.67717872, 12.91025271, 1.08400493, 4.69166025, 9.76966565],\n", + " [11.8677355 , 17.87054027, 9.6750857 , 2.89591097, 7.52259307],\n", + " [ 0.56165366, 7.09685764, 3.58315868, 7.24868567, 3.66327788]]),\n", + " 'acetate': array([[0.04663064, 0.1913742 , 0.15232374, 0.06755452, 0.15813769],\n", + " [0.12991183, 0.03639377, 0.04848602, 0.15886193, 0.12890896],\n", + " [0. , 0.11719266, 0. , 0.06001774, 0.04538073],\n", + " [0.16966296, 0.20784714, 0.07035575, 0. , 0.12723903],\n", + " [0. , 0.06104751, 0. , 0.04810332, 0. ]]),\n", + " 'biomass': array([[0.06685127, 0.17928891, 0.14985837, 0.11403747, 0.14381089],\n", + " [0.14032936, 0.03958117, 0.16011636, 0.19864332, 0.11685262],\n", + " [0.07911362, 0.1212375 , 0.01136611, 0.19561115, 0.05585039],\n", + " [0.18125093, 0.18951505, 0.08650483, 0.03623486, 0.1869319 ],\n", + " [0.1422459 , 0.09998782, 0.02345702, 0.07777426, 0.04633903]])},\n", " 'time': 10.0}]" ] }, @@ -645,19 +623,7 @@ "outputs_hidden": false } }, - "outputs": [ - { - "ename": "TypeError", - "evalue": "list indices must be integers or slices, not str", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m plot_results(\u001b[43mresults\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mresults\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m)\n", - "\u001b[0;31mTypeError\u001b[0m: list indices must be integers or slices, not str" - ] - } - ], + "outputs": [], "source": [ "# plot_results(results['results'])" ] @@ -809,106 +775,106 @@ "name": "stdout", "output_type": "stream", "text": [ - "[{'fields': {'glucose': array([[11.49673574, 0.68256312, 18.54146763, 0.95746649],\n", - " [ 3.19256133, 7.66018853, 5.83104959, 15.26516279],\n", - " [11.02857073, 8.32815473, 13.70634628, 3.93032842],\n", - " [17.69033152, 17.09328189, 9.9747383 , 3.19076489]]), 'acetate': array([[0., 0., 0., 0.],\n", + "[{'fields': {'glucose': array([[ 6.3778075 , 19.22653031, 18.34401593, 13.04759822],\n", + " [10.70063161, 1.34591456, 6.24732449, 8.15221775],\n", + " [15.57146219, 15.31785191, 7.82161606, 9.84856477],\n", + " [13.48377254, 16.31984105, 19.90598232, 10.41022059]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.05699761, 0.09481982, 0.02570525, 0.02258643],\n", - " [0.01204724, 0.01354382, 0.08648323, 0.00512884],\n", - " [0.04747683, 0.04636961, 0.06420193, 0.01107399],\n", - " [0.02910536, 0.04286344, 0.03248139, 0.09196548]])}, 'time': 0.0}, {'fields': {'glucose': array([[ 9.84321673, 3.73152289, 14.39153868, 3.76520899],\n", - " [ 5.00816707, 6.9420476 , 8.21497622, 12.28942337],\n", - " [10.77908124, 9.56199548, 11.56953882, 5.64172408],\n", - " [16.88162215, 15.68484685, 10.22024593, 4.04455588]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[1.22492592e-03, 6.32134456e-02, 8.07464051e-02, 2.18643878e-02],\n", + " [9.20626967e-02, 6.95026218e-05, 1.68679860e-02, 8.04637811e-02],\n", + " [5.71227249e-02, 3.67712875e-02, 6.85828083e-02, 1.84582320e-02],\n", + " [8.11143656e-02, 6.03052318e-02, 8.00668469e-02, 9.89941840e-02]])}, 'time': 0.0}, {'fields': {'glucose': array([[ 7.91099702, 16.42347263, 16.69270908, 13.03018209],\n", + " [10.10414476, 5.32156803, 7.43431668, 8.64163127],\n", + " [14.79321719, 13.72409232, 9.48771404, 9.69451891],\n", + " [13.9305705 , 16.12325668, 17.63446039, 11.17450021]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.05583965, 0.07821721, 0.03585772, 0.02217968],\n", - " [0.02031254, 0.02884648, 0.06638537, 0.0145901 ],\n", - " [0.04272558, 0.04489545, 0.05684999, 0.02269962],\n", - " [0.03197847, 0.04140733, 0.04104784, 0.07901724]])}, 'time': 1.0}, {'fields': {'glucose': array([[ 8.89969323, 5.4619349 , 12.00368391, 5.46458495],\n", - " [ 6.14917075, 7.03922604, 9.08402553, 10.64203344],\n", - " [10.7418569 , 10.07143104, 10.54527385, 6.58638811],\n", - " [16.10231093, 14.69053841, 10.2186389 , 4.8689211 ]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.01499548, 0.0539746 , 0.06817446, 0.03211996],\n", + " [0.07313834, 0.01842942, 0.03059766, 0.06502197],\n", + " [0.05982446, 0.04092131, 0.05912082, 0.03501529],\n", + " [0.0768812 , 0.06182664, 0.07803044, 0.08985677]])}, 'time': 1.0}, {'fields': {'glucose': array([[ 8.88250739, 14.68883607, 15.40050922, 12.9156302 ],\n", + " [10.01878253, 7.63189584, 8.4914099 , 9.09241534],\n", + " [14.13395173, 13.00326241, 10.38607144, 9.80297837],\n", + " [14.1850187 , 15.73394296, 16.15443844, 11.59970126]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.05432848, 0.06795805, 0.04046046, 0.02334962],\n", - " [0.02681797, 0.03661665, 0.05537098, 0.0208532 ],\n", - " [0.04014386, 0.04402434, 0.05211067, 0.03015918],\n", - " [0.0338317 , 0.04108512, 0.04550276, 0.07023723]])}, 'time': 2.0}, {'fields': {'glucose': array([[ 8.37387799, 6.47715147, 10.60116401, 6.51165215],\n", - " [ 6.91987863, 7.3841729 , 9.31217732, 9.71101493],\n", - " [10.76619303, 10.27355099, 10.02975927, 7.14524345],\n", - " [15.39142651, 13.93602068, 10.13830896, 5.59811968]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.02383926, 0.04884306, 0.06026169, 0.03816278],\n", + " [0.0621857 , 0.02947781, 0.0381447 , 0.05693893],\n", + " [0.06038576, 0.04454673, 0.05530037, 0.04443401],\n", + " [0.07376569, 0.06270954, 0.07535618, 0.08357661]])}, 'time': 2.0}, {'fields': {'glucose': array([[ 9.52353716, 13.58898269, 14.42021479, 12.7536738 ],\n", + " [10.15129236, 9.02446067, 9.32938312, 9.50793614],\n", + " [13.63494591, 12.67972186, 10.9047692 , 10.0183668 ],\n", + " [14.28932825, 15.30787258, 15.15299432, 11.83387216]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.05285174, 0.06131141, 0.04230678, 0.02512742],\n", - " [0.03169022, 0.04051777, 0.04926208, 0.02525544],\n", - " [0.03891794, 0.04346113, 0.04910138, 0.03493071],\n", - " [0.03512195, 0.04124004, 0.04761817, 0.06413609]])}, 'time': 3.0}, {'fields': {'glucose': array([[ 8.09901016, 7.0959645 , 9.76254908, 7.16723594],\n", - " [ 7.47139617, 7.75522564, 9.29206162, 9.17615043],\n", - " [10.79418703, 10.34283899, 9.75254988, 7.50414786],\n", - " [14.75766886, 13.33608694, 10.04436751, 6.21827139]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.02968054, 0.04608875, 0.05523553, 0.04176338],\n", + " [0.05588051, 0.03623581, 0.04242723, 0.05285241],\n", + " [0.06003233, 0.04750067, 0.05409858, 0.04986906],\n", + " [0.0713422 , 0.06314009, 0.07276781, 0.07901391]])}, 'time': 3.0}, {'fields': {'glucose': array([[ 9.96476277, 12.87798395, 13.68747009, 12.57797178],\n", + " [10.36239773, 9.89472631, 9.96061424, 9.88105796],\n", + " [13.27826088, 12.53477254, 11.22705095, 10.26604967],\n", + " [14.28850769, 14.90627406, 14.45314213, 11.96030906]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.05153669, 0.0567995 , 0.0428363 , 0.02704465],\n", - " [0.03523499, 0.04242577, 0.04584205, 0.02850574],\n", - " [0.03850262, 0.04308757, 0.04719454, 0.03798041],\n", - " [0.03609919, 0.04154836, 0.04843036, 0.05978155]])}, 'time': 4.0}, {'fields': {'glucose': array([[ 7.97682768, 7.49024957, 9.25422001, 7.5839478 ],\n", - " [ 7.88266151, 8.07749046, 9.19428493, 8.86624808],\n", - " [10.80644637, 10.35216603, 9.59180615, 7.7551075 ],\n", - " [14.1979645 , 12.84511977, 9.95921444, 6.73595719]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.0336664 , 0.04470941, 0.05203662, 0.043944 ],\n", + " [0.05229687, 0.04046768, 0.04496786, 0.05092062],\n", + " [0.05935924, 0.04979924, 0.05403216, 0.05304451],\n", + " [0.06937532, 0.06325873, 0.07050836, 0.07554179]])}, 'time': 4.0}, {'fields': {'glucose': array([[10.28172785, 12.41194967, 13.14338435, 12.40857953],\n", + " [10.58785311, 10.45786217, 10.42543865, 10.20694295],\n", + " [13.03105568, 12.46847644, 11.44150121, 10.5106188 ],\n", + " [14.21976218, 14.54916954, 13.95052667, 12.02650301]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.05040417, 0.05360403, 0.04278217, 0.02888652],\n", - " [0.03776676, 0.04330798, 0.04391777, 0.03099612],\n", - " [0.03854789, 0.04284548, 0.04597557, 0.03992983],\n", - " [0.03689612, 0.04186489, 0.04853825, 0.05658672]])}, 'time': 5.0}, {'fields': {'glucose': array([[ 7.9477474 , 7.754542 , 8.94380025, 7.85299323],\n", - " [ 8.19776391, 8.3350965 , 9.08849365, 8.68758522],\n", - " [10.79899193, 10.33246239, 9.49175335, 7.94450688],\n", - " [13.70519795, 12.43590563, 9.88837203, 7.16449965]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.03648696, 0.0441248 , 0.05001641, 0.04529864],\n", + " [0.05031372, 0.04320128, 0.04656477, 0.05013391],\n", + " [0.05863781, 0.05152941, 0.05439108, 0.05491384],\n", + " [0.0677308 , 0.0631663 , 0.06861617, 0.07280292]])}, 'time': 5.0}, {'fields': {'glucose': array([[10.51907603, 12.10411416, 12.7404631 , 12.25593999],\n", + " [10.79982929, 10.83448471, 10.76513213, 10.48518271],\n", + " [12.86205722, 12.43561799, 11.59245833, 10.73610307],\n", + " [14.11067167, 14.2394434 , 13.58110706, 12.05967095]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.049437 , 0.05125844, 0.04250934, 0.03056526],\n", - " [0.03955171, 0.04366608, 0.04283744, 0.03295528],\n", - " [0.03883623, 0.04269792, 0.0451816 , 0.04117543],\n", - " [0.03758117, 0.0421347 , 0.04828408, 0.05417858]])}, 'time': 6.0}, {'fields': {'glucose': array([[ 7.97478488, 7.94183345, 8.75461426, 8.02991617],\n", - " [ 8.44329871, 8.53350052, 8.99955938, 8.58751595],\n", - " [10.77357056, 10.29753093, 9.42600231, 8.09628602],\n", - " [13.27136677, 12.0904719 , 9.83125125, 7.51820893]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.03856191, 0.04399849, 0.04876863, 0.04617397],\n", + " [0.04927475, 0.04503581, 0.04763857, 0.04993995],\n", + " [0.05797842, 0.052798 , 0.0548499 , 0.05601205],\n", + " [0.06632822, 0.06293382, 0.06705248, 0.07058386]])}, 'time': 6.0}, {'fields': {'glucose': array([[10.70376468, 11.90065818, 12.44244505, 12.12435717],\n", + " [10.98795633, 11.09429338, 11.01375248, 10.71876916],\n", + " [12.74638559, 12.41607494, 11.70320766, 10.93632915],\n", + " [13.98041623, 13.9734732 , 13.30411946, 12.07534915]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.0486086 , 0.04948709, 0.04219193, 0.03205517],\n", - " [0.04079703, 0.04376128, 0.04223955, 0.03452502],\n", - " [0.03923628, 0.04261741, 0.04464991, 0.04196927],\n", - " [0.03818862, 0.04234526, 0.04786082, 0.05231702]])}, 'time': 7.0}, {'fields': {'glucose': array([[ 8.03458828, 8.08234764, 8.64127314, 8.14908682],\n", - " [ 8.63657843, 8.68398459, 8.93337387, 8.53565783],\n", - " [10.73367854, 10.25415817, 9.38133741, 8.22318919],\n", - " [12.88881376, 11.79599617, 9.78547418, 7.81017396]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.04014958, 0.04413473, 0.0480334 , 0.04677266],\n", + " [0.04879322, 0.04632166, 0.04841246, 0.05003843],\n", + " [0.0574151 , 0.05370681, 0.05527121, 0.05664465],\n", + " [0.0651161 , 0.06261103, 0.0657578 , 0.06874997]])}, 'time': 7.0}, {'fields': {'glucose': array([[10.85242367, 11.76732391, 12.22233319, 12.01451846],\n", + " [11.15000747, 11.27878495, 11.19707384, 10.91258499],\n", + " [12.66587602, 12.40114555, 11.78674724, 11.11008001],\n", + " [13.84172161, 13.74568581, 13.09276736, 12.08227773]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.04789379, 0.04812025, 0.04190638, 0.03335951],\n", - " [0.04165707, 0.04372969, 0.04192053, 0.03579888],\n", - " [0.03967133, 0.04258275, 0.04428118, 0.0424717 ],\n", - " [0.03873535, 0.04250162, 0.04737526, 0.05084498]])}, 'time': 8.0}, {'fields': {'glucose': array([[ 8.1122641 , 8.19359018, 8.57632741, 8.23204396],\n", - " [ 8.78962989, 8.79778518, 8.88846882, 8.51398657],\n", - " [10.68299176, 10.20614969, 9.35057911, 8.33228627],\n", - " [12.5506566 , 11.54286193, 9.74849609, 8.05159442]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.04141106, 0.04441906, 0.04764126, 0.04721304],\n", + " [0.04863966, 0.04726504, 0.04900614, 0.05026807],\n", + " [0.05694828, 0.05434274, 0.05560703, 0.0569897 ],\n", + " [0.06405899, 0.06223282, 0.06467462, 0.06721129]])}, 'time': 8.0}, {'fields': {'glucose': array([[10.97553809, 11.68179112, 12.06023242, 11.92516335],\n", + " [11.28733743, 11.41337804, 11.33380562, 11.07220892],\n", + " [12.60793625, 12.38726462, 11.85085481, 11.25858713],\n", + " [13.70267295, 13.55040462, 12.9289401 , 12.08523633]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.04727192, 0.04704867, 0.04168033, 0.03449378],\n", - " [0.04224402, 0.04364196, 0.04176403, 0.03684216],\n", - " [0.04009852, 0.04257781, 0.04401514, 0.04278507],\n", - " [0.03922979, 0.04261446, 0.04688479, 0.04965781]])}, 'time': 9.0}, {'fields': {'glucose': array([[ 8.19829013, 8.2858391 , 8.54282389, 8.29240713],\n", - " [ 8.91122664, 8.884254 , 8.86107722, 8.51151391],\n", - " [10.62479728, 10.15591766, 9.32944038, 8.42771718],\n", - " [12.25088594, 11.32364015, 9.71813105, 8.25175031]]), 'acetate': array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]), 'biomass': array([[0.04244828, 0.04478404, 0.04747983, 0.04756377],\n", + " [0.04867703, 0.04798847, 0.04948485, 0.05054411],\n", + " [0.05656569, 0.05477555, 0.05584977, 0.0571535 ],\n", + " [0.06313081, 0.06182364, 0.06375495, 0.06590451]])}, 'time': 9.0}, {'fields': {'glucose': array([[11.07987203, 11.62921223, 11.9415101 , 11.8541192 ],\n", + " [11.40267456, 11.5140617 , 11.43725166, 11.20315459],\n", + " [12.56415326, 12.37313277, 11.90052251, 11.38419853],\n", + " [13.56815585, 13.38251566, 12.80010375, 12.0867134 ]]), 'acetate': array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", - " [0., 0., 0., 0.]]), 'biomass': array([[0.04672699, 0.04619884, 0.04151806, 0.03547752],\n", - " [0.04263833, 0.04353426, 0.04170255, 0.03770259],\n", - " [0.04049559, 0.04259083, 0.04381527, 0.04297512],\n", - " [0.0396766 , 0.04269474, 0.04641867, 0.0486843 ]])}, 'time': 10.0}]\n" + " [0., 0., 0., 0.]]), 'biomass': array([[0.04332671, 0.04518964, 0.04747347, 0.04786426],\n", + " [0.04882299, 0.04856568, 0.0498851 , 0.05082378],\n", + " [0.05625195, 0.05505925, 0.05600839, 0.05720113],\n", + " [0.06231129, 0.06140061, 0.0629614 , 0.06478314]])}, 'time': 10.0}]\n" ] } ], @@ -992,25 +958,642 @@ "metadata": {}, "outputs": [ { - "ename": "KeyError", - "evalue": "'_type'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[13], line 87\u001b[0m\n\u001b[1;32m 30\u001b[0m composite_state \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 31\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfields\u001b[39m\u001b[38;5;124m'\u001b[39m: {\n\u001b[1;32m 32\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_type\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 82\u001b[0m }\n\u001b[1;32m 83\u001b[0m }\n\u001b[1;32m 85\u001b[0m sim \u001b[38;5;241m=\u001b[39m Composite({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstate\u001b[39m\u001b[38;5;124m'\u001b[39m: composite_state}, core\u001b[38;5;241m=\u001b[39mcore)\n\u001b[0;32m---> 87\u001b[0m \u001b[43msim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m10.0\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:1087\u001b[0m, in \u001b[0;36mComposite.update\u001b[0;34m(self, state, interval)\u001b[0m\n\u001b[1;32m 1078\u001b[0m projection \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcore\u001b[38;5;241m.\u001b[39mproject(\n\u001b[1;32m 1079\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minterface()[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minputs\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 1080\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbridge[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minputs\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 1081\u001b[0m [],\n\u001b[1;32m 1082\u001b[0m state)\n\u001b[1;32m 1084\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmerge(\n\u001b[1;32m 1085\u001b[0m projection)\n\u001b[0;32m-> 1087\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43minterval\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1089\u001b[0m updates \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbridge_updates\n\u001b[1;32m 1090\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbridge_updates \u001b[38;5;241m=\u001b[39m []\n", - "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:927\u001b[0m, in \u001b[0;36mComposite.run\u001b[0;34m(self, interval, force_complete)\u001b[0m\n\u001b[1;32m 925\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m path \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprocess_paths:\n\u001b[1;32m 926\u001b[0m process \u001b[38;5;241m=\u001b[39m get_path(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate, path)\n\u001b[0;32m--> 927\u001b[0m full_step \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_process\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 928\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 929\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocess\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 930\u001b[0m \u001b[43m \u001b[49m\u001b[43mend_time\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 931\u001b[0m \u001b[43m \u001b[49m\u001b[43mfull_step\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 932\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_complete\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 934\u001b[0m \u001b[38;5;66;03m# apply updates based on process times in self.front\u001b[39;00m\n\u001b[1;32m 935\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m full_step \u001b[38;5;241m==\u001b[39m math\u001b[38;5;241m.\u001b[39minf:\n\u001b[1;32m 936\u001b[0m \u001b[38;5;66;03m# no processes ran, jump to next process\u001b[39;00m\n", - "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:824\u001b[0m, in \u001b[0;36mComposite.run_process\u001b[0;34m(self, path, process, end_time, full_step, force_complete)\u001b[0m\n\u001b[1;32m 821\u001b[0m full_step \u001b[38;5;241m=\u001b[39m interval\n\u001b[1;32m 823\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m future \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m end_time:\n\u001b[0;32m--> 824\u001b[0m update \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess_update\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 825\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 826\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocess\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 827\u001b[0m \u001b[43m \u001b[49m\u001b[43mstate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 828\u001b[0m \u001b[43m \u001b[49m\u001b[43mprocess_interval\u001b[49m\n\u001b[1;32m 829\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 831\u001b[0m \u001b[38;5;66;03m# update front, to be applied at its projected time\u001b[39;00m\n\u001b[1;32m 832\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfront[path][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m future\n", - "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:766\u001b[0m, in \u001b[0;36mComposite.process_update\u001b[0;34m(self, path, process, states, interval, ports_key)\u001b[0m\n\u001b[1;32m 739\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mprocess_update\u001b[39m(\n\u001b[1;32m 740\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 741\u001b[0m path,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 744\u001b[0m interval,\n\u001b[1;32m 745\u001b[0m ports_key\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m 747\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Start generating a process's update.\u001b[39;00m\n\u001b[1;32m 748\u001b[0m \n\u001b[1;32m 749\u001b[0m \u001b[38;5;124;03m This function is similar to :py:meth:`_invoke_process` except in\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 764\u001b[0m \u001b[38;5;124;03m ``store``.\u001b[39;00m\n\u001b[1;32m 765\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 766\u001b[0m update \u001b[38;5;241m=\u001b[39m \u001b[43mprocess\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43minstance\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minvoke\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 768\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdefer_project\u001b[39m(update, args):\n\u001b[1;32m 769\u001b[0m schema, state, path \u001b[38;5;241m=\u001b[39m args\n", - "File \u001b[0;32m~/code/process-bigraph/process_bigraph/composite.py:319\u001b[0m, in \u001b[0;36mProcess.invoke\u001b[0;34m(self, state, interval)\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minvoke\u001b[39m(\u001b[38;5;28mself\u001b[39m, state, interval):\n\u001b[0;32m--> 319\u001b[0m update \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 320\u001b[0m sync \u001b[38;5;241m=\u001b[39m SyncUpdate(update)\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sync\n", - "Cell \u001b[0;32mIn[11], line 74\u001b[0m, in \u001b[0;36mDiffusionAdvection.update\u001b[0;34m(self, state, interval)\u001b[0m\n\u001b[1;32m 69\u001b[0m fields_update \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m species, field \u001b[38;5;129;01min\u001b[39;00m fields\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 71\u001b[0m fields_update[species] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdiffusion_delta(\n\u001b[1;32m 72\u001b[0m field,\n\u001b[1;32m 73\u001b[0m interval,\n\u001b[0;32m---> 74\u001b[0m diffusion_coeff\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdiffusion_coeffs\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[43mspecies\u001b[49m\u001b[43m]\u001b[49m,\n\u001b[1;32m 75\u001b[0m advection_coeff\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madvection_coeffs\u001b[39m\u001b[38;5;124m'\u001b[39m][species]\n\u001b[1;32m 76\u001b[0m )\n\u001b[1;32m 78\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 79\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfields\u001b[39m\u001b[38;5;124m'\u001b[39m: fields_update\n\u001b[1;32m 80\u001b[0m }\n", - "\u001b[0;31mKeyError\u001b[0m: '_type'" + "name": "stdout", + "output_type": "stream", + "text": [ + "{('emitter',): [{'fields': {'glucose': array([[ 3.82126173, 3.12636203, 8.22889632, 17.56733378, 9.73343781,\n", + " 0.31601036, 8.1821953 , 3.08994108, 8.06914903, 14.99527261],\n", + " [10.07156141, 3.52828765, 1.31190908, 4.24779386, 18.99041128,\n", + " 2.46544413, 14.21736908, 18.56246038, 12.40297421, 2.21408072],\n", + " [18.94420483, 13.70246869, 4.57396732, 10.8122537 , 7.38989862,\n", + " 16.78092721, 4.98489295, 2.59636159, 19.55761987, 0.90474753],\n", + " [11.92760396, 18.17486444, 10.97201684, 2.11927962, 9.38597731,\n", + " 6.02713358, 1.53960068, 13.74875238, 5.21003044, 9.44833266],\n", + " [ 9.32633965, 9.76796857, 16.73425389, 19.5525409 , 5.45817916,\n", + " 9.99496607, 5.82465315, 14.28741657, 14.42171748, 10.16918618],\n", + " [ 9.10862658, 6.84781818, 11.62278588, 11.4607051 , 3.95802964,\n", + " 4.72677715, 10.51982268, 2.64383585, 11.64272948, 12.69519414],\n", + " [ 5.69885288, 4.48548957, 6.36648647, 0.20539891, 13.15649957,\n", + " 1.44902334, 12.6504334 , 15.15818063, 12.13369899, 0.07686751],\n", + " [ 7.01522932, 19.29669429, 0.76477955, 10.75726936, 7.46574612,\n", + " 8.55671029, 3.59279893, 9.65385724, 15.3714715 , 5.46855368],\n", + " [18.04089068, 17.62155866, 16.31874208, 6.9022857 , 3.07346873,\n", + " 4.25060792, 17.52441299, 2.62862301, 16.8026227 , 3.21312078],\n", + " [ 3.07183598, 4.42490798, 9.05821636, 17.91323437, 17.87274517,\n", + " 5.111423 , 0.29492852, 9.89584752, 13.66735216, 5.6826724 ]]), 'acetate': array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]), 'biomass': array([[0.08604086, 0.03302994, 0.06807024, 0.02809788, 0.03389805,\n", + " 0.00923769, 0.00387872, 0.01822238, 0.00526079, 0.01046659],\n", + " [0.00499364, 0.08351803, 0.06797482, 0.01127102, 0.09864247,\n", + " 0.03226925, 0.06828779, 0.01183665, 0.01748456, 0.07014272],\n", + " [0.00811581, 0.07239723, 0.03976824, 0.08165344, 0.06025926,\n", + " 0.04980458, 0.05151466, 0.02476535, 0.03394666, 0.02144946],\n", + " [0.07002669, 0.02121687, 0.01639185, 0.01690746, 0.09933419,\n", + " 0.05369704, 0.0630521 , 0.08130519, 0.07991097, 0.04929892],\n", + " [0.01008635, 0.00442297, 0.04971321, 0.0338883 , 0.02937761,\n", + " 0.06892877, 0.06698683, 0.0230541 , 0.02004484, 0.08789833],\n", + " [0.08523132, 0.03232749, 0.09910479, 0.01961684, 0.00139808,\n", + " 0.09434443, 0.07528768, 0.06671021, 0.00926822, 0.01007608],\n", + " [0.04812355, 0.08222086, 0.00042157, 0.06016274, 0.0385797 ,\n", + " 0.06955171, 0.0639717 , 0.0221655 , 0.03210612, 0.08435087],\n", + " [0.02210327, 0.08541766, 0.03999851, 0.0276389 , 0.09508208,\n", + " 0.07644128, 0.02193961, 0.05804431, 0.03867814, 0.08293876],\n", + " [0.00557096, 0.02256939, 0.00293057, 0.07195997, 0.02510287,\n", + " 0.04244563, 0.06480956, 0.00126045, 0.01197891, 0.06278026],\n", + " [0.05300538, 0.01336124, 0.0616027 , 0.08464584, 0.07881536,\n", + " 0.06058593, 0.03211505, 0.04638376, 0.09872545, 0.09189502]])}, 'time': 0.0}, {'fields': {'glucose': array([[ 4.31163516, 3.76368257, 7.88176905, 14.79010774, 10.16892358,\n", + " 2.32273191, 7.6274915 , 5.31774104, 8.66839193, 13.15507089],\n", + " [ 9.68786348, 4.7730571 , 2.90223274, 6.74027721, 14.59206534,\n", + " 5.68941109, 12.12567673, 14.94154897, 11.99310578, 4.23387897],\n", + " [16.91094428, 12.69794049, 6.14107213, 8.95384519, 9.16833498,\n", + " 12.92706052, 6.32028145, 6.30970993, 14.79584837, 3.4091276 ],\n", + " [12.67365613, 15.81143858, 10.81710216, 5.58705546, 8.20073991,\n", + " 6.9955049 , 3.74716603, 11.18264674, 7.95078568, 8.55131687],\n", + " [ 9.65440036, 10.71764668, 15.16337871, 15.82381218, 7.10612713,\n", + " 8.52830637, 6.82584039, 12.43822527, 12.97727851, 10.47259968],\n", + " [ 8.58290636, 7.5875987 , 10.96634819, 10.53376897, 5.58620187,\n", + " 5.3550018 , 9.1518531 , 6.02543584, 11.21379652, 11.285272 ],\n", + " [ 6.14200435, 6.08193604, 6.03278216, 3.55688088, 9.94195783,\n", + " 4.13492919, 10.89619157, 13.0601376 , 11.46538378, 2.83304856],\n", + " [ 8.78308004, 15.24372075, 4.78423402, 8.69381881, 7.66777035,\n", + " 7.26236911, 6.25744152, 9.55921303, 13.60299058, 5.74064977],\n", + " [15.63012577, 16.11764986, 13.78399649, 8.47185674, 5.28809194,\n", + " 5.60879539, 12.60758344, 6.11833374, 13.99659019, 4.79861324],\n", + " [ 4.61060226, 6.03435465, 9.94645575, 15.94976165, 15.2380789 ,\n", + " 5.81242623, 3.02117206, 8.88115552, 12.58961299, 6.18524962]]), 'acetate': array([[0.00000000e+00, 0.00000000e+00, 6.92884034e-03, 4.52100721e-03,\n", + " 4.02044350e-03, 0.00000000e+00, 3.92426855e-04, 0.00000000e+00,\n", + " 5.24276878e-04, 1.58810027e-03],\n", + " [6.07846683e-04, 0.00000000e+00, 0.00000000e+00, 6.64013677e-05,\n", + " 1.62697325e-02, 0.00000000e+00, 1.01287950e-02, 1.93868421e-03,\n", + " 2.42662721e-03, 0.00000000e+00],\n", + " [1.33760496e-03, 1.05602918e-02, 7.71819562e-04, 1.04440664e-02,\n", + " 5.40091879e-03, 7.88842741e-03, 1.75913410e-03, 0.00000000e+00,\n", + " 5.64820845e-03, 0.00000000e+00],\n", + " [9.51154154e-03, 3.45197612e-03, 2.11678127e-03, 0.00000000e+00,\n", + " 1.14408477e-02, 3.39423894e-03, 0.00000000e+00, 1.18782229e-02,\n", + " 3.30228134e-03, 5.70922301e-03],\n", + " [1.15551731e-03, 5.26032725e-04, 7.86617776e-03, 5.63807234e-03,\n", + " 1.42792697e-03, 8.34278750e-03, 3.90629990e-03, 3.42691056e-03,\n", + " 2.99177353e-03, 1.07752964e-02],\n", + " [9.56811473e-03, 2.59568769e-03, 1.32609715e-02, 2.60299132e-03,\n", + " 0.00000000e+00, 2.37371152e-03, 9.45352689e-03, 0.00000000e+00,\n", + " 1.24141132e-03, 1.41569234e-03],\n", + " [2.65214607e-03, 1.30864659e-03, 2.98343130e-05, 0.00000000e+00,\n", + " 5.51905137e-03, 0.00000000e+00, 8.97156659e-03, 3.37803750e-03,\n", + " 4.40296222e-03, 0.00000000e+00],\n", + " [1.84164430e-03, 1.41561690e-02, 0.00000000e+00, 3.52330151e-03,\n", + " 8.63657125e-03, 8.09735947e-03, 0.00000000e+00, 6.83990725e-03,\n", + " 5.92771479e-03, 4.05547303e-03],\n", + " [9.04240383e-04, 3.63519206e-03, 4.59514091e-04, 5.84985660e-03,\n", + " 0.00000000e+00, 2.55348139e-04, 1.04194647e-02, 0.00000000e+00,\n", + " 1.89817804e-03, 0.00000000e+00],\n", + " [0.00000000e+00, 1.79749765e-04, 6.88179745e-03, 1.37075501e-02,\n", + " 1.27539439e-02, 2.31754851e-03, 0.00000000e+00, 5.57198797e-03,\n", + " 1.43834827e-02, 5.02571342e-03]]), 'biomass': array([[0.08057403, 0.04701196, 0.06676388, 0.03387483, 0.03913097,\n", + " 0.0144205 , 0.01151938, 0.01723946, 0.00889548, 0.01615073],\n", + " [0.0201009 , 0.07612373, 0.06613336, 0.03106734, 0.08508503,\n", + " 0.04178906, 0.05910791, 0.01986319, 0.02335611, 0.06060675],\n", + " [0.01983777, 0.06629399, 0.04865253, 0.0724074 , 0.07019419,\n", + " 0.05457981, 0.05512341, 0.03354138, 0.03774312, 0.03054787],\n", + " [0.06085947, 0.02946759, 0.02438046, 0.03136165, 0.08733912,\n", + " 0.06278459, 0.06673004, 0.07599593, 0.07403457, 0.05612464],\n", + " [0.02217408, 0.01462993, 0.04912238, 0.03608968, 0.03905358,\n", + " 0.07134774, 0.06916277, 0.03705505, 0.03215089, 0.07874524],\n", + " [0.07761435, 0.04554835, 0.08232088, 0.03060312, 0.01788119,\n", + " 0.08745378, 0.07880774, 0.06057383, 0.01905003, 0.02429195],\n", + " [0.0550798 , 0.07492648, 0.0231501 , 0.04999575, 0.04741963,\n", + " 0.07251192, 0.06412357, 0.03464356, 0.03754817, 0.07330255],\n", + " [0.03050359, 0.07609367, 0.03980957, 0.04182177, 0.0846782 ,\n", + " 0.07555783, 0.03766505, 0.05136314, 0.04445385, 0.08297112],\n", + " [0.01374176, 0.02669487, 0.01888297, 0.06619059, 0.04244599,\n", + " 0.05055399, 0.05741037, 0.01672299, 0.02706566, 0.06755898],\n", + " [0.04906176, 0.02296113, 0.05951184, 0.08626347, 0.07931574,\n", + " 0.06286657, 0.03940351, 0.049833 , 0.09332323, 0.09616132]])}, 'time': 1.0}, {'fields': {'glucose': array([[ 4.73451365, 4.31985082, 7.61707945, 12.94964984, 10.1216048 ,\n", + " 3.94792143, 7.40437789, 6.65554227, 9.06194312, 11.8989265 ],\n", + " [ 9.3737015 , 5.65011158, 4.24372236, 7.84257288, 12.26670637,\n", + " 7.19740427, 10.8162124 , 12.81596042, 11.3546022 , 5.67337675],\n", + " [15.37270776, 11.93678465, 7.0746198 , 8.3643867 , 9.57829349,\n", + " 10.91425298, 7.16105274, 8.03082641, 12.28641642, 4.96333455],\n", + " [12.89755302, 14.30667671, 10.75041418, 7.34912768, 7.93694404,\n", + " 7.36017572, 5.1999354 , 9.98386051, 9.06772134, 8.27942026],\n", + " [ 9.94750273, 11.1013788 , 13.89185664, 13.5802373 , 7.84452678,\n", + " 7.86738431, 7.31203929, 11.26733319, 12.05259811, 10.43246033],\n", + " [ 8.35332973, 8.12314772, 10.43199054, 9.94773276, 6.49208859,\n", + " 5.87046096, 8.49600637, 7.778592 , 10.89881734, 10.4556254 ],\n", + " [ 6.64906339, 6.93697543, 6.33619528, 5.28228669, 8.39589869,\n", + " 5.48781008, 9.88155451, 11.75756105, 10.9148672 , 4.62390135],\n", + " [ 9.60481243, 13.01284379, 6.77827532, 7.95014123, 7.57211682,\n", + " 6.87122253, 7.42613554, 9.60350178, 12.24563841, 6.12402295],\n", + " [14.00254829, 14.65523066, 12.43416877, 9.19986504, 6.67448943,\n", + " 6.29465931, 10.14786573, 7.74920966, 12.29326806, 5.79306669],\n", + " [ 5.7850367 , 7.22208507, 10.37763455, 14.50025375, 13.42539089,\n", + " 6.39714816, 4.60667953, 8.49056678, 11.59585838, 6.60587695]]), 'acetate': array([[0.00079365, 0.00063565, 0.01192746, 0.00947765, 0.00942783,\n", + " 0.00062893, 0.00220401, 0.00110745, 0.00170609, 0.00366559],\n", + " [0.00305681, 0.00297199, 0.00088045, 0.00495972, 0.02438401,\n", + " 0.00495981, 0.01517374, 0.00532577, 0.00544566, 0.00073139],\n", + " [0.00581644, 0.01678362, 0.00555441, 0.01564483, 0.01494232,\n", + " 0.01405139, 0.00654362, 0.00408087, 0.00999549, 0.00101364],\n", + " [0.01608429, 0.00865739, 0.00574853, 0.00401294, 0.01742337,\n", + " 0.00965285, 0.0018463 , 0.01836883, 0.01151612, 0.01136219],\n", + " [0.00516535, 0.00367071, 0.01432717, 0.0104522 , 0.0063067 ,\n", + " 0.01405117, 0.00986047, 0.00899276, 0.00816554, 0.01857539],\n", + " [0.01584957, 0.00796506, 0.020382 , 0.00711309, 0.00210329,\n", + " 0.00708607, 0.01633369, 0.00537847, 0.00419214, 0.00531083],\n", + " [0.00674526, 0.00735658, 0.00282092, 0.00110087, 0.01015171,\n", + " 0.00210546, 0.01529592, 0.00880261, 0.00880573, 0.00091524],\n", + " [0.00613191, 0.02145854, 0.00264695, 0.00808803, 0.01498621,\n", + " 0.01283013, 0.00525493, 0.01144363, 0.01172984, 0.0081908 ],\n", + " [0.00334625, 0.00781849, 0.00456547, 0.01238384, 0.00422828,\n", + " 0.00459655, 0.01510593, 0.00313645, 0.00702127, 0.00296415],\n", + " [0.00119104, 0.0025634 , 0.01349539, 0.02548505, 0.02282976,\n", + " 0.00660321, 0.00158569, 0.01086409, 0.02459429, 0.01179396]]), 'biomass': array([[0.07828787, 0.05728615, 0.06730756, 0.04033219, 0.04349409,\n", + " 0.02059622, 0.01750581, 0.01812553, 0.01273189, 0.02078817],\n", + " [0.03224072, 0.07278447, 0.06717278, 0.04444826, 0.0784066 ,\n", + " 0.04839362, 0.05465686, 0.02621373, 0.02820923, 0.05524334],\n", + " [0.02939798, 0.06361631, 0.05486396, 0.06943058, 0.0757993 ,\n", + " 0.06026237, 0.05865851, 0.04095297, 0.04195562, 0.03840353],\n", + " [0.05615968, 0.03602776, 0.03239329, 0.04165936, 0.08179929,\n", + " 0.06962602, 0.07101653, 0.07384379, 0.07140837, 0.0612982 ],\n", + " [0.03159802, 0.02438946, 0.04950192, 0.04023096, 0.04712541,\n", + " 0.07433525, 0.07258311, 0.0476838 , 0.04177937, 0.07410668],\n", + " [0.07401344, 0.0539811 , 0.07349332, 0.03848361, 0.03148691,\n", + " 0.08456042, 0.08100537, 0.05958675, 0.02823484, 0.03503521],\n", + " [0.06039637, 0.07211632, 0.03757683, 0.04992837, 0.0541241 ,\n", + " 0.07597169, 0.06669049, 0.04361456, 0.04289043, 0.0717583 ],\n", + " [0.03775617, 0.07017813, 0.04378171, 0.05074528, 0.08009684,\n", + " 0.07626787, 0.04847665, 0.05023119, 0.04996059, 0.083178 ],\n", + " [0.02110775, 0.03158528, 0.03059259, 0.06557963, 0.05487839,\n", + " 0.0575448 , 0.055553 , 0.0286748 , 0.03967752, 0.07316461],\n", + " [0.04733965, 0.03069299, 0.05998583, 0.08735126, 0.0813871 ,\n", + " 0.06610566, 0.04681063, 0.0540446 , 0.09098797, 0.10007066]])}, 'time': 2.0}, {'fields': {'glucose': array([[ 5.09870059, 4.79536488, 7.44357174, 11.66513998, 9.90374229,\n", + " 5.18069452, 7.37519963, 7.46899975, 9.28153863, 11.04065964],\n", + " [ 9.11709354, 6.28117333, 5.28114882, 8.31281756, 10.95261521,\n", + " 7.88959831, 9.97907677, 11.50400584, 10.75654692, 6.66884774],\n", + " [14.17968036, 11.35581898, 7.67721179, 8.25777355, 9.50090063,\n", + " 9.81495417, 7.67733104, 8.782906 , 10.91125328, 5.98956485],\n", + " [12.84072866, 13.3001572 , 10.67217896, 8.2585039 , 7.97129775,\n", + " 7.50907694, 6.15927629, 9.41560137, 9.45362755, 8.25822721],\n", + " [10.16374559, 11.18697652, 12.88930034, 12.16157056, 8.15969543,\n", + " 7.58450961, 7.55919821, 10.51044201, 11.39535461, 10.260533 ],\n", + " [ 8.30708573, 8.48255188, 10.03033454, 9.54187261, 7.00185871,\n", + " 6.27290199, 8.191822 , 8.64979916, 10.63074526, 9.95518916],\n", + " [ 7.11050673, 7.45046465, 6.78339615, 6.23658504, 7.66406746,\n", + " 6.19845134, 9.25776421, 10.91810747, 10.46600159, 5.83027136],\n", + " [ 9.93733374, 11.71575863, 7.79432899, 7.75158489, 7.45869768,\n", + " 6.82077317, 7.91223968, 9.60658616, 11.24237377, 6.50471168],\n", + " [12.85511079, 13.43542002, 11.64380905, 9.51635947, 7.49163992,\n", + " 6.69160366, 8.91701399, 8.47273198, 11.18147744, 6.43939822],\n", + " [ 6.69042175, 8.06310361, 10.56250943, 13.39393439, 12.15952581,\n", + " 6.83758582, 5.58698939, 8.34937465, 10.76832445, 6.92860453]]), 'acetate': array([[0.00306472, 0.00240574, 0.0160008 , 0.01504055, 0.01512404,\n", + " 0.00217912, 0.00467972, 0.00314389, 0.00360355, 0.00606054],\n", + " [0.00693401, 0.00772619, 0.00336847, 0.01170581, 0.02979243,\n", + " 0.01181053, 0.01863367, 0.00936974, 0.00880793, 0.00453851],\n", + " [0.01176542, 0.02164557, 0.01153383, 0.02019676, 0.02426239,\n", + " 0.0202274 , 0.01239253, 0.01009192, 0.0143313 , 0.00405292],\n", + " [0.02151568, 0.01454414, 0.01089444, 0.01045708, 0.02255677,\n", + " 0.01649128, 0.00799233, 0.02332221, 0.01942779, 0.01730589],\n", + " [0.01073636, 0.00887919, 0.01994406, 0.01554396, 0.01237659,\n", + " 0.0192867 , 0.01639851, 0.01570704, 0.014772 , 0.02496166],\n", + " [0.02106779, 0.01458365, 0.0251929 , 0.0122118 , 0.00647165,\n", + " 0.01271082, 0.02233604, 0.0125663 , 0.00891993, 0.0104276 ],\n", + " [0.01220373, 0.01405723, 0.00732657, 0.00545094, 0.01418565,\n", + " 0.0089339 , 0.02088678, 0.01504426, 0.01356348, 0.00426038],\n", + " [0.01160853, 0.02604971, 0.00839208, 0.01302971, 0.02014222,\n", + " 0.0170433 , 0.01220594, 0.01604538, 0.01750037, 0.01290342],\n", + " [0.00701387, 0.01253365, 0.01050113, 0.01926666, 0.01168993,\n", + " 0.0103435 , 0.01822685, 0.00854705, 0.0137655 , 0.00893235],\n", + " [0.0043521 , 0.00661982, 0.02022534, 0.03571037, 0.03160798,\n", + " 0.01226311, 0.00503412, 0.01629229, 0.03263213, 0.01964191]]), 'biomass': array([[0.07823671, 0.06532927, 0.06930746, 0.04700655, 0.04774012,\n", + " 0.02698779, 0.02272274, 0.02023514, 0.01673251, 0.02486293],\n", + " [0.04242112, 0.07220623, 0.06958157, 0.05432052, 0.0758259 ,\n", + " 0.05359934, 0.05324825, 0.03166147, 0.03257718, 0.05252567],\n", + " [0.03761055, 0.06330078, 0.05996397, 0.06991488, 0.07959206,\n", + " 0.06606576, 0.06244224, 0.04741829, 0.04646579, 0.04517719],\n", + " [0.05456271, 0.04185458, 0.04002546, 0.04979219, 0.08018657,\n", + " 0.07541031, 0.07531718, 0.07394782, 0.07102188, 0.06566458],\n", + " [0.03947415, 0.03336537, 0.05114602, 0.04535272, 0.05441355,\n", + " 0.07787297, 0.07670644, 0.0563773 , 0.04991715, 0.07254037],\n", + " [0.07300914, 0.06002127, 0.06951169, 0.04524124, 0.04295746,\n", + " 0.08435025, 0.08311877, 0.06139881, 0.03697098, 0.04406479],\n", + " [0.06492717, 0.07182867, 0.04781958, 0.05287569, 0.06020426,\n", + " 0.07936831, 0.07048902, 0.05093653, 0.04862026, 0.07231265],\n", + " [0.04422066, 0.06723132, 0.04891059, 0.05754926, 0.07907989,\n", + " 0.0782164 , 0.05673306, 0.05233794, 0.05552625, 0.08433791],\n", + " [0.02797106, 0.0368576 , 0.04005501, 0.06775643, 0.06449393,\n", + " 0.06396315, 0.05712321, 0.03874127, 0.05055987, 0.07913669],\n", + " [0.04722979, 0.03735543, 0.06207212, 0.08865991, 0.0844462 ,\n", + " 0.07017507, 0.05358269, 0.05891047, 0.09095112, 0.10397621]])}, 'time': 3.0}, {'fields': {'glucose': array([[ 5.4113536 , 5.19832837, 7.34144348, 10.73407304, 9.64238776,\n", + " 6.08160177, 7.44735273, 7.96522752, 9.37642564, 10.44845156],\n", + " [ 8.90668073, 6.73864904, 6.05008441, 8.49121894, 10.15185781,\n", + " 8.19106658, 9.43305992, 10.65378888, 10.26841865, 7.34491445],\n", + " [13.23497143, 10.90712921, 8.08276578, 8.3092214 , 9.28379024,\n", + " 9.18349463, 7.98147807, 9.0649851 , 10.12163377, 6.69803725],\n", + " [12.63725447, 12.58577294, 10.5638506 , 8.72350755, 8.0696437 ,\n", + " 7.58424998, 6.79310873, 9.13195167, 9.5188979 , 8.3220991 ],\n", + " [10.29921559, 11.11883017, 12.10371221, 11.21911364, 8.27489405,\n", + " 7.47828065, 7.69279264, 10.00268865, 10.89005865, 10.04990545],\n", + " [ 8.3609003 , 8.71356295, 9.73305982, 9.24267405, 7.28989704,\n", + " 6.57837685, 8.05436211, 9.04324909, 10.38280658, 9.64165353],\n", + " [ 7.49567723, 7.79070299, 7.20029595, 6.79868029, 7.33473762,\n", + " 6.59013519, 8.85189988, 10.34586236, 10.10148973, 6.64961863],\n", + " [10.01813145, 10.91639113, 8.32068331, 7.76337513, 7.3932576 ,\n", + " 6.88515081, 8.08697612, 9.53833873, 10.50652243, 6.840072 ],\n", + " [12.01941986, 12.47681581, 11.12812852, 9.62032206, 7.94581874,\n", + " 6.95090258, 8.30437382, 8.74973942, 10.40830875, 6.86843396],\n", + " [ 7.38783855, 8.64140417, 10.60642682, 12.52910571, 11.25425282,\n", + " 7.15336863, 6.22371736, 8.29543839, 10.10679742, 7.16220683]]), 'acetate': array([[0.00644695, 0.00598617, 0.01991831, 0.02110177, 0.02088051,\n", + " 0.0057932 , 0.00765613, 0.00585466, 0.00620474, 0.00894945],\n", + " [0.01196133, 0.01308392, 0.00945355, 0.01904948, 0.03463271,\n", + " 0.01881238, 0.02197009, 0.01382004, 0.01266387, 0.00915809],\n", + " [0.0184527 , 0.02642125, 0.01801523, 0.02548297, 0.03262799,\n", + " 0.02677606, 0.01894841, 0.01678185, 0.01908574, 0.0090935 ],\n", + " [0.02677805, 0.0208681 , 0.01722219, 0.01784728, 0.02818344,\n", + " 0.02366162, 0.01617313, 0.02844449, 0.02672935, 0.02360492],\n", + " [0.01727676, 0.01549312, 0.02538149, 0.02122431, 0.01905734,\n", + " 0.02486915, 0.02342694, 0.02308576, 0.0221735 , 0.03089469],\n", + " [0.02630876, 0.02168257, 0.02948034, 0.01783232, 0.01239764,\n", + " 0.01910507, 0.02830503, 0.02017903, 0.01509969, 0.01643105],\n", + " [0.01862791, 0.02086422, 0.01328475, 0.01136725, 0.01864908,\n", + " 0.01668798, 0.02674987, 0.02173195, 0.01899969, 0.01074133],\n", + " [0.01775758, 0.03003256, 0.01513553, 0.01868815, 0.02511341,\n", + " 0.02196804, 0.01949168, 0.02136788, 0.02348654, 0.01849035],\n", + " [0.01174451, 0.01781292, 0.01757 , 0.026669 , 0.02049369,\n", + " 0.01688343, 0.02162295, 0.01519113, 0.02144779, 0.01653385],\n", + " [0.00861375, 0.01196579, 0.02728667, 0.04486294, 0.03989002,\n", + " 0.01891214, 0.01072236, 0.02217961, 0.03971072, 0.02823807]]), 'biomass': array([[0.07982373, 0.07208608, 0.07242715, 0.05373909, 0.0522047 ,\n", + " 0.03338042, 0.02765878, 0.0232213 , 0.02089314, 0.02867459],\n", + " [0.05133431, 0.07357335, 0.0728173 , 0.06228386, 0.07581297,\n", + " 0.05828211, 0.05388115, 0.03667442, 0.03677213, 0.05172213],\n", + " [0.0450254 , 0.06469907, 0.06472191, 0.07238994, 0.08284261,\n", + " 0.0717578 , 0.0665542 , 0.05334903, 0.05119368, 0.05122563],\n", + " [0.05518944, 0.04744934, 0.04726824, 0.05688211, 0.08107152,\n", + " 0.08075311, 0.07972835, 0.07566716, 0.07226762, 0.06972364],\n", + " [0.0464809 , 0.04160665, 0.05399235, 0.05105343, 0.06135912,\n", + " 0.08194542, 0.08127908, 0.06398566, 0.05721307, 0.07314328],\n", + " [0.07376841, 0.06496389, 0.06865467, 0.05162919, 0.0529567 ,\n", + " 0.08597836, 0.08568503, 0.06495904, 0.04539482, 0.05210087],\n", + " [0.06915099, 0.07311149, 0.05583566, 0.05742189, 0.06613965,\n", + " 0.08300268, 0.07496088, 0.05758862, 0.0546785 , 0.07427525],\n", + " [0.05021423, 0.06663342, 0.05454307, 0.06352656, 0.08038325,\n", + " 0.08113712, 0.06376687, 0.05641904, 0.0613419 , 0.086465 ],\n", + " [0.0345359 , 0.04238628, 0.04828974, 0.07152091, 0.07254616,\n", + " 0.07017194, 0.06082774, 0.04783023, 0.06029436, 0.0853503 ],\n", + " [0.04840328, 0.04344639, 0.06525209, 0.09053041, 0.08820654,\n", + " 0.07490731, 0.06011505, 0.06432512, 0.09267796, 0.10809486]])}, 'time': 4.0}, {'fields': {'glucose': array([[ 5.678529 , 5.53774769, 7.28756421, 10.04022783, 9.38590365,\n", + " 6.72370755, 7.56236464, 8.26494947, 9.38940307, 10.03227003],\n", + " [ 8.73224973, 7.06965452, 6.60615789, 8.53214425, 9.62472721,\n", + " 8.30421173, 9.06878777, 10.0768413 , 9.88887444, 7.79795048],\n", + " [12.47332125, 10.5532126 , 8.35660204, 8.38998604, 9.05356798,\n", + " 8.79955653, 8.14793145, 9.12164537, 9.64243635, 7.20032026],\n", + " [12.3616051 , 12.04613085, 10.42992665, 8.94663597, 8.15310028,\n", + " 7.63281345, 7.20994085, 8.97180527, 9.45015214, 8.40032288],\n", + " [10.36385862, 10.97458741, 11.4846727 , 10.56205944, 8.29403464,\n", + " 7.45182545, 7.76854403, 9.64383246, 10.48059068, 9.83891434],\n", + " [ 8.45949843, 8.85634488, 9.50912062, 9.01200451, 7.45108292,\n", + " 6.80542259, 7.99042794, 9.17841056, 10.14619858, 9.43210046],\n", + " [ 7.80335631, 8.03070128, 7.5372307 , 7.14932987, 7.20395214,\n", + " 6.81793613, 8.57276385, 9.92865073, 9.80216239, 7.20713749],\n", + " [ 9.9725838 , 10.39333916, 8.59254964, 7.84148683, 7.37384388,\n", + " 6.9762511 , 8.1202962 , 9.41313362, 9.96133102, 7.11647561],\n", + " [11.3950835 , 11.73983511, 10.75422845, 9.60947773, 8.17771419,\n", + " 7.13302158, 8.00147534, 8.80620009, 9.84181072, 7.15458939],\n", + " [ 7.92087792, 9.02747656, 10.56572841, 11.83914623, 10.58774202,\n", + " 7.37206382, 6.65241783, 8.26149148, 9.58468337, 7.3219887 ]]), 'acetate': array([[0.01083633, 0.01091549, 0.02437343, 0.02756692, 0.02683491,\n", + " 0.01088712, 0.0112377 , 0.00919595, 0.00947841, 0.01234121],\n", + " [0.01788308, 0.01906987, 0.01701093, 0.02676646, 0.03967462,\n", + " 0.02573254, 0.0257467 , 0.01861606, 0.01700735, 0.01415406],\n", + " [0.02559473, 0.03163592, 0.02505549, 0.03171932, 0.04028468,\n", + " 0.03371204, 0.0260375 , 0.02379445, 0.02442543, 0.0153426 ],\n", + " [0.03238072, 0.02763305, 0.02441324, 0.02575828, 0.03455119,\n", + " 0.03119483, 0.02508015, 0.03427385, 0.03374959, 0.03030425],\n", + " [0.02452166, 0.02303225, 0.03110908, 0.02754372, 0.02623346,\n", + " 0.03110902, 0.03094481, 0.03092726, 0.03005424, 0.03693389],\n", + " [0.03205111, 0.02901506, 0.0340852 , 0.02400943, 0.01937483,\n", + " 0.02611969, 0.03464074, 0.02808204, 0.02239584, 0.02331141],\n", + " [0.02573423, 0.0278329 , 0.02027286, 0.01810585, 0.02390717,\n", + " 0.02459194, 0.03309959, 0.02881669, 0.02533635, 0.01848332],\n", + " [0.02439207, 0.03432623, 0.02246011, 0.02513978, 0.03050944,\n", + " 0.02777472, 0.02686259, 0.02754903, 0.02992951, 0.02509753],\n", + " [0.01736823, 0.02370684, 0.02539183, 0.03462706, 0.02980381,\n", + " 0.02407428, 0.02604887, 0.0226255 , 0.02971182, 0.02519748],\n", + " [0.01372494, 0.01830209, 0.03478105, 0.05340787, 0.04807489,\n", + " 0.02639902, 0.01764103, 0.02873133, 0.0465656 , 0.03736255]]), 'biomass': array([[0.08265826, 0.07819132, 0.07642405, 0.06050814, 0.05703383,\n", + " 0.0397604 , 0.03259627, 0.02688129, 0.02523112, 0.03242972],\n", + " [0.059467 , 0.07635136, 0.07671997, 0.0692559 , 0.07751957,\n", + " 0.06289842, 0.05595673, 0.04155091, 0.04099489, 0.05235358],\n", + " [0.05202226, 0.06740534, 0.06952936, 0.07609387, 0.08617908,\n", + " 0.07734598, 0.07101763, 0.05903517, 0.05611667, 0.05684824],\n", + " [0.05746569, 0.05308624, 0.0542536 , 0.0635413 , 0.08363843,\n", + " 0.08600417, 0.08436452, 0.07858863, 0.07475267, 0.07378681],\n", + " [0.05304636, 0.04929764, 0.05788086, 0.05717815, 0.06821643,\n", + " 0.08653688, 0.08621571, 0.07104015, 0.06409704, 0.07533548],\n", + " [0.07579745, 0.06952316, 0.06992922, 0.05801737, 0.06200491,\n", + " 0.08894195, 0.08891878, 0.06969445, 0.05362924, 0.05960925],\n", + " [0.07335209, 0.07548418, 0.06272798, 0.06291083, 0.07217459,\n", + " 0.08705008, 0.07989955, 0.06409376, 0.06105641, 0.07737333],\n", + " [0.05598723, 0.06786129, 0.06045396, 0.06932377, 0.08329146,\n", + " 0.08488 , 0.07032681, 0.06178497, 0.06750504, 0.08952174],\n", + " [0.04095995, 0.048148 , 0.05588189, 0.07626436, 0.07979021,\n", + " 0.07640705, 0.06593075, 0.05646652, 0.06932618, 0.09177819],\n", + " [0.05063884, 0.04929485, 0.06924188, 0.09310248, 0.09253678,\n", + " 0.08020601, 0.06670399, 0.07025137, 0.0957997 , 0.1125684 ]])}, 'time': 5.0}, {'fields': {'glucose': array([[ 5.90534991, 5.82168068, 7.26286613, 9.51168149, 9.14998427,\n", + " 7.17153684, 7.68544646, 8.44021587, 9.35172256, 9.73180529],\n", + " [ 8.58505149, 7.30654151, 7.00058838, 8.50660978, 9.25160981,\n", + " 8.32584529, 8.81855911, 9.66792331, 9.59651702, 8.09694524],\n", + " [11.84899281, 10.26542626, 8.5350841 , 8.45334304, 8.84850945,\n", + " 8.55052864, 8.22560566, 9.07280899, 9.33218131, 7.55997701],\n", + " [12.05496091, 11.61401248, 10.2787126 , 9.03232629, 8.20166388,\n", + " 7.66750909, 7.47994256, 8.86126179, 9.33037978, 8.46483541],\n", + " [10.37103834, 10.79552067, 10.99025414, 10.08204668, 8.26605673,\n", + " 7.45752592, 7.81057507, 9.37376875, 10.13701661, 9.64100346],\n", + " [ 8.56873487, 8.93904095, 9.33392364, 8.82760164, 7.5376726 ,\n", + " 6.97047736, 7.95402701, 9.17442432, 9.91889185, 9.27832047],\n", + " [ 8.04191621, 8.20411448, 7.79052882, 7.37749322, 7.16851354,\n", + " 6.95722701, 8.36936944, 9.60306594, 9.55068316, 7.58372492],\n", + " [ 9.867205 , 10.02991271, 8.72601548, 7.92581074, 7.38292298,\n", + " 7.0614329 , 8.0897827 , 9.25247952, 9.54817956, 7.33299624],\n", + " [10.91821523, 11.17420196, 10.45812011, 9.53477453, 8.27640338,\n", + " 7.26341012, 7.85060354, 8.7541186 , 9.40852967, 7.34238112],\n", + " [ 8.3226842 , 9.27468402, 10.47257975, 11.27773825, 10.08105163,\n", + " 7.51757748, 6.94630253, 8.22195051, 9.17108785, 7.42293297]]), 'acetate': array([[0.0161695 , 0.01690231, 0.02961903, 0.03441539, 0.0331246 ,\n", + " 0.01701499, 0.01550788, 0.01317153, 0.01339365, 0.0162354 ],\n", + " [0.02454517, 0.02570753, 0.02526867, 0.03477336, 0.04519898,\n", + " 0.03266708, 0.03017779, 0.02378501, 0.02183912, 0.01947902],\n", + " [0.03311711, 0.03752458, 0.03266602, 0.03882378, 0.04764009,\n", + " 0.04101612, 0.03355247, 0.03105994, 0.03038026, 0.02238442],\n", + " [0.03858251, 0.03489834, 0.03228059, 0.03409035, 0.04163886,\n", + " 0.03913406, 0.03429798, 0.04089687, 0.04082212, 0.03741811],\n", + " [0.03236097, 0.03121678, 0.03740007, 0.03451011, 0.03390916,\n", + " 0.03809371, 0.03894695, 0.03918082, 0.03830361, 0.04339453],\n", + " [0.0384798 , 0.03657794, 0.03937889, 0.03078464, 0.02711455,\n", + " 0.03368588, 0.04152446, 0.03633682, 0.03057817, 0.0309922 ],\n", + " [0.03337381, 0.03509298, 0.02798906, 0.02550897, 0.03006162,\n", + " 0.03258644, 0.03997844, 0.03635829, 0.03256153, 0.02695038],\n", + " [0.03146642, 0.0393322 , 0.0302854 , 0.03236746, 0.03662908,\n", + " 0.03440431, 0.03440531, 0.03456365, 0.0369977 , 0.03266244],\n", + " [0.02376912, 0.03025562, 0.0337947 , 0.04311146, 0.03932424,\n", + " 0.03189305, 0.03168823, 0.03069291, 0.0384187 , 0.03463936],\n", + " [0.01961678, 0.02544544, 0.0427541 , 0.06172554, 0.05638264,\n", + " 0.03460142, 0.02543552, 0.0359962 , 0.0536325 , 0.04690408]]), 'biomass': array([[0.08648828, 0.08406252, 0.08114292, 0.06735217, 0.0622897 ,\n", + " 0.04618025, 0.03770504, 0.03109942, 0.02977664, 0.03627473],\n", + " [0.06716742, 0.08020444, 0.08122021, 0.07578609, 0.08046976,\n", + " 0.06769217, 0.05911351, 0.04648703, 0.04537856, 0.05410233],\n", + " [0.05886915, 0.07116079, 0.07459743, 0.08064025, 0.0899053 ,\n", + " 0.08292576, 0.07584538, 0.06468081, 0.06124796, 0.06227267],\n", + " [0.06101448, 0.05892554, 0.06114383, 0.07011687, 0.08741786,\n", + " 0.09137468, 0.08930992, 0.08245139, 0.07822186, 0.07805242],\n", + " [0.05945234, 0.05665024, 0.06265443, 0.0636808 , 0.07514631,\n", + " 0.09163776, 0.09151124, 0.07788431, 0.07085729, 0.07874596],\n", + " [0.07880347, 0.07410157, 0.07274909, 0.06459765, 0.07049697,\n", + " 0.09294317, 0.09288899, 0.07529042, 0.06179003, 0.06690847],\n", + " [0.07771015, 0.07870372, 0.06913948, 0.06903168, 0.07844637,\n", + " 0.0916085 , 0.08525979, 0.07073845, 0.06777825, 0.08144147],\n", + " [0.0617308 , 0.07051667, 0.06659808, 0.07526857, 0.08738862,\n", + " 0.08936367, 0.07684215, 0.068064 , 0.07407289, 0.093465 ],\n", + " [0.04737221, 0.05416142, 0.06318677, 0.08168843, 0.08669527,\n", + " 0.0828274 , 0.07202223, 0.06496834, 0.07799088, 0.09844457],\n", + " [0.053786 , 0.05512666, 0.07388994, 0.09642118, 0.09738754,\n", + " 0.08602656, 0.07353389, 0.07668886, 0.1000673 , 0.11749333]])}, 'time': 6.0}, {'fields': {'glucose': array([[ 6.096105 , 6.05694737, 7.25339189, 9.10096704, 8.93726615,\n", + " 7.47604799, 7.79728971, 8.53484912, 9.28423059, 9.50702355],\n", + " [ 8.45781027, 7.47213177, 7.27415425, 8.44773941, 8.96994765,\n", + " 8.30224475, 8.63962329, 9.36560332, 9.3682788 , 8.28937043],\n", + " [11.32883074, 10.02262188, 8.64129683, 8.4858656 , 8.67388506,\n", + " 8.37664297, 8.24617079, 8.97690557, 9.11593945, 7.81603133],\n", + " [11.73974403, 11.25036734, 10.1169813 , 9.03666201, 8.21555787,\n", + " 7.69000245, 7.64874473, 8.76725981, 9.19494729, 8.50626419],\n", + " [10.33336467, 10.60299583, 10.58776353, 9.71516923, 8.21412494,\n", + " 7.47154499, 7.82911443, 9.15663157, 9.84137332, 9.45871654],\n", + " [ 8.66888285, 8.97983554, 9.1899252 , 8.67497929, 7.57865333,\n", + " 7.08670582, 7.92307126, 9.09592379, 9.70068878, 9.15243361],\n", + " [ 8.22166198, 8.32812427, 7.97102497, 7.52864334, 7.17520917,\n", + " 7.04500906, 8.21169442, 9.33322206, 9.33295858, 7.83240626],\n", + " [ 9.73688728, 9.761989 , 8.77996512, 7.99302914, 7.40387002,\n", + " 7.12976626, 8.03037527, 9.07380033, 9.2249685 , 7.49391533],\n", + " [10.54591947, 10.73505752, 10.20762803, 9.42411306, 8.29588557,\n", + " 7.35411667, 7.77046117, 8.64936155, 9.0646084 , 7.45965361],\n", + " [ 8.6192189 , 9.42158511, 10.34633846, 10.81161626, 9.68276847,\n", + " 7.60795634, 7.14692053, 8.16882395, 8.83852847, 7.47754428]]), 'acetate': array([[0.02239908, 0.02377492, 0.03572337, 0.04166674, 0.03984948,\n", + " 0.02392136, 0.02051304, 0.01779704, 0.01793076, 0.02064406],\n", + " [0.03186844, 0.03300735, 0.0339667 , 0.04306739, 0.05130796,\n", + " 0.03976918, 0.03533646, 0.02938504, 0.02717812, 0.02517796],\n", + " [0.04104033, 0.04418558, 0.04084821, 0.04667481, 0.05503861,\n", + " 0.04869038, 0.04144731, 0.03860449, 0.03694139, 0.03000203],\n", + " [0.04551002, 0.04272509, 0.04073811, 0.04284486, 0.04939096,\n", + " 0.0475143 , 0.04372603, 0.04827171, 0.04818385, 0.04496867],\n", + " [0.04075982, 0.03991723, 0.04439531, 0.04213381, 0.04211305,\n", + " 0.04582322, 0.04743931, 0.04785575, 0.04691813, 0.05044549],\n", + " [0.04565077, 0.04445714, 0.0455101 , 0.03820162, 0.03547754,\n", + " 0.04178681, 0.04903316, 0.04502199, 0.0395011 , 0.03941497],\n", + " [0.04149 , 0.04275643, 0.03628484, 0.03355219, 0.03711535,\n", + " 0.04078699, 0.04740833, 0.04442906, 0.04062603, 0.03600365],\n", + " [0.03899812, 0.04520925, 0.03861865, 0.0403415 , 0.04358919,\n", + " 0.04178844, 0.04227454, 0.04236306, 0.0447852 , 0.04110368],\n", + " [0.03088471, 0.03749009, 0.04271334, 0.05208972, 0.04900773,\n", + " 0.04033953, 0.03851586, 0.03935321, 0.04754742, 0.04470578],\n", + " [0.0262787 , 0.03329944, 0.05123277, 0.0701023 , 0.06495178,\n", + " 0.04344618, 0.03398086, 0.04398188, 0.061164 , 0.05682356]]), 'biomass': array([[0.09115479, 0.08997756, 0.08649157, 0.07433399, 0.06800032,\n", + " 0.05271491, 0.04309241, 0.03581423, 0.03456725, 0.04031687],\n", + " [0.07469058, 0.08492724, 0.08629122, 0.08221583, 0.08439487,\n", + " 0.07280027, 0.06313366, 0.05161642, 0.05001541, 0.05675889],\n", + " [0.06575994, 0.07580066, 0.08004687, 0.08584272, 0.094165 ,\n", + " 0.08861426, 0.08105403, 0.07043309, 0.0666205 , 0.06767424],\n", + " [0.06558951, 0.0650699 , 0.06809078, 0.07681722, 0.09213968,\n", + " 0.09700104, 0.094628 , 0.08709447, 0.08251218, 0.08264996],\n", + " [0.06589344, 0.06386188, 0.06819127, 0.0705628 , 0.08226171,\n", + " 0.09724766, 0.09719529, 0.08474886, 0.07769158, 0.08314035],\n", + " [0.08261557, 0.07893287, 0.07676252, 0.07147858, 0.07872951,\n", + " 0.09780815, 0.09760535, 0.0815784 , 0.06998662, 0.07422279],\n", + " [0.08234714, 0.0826499 , 0.07545828, 0.07564932, 0.08504248,\n", + " 0.09673592, 0.09106467, 0.0776875 , 0.07488238, 0.08637822],\n", + " [0.06759061, 0.07431449, 0.07300329, 0.08153172, 0.09243321,\n", + " 0.09454746, 0.08356736, 0.0750623 , 0.08108772, 0.09825676],\n", + " [0.05388187, 0.0604621 , 0.07043508, 0.08765855, 0.09356382,\n", + " 0.08954647, 0.07888086, 0.07354123, 0.08654159, 0.10540041],\n", + " [0.0577439 , 0.0611029 , 0.07912103, 0.10049146, 0.10275279,\n", + " 0.09235748, 0.08072466, 0.0836548 , 0.1053173 , 0.12293946]])}, 'time': 7.0}, {'fields': {'glucose': array([[ 6.25435024, 6.24924372, 7.24947081, 8.77518871, 8.74554268,\n", + " 7.67540099, 7.88823447, 8.57588641, 9.19996581, 9.33140136],\n", + " [ 8.3445607 , 7.58273233, 7.45742134, 8.37112588, 8.74509624,\n", + " 8.25532257, 8.50454939, 9.13240278, 9.18494428, 8.40723084],\n", + " [10.88816311, 9.80962476, 8.69138174, 8.48682966, 8.52429902,\n", + " 8.24486319, 8.22974866, 8.8618623 , 8.95270152, 7.99410943],\n", + " [11.42771519, 10.93195012, 9.94917523, 8.99091701, 8.20044131,\n", + " 7.69926913, 7.74626965, 8.67558878, 9.05765555, 8.52304759],\n", + " [10.2613159 , 10.40749439, 10.25245614, 9.42229286, 8.14908336,\n", + " 7.48183835, 7.82852676, 8.97094752, 9.58155686, 9.29019038],\n", + " [ 8.74947405, 8.99000567, 9.06506678, 8.54392931, 7.59011607,\n", + " 7.16410492, 7.88736231, 8.97786486, 9.49135751, 9.03842808],\n", + " [ 8.35211881, 8.41273248, 8.09209603, 7.62712487, 7.19618117,\n", + " 7.09957509, 8.0812688 , 9.09846618, 9.13819123, 7.98842651],\n", + " [ 9.5992608 , 9.55271468, 8.78519071, 8.03570126, 7.42472368,\n", + " 7.17843436, 7.95727421, 8.88854992, 8.96226564, 7.60525197],\n", + " [10.24821621, 10.38682586, 9.98559154, 9.2932269 , 8.26793695,\n", + " 7.41194997, 7.7190207 , 8.51971211, 8.7820572 , 7.52447236],\n", + " [ 8.83102215, 9.49543579, 10.19905431, 10.41646008, 9.35891265,\n", + " 7.65607227, 7.279204 , 8.10099282, 8.5648313 , 7.49553473]]), 'acetate': array([[0.02948766, 0.03143768, 0.04268214, 0.04936025, 0.04707864,\n", + " 0.03147137, 0.02627485, 0.02309135, 0.02308422, 0.02559041],\n", + " [0.03982278, 0.04097405, 0.04304759, 0.05168494, 0.05804306,\n", + " 0.04717772, 0.04124193, 0.03547984, 0.03305403, 0.03131052],\n", + " [0.04942317, 0.05165457, 0.04960624, 0.05518276, 0.06272482,\n", + " 0.05676007, 0.0497188 , 0.04648391, 0.04409569, 0.03809273],\n", + " [0.05322275, 0.05116513, 0.04976209, 0.05205362, 0.0577712 ,\n", + " 0.05636244, 0.0533784 , 0.05633895, 0.05598673, 0.0529891 ],\n", + " [0.04972126, 0.04909938, 0.05216068, 0.0504315 , 0.05087537,\n", + " 0.05427183, 0.05643651, 0.05698271, 0.05594125, 0.05817516],\n", + " [0.05357156, 0.05275805, 0.05252902, 0.04629923, 0.04441354,\n", + " 0.05043302, 0.05719931, 0.05420234, 0.04908265, 0.04854694],\n", + " [0.05008097, 0.05091159, 0.04511524, 0.04224381, 0.04503862,\n", + " 0.04933168, 0.05542032, 0.05308965, 0.04948941, 0.04563344],\n", + " [0.04703177, 0.05200583, 0.04749232, 0.04903934, 0.05141627,\n", + " 0.04989116, 0.05061114, 0.05091303, 0.05333842, 0.05036001],\n", + " [0.03869287, 0.04543511, 0.05213638, 0.06154973, 0.05890897,\n", + " 0.04941771, 0.04644479, 0.04861233, 0.05713115, 0.05531649],\n", + " [0.03371998, 0.04182472, 0.06024199, 0.07874568, 0.07388292,\n", + " 0.05289886, 0.04323826, 0.05269069, 0.06930484, 0.067124 ]]), 'biomass': array([[0.09656189, 0.09612522, 0.09242207, 0.08152431, 0.07418298,\n", + " 0.0594438 , 0.04883138, 0.04099893, 0.03964457, 0.044638 ],\n", + " [0.08222846, 0.0903998 , 0.09192856, 0.08876697, 0.08914431,\n", + " 0.07830667, 0.06788861, 0.05703462, 0.0549736 , 0.060188 ],\n", + " [0.07283914, 0.08122266, 0.08595363, 0.09162181, 0.09902603,\n", + " 0.09452404, 0.08666737, 0.07640228, 0.07227751, 0.0731907 ],\n", + " [0.07103289, 0.07159283, 0.0752246 , 0.08377761, 0.09765118,\n", + " 0.10297884, 0.10037014, 0.09242298, 0.08752332, 0.08766759],\n", + " [0.07251138, 0.07110293, 0.07440965, 0.07784661, 0.08965029,\n", + " 0.10337589, 0.10331098, 0.09179575, 0.08474064, 0.08837449],\n", + " [0.08713861, 0.08415919, 0.08175753, 0.07873082, 0.08692645,\n", + " 0.10343941, 0.10305923, 0.08847495, 0.07832163, 0.08171579],\n", + " [0.08735262, 0.08726765, 0.08192857, 0.08271918, 0.09202796,\n", + " 0.10247158, 0.09736246, 0.085044 , 0.08241308, 0.09212384],\n", + " [0.07367986, 0.07906068, 0.07972376, 0.08820881, 0.09828803,\n", + " 0.1004158 , 0.09066124, 0.08268722, 0.0885879 , 0.10386891],\n", + " [0.06058372, 0.06709255, 0.07778809, 0.0941268 , 0.10059986,\n", + " 0.09665128, 0.08639575, 0.08232868, 0.09517211, 0.11270964],\n", + " [0.06244772, 0.06734338, 0.08490513, 0.10530548, 0.10864961,\n", + " 0.09920872, 0.08836025, 0.09117521, 0.11144723, 0.12896174]])}, 'time': 8.0}, {'fields': {'glucose': array([[ 6.38301241, 6.4033188 , 7.2445845 , 8.51075081, 8.57111189,\n", + " 7.79736986, 7.95435722, 8.5801719 , 9.1065915 , 9.18730073],\n", + " [ 8.24043137, 7.65006562, 7.57266769, 8.28407213, 8.55660632,\n", + " 8.19518727, 8.39549894, 8.94448818, 9.03193892, 8.471897 ],\n", + " [10.50827017, 9.61575894, 8.69725162, 8.45968918, 8.39219782,\n", + " 8.13614703, 8.18883354, 8.74043195, 8.81921544, 8.1119414 ],\n", + " [11.12453351, 10.64443238, 9.77783732, 8.91307876, 8.16222478,\n", + " 7.69424101, 7.79231917, 8.5805164 , 8.92279369, 8.51657523],\n", + " [10.1630417 , 10.21359134, 9.96583619, 9.17854741, 8.07577629,\n", + " 7.48235854, 7.8108316 , 8.80370485, 9.34865045, 9.13209788],\n", + " [ 8.80570784, 8.97641091, 8.95109861, 8.42689077, 7.58091849,\n", + " 7.21002225, 7.84247627, 8.83897818, 9.29012921, 8.92717061],\n", + " [ 8.44126651, 8.4645289 , 8.16562124, 7.68668415, 7.21670357,\n", + " 7.13000355, 7.96630085, 8.88648999, 8.9583611 , 8.07555275],\n", + " [ 9.46246983, 9.37990364, 8.75831982, 8.05295664, 7.43790719,\n", + " 7.20740136, 7.87656762, 8.70317822, 8.73967896, 7.6731785 ],\n", + " [10.00355124, 10.10273279, 9.7821405 , 9.15101641, 8.21079973,\n", + " 7.44147428, 7.67464067, 8.37869706, 8.54197581, 7.54889 ],\n", + " [ 8.97434797, 9.51531983, 10.03832276, 10.07427566, 9.08655174,\n", + " 7.67088647, 7.35899232, 8.01959261, 8.33287419, 7.48414915]]), 'acetate': array([[0.03740661, 0.03984125, 0.05046841, 0.05754274, 0.05486131,\n", + " 0.03960475, 0.03280203, 0.02907471, 0.0288616 , 0.03110502],\n", + " [0.04840805, 0.049613 , 0.05253243, 0.06067927, 0.06542774,\n", + " 0.05500342, 0.0478962 , 0.04212894, 0.03950095, 0.03793246],\n", + " [0.05833548, 0.05994101, 0.05895118, 0.06429885, 0.07086049,\n", + " 0.06526495, 0.05839037, 0.05476002, 0.05183756, 0.04662115],\n", + " [0.06174837, 0.06026185, 0.05936314, 0.061757 , 0.06676631,\n", + " 0.06570195, 0.06330838, 0.06505452, 0.06432564, 0.06151911],\n", + " [0.05926821, 0.05878278, 0.06072521, 0.0594232 , 0.06022448,\n", + " 0.06341322, 0.06595837, 0.06659877, 0.06543183, 0.0666302 ],\n", + " [0.0622382 , 0.06157938, 0.06044681, 0.05511022, 0.05392046,\n", + " 0.05964823, 0.06603925, 0.06392832, 0.05928578, 0.05837562],\n", + " [0.0591755 , 0.05963039, 0.05449245, 0.05160074, 0.05379784,\n", + " 0.0583403 , 0.0640538 , 0.06238749, 0.05912721, 0.05587054],\n", + " [0.05562241, 0.0597253 , 0.05694597, 0.05844884, 0.06009963,\n", + " 0.0587044 , 0.05952445, 0.06019853, 0.06267828, 0.06039316],\n", + " [0.04719875, 0.05411276, 0.06208046, 0.07150198, 0.06911585,\n", + " 0.05913468, 0.05538436, 0.05849314, 0.06722249, 0.06643725],\n", + " [0.04195766, 0.05101721, 0.06981057, 0.08780467, 0.08325748,\n", + " 0.06295103, 0.05320125, 0.06212848, 0.07813766, 0.07783085]]), 'biomass': array([[0.10265702, 0.10263802, 0.09891717, 0.08899472, 0.08085497,\n", + " 0.06644377, 0.05497681, 0.04664947, 0.04505254, 0.04930393],\n", + " [0.08993039, 0.09655831, 0.09814124, 0.09559171, 0.09463678,\n", + " 0.08427005, 0.07330669, 0.06281419, 0.06030765, 0.06430627],\n", + " [0.08021859, 0.08736755, 0.09237213, 0.09795549, 0.10452298,\n", + " 0.10075505, 0.09271618, 0.08267529, 0.07826739, 0.07893311],\n", + " [0.07724769, 0.07855332, 0.08265406, 0.09109444, 0.10387079,\n", + " 0.10938144, 0.10658157, 0.09838635, 0.09319836, 0.09316936],\n", + " [0.07941545, 0.07851641, 0.08126298, 0.08556473, 0.09738592,\n", + " 0.11004068, 0.10990571, 0.09914468, 0.09210987, 0.0943645 ],\n", + " [0.09232557, 0.08987317, 0.08760849, 0.08640881, 0.09525974,\n", + " 0.10978779, 0.10924188, 0.09594761, 0.08689075, 0.08951219],\n", + " [0.09279772, 0.09253791, 0.08871213, 0.09024371, 0.09945849,\n", + " 0.1088474 , 0.10420811, 0.09288055, 0.0904175 , 0.09864723],\n", + " [0.0800897 , 0.08463025, 0.08682073, 0.09536126, 0.1048803 ,\n", + " 0.1069696 , 0.09823059, 0.09090483, 0.09661257, 0.11028498],\n", + " [0.06756177, 0.07409862, 0.08536746, 0.10109144, 0.10794863,\n", + " 0.1042137 , 0.09452159, 0.09143973, 0.10403461, 0.12044162],\n", + " [0.06785953, 0.07394155, 0.09123981, 0.11085573, 0.11510767,\n", + " 0.1066044 , 0.09650542, 0.09928134, 0.11839816, 0.13560764]])}, 'time': 9.0}, {'fields': {'glucose': array([[ 6.48448545, 6.52312971, 7.23439414, 8.29032294, 8.41007623,\n", + " 7.86184124, 7.99495259, 8.55825093, 9.0082559 , 9.06288871],\n", + " [ 8.14143526, 7.68258085, 7.63591484, 8.18986016, 8.39160159,\n", + " 8.12622409, 8.30072948, 8.78612554, 8.89863265, 8.49759032],\n", + " [10.17473818, 9.43358541, 8.66789657, 8.40869161, 8.27074196,\n", + " 8.0390494 , 8.13095747, 8.61783339, 8.70179972, 8.18223649],\n", + " [10.83235708, 10.37857261, 9.60419947, 8.81370782, 8.10559087,\n", + " 7.67438933, 7.80010561, 8.47994762, 8.79065318, 8.48908097],\n", + " [10.04461261, 10.02270974, 9.7141123 , 8.96754352, 7.99608282,\n", + " 7.47016276, 7.7771645 , 8.64684002, 9.13570365, 8.98091782],\n", + " [ 8.83608648, 8.9432019 , 8.84229477, 8.31809751, 7.55582545,\n", + " 7.22973604, 7.78669146, 8.68907455, 9.09571835, 8.81347095],\n", + " [ 8.49549699, 8.48824294, 8.20101498, 7.71552971, 7.22897307,\n", + " 7.14079819, 7.85900915, 8.68954639, 8.78757523, 8.11004574],\n", + " [ 9.32947596, 9.22956658, 8.70861153, 8.04637142, 7.43902931,\n", + " 7.21740819, 7.79018585, 8.5206135 , 8.54305117, 7.70333616],\n", + " [ 9.79611975, 9.86311163, 9.59107567, 9.00236255, 8.13466993,\n", + " 7.44608707, 7.62631667, 8.23251618, 8.33102726, 7.54110538],\n", + " [ 9.06200405, 9.49455581, 9.86888247, 9.77160026, 8.84982392,\n", + " 7.65858021, 7.39688495, 7.92613941, 8.12969038, 7.44864435]]), 'acetate': array([[0.0461356 , 0.04896382, 0.05905392, 0.06626193, 0.06323552,\n", + " 0.048306 , 0.04009865, 0.03576854, 0.03528094, 0.03722276],\n", + " [0.05764125, 0.05893322, 0.06246963, 0.0701092 , 0.07348164,\n", + " 0.06333189, 0.05529895, 0.04938515, 0.04655416, 0.04509347],\n", + " [0.06784594, 0.06904598, 0.06890129, 0.07400701, 0.07955021,\n", + " 0.07425121, 0.0675004 , 0.06349268, 0.06017166, 0.0555917 ],\n", + " [0.07110158, 0.07005321, 0.06956912, 0.07199716, 0.07637955,\n", + " 0.07555645, 0.07357942, 0.07439518, 0.07326127, 0.07060077],\n", + " [0.06943445, 0.06901397, 0.07010289, 0.06912986, 0.07018724,\n", + " 0.07322911, 0.07602758, 0.07674176, 0.07544942, 0.07583713],\n", + " [0.07165042, 0.07100614, 0.06926257, 0.06466229, 0.06401981,\n", + " 0.06946163, 0.0755651 , 0.07424044, 0.0701032 , 0.06890273],\n", + " [0.06881858, 0.06897471, 0.0644559 , 0.06164288, 0.0633667 ,\n", + " 0.06790755, 0.07335068, 0.07236018, 0.06952874, 0.06675516],\n", + " [0.0648279 , 0.06835748, 0.06702056, 0.06856739, 0.06961852,\n", + " 0.06823659, 0.0690945 , 0.07021938, 0.07281397, 0.07118274],\n", + " [0.05642466, 0.06354479, 0.07257732, 0.08197413, 0.07971962,\n", + " 0.06950133, 0.06526009, 0.06902344, 0.07787628, 0.07806323],\n", + " [0.05101299, 0.06089401, 0.07997228, 0.09738766, 0.09314522,\n", + " 0.0736105 , 0.06387497, 0.07230477, 0.08770958, 0.08897995]]), 'biomass': array([[0.10941785, 0.10961361, 0.10598097, 0.09681512, 0.08803802,\n", + " 0.07378699, 0.06157467, 0.05277715, 0.05083655, 0.05437068],\n", + " [0.0979168 , 0.10337617, 0.10494763, 0.10280136, 0.10083329,\n", + " 0.09073783, 0.07935365, 0.06901434, 0.06606503, 0.06906711],\n", + " [0.08798879, 0.09420651, 0.09934737, 0.10485288, 0.11067849,\n", + " 0.10739418, 0.09923695, 0.08932464, 0.08464111, 0.08499381],\n", + " [0.08417987, 0.08600359, 0.0904708 , 0.09884353, 0.11076151,\n", + " 0.11627027, 0.1133052 , 0.10496435, 0.09951088, 0.09920606],\n", + " [0.08669503, 0.0862223 , 0.08873259, 0.09375539, 0.10553499,\n", + " 0.1172681 , 0.11702784, 0.10688949, 0.09988322, 0.10106734],\n", + " [0.09816094, 0.09614138, 0.09424512, 0.09456109, 0.10386507,\n", + " 0.11683556, 0.11615182, 0.10399545, 0.09578321, 0.09771186],\n", + " [0.09874337, 0.09846277, 0.09592311, 0.09825017, 0.10738652,\n", + " 0.11589391, 0.11165641, 0.10125565, 0.09894473, 0.10593787],\n", + " [0.08689702, 0.09094927, 0.09435552, 0.10303662, 0.1121783 ,\n", + " 0.11422147, 0.10635439, 0.09971617, 0.10520358, 0.11750032],\n", + " [0.07489223, 0.08152843, 0.09327163, 0.10857569, 0.11572017,\n", + " 0.11229736, 0.10325264, 0.10096428, 0.11325274, 0.12866725],\n", + " [0.07396194, 0.08097423, 0.09814031, 0.11714094, 0.12216396,\n", + " 0.11457835, 0.10521548, 0.10800841, 0.12614264, 0.1429218 ]])}, 'time': 10.0}]}\n" ] } ], "source": [ - "n_bins = (5, 5)\n", + "n_bins = (10, 10)\n", "\n", "initial_glucose = np.random.uniform(low=0, high=20, size=n_bins)\n", "initial_acetate = np.random.uniform(low=0, high=0, size=n_bins)\n", @@ -1096,232 +1679,19 @@ "\n", "sim = Composite({'state': composite_state}, core=core)\n", "\n", - "sim.update({}, 10.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "812b9fdd-f810-4310-86c5-d6aa8367c294", - "metadata": {}, - "outputs": [], - "source": [ - "result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "57864d93-398d-4872-9aea-7880c5d5c5ec", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1fbb10bb-2f75-4262-83f2-e4c9c0352c34", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7dcd0440-800c-4ba1-96b5-3b2d3c5c8f29", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "983b47cbb5623b3d", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Spatial dFBA composite simulation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7f92f56a30057ef9", - "metadata": { - "ExecuteTime": { - "end_time": "2024-06-18T22:20:20.354240Z", - "start_time": "2024-06-18T22:20:03.598052Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "n_bins = (2, 2)\n", - "\n", - "initial_glucose = np.random.uniform(low=0, high=20, size=n_bins)\n", - "initial_acetate = np.random.uniform(low=0, high=0, size=n_bins)\n", - "initial_biomass = np.random.uniform(low=0, high=0.1, size=n_bins)\n", + "sim.update({}, 10.0)\n", "\n", - "dfba_processes_dict = {}\n", - "for i in range(n_bins[0]):\n", - " for j in range(n_bins[1]):\n", - " dfba_processes_dict[f'[{i},{j}]'] = {\n", - " '_type': 'process',\n", - " 'address': 'local:DynamicFBA',\n", - " 'config': dfba_config(),\n", - " 'inputs': {\n", - " 'substrates': {\n", - " 'glucose': ['..', '..', 'fields', 'glucose', i, j],\n", - " 'acetate': ['..', '..', 'fields', 'acetate', i, j],\n", - " 'biomass': ['..', '..', 'fields', 'biomass', i, j],\n", - " }\n", - " },\n", - " 'outputs': {\n", - " 'substrates': {\n", - " 'glucose': ['..', '..', 'fields', 'glucose', i, j],\n", - " 'acetate': ['..', '..', 'fields', 'acetate', i, j],\n", - " 'biomass': ['..', '..', 'fields', 'biomass', i, j]\n", - " }\n", - " }\n", - " }\n", + "results = sim.gather_results()\n", "\n", - "composite_state = {\n", - " 'fields': {\n", - " '_type': 'map',\n", - " '_value': {\n", - " '_type': 'array',\n", - " '_size': n_bins,\n", - " '_value': 'positive_float'\n", - " },\n", - " 'glucose': initial_glucose,\n", - " 'acetate': initial_acetate,\n", - " 'biomass': initial_biomass,\n", - " },\n", - " 'spatial_dfba': dfba_processes_dict\n", - "}\n", - "\n", - "sim = Composite({'state': composite_state}, core=core)\n" + "print(results)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b6f24905-9ae4-458f-b794-9eef774a35b4", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0e4fd7e9-9ddf-4bca-a8f6-92c20670e2bb", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f3316851-5ba8-4e5c-b915-3bc74665dadb", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d67aebf9-f5fb-4b9d-be22-6edd064103f2", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "768e3533-398d-4a02-a041-24dab9fe8517", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "43b0f28a-2679-420b-97f2-2faac5f0cdcf", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3e917a6d-8e58-46c7-8865-b487d6dba616", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8e6ba7e397d883bf", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "sim.state['spatial_dfba']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "34221fba51751ea7", - "metadata": { - "ExecuteTime": { - "end_time": "2024-06-18T22:20:20.356451Z", - "start_time": "2024-06-18T22:20:20.356230Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "composite_state" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "24508915eb52af63", - "metadata": { - "ExecuteTime": { - "end_time": "2024-06-18T22:20:20.357449Z", - "start_time": "2024-06-18T22:20:20.357343Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python (process-bigraph)", "language": "python", - "name": "python3" + "name": "process-bigraph" }, "language_info": { "codemirror_mode": {