Skip to content

Commit acd2e1f

Browse files
feat: add zero_crossing_id to SymbolicContinuousCallback
1 parent cb56357 commit acd2e1f

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

src/systems/callbacks.jl

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
165165
finalize::Union{Affect, Nothing}
166166
rootfind::Union{Nothing, SciMLBase.RootfindOpt}
167167
reinitializealg::SciMLBase.DAEInitializationAlgorithm
168+
zero_crossing_id::Symbol
168169

169170
function SymbolicContinuousCallback(
170171
conditions::Union{Equation, Vector{Equation}},
@@ -174,6 +175,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
174175
finalize = nothing,
175176
rootfind = SciMLBase.LeftRootFind,
176177
reinitializealg = nothing,
178+
zero_crossing_id = gensym(),
177179
kwargs...)
178180
conditions = (conditions isa AbstractVector) ? conditions : [conditions]
179181

@@ -190,7 +192,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
190192
make_affect(affect_neg; kwargs...),
191193
make_affect(initialize; kwargs...), make_affect(
192194
finalize; kwargs...),
193-
rootfind, reinitializealg)
195+
rootfind, reinitializealg, zero_crossing_id)
194196
end # Default affect to nothing
195197
end
196198

@@ -466,7 +468,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
466468
affect_neg = namespace_affects(affect_negs(cb), s),
467469
initialize = namespace_affects(initialize_affects(cb), s),
468470
finalize = namespace_affects(finalize_affects(cb), s),
469-
rootfind = cb.rootfind, reinitializealg = cb.reinitializealg)
471+
rootfind = cb.rootfind, reinitializealg = cb.reinitializealg,
472+
zero_crossing_id = cb.zero_crossing_id)
470473
end
471474

472475
function namespace_conditions(condition, s)
@@ -490,6 +493,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
490493
s = hash(finalize_affects(cb), s)
491494
!is_discrete(cb) && (s = hash(cb.rootfind, s))
492495
hash(cb.reinitializealg, s)
496+
!is_discrete(cb) && (s = hash(cb.zero_crossing_id, s))
497+
return s
493498
end
494499

495500
###########################
@@ -524,13 +529,16 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
524529
end
525530

526531
function Base.:(==)(e1::AbstractCallback, e2::AbstractCallback)
527-
(is_discrete(e1) === is_discrete(e2)) || return false
528-
(isequal(e1.conditions, e2.conditions) && isequal(e1.affect, e2.affect) &&
529-
isequal(e1.initialize, e2.initialize) && isequal(e1.finalize, e2.finalize)) &&
530-
isequal(e1.reinitializealg, e2.reinitializealg) ||
531-
return false
532-
is_discrete(e1) ||
533-
(isequal(e1.affect_neg, e2.affect_neg) && isequal(e1.rootfind, e2.rootfind))
532+
is_discrete(e1) === is_discrete(e2) || return false
533+
isequal(e1.conditions, e2.conditions) && isequal(e1.affect, e2.affect) || return false
534+
isequal(e1.initialize, e2.initialize) || return false
535+
isequal(e1.finalize, e2.finalize) || return false
536+
isequal(e1.reinitializealg, e2.reinitializealg) || return false
537+
if !is_discrete(e1)
538+
isequal(e1.affect_neg, e2.affect_neg) || return false
539+
isequal(e1.rootfind, e2.rootfind) || return false
540+
isequal(e1.zero_crossing_id, e2.zero_crossing_id) || return false
541+
end
534542
end
535543

536544
Base.isempty(cb::AbstractCallback) = isempty(cb.conditions)

0 commit comments

Comments
 (0)