|
73 | 73 | const NULL_AFFECT = Equation[]
|
74 | 74 | struct SymbolicContinuousCallback
|
75 | 75 | eqs::Vector{Equation}
|
76 |
| - affect |
| 76 | + affect::Union{Vector{Equation}, FunctionalAffect} |
77 | 77 | function SymbolicContinuousCallback(eqs::Vector{Equation}, affect = NULL_AFFECT)
|
78 | 78 | new(eqs, affect)
|
79 | 79 | end # Default affect to nothing
|
80 | 80 | end
|
81 | 81 |
|
82 |
| -SymbolicContinuousCallback(eqs::Vector{Equation}, affect::Function) = SymbolicContinuousCallback(eqs, SymbolicContinuousCallback(affect)) |
83 |
| - |
84 | 82 | function Base.:(==)(e1::SymbolicContinuousCallback, e2::SymbolicContinuousCallback)
|
85 | 83 | isequal(e1.eqs, e2.eqs) && isequal(e1.affect, e2.affect)
|
86 | 84 | end
|
@@ -123,9 +121,12 @@ function affects(cbs::Vector{SymbolicContinuousCallback})
|
123 | 121 | reduce(vcat, [affects(cb) for cb in cbs])
|
124 | 122 | end
|
125 | 123 |
|
| 124 | +namespace_affects(af::Vector, s) = Equation[namespace_affact(a, s) for a in af] |
| 125 | +namespace_affects(af::FunctionalAffect, s) = namespace_affect(af, s) |
| 126 | + |
126 | 127 | function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuousCallback
|
127 | 128 | SymbolicContinuousCallback(namespace_equation.(equations(cb), (s,)),
|
128 |
| - namespace_affect.(affects(cb), (s,))) |
| 129 | + namespace_affects(affects(cb), s)) |
129 | 130 | end
|
130 | 131 |
|
131 | 132 | cb_add_context(cb::SymbolicContinuousCallback, s) = SymbolicContinuousCallback(equations(cb), af_add_context(affects(cb), s))
|
|
164 | 165 | is_timed_condition(cb) = false
|
165 | 166 | is_timed_condition(::R) where {R<:Real} = true
|
166 | 167 | is_timed_condition(::V) where {V<:AbstractVector} = eltype(V) <: Real
|
| 168 | +is_timed_condition(::Num) = false |
167 | 169 | is_timed_condition(cb::SymbolicDiscreteCallback) = is_timed_condition(condition(cb))
|
168 | 170 |
|
169 | 171 | scalarize_condition(condition) = is_timed_condition(condition) ? condition : value(scalarize(condition))
|
@@ -368,7 +370,7 @@ function generate_rootfinding_callback(cbs, sys::AbstractODESystem, dvs = states
|
368 | 370 | rf_oop, rf_ip = build_function(rhss, u, p, t; expression = Val{false}, kwargs...)
|
369 | 371 |
|
370 | 372 | affect_functions = map(cbs) do cb # Keep affect function separate
|
371 |
| - eq_aff = affect_equations(cb) |
| 373 | + eq_aff = affects(cb) |
372 | 374 | affect = compile_affect(eq_aff, sys, dvs, ps; expression = Val{false}, kwargs...)
|
373 | 375 | end
|
374 | 376 |
|
|
0 commit comments