@@ -252,6 +252,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
252252 finalize:: Union{Affect, SymbolicAffect, Nothing}
253253 rootfind:: Union{Nothing, SciMLBase.RootfindOpt}
254254 reinitializealg:: SciMLBase.DAEInitializationAlgorithm
255+ zero_crossing_id:: Symbol
255256end
256257
257258function SymbolicContinuousCallback (
@@ -262,6 +263,7 @@ function SymbolicContinuousCallback(
262263 finalize = nothing ,
263264 rootfind = SciMLBase. LeftRootFind,
264265 reinitializealg = nothing ,
266+ zero_crossing_id = gensym (),
265267 kwargs... )
266268 conditions = (conditions isa AbstractVector) ? conditions : [conditions]
267269
@@ -278,7 +280,7 @@ function SymbolicContinuousCallback(
278280 SymbolicAffect (affect_neg; kwargs... ),
279281 SymbolicAffect (initialize; kwargs... ), SymbolicAffect (
280282 finalize; kwargs... ),
281- rootfind, reinitializealg)
283+ rootfind, reinitializealg, zero_crossing_id )
282284end # Default affect to nothing
283285
284286function SymbolicContinuousCallback (p:: Pair , args... ; kwargs... )
297299function complete (cb:: SymbolicContinuousCallback ; kwargs... )
298300 SymbolicContinuousCallback (cb. conditions, make_affect (cb. affect; kwargs... ),
299301 make_affect (cb. affect_neg; kwargs... ), make_affect (cb. initialize; kwargs... ),
300- make_affect (cb. finalize; kwargs... ), cb. rootfind, cb. reinitializealg)
302+ make_affect (cb. finalize; kwargs... ), cb. rootfind, cb. reinitializealg, cb . zero_crossing_id )
301303end
302304
303305make_affect (affect:: SymbolicAffect ; kwargs... ) = AffectSystem (affect; kwargs... )
@@ -512,7 +514,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
512514 affect_neg = namespace_affects (affect_negs (cb), s),
513515 initialize = namespace_affects (initialize_affects (cb), s),
514516 finalize = namespace_affects (finalize_affects (cb), s),
515- rootfind = cb. rootfind, reinitializealg = cb. reinitializealg)
517+ rootfind = cb. rootfind, reinitializealg = cb. reinitializealg,
518+ zero_crossing_id = cb. zero_crossing_id)
516519end
517520
518521function namespace_conditions (condition, s)
@@ -536,6 +539,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
536539 s = hash (finalize_affects (cb), s)
537540 ! is_discrete (cb) && (s = hash (cb. rootfind, s))
538541 hash (cb. reinitializealg, s)
542+ ! is_discrete (cb) && (s = hash (cb. zero_crossing_id, s))
543+ return s
539544end
540545
541546# ##########################
@@ -570,13 +575,17 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
570575end
571576
572577function Base.:(== )(e1:: AbstractCallback , e2:: AbstractCallback )
573- (is_discrete (e1) === is_discrete (e2)) || return false
574- (isequal (e1. conditions, e2. conditions) && isequal (e1. affect, e2. affect) &&
575- isequal (e1. initialize, e2. initialize) && isequal (e1. finalize, e2. finalize)) &&
576- isequal (e1. reinitializealg, e2. reinitializealg) ||
577- return false
578- is_discrete (e1) ||
579- (isequal (e1. affect_neg, e2. affect_neg) && isequal (e1. rootfind, e2. rootfind))
578+ is_discrete (e1) === is_discrete (e2) || return false
579+ isequal (e1. conditions, e2. conditions) && isequal (e1. affect, e2. affect) || return false
580+ isequal (e1. initialize, e2. initialize) || return false
581+ isequal (e1. finalize, e2. finalize) || return false
582+ isequal (e1. reinitializealg, e2. reinitializealg) || return false
583+ if ! is_discrete (e1)
584+ isequal (e1. affect_neg, e2. affect_neg) || return false
585+ isequal (e1. rootfind, e2. rootfind) || return false
586+ isequal (e1. zero_crossing_id, e2. zero_crossing_id) || return false
587+ end
588+ return true
580589end
581590
582591Base. isempty (cb:: AbstractCallback ) = isempty (cb. conditions)
0 commit comments