@@ -252,6 +252,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
252
252
finalize:: Union{Affect, SymbolicAffect, Nothing}
253
253
rootfind:: Union{Nothing, SciMLBase.RootfindOpt}
254
254
reinitializealg:: SciMLBase.DAEInitializationAlgorithm
255
+ zero_crossing_id:: Symbol
255
256
end
256
257
257
258
function SymbolicContinuousCallback (
@@ -262,6 +263,7 @@ function SymbolicContinuousCallback(
262
263
finalize = nothing ,
263
264
rootfind = SciMLBase. LeftRootFind,
264
265
reinitializealg = nothing ,
266
+ zero_crossing_id = gensym (),
265
267
kwargs... )
266
268
conditions = (conditions isa AbstractVector) ? conditions : [conditions]
267
269
@@ -278,7 +280,7 @@ function SymbolicContinuousCallback(
278
280
SymbolicAffect (affect_neg; kwargs... ),
279
281
SymbolicAffect (initialize; kwargs... ), SymbolicAffect (
280
282
finalize; kwargs... ),
281
- rootfind, reinitializealg)
283
+ rootfind, reinitializealg, zero_crossing_id )
282
284
end # Default affect to nothing
283
285
284
286
function SymbolicContinuousCallback (p:: Pair , args... ; kwargs... )
297
299
function complete (cb:: SymbolicContinuousCallback ; kwargs... )
298
300
SymbolicContinuousCallback (cb. conditions, make_affect (cb. affect; kwargs... ),
299
301
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 )
301
303
end
302
304
303
305
make_affect (affect:: SymbolicAffect ; kwargs... ) = AffectSystem (affect; kwargs... )
@@ -512,7 +514,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
512
514
affect_neg = namespace_affects (affect_negs (cb), s),
513
515
initialize = namespace_affects (initialize_affects (cb), s),
514
516
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)
516
519
end
517
520
518
521
function namespace_conditions (condition, s)
@@ -536,6 +539,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
536
539
s = hash (finalize_affects (cb), s)
537
540
! is_discrete (cb) && (s = hash (cb. rootfind, s))
538
541
hash (cb. reinitializealg, s)
542
+ ! is_discrete (cb) && (s = hash (cb. zero_crossing_id, s))
543
+ return s
539
544
end
540
545
541
546
# ##########################
@@ -570,13 +575,16 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
570
575
end
571
576
572
577
function 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
580
588
end
581
589
582
590
Base. isempty (cb:: AbstractCallback ) = isempty (cb. conditions)
0 commit comments