Description
Describe the bug π
Similar to #981, this is the more advanced version where we actually have to change some values. The example below is contrived, but passing u0
and p
with these types is encountered when using setsym_oop
. While the u0
and p
values are made type stable by SciML/ModelingToolkit.jl#3546 & SciML/SymbolicIndexingInterface.jl#118 (with something like SciML/SymbolicIndexingInterface.jl#119 on top), the issue is that the remake for the initialization data is very dynamic and completely loses the gains from the previous PRs.
The starting point is
meta = get_metadata(oldinitsys)
if meta isa InitializationSystemMetadata && meta.oop_reconstruct_u0_p !== nothing
reconstruct_fn = meta.oop_reconstruct_u0_p
else
reconstruct_fn = ReconstructInitializeprob(sys, oldinitsys)
end
from which we get a Union{Nothing, ReconstructInitializeprob}
that when called with another Union
in the ProblemState
(due to history_fn
) completely gives up on inference and we get new_initp::Any
, which poisons the rest.
Expected behavior
remake
should be inferred.
Minimal Reproducible Example π
Without MRE, we would only be able to help you to a limited extent, and attention to the issue would be limited. to know more about MRE refer to wikipedia and stackoverflow.
using SciMLBase
prob = ODEProblem((u, p, t) -> -u, [1.0], (0.0, 1.0))
@code_warntype remake(prob, u0=prob.u0, p=prob.p) # no issues
using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D
@parameters Ξ±=1 Ξ²=1 Ξ³=1 Ξ΄=1
@variables x(t)=1 y(t)=1
eqs = [D(x) ~ Ξ± * x - Ξ² * x * y, D(y) ~ -Ξ΄ * y + Ξ³ * x * y]
@named sys = ODESystem(eqs, t)
prob = ODEProblem(complete(sys), [], (0.,1))
@code_warntype remake(prob, u0=prob.u0, p=prob.p) # Any
Error & Stacktrace
MethodInstance for Core.kwcall(::@NamedTuple{u0::Vector{Float64}, p::MTKParameters{Vector{Float64}, Vector{Float64}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}}, ::typeof(remake), ::ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, MTKParameters{Vector{Float64}, Vector{Float64}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}, ODEFunction{true, SciMLBase.AutoSpecialize, ModelingToolkit.GeneratedFunctionWrapper{(2, 3, true), RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:__mtk_arg_1, :___mtkparameters___, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x42dc2497, 0x45642c41, 0x10ed7100, 0x37cb3c7b, 0x39fcf7e9), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:Λβout, :__mtk_arg_1, :___mtkparameters___, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x00f7494c, 0x1d4dc422, 0xd4b8b833, 0xca7f69f5, 0x2249aa1c), Nothing}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.ObservedFunctionCache{ODESystem}, Nothing, ODESystem, SciMLBase.OverrideInitData{NonlinearProblem{Nothing, true, MTKParameters{Vector{Float64}, StaticArraysCore.SizedVector{0, Float64, Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}, NonlinearFunction{true, SciMLBase.FullSpecialize, ModelingToolkit.GeneratedFunctionWrapper{(2, 2, true), RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x85e41679, 0xe3baaf69, 0x36273733, 0xfa33874a, 0x6249a58a), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:Λβout, :__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xa427c4e8, 0x725f824c, 0xe49d1abc, 0x4f823061, 0x3d8f5fff), Nothing}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.ObservedFunctionCache{NonlinearSystem}, Nothing, NonlinearSystem, Nothing, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}, ModelingToolkit.InitializationSystemMetadata{ModelingToolkit.ReconstructInitializeprob{SymbolicIndexingInterface.MultipleGetters{ContinuousTimeseries, Vector{SymbolicIndexingInterface.AbstractGetIndexer}}, SymbolicIndexingInterface.OOPSetter{false, NonlinearSystem, Vector{ModelingToolkit.ParameterIndex{SciMLStructures.Tunable, B, Int64} where B}}}}}, ModelingToolkit.UpdateInitializeprob{SymbolicIndexingInterface.MultipleGetters{ContinuousTimeseries, Vector{SymbolicIndexingInterface.AbstractGetIndexer}}, SymbolicIndexingInterface.MultipleSetters{Vector{SymbolicIndexingInterface.ParameterHookWrapper{S, SymbolicUtils.BasicSymbolic{Real}} where S}}}, ComposedFunction{typeof(identity), SymbolicIndexingInterface.TimeIndependentObservedFunction{ModelingToolkit.GeneratedFunctionWrapper{(2, 2, true), RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xb1e81c3a, 0x1774638f, 0xdf6809cd, 0xabae0e03, 0x7fcc3406), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:Λβout, :__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x11d787e2, 0x05a9fa01, 0xefd56ed6, 0xcbb4f113, 0xd37eeca2), Nothing}}}}, Nothing}, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}, SciMLBase.StandardODEProblem})
from kwcall(::NamedTuple, ::typeof(remake), prob::ODEProblem) @ SciMLBase ~/.julia/dev/SciMLBase/src/remake.jl:214
Arguments
_::Core.Const(Core.kwcall)
@_2::@NamedTuple{u0::Vector{Float64}, p::MTKParameters{Vector{Float64}, Vector{Float64}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}}
@_3::Core.Const(SciMLBase.remake)
prob::ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, MTKParameters{Vector{Float64}, Vector{Float64}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}, ODEFunction{true, SciMLBase.AutoSpecialize, ModelingToolkit.GeneratedFunctionWrapper{(2, 3, true), RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:__mtk_arg_1, :___mtkparameters___, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x42dc2497, 0x45642c41, 0x10ed7100, 0x37cb3c7b, 0x39fcf7e9), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:Λβout, :__mtk_arg_1, :___mtkparameters___, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x00f7494c, 0x1d4dc422, 0xd4b8b833, 0xca7f69f5, 0x2249aa1c), Nothing}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.ObservedFunctionCache{ODESystem}, Nothing, ODESystem, SciMLBase.OverrideInitData{NonlinearProblem{Nothing, true, MTKParameters{Vector{Float64}, StaticArraysCore.SizedVector{0, Float64, Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}, NonlinearFunction{true, SciMLBase.FullSpecialize, ModelingToolkit.GeneratedFunctionWrapper{(2, 2, true), RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x85e41679, 0xe3baaf69, 0x36273733, 0xfa33874a, 0x6249a58a), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:Λβout, :__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xa427c4e8, 0x725f824c, 0xe49d1abc, 0x4f823061, 0x3d8f5fff), Nothing}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.ObservedFunctionCache{NonlinearSystem}, Nothing, NonlinearSystem, Nothing, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}, ModelingToolkit.InitializationSystemMetadata{ModelingToolkit.ReconstructInitializeprob{SymbolicIndexingInterface.MultipleGetters{ContinuousTimeseries, Vector{SymbolicIndexingInterface.AbstractGetIndexer}}, SymbolicIndexingInterface.OOPSetter{false, NonlinearSystem, Vector{ModelingToolkit.ParameterIndex{SciMLStructures.Tunable, B, Int64} where B}}}}}, ModelingToolkit.UpdateInitializeprob{SymbolicIndexingInterface.MultipleGetters{ContinuousTimeseries, Vector{SymbolicIndexingInterface.AbstractGetIndexer}}, SymbolicIndexingInterface.MultipleSetters{Vector{SymbolicIndexingInterface.ParameterHookWrapper{S, SymbolicUtils.BasicSymbolic{Real}} where S}}}, ComposedFunction{typeof(identity), SymbolicIndexingInterface.TimeIndependentObservedFunction{ModelingToolkit.GeneratedFunctionWrapper{(2, 2, true), RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xb1e81c3a, 0x1774638f, 0xdf6809cd, 0xabae0e03, 0x7fcc3406), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:Λβout, :__mtk_arg_1, :___mtkparameters___), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x11d787e2, 0x05a9fa01, 0xefd56ed6, 0xcbb4f113, 0xd37eeca2), Nothing}}}}, Nothing}, Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}, SciMLBase.StandardODEProblem}
Locals
f::Union{}
u0::Union{}
tspan::Union{}
p::Union{}
kwargs::Union{}
interpret_symbolicmap::Union{}
build_initializeprob::Union{}
use_defaults::Union{}
lazy_initialization::Union{}
_kwargs...::Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}
@_15::Union{Missing, Nothing, Bool, Type{Val{true}}, MTKParameters{Vector{Float64}, Vector{Float64}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}}
Body::Any
1 ββ Core.NewvarNode(:(f))
β Core.NewvarNode(:(u0))
β Core.NewvarNode(:(tspan))
β Core.NewvarNode(:(p))
β Core.NewvarNode(:(kwargs))
β Core.NewvarNode(:(interpret_symbolicmap))
β Core.NewvarNode(:(build_initializeprob))
β Core.NewvarNode(:(use_defaults))
β Core.NewvarNode(:(lazy_initialization))
β Core.NewvarNode(:(_kwargs...))
β Core.NewvarNode(:(@_15))
β %12 = Core.isdefined(@_2, :f)::Core.Const(false)
ββββ goto #3 if not %12
2 ββ Core.Const(:(@_15 = Core.getfield(@_2, :f)))
ββββ Core.Const(:(goto %17))
3 ββ (@_15 = SciMLBase.missing)
β %17 = @_15::Core.Const(missing)
β %18 = Core.isdefined(@_2, :u0)::Core.Const(true)
ββββ goto #5 if not %18
4 ββ (@_15 = Core.getfield(@_2, :u0))
ββββ goto #6
5 ββ Core.Const(:(@_15 = SciMLBase.missing))
6 ββ %23 = @_15::Vector{Float64}
β %24 = Core.isdefined(@_2, :tspan)::Core.Const(false)
ββββ goto #8 if not %24
7 ββ Core.Const(:(@_15 = Core.getfield(@_2, :tspan)))
ββββ Core.Const(:(goto %29))
8 ββ (@_15 = SciMLBase.missing)
β %29 = @_15::Core.Const(missing)
β %30 = Core.isdefined(@_2, :p)::Core.Const(true)
ββββ goto #10 if not %30
9 ββ (@_15 = Core.getfield(@_2, :p))
ββββ goto #11
10 β Core.Const(:(@_15 = SciMLBase.missing))
11 β %35 = @_15::MTKParameters{Vector{Float64}, Vector{Float64}, Tuple{}, Tuple{}, Tuple{}, Tuple{}}
β %36 = Core.isdefined(@_2, :kwargs)::Core.Const(false)
ββββ goto #13 if not %36
12 β Core.Const(:(@_15 = Core.getfield(@_2, :kwargs)))
ββββ Core.Const(:(goto %41))
13 β (@_15 = SciMLBase.missing)
β %41 = @_15::Core.Const(missing)
β %42 = Core.isdefined(@_2, :interpret_symbolicmap)::Core.Const(false)
ββββ goto #15 if not %42
14 β Core.Const(:(@_15 = Core.getfield(@_2, :interpret_symbolicmap)))
ββββ Core.Const(:(goto %47))
15 β (@_15 = true)
β %47 = @_15::Core.Const(true)
β %48 = Core.isdefined(@_2, :build_initializeprob)::Core.Const(false)
ββββ goto #17 if not %48
16 β Core.Const(:(@_15 = Core.getfield(@_2, :build_initializeprob)))
ββββ Core.Const(:(goto %53))
17 β (@_15 = Core.apply_type(SciMLBase.Val, true))
β %53 = @_15::Core.Const(Val{true})
β %54 = Core.isdefined(@_2, :use_defaults)::Core.Const(false)
ββββ goto #19 if not %54
18 β Core.Const(:(@_15 = Core.getfield(@_2, :use_defaults)))
ββββ Core.Const(:(goto %59))
19 β (@_15 = false)
β %59 = @_15::Core.Const(false)
β %60 = Core.isdefined(@_2, :lazy_initialization)::Core.Const(false)
ββββ goto #21 if not %60
20 β Core.Const(:(@_15 = Core.getfield(@_2, :lazy_initialization)))
ββββ Core.Const(:(goto %65))
21 β (@_15 = SciMLBase.nothing)
β %65 = @_15::Core.Const(nothing)
β %66 = (:f, :u0, :tspan, :p, :kwargs, :interpret_symbolicmap, :build_initializeprob, :use_defaults, :lazy_initialization)::Core.Const((:f, :u0, :tspan, :p, :kwargs, :interpret_symbolicmap, :build_initializeprob, :use_defaults, :lazy_initialization))
β %67 = Core.apply_type(Core.NamedTuple, %66)::Core.Const(NamedTuple{(:f, :u0, :tspan, :p, :kwargs, :interpret_symbolicmap, :build_initializeprob, :use_defaults, :lazy_initialization)})
β %68 = Base.structdiff(@_2, %67)::Core.Const(NamedTuple())
β (_kwargs... = Base.pairs(%68))
β %70 = SciMLBase.:(var"#remake#735")::Core.Const(SciMLBase.var"#remake#735")
β %71 = _kwargs...::Core.Const(Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}())
β %72 = (%70)(%17, %23, %29, %35, %41, %47, %53, %59, %65, %71, @_3, prob)::Any
ββββ return %72
The relevant part from @descend
would be
Environment (please complete the following information):
- Output of
using Pkg; Pkg.status()
- Output of
using Pkg; Pkg.status(; mode = PKGMODE_MANIFEST)
- Output of
versioninfo()
Additional context
Add any other context about the problem here.