Skip to content

Commit 83ca47d

Browse files
fix: fix unscalarized array passed to discrete_parameters
1 parent 6d9db15 commit 83ca47d

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/systems/callbacks.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,11 @@ function compile_equational_affect(
904904
obseqs, Dict([p => unPre(p) for p in parameters(affsys)]))
905905
rhss = map(x -> x.rhs, update_eqs)
906906
lhss = map(x -> x.lhs, update_eqs)
907-
is_p = [lhs in Set(ps_to_update) for lhs in lhss]
907+
update_ps_set = Set(ps_to_update)
908+
is_p = map(lhss) do lhs
909+
lhs in update_ps_set || iscall(lhs) && operation(lhs) === getindex &&
910+
arguments(lhs)[1] in update_ps_set
911+
end
908912
is_u = [lhs in Set(dvs_to_update) for lhs in lhss]
909913
dvs = unknowns(sys)
910914
ps = parameters(sys)

test/symbolic_events.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,3 +1471,19 @@ end
14711471
sol = solve(oprob)
14721472
@test sol[p] [[1.0, 2.0], [0.0, 0.0]]
14731473
end
1474+
1475+
@testset "Issue#2990: Unscalarized array passed to `discrete_parameters` of symbolic affect" begin
1476+
@parameters p(t)[1:2] d
1477+
@variables X(t) Y(t)
1478+
eqs = [
1479+
D(X) ~ p[1] - d*X,
1480+
D(Y) ~ p[2] - d*Y
1481+
]
1482+
devent = SymbolicDiscreteCallback([1.0] => [p ~ zeros(2)]; discrete_parameters = [p])
1483+
@mtkcompile sys = System(eqs, t; discrete_events = devent)
1484+
1485+
sim_cond = [X => 1.0, Y => 2.0, p => [1.0, 2.0], d => 1.0]
1486+
oprob = ODEProblem(sys, sim_cond, 2.0)
1487+
sol = solve(oprob)
1488+
@test sol[p] [[1.0, 2.0], [0.0, 0.0]]
1489+
end

0 commit comments

Comments
 (0)