Skip to content

Commit 81ff95a

Browse files
feat: add vars! for callbacks and affects
1 parent bd3f43b commit 81ff95a

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

src/systems/callbacks.jl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ function has_functional_affect(cb)
7777
(affects(cb) isa FunctionalAffect || affects(cb) isa ImperativeAffect)
7878
end
7979

80+
function vars!(vars, aff::FunctionalAffect; op = Differential)
81+
for var in Iterators.flatten((unknowns(aff), parameters(aff), discretes(aff)))
82+
vars!(vars, var)
83+
end
84+
return vars
85+
end
86+
8087
#################################### continuous events #####################################
8188

8289
const NULL_AFFECT = Equation[]
@@ -333,6 +340,22 @@ function continuous_events(sys::AbstractSystem)
333340
filter(!isempty, cbs)
334341
end
335342

343+
function vars!(vars, cb::SymbolicContinuousCallback; op = Differential)
344+
for eq in equations(cb)
345+
vars!(vars, eq; op)
346+
end
347+
for aff in (affects(cb), affect_negs(cb), initialize_affects(cb), finalize_affects(cb))
348+
if aff isa Vector{Equation}
349+
for eq in aff
350+
vars!(vars, eq; op)
351+
end
352+
elseif aff !== nothing
353+
vars!(vars, aff; op)
354+
end
355+
end
356+
return vars
357+
end
358+
336359
#################################### discrete events #####################################
337360

338361
struct SymbolicDiscreteCallback
@@ -469,6 +492,28 @@ function discrete_events(sys::AbstractSystem)
469492
cbs
470493
end
471494

495+
function vars!(vars, cb::SymbolicDiscreteCallback; op = Differential)
496+
if symbolic_type(cb.condition) == NotSymbolic
497+
if cb.condition isa AbstractArray
498+
for eq in cb.condition
499+
vars!(vars, eq; op)
500+
end
501+
end
502+
else
503+
vars!(vars, cb.condition; op)
504+
end
505+
for aff in (cb.affects, cb.initialize, cb.finalize)
506+
if aff isa Vector{Equation}
507+
for eq in aff
508+
vars!(vars, eq; op)
509+
end
510+
elseif aff !== nothing
511+
vars!(vars, aff; op)
512+
end
513+
end
514+
return vars
515+
end
516+
472517
################################# compilation functions ####################################
473518

474519
# handles ensuring that affect! functions work with integrator arguments

src/systems/imperative_affect.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,20 @@ function compile_user_affect(affect::ImperativeAffect, cb, sys, dvs, ps; kwargs.
216216
end
217217

218218
scalarize_affects(affects::ImperativeAffect) = affects
219+
220+
function vars!(vars, aff::ImperativeAffect; op = Differential)
221+
for var in Iterators.flatten((observed(aff), modified(aff)))
222+
if symbolic_type(var) == NotSymbolic()
223+
if var isa AbstractArray
224+
for v in var
225+
v = unwrap(v)
226+
vars!(vars, v)
227+
end
228+
end
229+
else
230+
var = unwrap(var)
231+
vars!(vars, var)
232+
end
233+
end
234+
return vars
235+
end

0 commit comments

Comments
 (0)