In [1]:
from bigraph_viz import plot_bigraph
from process_bigraph import allocate_core

core = allocate_core()

plot_settings = {"show_types": True, "rankdir": "RL", "dpi": "70"}
In [2]:
volumetric = {
        "amounts [mol or g]": "float",
        "concentrations [mol/L or g/L]": "float",
        "volume [L]": "float",
}
core.register_type("volumetric", volumetric)
core.register_type("mol", "float")
core.register_type("g", "float")
core.register_type("mol/L", "float")
core.register_type("g/L", "float")
core.register_type("L", "float")


single = {
    "volumetric": volumetric
}


plot_bigraph(single,
             filename="volumetric",
             label_margin='0.04',
             node_label_size='16pt',
             dpi="70",
             )
Writing out/volumetric
Out[2]:
bigraph ('volumetric',) volumetric ('volumetric', 'amounts [mol or g]') amounts [mol or g] ('volumetric',)->('volumetric', 'amounts [mol or g]') ('volumetric', 'concentrations [mol/L or g/L]') concentrations [mol/L or g/L] ('volumetric',)->('volumetric', 'concentrations [mol/L or g/L]') ('volumetric', 'volume [L]') volume [L] ('volumetric',)->('volumetric', 'volume [L]')
In [3]:
volumetric_process = {
    "_type": "process",
        "_inputs": {
            "species": "any",
        },
        "_outputs": {
            "species": "any",
    },
}


cdfba_crm = {
    "volumetric": {}, #volumetric,
    "cdFBA": {**volumetric_process,
        "inputs": {
            "species": ["volumetric"]
        },
        "outputs": {
            "species": ["volumetric"]
        }
    },
    "CRM": {**volumetric_process,
        "inputs": {
            "species": ["volumetric"]
        },
        "outputs": {
            "species": ["volumetric"]
        }
    },
}


plot_bigraph(cdfba_crm,
             filename="cdfba_crm",
             label_margin='0.04',
             node_label_size='16pt',
             dpi="120",
             rankdir='RL',
             )
Writing out/cdfba_crm
Out[3]:
bigraph ('volumetric',) volumetric ('cdFBA',) cdFBA ('volumetric',)->('cdFBA',) species ('CRM',) CRM ('volumetric',)->('CRM',) species
In [ ]:
 
In [4]:
transport = {
        "_type": "process",
        "_inputs": {
            "regions": "any",
        },
        "_outputs": {
            "regions": "any",
        },
}


volumetric = {}
    # "amounts [mol or g]": "union[mol,g]",
    # "concentrations [mol/L or g/L]": "mol/L or g/L",
    # "volume [L]": "L",
# }

# Example volumetric compartments
regions = [
    "duodenum [volumetric]",
    "jejunum [volumetric]",
    "ileum [volumetric]",
    "ascending colon [volumetric]",
    # "transverse colon [volumetric]",
    "descending colon [volumetric]",
    # "rectum [volumetric]",
]

# base process template
volumetric_process = {
    "_type": "process",
    "_name": "cdFBA-CRM",
    # inputs/outputs will be filled in per region
}

# build the dict
gut = {}

# add volumetric stores
for region in regions:
    gut[region] = volumetric

# add one cdFBA-CRM per region
for i, region in enumerate(regions, start=1):
    gut[f"cdFBA-CRM{i}"] = {
        **volumetric_process,
        "inputs": {"species": [region]},
        "outputs": {"species": [region]},
    }

multiple = {
    "diffusion": {**transport,
        "inputs": {
            "regions": ["gut"]
        },
        "outputs": {
            "regions": ["gut"]
        }
    },
    "peristalsis": {**transport,
        "inputs": {
            "regions": ["gut"]
        },
        "outputs": {
            "regions": ["gut"]
        }
    },
    "gut": gut
}
node_groups = [[('gut',), ('diffusion',), ('peristalsis',)]
               ]  # group the gut regions and the transport processes

