Skip to content

add sampletime operator #2690

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ModelingToolkit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ export debug_system
#export Continuous, Discrete, sampletime, input_timedomain, output_timedomain
#export has_discrete_domain, has_continuous_domain
#export is_discrete_domain, is_continuous_domain, is_hybrid_domain
export Sample, Hold, Shift, ShiftIndex
export Sample, Hold, Shift, ShiftIndex, sampletime, SampleTime
export Clock #, InferredDiscrete,

end # module
16 changes: 11 additions & 5 deletions src/discretedomain.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
using Symbolics: Operator, Num, Term, value, recursive_hasoperator

struct SampleTime <: Operator end
SymbolicUtils.promote_symtype(::Type{SampleTime}, t...) = Real
function SampleTime()
SymbolicUtils.term(SampleTime, type = Real)

Check warning on line 6 in src/discretedomain.jl

View check run for this annotation

Codecov / codecov/patch

src/discretedomain.jl#L4-L6

Added lines #L4 - L6 were not covered by tests
end

# Shift

"""
Expand All @@ -15,8 +21,6 @@
```jldoctest
julia> using Symbolics

julia> @variables t;

julia> Δ = Shift(t)
(::Shift) (generic function with 2 methods)
```
Expand Down Expand Up @@ -176,16 +180,18 @@
function (xn::Num)(k::ShiftIndex)
@unpack clock, steps = k
x = value(xn)
t = clock.t
# Verify that the independent variables of k and x match and that the expression doesn't have multiple variables
vars = Symbolics.get_variables(x)
length(vars) == 1 ||
error("Cannot shift a multivariate expression $x. Either create a new unknown and shift this, or shift the individual variables in the expression.")
args = Symbolics.arguments(vars[]) # args should be one element vector with the t in x(t)
length(args) == 1 ||
error("Cannot shift an expression with multiple independent variables $x.")
isequal(args[], t) ||
error("Independent variable of $xn is not the same as that of the ShiftIndex $(k.t)")
t = args[]
if hasfield(typeof(clock), :t)
isequal(t, clock.t) ||
error("Independent variable of $xn is not the same as that of the ShiftIndex $(k.t)")
end

# d, _ = propagate_time_domain(xn)
# if d != clock # this is only required if the variable has another clock
Expand Down
47 changes: 47 additions & 0 deletions src/systems/clock_inference.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,52 @@
ClockInference(ts, eq_domain, var_domain, inferred)
end

struct NotInferedTimeDomain end

Check warning on line 24 in src/systems/clock_inference.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"Infered" should be "Inferred".
function error_sample_time(eq)
error("$eq\ncontains `SampleTime` but it is not an infered discrete equation.")

Check warning on line 26 in src/systems/clock_inference.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"infered" should be "inferred".

Check warning on line 26 in src/systems/clock_inference.jl

View check run for this annotation

Codecov / codecov/patch

src/systems/clock_inference.jl#L24-L26

Added lines #L24 - L26 were not covered by tests
end
function substitute_sample_time(ci::ClockInference)
@unpack ts, eq_domain = ci
eqs = copy(equations(ts))
@assert length(eqs) == length(eq_domain)
for i in eachindex(eqs)
eq = eqs[i]
domain = eq_domain[i]
dt = sampletime(domain)
neweq = substitute_sample_time(eq, dt)
if neweq isa NotInferedTimeDomain

Check warning on line 37 in src/systems/clock_inference.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"Infered" should be "Inferred".
error_sample_time(eq)

Check warning on line 38 in src/systems/clock_inference.jl

View check run for this annotation

Codecov / codecov/patch

src/systems/clock_inference.jl#L38

Added line #L38 was not covered by tests
end
eqs[i] = neweq
end
@set! ts.sys.eqs = eqs
@set! ci.ts = ts
end

function substitute_sample_time(eq::Equation, dt)
substitute_sample_time(eq.lhs, dt) ~ substitute_sample_time(eq.rhs, dt)
end

function substitute_sample_time(ex, dt)
istree(ex) || return ex
op = operation(ex)
args = arguments(ex)
if op == SampleTime
dt === nothing && return NotInferedTimeDomain()

Check warning on line 55 in src/systems/clock_inference.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"Infered" should be "Inferred".
return dt

Check warning on line 56 in src/systems/clock_inference.jl

View check run for this annotation

Codecov / codecov/patch

src/systems/clock_inference.jl#L55-L56

Added lines #L55 - L56 were not covered by tests
else
new_args = similar(args)
for (i, arg) in enumerate(args)
ex_arg = substitute_sample_time(arg, dt)
if ex_arg isa NotInferedTimeDomain

Check warning on line 61 in src/systems/clock_inference.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"Infered" should be "Inferred".
return ex_arg

Check warning on line 62 in src/systems/clock_inference.jl

View check run for this annotation

Codecov / codecov/patch

src/systems/clock_inference.jl#L62

Added line #L62 was not covered by tests
end
new_args[i] = ex_arg
end
similarterm(ex, op, new_args; metadata = metadata(ex))
end
end

function infer_clocks!(ci::ClockInference)
@unpack ts, eq_domain, var_domain, inferred = ci
@unpack var_to_diff, graph = ts.structure
Expand Down Expand Up @@ -66,6 +112,7 @@
end
end

ci = substitute_sample_time(ci)
return ci
end

Expand Down
2 changes: 1 addition & 1 deletion src/systems/systemstructure.jl
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ function structural_simplify!(state::TearingState, io = nothing; simplify = fals
kwargs...)
if state.sys isa ODESystem
ci = ModelingToolkit.ClockInference(state)
ModelingToolkit.infer_clocks!(ci)
ci = ModelingToolkit.infer_clocks!(ci)
time_domains = merge(Dict(state.fullvars .=> ci.var_domain),
Dict(default_toterm.(state.fullvars) .=> ci.var_domain))
tss, inputs, continuous_id, id_to_clock = ModelingToolkit.split_system(ci)
Expand Down
17 changes: 7 additions & 10 deletions test/clock.jl
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@

dt = 0.05
d = Clock(t, dt)
k = ShiftIndex(d)
k = ShiftIndex()

@mtkmodel DiscretePI begin
@components begin
Expand All @@ -347,7 +347,7 @@
y(t)
end
@equations begin
x(k) ~ x(k - 1) + ki * u(k)
x(k) ~ x(k - 1) + ki * u(k) * SampleTime() / dt
output.u(k) ~ y(k)
input.u(k) ~ u(k)
y(k) ~ x(k - 1) + kp * u(k)
Expand All @@ -364,21 +364,18 @@
end
end

@mtkmodel Holder begin
@components begin
input = RealInput()
output = RealOutput()
end
@mtkmodel ZeroOrderHold begin
@extend u, y = siso = Blocks.SISO()
@equations begin
output.u ~ Hold(input.u)
y ~ Hold(u)
end
end

@mtkmodel ClosedLoop begin
@components begin
plant = FirstOrder(k = 0.3, T = 1)
sampler = Sampler()
holder = Holder()
holder = ZeroOrderHold()
controller = DiscretePI(kp = 2, ki = 2)
feedback = Feedback()
ref = Constant(k = 0.5)
Expand Down Expand Up @@ -444,7 +441,7 @@
[model.plant.x => 0.0; model.controller.kp => 2.0; model.controller.ki => 2.0],
(0.0, Tf))
int = init(prob, Tsit5(); kwargshandle = KeywordArgSilent)
@test int.ps[Hold(ssys.holder.input.u)] == 2 # constant output * kp issue https://github.com/SciML/ModelingToolkit.jl/issues/2356
@test_broken int.ps[Hold(ssys.holder.input.u)] == 2 # constant output * kp issue https://github.com/SciML/ModelingToolkit.jl/issues/2356
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AayushSabharwal this line errors with

  Test threw exception
  Expression: int.ps[Hold(ssys.holder.input.u)] == 2
  MethodError: no method matching parameter_values(::ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing})

  Closest candidates are:
    parameter_values(::ModelingToolkit.MTKParameters, ::ModelingToolkit.ParameterIndex)
     @ ModelingToolkit ~/src/julia/ModelingToolkit/src/systems/parameter_buffer.jl:265
    parameter_values(::Any, ::Any)
     @ SymbolicIndexingInterface ~/.julia/packages/SymbolicIndexingInterface/viGPl/src/parameter_indexing.jl:19
    parameter_values(::SciMLBase.AbstractEnsembleProblem)
     @ SciMLBase ~/src/julia/SciMLBase/src/problems/problem_interface.jl:16
    ...

  Stacktrace:
   [1] parameter_values(prob::ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, i::Nothing)
     @ SymbolicIndexingInterface ~/.julia/packages/SymbolicIndexingInterface/viGPl/src/parameter_indexing.jl:19
   [2] parameter_values(prob::OrdinaryDiffEq.ODEIntegrator{Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, true, Vector{Float64}, Nothing, Float64, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Vector{Float64}}}, ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, @Kwargs{callback::DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, disc_saved_values::Vector{Any}}, SciMLBase.StandardODEProblem}, Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.InterpolationData{ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, Nothing, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, Nothing}, SciMLBase.DEStats, Nothing, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(LinearAlgebra.opnorm), Nothing, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit, Nothing}, i::Nothing)
     @ SymbolicIndexingInterface ~/.julia/packages/SymbolicIndexingInterface/viGPl/src/parameter_indexing.jl:19
   [3] (::SymbolicIndexingInterface.var"#_getter#7"{Nothing})(::SymbolicIndexingInterface.NotTimeseries, prob::OrdinaryDiffEq.ODEIntegrator{Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, true, Vector{Float64}, Nothing, Float64, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Vector{Float64}}}, ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, @Kwargs{callback::DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, disc_saved_values::Vector{Any}}, SciMLBase.StandardODEProblem}, Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.InterpolationData{ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, Nothing, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, Nothing}, SciMLBase.DEStats, Nothing, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(LinearAlgebra.opnorm), Nothing, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit, Nothing})
     @ SymbolicIndexingInterface ~/.julia/packages/SymbolicIndexingInterface/viGPl/src/parameter_indexing.jl:131
   [4] (::SymbolicIndexingInterface.var"#getter#8"{SymbolicIndexingInterface.var"#_getter#7"{Nothing}})(::OrdinaryDiffEq.ODEIntegrator{Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, true, Vector{Float64}, Nothing, Float64, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Vector{Float64}}}, ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, @Kwargs{callback::DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, disc_saved_values::Vector{Any}}, SciMLBase.StandardODEProblem}, Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.InterpolationData{ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, Nothing, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, Nothing}, SciMLBase.DEStats, Nothing, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(LinearAlgebra.opnorm), Nothing, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit, Nothing})
     @ SymbolicIndexingInterface ~/.julia/packages/SymbolicIndexingInterface/viGPl/src/parameter_indexing.jl:153
   [5] getindex(::SymbolicIndexingInterface.ParameterIndexingProxy{OrdinaryDiffEq.ODEIntegrator{Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, true, Vector{Float64}, Nothing, Float64, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Vector{Float64}}}, ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, @Kwargs{callback::DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, disc_saved_values::Vector{Any}}, SciMLBase.StandardODEProblem}, Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.InterpolationData{ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, Nothing, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, Nothing}, SciMLBase.DEStats, Nothing, Nothing, Nothing}, ODEFunction{true, SciMLBase.AutoSpecialize, FunctionWrappersWrappers.FunctionWrappersWrapper{Tuple{FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{Float64}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, Float64}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{Float64}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}, FunctionWrappers.FunctionWrapper{Nothing, Tuple{Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}, ModelingToolkit.MTKParameters{Tuple{Vector{Float64}}, Tuple{Vector{Float64}}, Tuple{}, Tuple{}, Tuple{}, Nothing, Nothing}, ForwardDiff.Dual{ForwardDiff.Tag{DiffEqBase.OrdinaryDiffEqTag, Float64}, Float64, 1}}}}, false}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, ModelingToolkit.var"#863#generated_observed#720"{Bool, ODESystem, Dict{Any, Any}, Vector{Any}}, Nothing, ODESystem, Nothing, Nothing}, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(LinearAlgebra.opnorm), Nothing, CallbackSet{Tuple{}, Tuple{DiscreteCallback{DiffEqCallbacks.var"#95#99"{Bool, Float64, Base.RefValue{Int64}, Base.RefValue{Float64}}, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, DiffEqCallbacks.var"#96#100"{Bool, DiffEqCallbacks.var"#98#102"{Bool}, Float64, DiffEqCallbacks.PeriodicCallbackAffect{ModelingToolkit.DiscreteSaveAffect{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:integrator, :saved_values), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x45d95caf, 0xe2bfa518, 0xfae96534, 0xc3b16e55, 0x7d5933f7), Nothing}, SavedValues{Float64, Vector{Float64}}}, Float64, Base.RefValue{Float64}, Base.RefValue{Int64}}, Base.RefValue{Int64}, Base.RefValue{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit, Nothing}}, ::Num)
     @ SymbolicIndexingInterface ~/.julia/packages/SymbolicIndexingInterface/viGPl/src/parameter_indexing_proxy.jl:14
   [6] macro expansion
     @ ~/.bin/julia-1.10.0/share/julia/stdlib/v1.10/Test/src/Test.jl:669 [inlined]
   [7] top-level scope
     @ ~/src/julia/ModelingToolkit/test/clock.jl:508

could you take a look?

Copy link
Member

@AayushSabharwal AayushSabharwal May 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I've opened #2696 to help track it. There's a couple PRs I have open that change the parameters stuff, and some that affect SII/RAT so it'll be much easier to track this down and fix it once they're all in

@test int.ps[ssys.controller.x] == 1 # c2d
@test int.ps[Sample(d)(ssys.sampler.input.u)] == 0 # disc state
sol = solve(prob,
Expand Down Expand Up @@ -502,10 +499,10 @@
@mtkmodel FirstOrderWithStepCounter begin
@components begin
counter = CounterSys()
fo = FirstOrderSys()

Check warning on line 502 in test/clock.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"fo" should be "of" or "for" or "do" or "go" or "to".
end
@equations begin
counter.u ~ fo.x

Check warning on line 505 in test/clock.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"fo" should be "of" or "for" or "do" or "go" or "to".
end
end

Expand All @@ -513,7 +510,7 @@
prob = ODEProblem(model, [], (0.0, 10.0))
sol = solve(prob, Tsit5(), kwargshandle = KeywordArgSilent)

@test sol.prob.kwargs[:disc_saved_values][1].t == sol.t[1:2:end] # Test that the discrete-tiem system executed at every step of the continuous solver. The solver saves each time step twice, one state value before discrete affect and one after.

Check warning on line 513 in test/clock.jl

View workflow job for this annotation

GitHub Actions / Spell Check with Typos

"tiem" should be "time" or "item".
@test_nowarn ModelingToolkit.build_explicit_observed_function(
model, model.counter.ud)(sol.u[1], prob.p..., sol.t[1])

Expand Down
Loading