"""
Example simulation experiment.
"""
from pathlib import Path
from typing import Dict, Union
import numpy as np
from sbmlsim.data import Data
from sbmlsim.experiment import ExperimentRunner, SimulationExperiment
from sbmlsim.model import AbstractModel
from sbmlsim.plot import Axis, Figure
from sbmlsim.simulation import (
AbstractSim,
Dimension,
ScanSim,
Timecourse,
TimecourseSim,
)
from sbmlsim.simulator.simulation_ray import SimulatorParallel, SimulatorSerial
from sbmlsim.task import Task
from sbmlsim.test import MODEL_REPRESSILATOR
[docs]class RepressilatorExperiment(SimulationExperiment):
"""Simple repressilator experiment."""
[docs] def models(self) -> Dict[str, Union[Path, AbstractModel]]:
return {
"model1": MODEL_REPRESSILATOR,
"model2": AbstractModel(
MODEL_REPRESSILATOR, changes={"X": self.Q_(100, "dimensionless")}
),
}
[docs] def tasks(self) -> Dict[str, Task]:
tasks = dict()
for model in ["model1", "model2"]:
for sim_key in self.simulations():
tasks[f"task_{model}_{sim_key}"] = Task(model=model, simulation=sim_key)
return tasks
[docs] def simulations(self) -> Dict[str, AbstractSim]:
return {
**self.sim_scans(),
# **self.sim_sensitivities(),
}
[docs] def sim_scans(self) -> Dict[str, AbstractSim]:
Q_ = self.Q_
unit_data = "dimensionless"
tc = TimecourseSim(
[
Timecourse(start=0, end=100, steps=2000),
Timecourse(
start=0,
end=100,
steps=2000,
changes={"X": Q_(10, unit_data), "Y": Q_(20, unit_data)},
),
]
)
scan1d = ScanSim(
simulation=tc,
dimensions=[
Dimension(
"dim1", changes={"X": Q_(np.linspace(0, 10, num=11), unit_data)}
)
],
)
scan2d = ScanSim(
simulation=tc,
dimensions=[
Dimension(
"dim1",
changes={"X": Q_(np.random.normal(5, 2, size=10), unit_data)},
),
Dimension(
"dim2",
changes={"Y": Q_(np.random.normal(5, 2, size=10), unit_data)},
),
],
)
scan3d = ScanSim(
simulation=tc,
dimensions=[
Dimension(
"dim1", changes={"X": Q_(np.linspace(0, 10, num=5), unit_data)}
),
Dimension(
"dim2", changes={"Y": Q_(np.linspace(0, 10, num=5), unit_data)}
),
Dimension(
"dim3", changes={"Z": Q_(np.linspace(0, 10, num=5), unit_data)}
),
],
)
return {
"tc": tc,
"scan1d": scan1d,
"scan2d": scan2d,
# "scan3d": scan3d,
}
[docs] def datagenerators(self) -> None:
"""Data to plot and analyze.
:return:
"""
for model in ["model1", "model2"]:
for selection in ["X", "Y", "Z"]:
# accessed data
Data(self, task=f"task_{model}_tc", index=selection)
# Define functions (data generators)
Data(
self,
index="f1",
function="(sin(X)+Y+Z)/max(X)",
variables={
"X": "task_model1_tc__X",
"Y": "task_model1_tc__Y",
"Z": "task_model1_tc__Z",
},
)
Data(
self,
index="f2",
function="Y/max(Y)",
variables={
"Y": "task_model1_tc__Y",
},
)
# FIXME: arbitrary processing
# [3] arbitrary processing (e.g. pharmacokinetic calculations)
# Processing(variables) # arbitrary functions
# Aggregation over
}
[docs]def run_repressilator_experiments(output_path: Path) -> Path:
"""Run the repressilator simulation experiments."""
base_path = Path(__file__).parent
data_path = base_path
for simulator in [SimulatorSerial(), SimulatorParallel()]:
runner = ExperimentRunner(
[RepressilatorExperiment],
simulator=simulator,
data_path=data_path,
base_path=base_path,
)
_results = runner.run_experiments(
output_path=output_path / "results", show_figures=True
)
if __name__ == "__main__":
run_repressilator_experiments(Path(__file__).parent / "results")