Skip to content

Elementary flux modes and extreme pathways

The toy network of Raman whose steady-state cone ElementaryModeAnalysis enumerates.

  • Name: elementary_flux_modes
  • Field: biology/systems_biology
  • Formalism: static solution
  • References: Raman 2021; Schuster and Hilgetag 1994; Schilling et al. 2000; Gagneur and Klamt 2004

Select this system

from skcomplex.systems import create_simulation, create_system, describe

system = create_system('elementary_flux_modes')
entry = describe('elementary_flux_modes')
trajectory = create_simulation('elementary_flux_modes').prepare().run().trajectory_

Factory

@register_system(
    field='biology/systems_biology',
    tags=('elementary flux modes', 'extreme pathways', 'linear program', 'metabolism', 'static'),
    references=('Raman 2021', 'Schuster and Hilgetag 1994', 'Schilling et al. 2000', 'Gagneur and Klamt 2004'),
    defaults={'until': 0.0},
)
def elementary_flux_modes(knockouts: Sequence[str] = ()) -> System:
    """Return the toy network of Raman whose steady-state cone `ElementaryModeAnalysis` enumerates.

    Every steady-state flux of the network is a non-negative combination of the elementary modes of its cone (Raman
    2021, Section 9.8). The toy network has two modes, through `v1` and through `v2` and `v3`, both with growth yield
    `1/12` on `A`, so the bound 1000 on `v6` limits the growth to 50 whichever route carries the flux.

    Args:
        knockouts:
            The reactions to fix at zero.

    Returns:
        system:
            The system.

    Examples:
        >>> from skcomplex.core.analysis import ElementaryModeAnalysis
        >>> from skcomplex.systems.biology.systems_biology import elementary_flux_modes
        >>> analysis = ElementaryModeAnalysis(normalize='cell.v_b1').prepare(elementary_flux_modes()).run()
        >>> analysis.modes_.shape[0]
        2
    """
    closed = {f'{bound}_{name}': 0.0 for name in knockouts for bound in ('lower', 'upper')}
    return System(elements=[ToyNetworkElement('cell').set_params(**closed)], time=StaticTime())

Components

Elements:

  • ToyNetworkElement, from DeclaredElement
class ToyNetworkElement(MetabolicNetworkElement):
    """The toy network of Table 8.2 of Raman (2021), which grows on A alone.

    Args:
        label:
            The label of the element.

        visual:
            How the element is drawn, or `None` for the bars of its program.

        objective:
            The coefficient of every reaction in the objective, or `None` for `default_objective`.

        parsimonious:
            Whether to minimise the total absolute flux after the objective.

        infeasible:
            The infeasibility policy of the program.

        name:
            The name of the network.

        reactions:
            The reactions by name.

        default_objective:
            The objective of the network when `objective` is `None`.

        variables:
            The declared states and parameters that replace the ones of the reactions, by name, or `None` for none.

    Examples:
        >>> from skcomplex.systems.biology.common.metabolism import ToyNetworkElement
        >>> ToyNetworkElement('cell').get_value('upper_v1')
        1000.0
    """

    def __init__(
        self,
        label: str,
        visual: VisualSpec | None = None,
        *,
        objective: Mapping[str, float] | None = None,
        parsimonious: bool = False,
        infeasible: str = 'raise',
        name: str | None = 'ToyNetwork',
        reactions: Mapping[str, ReactionSpec] = TOY_REACTIONS,
        default_objective: Mapping[str, float] = TOY_OBJECTIVE,
        variables: Mapping[str, DeclaredVariableSpec] | None = None,
    ) -> None:
        super().__init__(
            label,
            visual,
            objective=objective,
            parsimonious=parsimonious,
            infeasible=infeasible,
            name=name,
            reactions=reactions,
            default_objective=default_objective,
            variables=variables,
        )