Skip to content

Commit e5d2f70

Browse files
working on fit mapping
1 parent 42c351a commit e5d2f70

File tree

5 files changed

+137
-2
lines changed

5 files changed

+137
-2
lines changed

src/sbmlsim/experiment/runner.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ def set_simulator(self, simulator: SimulatorSerial) -> None:
7373
for experiment in self.experiments.values():
7474
experiment.simulator = simulator
7575

76-
@timeit
7776
def initialize(self, experiment_classes: Union[List[Type[SimulationExperiment]], Tuple[Type[SimulationExperiment]], Set[Type[SimulationExperiment]]], **kwargs):
7877
"""Initialize ExperimentRunner.
7978

src/sbmlsim/fit/helpers.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
"""Helper functions for fitting."""
2+
from pathlib import Path
3+
4+
from sbmlsim.fit import FitExperiment, FitMapping
5+
import pandas as pd
6+
from sbmlutils.console import console
7+
from sbmlutils.log import get_logger
8+
9+
10+
from sbmlsim.experiment import ExperimentRunner, SimulationExperiment
11+
from sbmlsim.fit import FitExperiment, FitMapping, FitData
12+
13+
from typing import Dict, List, Type, Union, Callable, Iterable, Tuple, Any
14+
15+
from sbmlsim.fit.objects import MappingMetaData
16+
17+
logger = get_logger(__name__)
18+
19+
20+
def filtered_fit_experiments(
21+
experiment_classes: List[Type[SimulationExperiment]],
22+
metadata_filters: Union[Callable, Iterable[Callable]],
23+
base_path: Path,
24+
data_path: Path,
25+
) -> Tuple[Dict[str, List[FitExperiment]], pd.DataFrame]:
26+
"""Fit experiments based on MappingMetaData.
27+
28+
:param experiment_classes: List of SimulationExperiment class definition
29+
:param metadata_filter:
30+
"""
31+
filters = [metadata_filters] if isinstance(metadata_filters, Callable) else metadata_filters
32+
33+
# instantiate objects for filtering of fit mappings
34+
runner = ExperimentRunner(
35+
experiment_classes=experiment_classes,
36+
base_path=base_path,
37+
data_path=data_path,
38+
)
39+
40+
fit_experiments: Dict[str, List[FitExperiment]] = {}
41+
all_info: List[Dict] = []
42+
43+
for k, experiment_name in enumerate(runner.experiments):
44+
# print(experiment_name)
45+
experiment_class = experiment_classes[k]
46+
experiment = runner.experiments[experiment_name]
47+
48+
# filter mappings by metadata
49+
mappings = []
50+
for fm_key, fit_mapping in experiment.fit_mappings().items():
51+
52+
# test all the filters
53+
accept = True
54+
for filter in filters:
55+
if not filter(fm_key, fit_mapping):
56+
accept = False
57+
break
58+
59+
if accept:
60+
mappings.append(fm_key)
61+
62+
# collect information
63+
try:
64+
metadata: MappingMetaData = fit_mapping.metadata
65+
yid = "__".join(fit_mapping.observable.y.sid.split("__")[1:])
66+
info: Dict[str, Any] = {
67+
"experiment": experiment_name,
68+
"fm_key": fm_key,
69+
"yid": yid,
70+
**metadata.to_dict()
71+
}
72+
all_info.append(info)
73+
except Exception as err:
74+
logger.error(
75+
f"Error in metadata for experiment '{experiment_name}', {fm_key=}"
76+
)
77+
raise err
78+
79+
if mappings:
80+
# add fit experiment from filtered mappings
81+
fit_experiments[experiment_name] = [
82+
FitExperiment(
83+
experiment=experiment_class,
84+
mappings=mappings,
85+
weights=None,
86+
use_mapping_weights=True,
87+
)
88+
]
89+
90+
df = pd.DataFrame(all_info)
91+
92+
return fit_experiments, df
93+
94+
def f_fitexp(
95+
experiment_classes: List[Type[SimulationExperiment]],
96+
metadata_filters: Union[Callable, Iterable[Callable]],
97+
base_path: Path,
98+
data_path: Path,
99+
):
100+
"""Generic function to get fit experiments for filter."""
101+
fit_experiments, df = filtered_fit_experiments(
102+
experiment_classes,
103+
metadata_filters=metadata_filters,
104+
base_path=base_path,
105+
data_path=data_path,
106+
)
107+
console.print(df.to_string())
108+
109+
return fit_experiments
110+
111+
def filter_empty(fit_mapping_key: str, fit_mapping: FitMapping) -> bool:
112+
"""Return all experiments/mappings."""
113+
return True
114+
115+

src/sbmlsim/fit/objects.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
"""Definition of Objects used in FitProblems and optimization."""
2+
from __future__ import annotations
23
import json
34
import math
45
from dataclasses import dataclass
56
from pathlib import Path
67
from typing import Any, Callable, Dict, Iterable, List, Optional, Sized, Union
78

89
import numpy as np
10+
import pandas as pd
911
from sbmlutils import log
1012
from sbmlutils.console import console
1113

@@ -274,6 +276,19 @@ def to_json(self, path: Path = None) -> Optional[str]:
274276
"""
275277
return to_json(object=self, path=path)
276278

279+
def to_dict(self, path: Path = None) -> Optional[str]:
280+
"""Serialize to JSON.
281+
282+
Serializes to file if path is provided, otherwise returns JSON string.
283+
"""
284+
return {
285+
"pid": self.pid,
286+
"start_value": self.start_value,
287+
"lower_bound": self.lower_bound,
288+
"upper_bound": self.upper_bound,
289+
"unit": self.unit,
290+
}
291+
277292
@staticmethod
278293
def from_json(json_info: Union[str, Path]) -> "FitParameter":
279294
"""Load from JSON."""
@@ -284,6 +299,11 @@ def from_json(json_info: Union[str, Path]) -> "FitParameter":
284299
d = json.loads(json_info)
285300
return FitParameter(**d)
286301

302+
@staticmethod
303+
def parameters_to_df(parameters: Iterable[FitParameter]) -> pd.DataFrame:
304+
"""DataFrame of parameters"""
305+
return pd.DataFrame([p.to_dict() for p in parameters])
306+
287307

288308
class FitData:
289309
"""Data used in a fit.

src/sbmlsim/fit/runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def run_optimization(
107107
n_cores = max(1, multiprocessing.cpu_count() - 1)
108108
logger.error(f"More cores then cpus requested, reducing cores to '{n_cores}'")
109109

110-
console.rule("START OPTIMIZATION", align="left", style="white")
110+
console.rule("Start optimization", align="left", style="white")
111111
console.log(f"Running {n_cores} workers")
112112
if size < n_cores:
113113
logger.warning(

src/sbmlsim/oven/model_state.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def get_state_path(sbml_path: Path) -> Optional[Path]:
3838
r = roadrunner.RoadRunner(str(sbml_path))
3939
# save state
4040
r.saveState(str(state_path))
41+
r.saveStateS()
4142

4243
print(f"Load from state: '{state_path}'")
4344
r.loadState(str(state_path))

0 commit comments

Comments
 (0)