SciML / SciML/ModelingToolkitStandardLibrary.jl

`UndefRefError()` when using `ParametrizedInterpolation` inside of `@mtkmodel`

Open
#409 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Julia
Stars
171
Forks
49
Avg merge
15h 50m
Merged PRs (30d)
10

Description

Describe the bug

While the basic ParametrizedInterpolation example works fine on my machine, trying to use it inside of @mtkmodel failed.

Expected behavior

I expected a solution to the equation, or perhaps a better error message if I am doing something wrong.

Minimal Reproducible Example 👇

using ModelingToolkit, ModelingToolkitStandardLibrary.Electrical,
    ModelingToolkitStandardLibrary.Blocks, DataInterpolations, DifferentialEquations
using ModelingToolkit: t_nounits as t, D_nounits as D

@mtkmodel Borm begin
    @components begin
        I_input = RealInput()
    end
    @variables begin
        I(t) = 0
    end
    @equations begin
        D(I) ~ I_input.u
    end
end

uu = [0,10]
xx = [0,10]

@mtkmodel IsolatedBorm begin
    @components begin
        borm = Borm()
        I_input = ParametrizedInterpolation(interp_type=ConstantInterpolation, u=uu, x=xx)
        clock = ContinuousClock()
    end
    @equations begin
        connect(clock.output, I_input.input)
        connect(I_input.output, borm.I_input)
    end
end

@mtkbuild room = IsolatedBorm()
solve(ODEProblem(room, [], (0,10)))

Error & Stacktrace ⚠️

