diff --git a/src/systems/abstractsystem.jl b/src/systems/abstractsystem.jl index 51a495e4ff..efa586fc87 100644 --- a/src/systems/abstractsystem.jl +++ b/src/systems/abstractsystem.jl @@ -235,7 +235,7 @@ function SymbolicIndexingInterface.parameter_index(sys::AbstractSystem, sym::Sym if has_index_cache(sys) && (ic = get_index_cache(sys)) !== nothing idx = parameter_index(ic, sym) if idx === nothing || - idx.portion isa SciMLStructures.Discrete && idx.idx[2] == idx.idx[3] == 0 + idx.portion isa SciMLStructures.Discrete && idx.idx[1] == idx.idx[2] == 0 return nothing else return idx diff --git a/test/symbolic_indexing_interface.jl b/test/symbolic_indexing_interface.jl index 89b6907f4b..400ba1fa6c 100644 --- a/test/symbolic_indexing_interface.jl +++ b/test/symbolic_indexing_interface.jl @@ -2,6 +2,7 @@ using ModelingToolkit, SymbolicIndexingInterface, SciMLBase using ModelingToolkit: t_nounits as t, D_nounits as D, ParameterIndex, SymbolicContinuousCallback using SciMLStructures: Tunable +using OrdinaryDiffEq @testset "System" begin @parameters a b @@ -236,3 +237,14 @@ end @test timeseries_parameter_index(sys, p[1, 1]) === ParameterTimeseriesIndex(1, (1, 1, 1, 1)) end + +@testset "Indexing with symbols work for discrete parameters" begin + t = ModelingToolkit.t_nounits; D = ModelingToolkit.D_nounits + @variables x(t) = 1. + @parameters p(t) = 1. + ev = ModelingToolkit.SymbolicDiscreteCallback((t == 1) => [p ~ Pre(p)*2], discrete_parameters = p) + @mtkcompile sys = System([D(x) ~ p], t; discrete_events = ev) + prob = ODEProblem(sys, [], (0., 2.)) + sol = solve(prob, Tsit5()) + @test sol[p] == sol[:p] == sol.ps[p] == sol.ps[:p] +end