plot_bigraph(multiple,
             filename="volumetric_multiregion",
             label_margin='0.04',
             node_label_size='16pt',
             dpi="70",
             **{"node_groups": node_groups,
                "remove_process_place_edges": True}
             )
Writing out/volumetric_multiregion
Out[4]:
bigraph ('gut',) gut ('gut', 'duodenum [volumetric]') duodenum [volumetric] ('gut',)->('gut', 'duodenum [volumetric]') ('gut', 'jejunum [volumetric]') jejunum [volumetric] ('gut',)->('gut', 'jejunum [volumetric]') ('gut', 'ileum [volumetric]') ileum [volumetric] ('gut',)->('gut', 'ileum [volumetric]') ('gut', 'ascending colon [volumetric]') ascending colon [volumetric] ('gut',)->('gut', 'ascending colon [volumetric]') ('gut', 'descending colon [volumetric]') descending colon [volumetric] ('gut',)->('gut', 'descending colon [volumetric]') ('diffusion',) diffusion ('gut',)->('diffusion',) regions ('peristalsis',) peristalsis ('gut',)->('peristalsis',) regions ('gut', 'cdFBA-CRM1') cdFBA-CRM1 ('gut', 'cdFBA-CRM2') cdFBA-CRM2 ('gut', 'cdFBA-CRM3') cdFBA-CRM3 ('gut', 'cdFBA-CRM4') cdFBA-CRM4 ('gut', 'cdFBA-CRM5') cdFBA-CRM5 ('gut', 'duodenum [volumetric]')->('gut', 'cdFBA-CRM1') species ('gut', 'jejunum [volumetric]')->('gut', 'cdFBA-CRM2') species ('gut', 'ileum [volumetric]')->('gut', 'cdFBA-CRM3') species ('gut', 'ascending colon [volumetric]')->('gut', 'cdFBA-CRM4') species ('gut', 'descending colon [volumetric]')->('gut', 'cdFBA-CRM5') species
In [5]:
fba = {
    "Flux Balance Analysis (FBA)": {
        "_type": "process",
        "_inputs": {
            "flux bounds": "map[rxn_id: lower, upper]",
            "objective": "string",
            # "biomass": "string",
            "stoichiometric matrix": "array[n_metabolites × n_rxns]",
        },
        "_outputs": {
            "internal fluxes": "array[mmol/L/hr]",
            "exchanges": "array[mmol/L/hr]",
            "growth rate": "mmol/gDCW/hr",
        },
    },
}
plot_bigraph(fba, filename="fba", **plot_settings)
> /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/bigraph_schema/core.py(387)access()
    386                     import ipdb; ipdb.set_trace()
--> 387                     raise Exception(f'unable to parse type "{key}"\n\ndue to\n{e}')
    388             else:

