Open
Description
Currently, StructuralIdentifiability.jl cannot assess identifiability for models where there is a parameter in an exponent. When using the package directly, there is an error when trying to create such a model. However, for ModelingToolkit, there error happens when assess_identifiability
is called, and is rather non-intuitive. I.e.
using Catalyst, StructuralIdentifiability
rn = @reaction_network begin
X^n, ∅ --> X
d, X --> 0
end
assess_identifiability(rn; measured_quantities = [:X])
yields a
ERROR: MethodError: no method matching isless(::Int64, ::Nemo.QQMPolyRingElem)
The function `isless` exists, but no method is defined for this combination of argument types.
Closest candidates are:
isless(::Integer, ::ForwardDiff.Dual{Ty}) where Ty
@ ForwardDiff ~/.julia/packages/ForwardDiff/UBbGT/src/dual.jl:149
isless(::Real, ::Num)
@ Symbolics ~/.julia/packages/Symbolics/sc64L/src/num.jl:140
isless(::Real, ::ForwardDiff.Dual{Ty}) where Ty
@ ForwardDiff ~/.julia/packages/ForwardDiff/UBbGT/src/dual.jl:149
...
Stacktrace:
[1] <(x::Int64, y::Nemo.QQMPolyRingElem)
@ Base ./operators.jl:353
[2] <=(x::Int64, y::Nemo.QQMPolyRingElem)
@ Base ./operators.jl:402
[3] >=(x::Nemo.QQMPolyRingElem, y::Int64)
@ Base ./operators.jl:426
[4] eval_at_nemo(e::SymbolicUtils.BasicSymbolic{Real}, vals::Dict{SymbolicUtils.BasicSymbolic{Real}, Nemo.QQMPolyRingElem})
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:45
[5] (::ModelingToolkitSIExt.var"#1#2"{Dict{…}})(a::SymbolicUtils.BasicSymbolic{Real})
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:37
[6] iterate
@ ./generator.jl:48 [inlined]
[7] _collect(c::SymbolicUtils.SmallVec{…}, itr::Base.Generator{…}, ::Base.EltypeUnknown, isz::Base.HasShape{…})
@ Base ./array.jl:811
[8] collect_similar(cont::SymbolicUtils.SmallVec{…}, itr::Base.Generator{…})
@ Base ./array.jl:720
[9] map(f::Function, A::SymbolicUtils.SmallVec{Any, Vector{Any}})
@ Base ./abstractarray.jl:3371
[10] eval_at_nemo(e::SymbolicUtils.BasicSymbolic{Real}, vals::Dict{SymbolicUtils.BasicSymbolic{Real}, Nemo.QQMPolyRingElem})
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:36
[11] __mtk_to_si(de::ODESystem, measured_quantities::Vector{Tuple{String, SymbolicUtils.BasicSymbolic{Real}}})
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:259
[12] mtk_to_si(de::ODESystem, measured_quantities::Vector{Equation})
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:111
[13] _assess_identifiability(ode::ODESystem; measured_quantities::Vector{…}, funcs_to_check::Vector{…}, known_ic::Vector{…}, prob_threshold::Float64)
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:411
[14] _assess_identifiability
@ ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:404 [inlined]
[15] SciML/ModelingToolkit.jl#56
@ ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:394 [inlined]
[16] with_logstate(f::ModelingToolkitSIExt.var"#56#57"{…}, logstate::Base.CoreLogging.LogState)
@ Base.CoreLogging ./logging/logging.jl:522
[17] with_logger
@ ./logging/logging.jl:632 [inlined]
[18] assess_identifiability(ode::ODESystem; measured_quantities::Vector{…}, funcs_to_check::Vector{…}, known_ic::Vector{…}, prob_threshold::Float64, loglevel::Base.CoreLogging.LogLevel)
@ ModelingToolkitSIExt ~/.julia/packages/StructuralIdentifiability/r7Tss/ext/ModelingToolkitSIExt.jl:393
[19] assess_identifiability(::ReactionSystem{…}; measured_quantities::Vector{…}, known_p::Vector{…}, funcs_to_check::Vector{…}, remove_conserved::Bool, ignore_no_measured_warn::Bool, kwargs::@Kwargs{})
@ CatalystStructuralIdentifiabilityExtension ~/.julia/packages/Catalyst/8qDWw/ext/CatalystStructuralIdentifiabilityExtension/structural_identifiability_extension.jl:118
For someone not rather familiar with the package, there is more or less not way to figure out what the issue with this case is.