Skip to content

Commit 9eb8f8f

Browse files
Merge pull request #4500 from SciML/as/fix-imperative-affect
fix: fix `unassignable_variables` implementation in `ImperativeAffect`
2 parents 1614120 + d3c7cdd commit 9eb8f8f

1 file changed

Lines changed: 27 additions & 12 deletions

File tree

lib/ModelingToolkitBase/src/systems/imperative_affect.jl

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -158,18 +158,33 @@ function invalid_variables(sys, expr)
158158
end
159159

160160
function unassignable_variables(sys, expr)
161-
assignable_syms = reduce(
162-
vcat, Symbolics.scalarize.(
163-
vcat(
164-
unknowns(sys), parameters(sys; initial_parameters = true)
165-
)
166-
);
167-
init = []
168-
)
169-
written = reduce(vcat, Symbolics.scalarize.(collect(SU.search_variables(expr))); init = [])
170-
return filter(
171-
x -> !any(isequal(x), assignable_syms), written
172-
)
161+
assignable_syms = Set{SymbolicT}()
162+
union!(assignable_syms, unknowns(sys))
163+
for p in parameters(sys; initial_parameters = true)
164+
if Symbolics.isarraysymbolic(p)
165+
for idx in SU.stable_eachindex(p)
166+
push!(assignable_syms, p[idx])
167+
end
168+
else
169+
push!(assignable_syms, p)
170+
end
171+
end
172+
vars = Set{SymbolicT}()
173+
SU.search_variables!(vars, expr)
174+
unassignable = SymbolicT[]
175+
for var in vars
176+
if Symbolics.isarraysymbolic(var)
177+
for idx in SU.stable_eachindex(var)
178+
sym = var[idx]
179+
sym in assignable_syms && continue
180+
push!(unassignable, sym)
181+
end
182+
else
183+
var in assignable_syms && continue
184+
push!(unassignable, var)
185+
end
186+
end
187+
return unassignable
173188
end
174189

175190
@generated function _generated_writeback(

0 commit comments

Comments
 (0)