Writing out/fba
Out[5]:
bigraph ('Flux Balance Analysis (FBA)',) Flux Balance Analysis (FBA) ('Flux Balance Analysis (FBA)', 'f', 'l', 'u', 'x', ' ', 'b', 'o', 'u', 'n', 'd', 's')_input->('Flux Balance Analysis (FBA)',) flux bounds ('Flux Balance Analysis (FBA)', 's', 't', 'o', 'i', 'c', 'h', 'i', 'o', 'm', 'e', 't', 'r', 'i', 'c', ' ', 'm', 'a', 't', 'r', 'i', 'x')_input->('Flux Balance Analysis (FBA)',) stoichiometric matrix ('Flux Balance Analysis (FBA)', 'o', 'b', 'j', 'e', 'c', 't', 'i', 'v', 'e')_input->('Flux Balance Analysis (FBA)',) objective ('Flux Balance Analysis (FBA)', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', ' ', 'f', 'l', 'u', 'x', 'e', 's')_output->('Flux Balance Analysis (FBA)',) internal fluxes ('Flux Balance Analysis (FBA)', 'g', 'r', 'o', 'w', 't', 'h', ' ', 'r', 'a', 't', 'e')_output->('Flux Balance Analysis (FBA)',) growth rate ('Flux Balance Analysis (FBA)', 'e', 'x', 'c', 'h', 'a', 'n', 'g', 'e', 's')_output->('Flux Balance Analysis (FBA)',) exchanges
In [6]:
crm = {
    "Consumer Resource Model (CRM)": {
        "_type": "process",
        "_inputs": {
            "species abundances": "array[n_species]  # cells/mL or OD",
            "resource concentrations": "array[n_resources]  # mmol/L",
            "preference matrix": "array[n_species × n_resources]  # unitless uptake preferences",
            "uptake kinetics": "map[resource_id: {Vmax: float (mmol/L/hr), Km: float (mmol/L)}]",
            # "yields": "array[n_species × n_resources]  # biomass yield (gDCW/mmol)",
            # "maintenance costs": "array[n_species]  # mmol/L/hr or gDCW/hr",
            # "resource supply": "map[resource_id: {inflow: float (mmol/L/hr), feed_conc: float (mmol/L)}]",
            "dilution rate": "float  # 1/hr (chemostat) or 0 for batch",
            # "stoichiometry (optional)": "array[n_resources × n_species]  # if using explicit conversions",
        },
        "_outputs": {
            # "species trajectories": "array[n_species × n_timepoints]  # cells/mL or OD",
            # "resource trajectories": "array[n_resources × n_timepoints]  # mmol/L",
            "uptake fluxes": "array[n_species × n_resources × n_timepoints]  # mmol/L/hr",
            "growth rates": "array[n_species × n_timepoints]  # 1/hr",
            # "community metrics (optional)": "map[{diversity, evenness, richness}: trajectory]",
        },
    },
}
plot_bigraph(crm, filename="crm", **plot_settings)
> /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/bigraph_schema/core.py(387)access()
    386                     import ipdb; ipdb.set_trace()
--> 387                     raise Exception(f'unable to parse type "{key}"\n\ndue to\n{e}')
    388             else:

Writing out/crm
Out[6]:
bigraph ('Consumer Resource Model (CRM)',) Consumer Resource Model (CRM) ('Consumer Resource Model (CRM)', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', ' ', 'c', 'o', 'n', 'c', 'e', 'n', 't', 'r', 'a', 't', 'i', 'o', 'n', 's')_input->('Consumer Resource Model (CRM)',) resource concentrations ('Consumer Resource Model (CRM)', 'd', 'i', 'l', 'u', 't', 'i', 'o', 'n', ' ', 'r', 'a', 't', 'e')_input->('Consumer Resource Model (CRM)',) dilution rate ('Consumer Resource Model (CRM)', 'p', 'r', 'e', 'f', 'e', 'r', 'e', 'n', 'c', 'e', ' ', 'm', 'a', 't', 'r', 'i', 'x')_input->('Consumer Resource Model (CRM)',) preference matrix ('Consumer Resource Model (CRM)', 'u', 'p', 't', 'a', 'k', 'e', ' ', 'k', 'i', 'n', 'e', 't', 'i', 'c', 's')_input->('Consumer Resource Model (CRM)',) uptake kinetics ('Consumer Resource Model (CRM)', 's', 'p', 'e', 'c', 'i', 'e', 's', ' ', 'a', 'b', 'u', 'n', 'd', 'a', 'n', 'c', 'e', 's')_input->('Consumer Resource Model (CRM)',) species abundances ('Consumer Resource Model (CRM)', 'g', 'r', 'o', 'w', 't', 'h', ' ', 'r', 'a', 't', 'e', 's')_output->('Consumer Resource Model (CRM)',) growth rates ('Consumer Resource Model (CRM)', 'u', 'p', 't', 'a', 'k', 'e', ' ', 'f', 'l', 'u', 'x', 'e', 's')_output->('Consumer Resource Model (CRM)',) uptake fluxes
In [7]:
kinetic = {
    "Kinetic ODE Model (SBML-style)": {
        "_type": "process",
        "_inputs": {
            "compartments": "map[comp_id: volume (L)]",
            "species": "map[spec_id: {compartment: comp_id, initial_concentration: float (mol/L)}]",
            "parameters": "map[param_id: value (units vary)]",
            "reactions": (
                "list[{id, reactants: map[spec: stoich], products: map[spec: stoich], "
                "kinetic_law: str (e.g., 'k1*A - k2*B/C'), modifiers (optional): list[spec_id]}]"
            ),
        },
        "_outputs": {
            "trajectories": "array[n_species × n_timepoints]  # mol/L by compartment",
            "reaction rates": "array[n_reactions × n_timepoints]  # mol/L/s",
            "observables": "map[obs_id: array[n_timepoints]]",
        },
    },
}
plot_bigraph(kinetic, filename="kinetic", **plot_settings)
> /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/bigraph_schema/core.py(387)access()
    386                     import ipdb; ipdb.set_trace()
--> 387                     raise Exception(f'unable to parse type "{key}"\n\ndue to\n{e}')
    388             else:

Writing out/kinetic
Out[7]:
bigraph ('Kinetic ODE Model (SBML-style)',) Kinetic ODE Model (SBML-style) ('Kinetic ODE Model (SBML-style)', 'r', 'e', 'a', 'c', 't', 'i', 'o', 'n', 's')_input->('Kinetic ODE Model (SBML-style)',) reactions ('Kinetic ODE Model (SBML-style)', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's')_input->('Kinetic ODE Model (SBML-style)',) parameters ('Kinetic ODE Model (SBML-style)', 's', 'p', 'e', 'c', 'i', 'e', 's')_input->('Kinetic ODE Model (SBML-style)',) species ('Kinetic ODE Model (SBML-style)', 'c', 'o', 'm', 'p', 'a', 'r', 't', 'm', 'e', 'n', 't', 's')_input->('Kinetic ODE Model (SBML-style)',) compartments ('Kinetic ODE Model (SBML-style)', 't', 'r', 'a', 'j', 'e', 'c', 't', 'o', 'r', 'i', 'e', 's')_output->('Kinetic ODE Model (SBML-style)',) trajectories ('Kinetic ODE Model (SBML-style)', 'o', 'b', 's', 'e', 'r', 'v', 'a', 'b', 'l', 'e', 's')_output->('Kinetic ODE Model (SBML-style)',) observables ('Kinetic ODE Model (SBML-style)', 'r', 'e', 'a', 'c', 't', 'i', 'o', 'n', ' ', 'r', 'a', 't', 'e', 's')_output->('Kinetic ODE Model (SBML-style)',) reaction rates
In [8]:
transport = {
    "Spatial Transport Model": {
        "_type": "process",
        "_inputs": {
            "grid": "map[{nx, ny, (nz)}, spacing: {dx, dy, (dz)}, domain: {x: (min,max), y: (min,max), (z)}]",
            "fields": "map[field_id: initial_array[grid_shape]]  # e.g., concentration (mol/m^3)",
            "diffusion_coefficients": "map[field_id: float or array[grid_shape]]  # m^2/s",
            "advection_field": "map[{vx, vy, (vz)}: array[grid_shape]]  # m/s",
            "sources_sinks": "map[field_id: function(field,state,t)->array[grid_shape]]",
            # "reactions (optional)": "map[field_id: function(fields,params)->array[grid_shape]]",
            "boundary_conditions": (
                "map[face in {left,right,top,bottom,(front,back)}: "
                "{type: 'Dirichlet'|'Neumann'|'Robin'|'Periodic', value: float|array}]"
            ),
            "coupling/transport": (
                "map[interface_id: {permeability: float (m/s), from_field: id, to_field: id}]"
            ),
            # "time stepping": "map[{dt: float (s), t_end: float (s)}]",
            # "numerics": "map[{scheme: 'FD'|'FV'|'FE', order: int, stabilization (optional): str}]",
        },
        "_outputs": {
            # "field trajectories": "map[field_id: array[n_timepoints × grid_shape]]  # mol/m^3",
            "fluxes": "map[field_id: array[n_timepoints × grid_shape × dim]]  # mol/m^2/s",
            # "boundary flux log": "map[face: array[n_timepoints]]  # integrated flux",
            "mass balance": "map[field_id: array[n_timepoints]]  # total quantity over domain",
            # "stability diagnostics (optional)": "map[{CFL, Pe, Damkohler}: array[n_timepoints]]",
        },
    },
}
plot_bigraph(transport, filename="transport", **plot_settings)
> /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/bigraph_schema/core.py(387)access()
    386                     import ipdb; ipdb.set_trace()
--> 387                     raise Exception(f'unable to parse type "{key}"\n\ndue to\n{e}')
    388             else:

Writing out/transport
Out[8]:
bigraph ('Spatial Transport Model',) Spatial Transport Model ('Spatial Transport Model', 'b', 'o', 'u', 'n', 'd', 'a', 'r', 'y', '_', 'c', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', 's')_input->('Spatial Transport Model',) boundary_conditions ('Spatial Transport Model', 's', 'o', 'u', 'r', 'c', 'e', 's', '_', 's', 'i', 'n', 'k', 's')_input->('Spatial Transport Model',) sources_sinks ('Spatial Transport Model', 'c', 'o', 'u', 'p', 'l', 'i', 'n', 'g', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't')_input->('Spatial Transport Model',) coupling/transport ('Spatial Transport Model', 'a', 'd', 'v', 'e', 'c', 't', 'i', 'o', 'n', '_', 'f', 'i', 'e', 'l', 'd')_input->('Spatial Transport Model',) advection_field ('Spatial Transport Model', 'd', 'i', 'f', 'f', 'u', 's', 'i', 'o', 'n', '_', 'c', 'o', 'e', 'f', 'f', 'i', 'c', 'i', 'e', 'n', 't', 's')_input->('Spatial Transport Model',) diffusion_coefficients ('Spatial Transport Model', 'g', 'r', 'i', 'd')_input->('Spatial Transport Model',) grid ('Spatial Transport Model', 'f', 'i', 'e', 'l', 'd', 's')_input->('Spatial Transport Model',) fields ('Spatial Transport Model', 'm', 'a', 's', 's', ' ', 'b', 'a', 'l', 'a', 'n', 'c', 'e')_output->('Spatial Transport Model',) mass balance ('Spatial Transport Model', 'f', 'l', 'u', 'x', 'e', 's')_output->('Spatial Transport Model',) fluxes
In [9]:
multicellular = {
    "Multicellular Intestinal Crypt Model": {
        "_type": "composite",  # composed of sub-processes (mechanics, cell cycle, signaling, transport)
        "_inputs": {
            "geometry": (
                "map[{type: '1D_axis'|'2D_lattice'|'3D_mesh', "
                "mesh/lattice: data, metrics: {basement_membrane: surface, lumen: region}}]"
            ),
            # "cell types": (
            #     "map[type_id in {stem, TA, differentiated, Paneth, Goblet, Enterocyte}: "
            #     "{proliferation_rate (1/hr), differentiation_rules, apoptosis_rules, "
            #     "adhesion_params, size, target_volume}]"
            # ),
            "initial cells": (
                "list[{id, type_id, position, polarity (optional), cycle_state, "
                "receptor_levels (optional)}]"
            ),
            "update rules": "map[...]",
            "mechanics": (
                "map[{model: 'CPM'|'vertex'|'agent-force', "
                "parameters: {adhesion, cortical_tension, elasticity, friction}}]"
            ),
            "signaling fields": (
                "map[field_id in {Wnt, BMP, Notch_ligands, EGF, morphogens}: "
                "{initial: array[grid_shape], source_regions, decay_rate, diffusion_coeff}]"
            ),
            # "transport/coupling": "as in Spatial Transport Model (for morphogen fields)",
            # "migration rules": "function(cell, neighbors, fields, t) -> new_position/force",
            "homeostasis targets": (
                "map[{height_range, stem_cell_zone_extent, turnover_time (hrs), "
                "cell_counts_by_type}]"
            ),
            # "boundary_conditions": "for both cells (adhesion/reflect) and fields (Dirichlet/Neumann)",
        },
        "_outputs": {
            "cell positions": "",
            # "population statistics": (
            #     "map[time: {counts_by_type, stem_zone_height, crypt_height, turnover_rate}]"
            # ),
            # "lineages": "map[cell_id: lineage_tree]",
            "signaling fields": "map[field_id: array[n_timepoints × grid_shape]]",
            "morphometrics": "map[time: {cell_areas/volumes, packing, curvature}]",
        },
    },
}
plot_bigraph(multicellular, filename="multicellular", **plot_settings)
> /opt/hostedtoolcache/Python/3.11.15/x64/lib/python3.11/site-packages/bigraph_schema/core.py(387)access()
    386                     import ipdb; ipdb.set_trace()
--> 387                     raise Exception(f'unable to parse type "{key}"\n\ndue to\n{e}')
    388             else:

Writing out/multicellular
Out[9]:
bigraph ('Multicellular Intestinal Crypt Model',) Multicellular Intestinal Crypt Model ('Multicellular Intestinal Crypt Model', 'm', 'e', 'c', 'h', 'a', 'n', 'i', 'c', 's')_input->('Multicellular Intestinal Crypt Model',) mechanics ('Multicellular Intestinal Crypt Model', 'u', 'p', 'd', 'a', 't', 'e', ' ', 'r', 'u', 'l', 'e', 's')_input->('Multicellular Intestinal Crypt Model',) update rules ('Multicellular Intestinal Crypt Model', 's', 'i', 'g', 'n', 'a', 'l', 'i', 'n', 'g', ' ', 'f', 'i', 'e', 'l', 'd', 's')_input->('Multicellular Intestinal Crypt Model',) signaling fields ('Multicellular Intestinal Crypt Model', 'i', 'n', 'i', 't', 'i', 'a', 'l', ' ', 'c', 'e', 'l', 'l', 's')_input->('Multicellular Intestinal Crypt Model',) initial cells ('Multicellular Intestinal Crypt Model', 'h', 'o', 'm', 'e', 'o', 's', 't', 'a', 's', 'i', 's', ' ', 't', 'a', 'r', 'g', 'e', 't', 's')_input->('Multicellular Intestinal Crypt Model',) homeostasis targets ('Multicellular Intestinal Crypt Model', 'g', 'e', 'o', 'm', 'e', 't', 'r', 'y')_input->('Multicellular Intestinal Crypt Model',) geometry ('Multicellular Intestinal Crypt Model', 'c', 'e', 'l', 'l', ' ', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', 's')_output->('Multicellular Intestinal Crypt Model',) cell positions ('Multicellular Intestinal Crypt Model', 's', 'i', 'g', 'n', 'a', 'l', 'i', 'n', 'g', ' ', 'f', 'i', 'e', 'l', 'd', 's')_output->('Multicellular Intestinal Crypt Model',) signaling fields ('Multicellular Intestinal Crypt Model', 'm', 'o', 'r', 'p', 'h', 'o', 'm', 'e', 't', 'r', 'i', 'c', 's')_output->('Multicellular Intestinal Crypt Model',) morphometrics
In [ ]: