@@ -165,6 +165,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
165
165
finalize:: Union{Affect, Nothing}
166
166
rootfind:: Union{Nothing, SciMLBase.RootfindOpt}
167
167
reinitializealg:: SciMLBase.DAEInitializationAlgorithm
168
+ zero_crossing_id:: Symbol
168
169
169
170
function SymbolicContinuousCallback (
170
171
conditions:: Union{Equation, Vector{Equation}} ,
@@ -174,6 +175,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
174
175
finalize = nothing ,
175
176
rootfind = SciMLBase. LeftRootFind,
176
177
reinitializealg = nothing ,
178
+ zero_crossing_id = gensym (),
177
179
kwargs... )
178
180
conditions = (conditions isa AbstractVector) ? conditions : [conditions]
179
181
@@ -190,7 +192,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
190
192
make_affect (affect_neg; kwargs... ),
191
193
make_affect (initialize; kwargs... ), make_affect (
192
194
finalize; kwargs... ),
193
- rootfind, reinitializealg)
195
+ rootfind, reinitializealg, zero_crossing_id )
194
196
end # Default affect to nothing
195
197
end
196
198
@@ -466,7 +468,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
466
468
affect_neg = namespace_affects (affect_negs (cb), s),
467
469
initialize = namespace_affects (initialize_affects (cb), s),
468
470
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)
470
473
end
471
474
472
475
function namespace_conditions (condition, s)
@@ -490,6 +493,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
490
493
s = hash (finalize_affects (cb), s)
491
494
! is_discrete (cb) && (s = hash (cb. rootfind, s))
492
495
hash (cb. reinitializealg, s)
496
+ ! is_discrete (cb) && (s = hash (cb. zero_crossing_id, s))
497
+ return s
493
498
end
494
499
495
500
# ##########################
@@ -524,13 +529,16 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
524
529
end
525
530
526
531
function 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
534
542
end
535
543
536
544
Base. isempty (cb:: AbstractCallback ) = isempty (cb. conditions)
0 commit comments