From abd896e5f6c1f8ee1353df0eb5023b66b01be41f Mon Sep 17 00:00:00 2001 From: Benjamin Chung Date: Thu, 1 May 2025 16:00:22 -0700 Subject: [PATCH 1/4] Fix imperativeaffect namespacing for arrays in non-root components --- src/systems/imperative_affect.jl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/systems/imperative_affect.jl b/src/systems/imperative_affect.jl index 4c9ff3d248..bea4ac65a5 100644 --- a/src/systems/imperative_affect.jl +++ b/src/systems/imperative_affect.jl @@ -101,10 +101,22 @@ end namespace_affects(af::ImperativeAffect, s) = namespace_affect(af, s) function namespace_affect(affect::ImperativeAffect, s) + rmn = [] + for modded in modified(affect) + if modded isa AbstractArray + res = [] + for m in modded + push!(res, renamespace(s, m)) + end + push!(rmn, res) + else + push!(rmn, renamespace(s, modded)) + end + end ImperativeAffect(func(affect), namespace_expr.(observed(affect), (s,)), observed_syms(affect), - renamespace.((s,), modified(affect)), + rmn, modified_syms(affect), context(affect), affect.skip_checks) From 1fa12640b6461870b7ff67316c8b78d9f4764441 Mon Sep 17 00:00:00 2001 From: Benjamin Chung Date: Thu, 1 May 2025 16:02:44 -0700 Subject: [PATCH 2/4] format --- src/systems/imperative_affect.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systems/imperative_affect.jl b/src/systems/imperative_affect.jl index bea4ac65a5..b0742e70a7 100644 --- a/src/systems/imperative_affect.jl +++ b/src/systems/imperative_affect.jl @@ -109,7 +109,7 @@ function namespace_affect(affect::ImperativeAffect, s) push!(res, renamespace(s, m)) end push!(rmn, res) - else + else push!(rmn, renamespace(s, modded)) end end From 78431af522a9e6d0ffe57e86793cf24304c5f912 Mon Sep 17 00:00:00 2001 From: Benjamin Chung Date: Mon, 5 May 2025 21:57:17 -0700 Subject: [PATCH 3/4] Add tests --- test/symbolic_events.jl | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/symbolic_events.jl b/test/symbolic_events.jl index 3fb66081a2..5c0a2ee7fc 100644 --- a/test/symbolic_events.jl +++ b/test/symbolic_events.jl @@ -1434,3 +1434,30 @@ end sol2 = solve(ODEProblem(sys2, [], (0.0, 1.0)), Tsit5()) @test 100.0 ∈ sol2[sys2.wd2.θ] end + +@testset "Array parameter updates of parent components in ImperativeEffect" begin + function child(vals; name, max_time = 0.1) + vars = @variables begin + x(t) = 0.0 + end + eqs = reduce(vcat, Symbolics.scalarize.([ + D(x) ~ 1.0 + ])) + reset = ModelingToolkit.ImperativeAffect( + modified = (; vals = Symbolics.scalarize(ParentScope.(vals)), x)) do m, o, _, i + @set! m.vals = m.vals .+ 1 + @set! m.x = 0.0 + return m + end + return ODESystem(eqs, t, vars, []; name = name, + continuous_events = [[x ~ max_time] => reset]) + end + shared_pars = @parameters begin + vals(t)[1:2] = 0.0 + end + + @named sys = ODESystem(Equation[], t, [], Symbolics.scalarize(vals); + systems = [child(vals; name = :child)]) + sys = structural_simplify(sys) + sol = solve(ODEProblem(sys, [], (0.0, 1.0)), Tsit5()) +end From dc1e1c35f3f0811e4c4973af802d2f3e3f930607 Mon Sep 17 00:00:00 2001 From: Benjamin Chung Date: Tue, 6 May 2025 11:40:49 -0700 Subject: [PATCH 4/4] Update imperative affect namespacing to not recurse into symbolic arrays Co-authored-by: Aayush Sabharwal --- src/systems/imperative_affect.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systems/imperative_affect.jl b/src/systems/imperative_affect.jl index b0742e70a7..9be9536c93 100644 --- a/src/systems/imperative_affect.jl +++ b/src/systems/imperative_affect.jl @@ -103,7 +103,7 @@ namespace_affects(af::ImperativeAffect, s) = namespace_affect(af, s) function namespace_affect(affect::ImperativeAffect, s) rmn = [] for modded in modified(affect) - if modded isa AbstractArray + if symbolic_type(modded) == NotSymbolic() && modded isa AbstractArray res = [] for m in modded push!(res, renamespace(s, m))