@@ -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