@@ -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
195197end
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)
470473end
471474
472475function 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
493498end
494499
495500# ##########################
@@ -524,13 +529,16 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
524529end
525530
526531function 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
534542end
535543
536544Base. isempty (cb:: AbstractCallback ) = isempty (cb. conditions)
0 commit comments