ERROR: LoadError: UndefRefError: access to undefined reference
Stacktrace:
  [1] getindex
    @ .\essentials.jl:917 [inlined]
  [2] iterate (repeats 2 times)
    @ .\array.jl:902 [inlined]
  [3] _zip_iterate_some
    @ .\iterators.jl:444 [inlined]
  [4] _zip_iterate_some
    @ .\iterators.jl:446 [inlined]
  [5] _zip_iterate_all
    @ .\iterators.jl:436 [inlined]
  [6] iterate
    @ .\iterators.jl:426 [inlined]
  [7] ==(A::SubArray{Float64, 1, Vector{Float64}, Tuple{UnitRange{Int64}}, true}, B::Vector{Any})
    @ Base .\abstractarray.jl:3033
  [8] _eq
    @ .\tuple.jl:551 [inlined]
  [9] ==
    @ .\tuple.jl:547 [inlined]
 [10] !=
    @ .\operators.jl:277 [inlined]
 [11] (::ModelingToolkitStandardLibrary.Blocks.CachedInterpolation{…})(u::SubArray{…}, x::SubArray{…}, args::Tuple{})
    @ ModelingToolkitStandardLibrary.Blocks C:\Users\a1058035\.julia\packages\ModelingToolkitStandardLibrary\b10Ky\src\Blocks\sources.jl:808
 [12] macro expansion
    @ C:\Users\a1058035\.julia\packages\SymbolicUtils\KmZ71\src\code.jl:411 [inlined]
 [13] macro expansion
    @ C:\Users\a1058035\.julia\packages\Symbolics\3yEdi\src\build_function.jl:368 [inlined]
 [14] macro expansion
    @ C:\Users\a1058035\.julia\packages\RuntimeGeneratedFunctions\2SjTC\src\RuntimeGeneratedFunctions.jl:161 [inlined]
 [15] macro expansion
    @ .\none:0 [inlined]
 [16] generated_callfunc
    @ .\none:0 [inlined]
 [17] (::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{…})(::Vector{…}, ::Vector{…}, ::MTKParameters{…}, ::Float64)
    @ RuntimeGeneratedFunctions C:\Users\a1058035\.julia\packages\RuntimeGeneratedFunctions\2SjTC\src\RuntimeGeneratedFunctions.jl:148
 [18] macro expansion
    @ C:\Users\a1058035\.julia\packages\ModelingToolkit\hlGut\src\systems\codegen_utils.jl:0 [inlined]
 [19] _generated_call
    @ C:\Users\a1058035\.julia\packages\ModelingToolkit\hlGut\src\systems\codegen_utils.jl:353 [inlined]
 [20] GeneratedFunctionWrapper
    @ C:\Users\a1058035\.julia\packages\ModelingToolkit\hlGut\src\systems\codegen_utils.jl:350 [inlined]
 [21] ODEFunction
    @ C:\Users\a1058035\.julia\packages\SciMLBase\wQHrI\src\scimlfunctions.jl:2592 [inlined]
 [22] initialize!
    @ C:\Users\a1058035\.julia\packages\OrdinaryDiffEqTsit5\o07IY\src\tsit_perform_step.jl:175 [inlined]
 [23] initialize!(integrator::OrdinaryDiffEqCore.ODEIntegrator{…}, cache::OrdinaryDiffEqCore.DefaultCache{…})
    @ OrdinaryDiffEqCore C:\Users\a1058035\.julia\packages\OrdinaryDiffEqCore\oFTse\src\perform_step\composite_perform_step.jl:38
 [24] __init(prob::ODEProblem{…}, alg::CompositeAlgorithm{…}, timeseries_init::Tuple{}, ts_init::Tuple{}, ks_init::Tuple{}; saveat::Tuple{}, tstops::Tuple{}, d_discontinuities::Tuple{}, save_idxs::Nothing, save_everystep::Bool, save_on::Bool, save_start::Bool, save_end::Nothing, callback::Nothing, dense::Bool, calck::Bool, dt::Float64, dtmin::Float64, dtmax::Float64, force_dtmin::Bool, adaptive::Bool, gamma::Rational{…}, abstol::Nothing, reltol::Nothing, qmin::Rational{…}, qmax::Int64, qsteady_min::Int64, qsteady_max::Int64, beta1::Nothing, beta2::Nothing, qoldinit::Rational{…}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, maxiters::Int64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), internalopnorm::typeof(LinearAlgebra.opnorm), isoutofdomain::typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), unstable_check::typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), verbose::Bool, timeseries_errors::Bool, dense_errors::Bool, advance_to_tstop::Bool, stop_at_next_tstop::Bool, initialize_save::Bool, progress::Bool, progress_steps::Int64, progress_name::String, progress_message::typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), progress_id::Symbol, userdata::Nothing, allow_extrapolation::Bool, initialize_integrator::Bool, alias::ODEAliasSpecifier, initializealg::OrdinaryDiffEqCore.DefaultInit, kwargs::@Kwargs{…})
    @ OrdinaryDiffEqCore C:\Users\a1058035\.julia\packages\OrdinaryDiffEqCore\oFTse\src\solve.jl:577
 [25] __init (repeats 2 times)
    @ C:\Users\a1058035\.julia\packages\OrdinaryDiffEqCore\oFTse\src\solve.jl:11 [inlined]
 [26] #__solve#62
    @ C:\Users\a1058035\.julia\packages\OrdinaryDiffEqCore\oFTse\src\solve.jl:6 [inlined]
 [27] __solve
    @ C:\Users\a1058035\.julia\packages\OrdinaryDiffEqCore\oFTse\src\solve.jl:1 [inlined]
 [28] #__solve#3
    @ C:\Users\a1058035\.julia\packages\OrdinaryDiffEqDefault\MdlB6\src\default_alg.jl:48 [inlined]
 [29] __solve
    @ C:\Users\a1058035\.julia\packages\OrdinaryDiffEqDefault\MdlB6\src\default_alg.jl:47 [inlined]
 [30] #__solve#54
    @ C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:896 [inlined]
 [31] __solve
    @ C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:887 [inlined]
 [32] #solve_call#31
    @ C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:127 [inlined]
 [33] solve_call(::ODEProblem{…})
    @ DiffEqBase C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:84
 [34] solve_up(::ODEProblem{…}, ::Nothing, ::Vector{…}, ::MTKParameters{…}; originator::SciMLBase.ChainRulesOriginator, kwargs::@Kwargs{})
    @ DiffEqBase C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:665
 [35] solve_up
    @ C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:658 [inlined]
 [36] solve(::ODEProblem{…}; sensealg::Nothing, u0::Nothing, p::Nothing, wrap::Val{…}, kwargs::@Kwargs{})
    @ DiffEqBase C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:553
 [37] solve(::ODEProblem{…})
    @ DiffEqBase C:\Users\a1058035\.julia\packages\DiffEqBase\4uSBa\src\solve.jl:543

Environment (please complete the following information):

  • Output of using Pkg; Pkg.status()
  [82cc6244] DataInterpolations v8.5.0
  [0c46a032] DifferentialEquations v7.16.1
  [961ee093] ModelingToolkit v10.21.0
  [16a59e39] ModelingToolkitStandardLibrary v2.25.0
  [0c5d862f] Symbolics v6.52.0

Julia Version 1.11.5

@SebastianM-C

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the ParametrizedInterpolation and CachedInterpolation implementation in src/Blocks/sources.jl around line 808, then run the minimal @mtkmodel reproduction. Trace why the generated call compares the interpolation inputs to an undefined reference; done means the example solves without UndefRefError or reports a clearer error.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.