Skip to content

Commit ba70f54

Browse files
authored
Fix sympy symbol name clashes during PEtab import (#2069)
Closes #2055
1 parent f8929b9 commit ba70f54

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

python/sdist/amici/petab_import.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import sympy as sp
2424
from petab.C import *
2525
from petab.parameters import get_valid_parameters_for_parameter_table
26+
from sympy.abc import _clash
2627

2728
import amici
2829
from amici.logging import get_logger, log_execution_time, set_log_level
@@ -595,7 +596,7 @@ def import_model_sbml(
595596
output_parameters = OrderedDict()
596597
for formula in formulas:
597598
# we want reproducible parameter ordering upon repeated import
598-
free_syms = sorted(sp.sympify(formula).free_symbols,
599+
free_syms = sorted(sp.sympify(formula, locals=_clash).free_symbols,
599600
key=lambda symbol: symbol.name)
600601
for free_sym in free_syms:
601602
sym = str(free_sym)
@@ -750,11 +751,12 @@ def get_observation_model(
750751
# cannot handle states in sigma expressions. Therefore, where possible,
751752
# replace species occurring in error model definition by observableIds.
752753
replacements = {
753-
sp.sympify(observable['formula']): sp.Symbol(observable_id)
754+
sp.sympify(observable['formula'], locals=_clash):
755+
sp.Symbol(observable_id)
754756
for observable_id, observable in observables.items()
755757
}
756758
for observable_id, formula in sigmas.items():
757-
repl = sp.sympify(formula).subs(replacements)
759+
repl = sp.sympify(formula, locals=_clash).subs(replacements)
758760
sigmas[observable_id] = str(repl)
759761

760762
noise_distrs = petab_noise_distributions_to_amici(observable_df)

python/sdist/amici/petab_objective.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,23 @@
88
import copy
99
import logging
1010
import numbers
11-
from typing import (List, Sequence, Optional, Dict, Tuple, Union, Any,
12-
Collection, Iterator)
11+
from typing import (Any, Collection, Dict, Iterator, List, Optional, Sequence,
12+
Tuple, Union)
1313

14-
import amici
15-
from amici.sbml_import import get_species_initial
1614
import libsbml
1715
import numpy as np
1816
import pandas as pd
1917
import petab
2018
import sympy as sp
2119
from petab.C import * # noqa: F403
20+
from sympy.abc import _clash
2221

23-
from . import AmiciModel, AmiciExpData
22+
import amici
23+
from amici.sbml_import import get_species_initial
24+
from . import AmiciExpData, AmiciModel
2425
from .logging import get_logger, log_execution_time
26+
from .parameter_mapping import (ParameterMapping, ParameterMappingForCondition,
27+
fill_in_parameters)
2528
from .petab_import import PREEQ_INDICATOR_ID, element_is_state
2629
from .parameter_mapping import (
2730
fill_in_parameters,
@@ -568,7 +571,8 @@ def _set_initial_state(condition_id, element_id, init_par_id,
568571
.getInitialAssignmentBySymbol(element_id)
569572
if initial_assignment:
570573
initial_assignment = sp.sympify(
571-
libsbml.formulaToL3String(initial_assignment.getMath())
574+
libsbml.formulaToL3String(initial_assignment.getMath()),
575+
locals=_clash
572576
)
573577
if type_code == libsbml.SBML_SPECIES:
574578
value = get_species_initial(element) \

0 commit comments

Comments
 (0)