@@ -143,12 +143,11 @@ before the callback is triggered.
143143"""
144144struct Pre <: Symbolics.Operator end
145145Pre (x) = Pre ()(x)
146+ is_timevarying_operator (:: Type{Pre} ) = false
146147SymbolicUtils. promote_symtype (:: Type{Pre} , T) = T
147148SymbolicUtils. isbinop (:: Pre ) = false
148149Base. nameof (:: Pre ) = :Pre
149150Base. show (io:: IO , x:: Pre ) = print (io, " Pre" )
150- input_timedomain (:: Pre , _ = nothing ) = ContinuousClock ()
151- output_timedomain (:: Pre , _ = nothing ) = ContinuousClock ()
152151unPre (x:: Num ) = unPre (unwrap (x))
153152unPre (x:: Symbolics.Arr ) = unPre (unwrap (x))
154153unPre (x:: Symbolic ) = (iscall (x) && operation (x) isa Pre) ? only (arguments (x)) : x
@@ -252,6 +251,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
252251 finalize:: Union{Affect, SymbolicAffect, Nothing}
253252 rootfind:: Union{Nothing, SciMLBase.RootfindOpt}
254253 reinitializealg:: SciMLBase.DAEInitializationAlgorithm
254+ zero_crossing_id:: Symbol
255255end
256256
257257function SymbolicContinuousCallback (
@@ -262,6 +262,7 @@ function SymbolicContinuousCallback(
262262 finalize = nothing ,
263263 rootfind = SciMLBase. LeftRootFind,
264264 reinitializealg = nothing ,
265+ zero_crossing_id = gensym (),
265266 kwargs... )
266267 conditions = (conditions isa AbstractVector) ? conditions : [conditions]
267268
@@ -278,7 +279,7 @@ function SymbolicContinuousCallback(
278279 SymbolicAffect (affect_neg; kwargs... ),
279280 SymbolicAffect (initialize; kwargs... ), SymbolicAffect (
280281 finalize; kwargs... ),
281- rootfind, reinitializealg)
282+ rootfind, reinitializealg, zero_crossing_id )
282283end # Default affect to nothing
283284
284285function SymbolicContinuousCallback (p:: Pair , args... ; kwargs... )
297298function complete (cb:: SymbolicContinuousCallback ; kwargs... )
298299 SymbolicContinuousCallback (cb. conditions, make_affect (cb. affect; kwargs... ),
299300 make_affect (cb. affect_neg; kwargs... ), make_affect (cb. initialize; kwargs... ),
300- make_affect (cb. finalize; kwargs... ), cb. rootfind, cb. reinitializealg)
301+ make_affect (cb. finalize; kwargs... ), cb. rootfind, cb. reinitializealg, cb . zero_crossing_id )
301302end
302303
303304make_affect (affect:: SymbolicAffect ; kwargs... ) = AffectSystem (affect; kwargs... )
@@ -512,7 +513,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
512513 affect_neg = namespace_affects (affect_negs (cb), s),
513514 initialize = namespace_affects (initialize_affects (cb), s),
514515 finalize = namespace_affects (finalize_affects (cb), s),
515- rootfind = cb. rootfind, reinitializealg = cb. reinitializealg)
516+ rootfind = cb. rootfind, reinitializealg = cb. reinitializealg,
517+ zero_crossing_id = cb. zero_crossing_id)
516518end
517519
518520function namespace_conditions (condition, s)
@@ -536,6 +538,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
536538 s = hash (finalize_affects (cb), s)
537539 ! is_discrete (cb) && (s = hash (cb. rootfind, s))
538540 hash (cb. reinitializealg, s)
541+ ! is_discrete (cb) && (s = hash (cb. zero_crossing_id, s))
542+ return s
539543end
540544
541545# ##########################
@@ -570,13 +574,17 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
570574end
571575
572576function 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))
577+ is_discrete (e1) === is_discrete (e2) || return false
578+ isequal (e1. conditions, e2. conditions) && isequal (e1. affect, e2. affect) || return false
579+ isequal (e1. initialize, e2. initialize) || return false
580+ isequal (e1. finalize, e2. finalize) || return false
581+ isequal (e1. reinitializealg, e2. reinitializealg) || return false
582+ if ! is_discrete (e1)
583+ isequal (e1. affect_neg, e2. affect_neg) || return false
584+ isequal (e1. rootfind, e2. rootfind) || return false
585+ isequal (e1. zero_crossing_id, e2. zero_crossing_id) || return false
586+ end
587+ return true
580588end
581589
582590Base. isempty (cb:: AbstractCallback ) = isempty (cb. conditions)
0 commit comments