Skip to content

Better error for exponential parameters in structural identifiability extension #417

Open
@TorkelE

Description

@TorkelE

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions