Skip to content

Commit 8271da1

Browse files
authored
Don't eliminate parameters that are initial assignment targets (pt1) (#2304)
Currently, parameters that are targets of initial assignments don't show up as parameters or expressions in the amici model. This is rather not what most users would expect. As a first step: treat all SBML parameters that are initial assignment targets and whose initial assignment evaluates to a number as amici parameters. Related to #2150.
1 parent 16ec8b2 commit 8271da1

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

python/sdist/amici/sbml_import.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,15 +1051,23 @@ def _process_parameters(
10511051
"Parameter does not exist." % parameter
10521052
)
10531053

1054+
# parameter ID => initial assignment sympy expression
1055+
par_id_to_ia = {
1056+
par.getId(): ia
1057+
for par in self.sbml.getListOfParameters()
1058+
if (ia := self._get_element_initial_assignment(par.getId()))
1059+
is not None
1060+
}
1061+
10541062
fixed_parameters = [
10551063
parameter
10561064
for parameter in self.sbml.getListOfParameters()
10571065
if parameter.getId() in constant_parameters
10581066
]
10591067
for parameter in fixed_parameters:
1068+
ia_math = par_id_to_ia.get(parameter.getId())
10601069
if (
1061-
self._get_element_initial_assignment(parameter.getId())
1062-
is not None
1070+
(ia_math is not None and not ia_math.is_Number)
10631071
or self.is_assignment_rule_target(parameter)
10641072
or self.is_rate_rule_target(parameter)
10651073
):
@@ -1074,7 +1082,10 @@ def _process_parameters(
10741082
parameter
10751083
for parameter in self.sbml.getListOfParameters()
10761084
if parameter.getId() not in constant_parameters
1077-
and self._get_element_initial_assignment(parameter.getId()) is None
1085+
and (
1086+
(ia_math := par_id_to_ia.get(parameter.getId())) is None
1087+
or ia_math.is_Number
1088+
)
10781089
and not self.is_assignment_rule_target(parameter)
10791090
and parameter.getId() not in hardcode_symbols
10801091
]
@@ -1091,16 +1102,16 @@ def _process_parameters(
10911102
for par in settings["var"]:
10921103
self.symbols[partype][_get_identifier_symbol(par)] = {
10931104
"name": par.getName() if par.isSetName() else par.getId(),
1094-
"value": sp.Float(par.getValue()),
1105+
"value": par_id_to_ia.get(
1106+
par.getId(), sp.Float(par.getValue())
1107+
),
10951108
}
10961109

10971110
# Parameters that need to be turned into expressions
10981111
# so far, this concerns parameters with initial assignments containing rateOf(.)
10991112
# (those have been skipped above)
11001113
for par in self.sbml.getListOfParameters():
1101-
if (
1102-
ia := self._get_element_initial_assignment(par.getId())
1103-
) is not None and ia.find(
1114+
if (ia := par_id_to_ia.get(par.getId())) is not None and ia.find(
11041115
sp.core.function.UndefinedFunction("rateOf")
11051116
):
11061117
self.symbols[SymbolId.EXPRESSION][
@@ -1877,7 +1888,10 @@ def _process_initial_assignments(self):
18771888
for ia in self.sbml.getListOfInitialAssignments():
18781889
identifier = _get_identifier_symbol(ia)
18791890
if identifier in itt.chain(
1880-
self.symbols[SymbolId.SPECIES], self.compartments
1891+
self.symbols[SymbolId.SPECIES],
1892+
self.compartments,
1893+
self.symbols[SymbolId.PARAMETER],
1894+
self.symbols[SymbolId.FIXED_PARAMETER],
18811895
):
18821896
continue
18831897

0 commit comments

Comments
 (0)