SymbolicUtils.jl icon indicating copy to clipboard operation
SymbolicUtils.jl copied to clipboard

`simplify_fractions` changes ModelingToolkit parameters to variables

Open paulflang opened this issue 1 year ago • 3 comments

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

paulflang avatar Jul 12 '22 15:07 paulflang

Looks like another instance of https://github.com/JuliaSymbolics/SymbolicUtils.jl/issues/434

isaacsas avatar Jul 12 '22 16:07 isaacsas

@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!

isaacsas avatar Jul 12 '22 16:07 isaacsas

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?

paulflang avatar Jul 12 '22 16:07 paulflang