SymbolicUtils.jl
SymbolicUtils.jl copied to clipboard
`simplify_fractions` changes ModelingToolkit parameters to variables
simplify_fractions
changes ModelingToolkit parameters to variables in some very rare cases. This creates problems downstream when using structural_simplify
(unbalanced reaction system). The stdout from this code block in the SBMLToolkit.get_massaction function coarsely describes the issue:
println("--- before division ---")
println(kl)
println(get_variables(kl))
for v in get_variables(kl)
println(SymbolicUtils.metadata(v))
end
println(ModelingToolkit.isparameter.(get_variables(kl)))
rate_const = kl / *((.^(reactants, stoich))...)
println("--- before simplifying fractions ---")
println(rate_const)
println(get_variables(rate_const))
for v in get_variables(rate_const)
println(SymbolicUtils.metadata(v))
end
println(ModelingToolkit.isparameter.(get_variables(rate_const)))
rate_const = SymbolicUtils.simplify_fractions(rate_const)
println("--- after simplifying fractions ---")
println(rate_const)
println(get_variables(rate_const))
for v in get_variables(rate_const)
println(SymbolicUtils.metadata(v))
end
println(ModelingToolkit.isparameter.(get_variables(rate_const)))
prints for example
--- before division ---
(k3*S2(t)) / default_compartment
Any[k3, S2(t), default_compartment]
Base.ImmutableDict{DataType, Any}(ModelingToolkit.MTKParameterCtx => true, Catalyst.ParameterConstantSpecies => false, Symbolics.VariableSource => (:parameters, :k3))
Base.ImmutableDict{DataType, Any}(ModelingToolkit.VariableInput => false, ModelingToolkit.VariableIrreducible => false, Catalyst.VariableBCSpecies => false, Symbolics.VariableSource => (:variables, :S2))
Base.ImmutableDict{DataType, Any}(ModelingToolkit.MTKParameterCtx => true, Catalyst.ParameterConstantSpecies => false, Symbolics.VariableSource => (:parameters, :default_compartment))
Bool[1, 0, 1]
--- before simplifying fractions ---
k3 / default_compartment
Any[k3, default_compartment]
Base.ImmutableDict{DataType, Any}(ModelingToolkit.MTKParameterCtx => true, Catalyst.ParameterConstantSpecies => false, Symbolics.VariableSource => (:parameters, :k3))
Base.ImmutableDict{DataType, Any}(ModelingToolkit.MTKParameterCtx => true, Catalyst.ParameterConstantSpecies => false, Symbolics.VariableSource => (:parameters, :default_compartment))
Bool[1, 1]
--- after simplifying fractions ---
k3 / default_compartment
Any[k3, default_compartment]
Base.ImmutableDict{DataType, Any}(Symbolics.VariableSource => (:variables, :k3))
Base.ImmutableDict{DataType, Any}(Symbolics.VariableSource => (:variables, :default_compartment))
Bool[0, 0]
(Strangely, most reactions work fine, as does the following MWE:
using SymbolicUtils, ModelingToolkit
@parameters a b t
@variables c(t)
kl = a * c / b
f1 = kl / c
println(get_variables(f1)) # Any[a, b]
println(ModelingToolkit.isparameter.(get_variables(f1))) # Bool[1, 1]
f2 = SymbolicUtils.simplify_fractions(f1)
println(get_variables(f2)) # Any[a, b]
println(ModelingToolkit.isparameter.(get_variables(f2))) # Bool[1, 1]
)
cc @isaacsas
Looks like another instance of https://github.com/JuliaSymbolics/SymbolicUtils.jl/issues/434
@shashi this one is going to cause (or perhaps is causing) issues for SBMLToolkit, Catalyst and ModelingToolkit. Is there a workaround one can use to avoid it till it gets fixed? Thanks!
In my use case, the output of rate_cost = SymbolicUtils.simplify_fractions(rate_const)
is expected to be a functions of parameters only. To something like convert_all_vars_to_pars(rate_const)
should fix it for me. Is there a function that does sth like that?