@@ -143,12 +143,11 @@ before the callback is triggered.
143
143
"""
144
144
struct Pre <: Symbolics.Operator end
145
145
Pre (x) = Pre ()(x)
146
+ is_timevarying_operator (:: Type{Pre} ) = false
146
147
SymbolicUtils. promote_symtype (:: Type{Pre} , T) = T
147
148
SymbolicUtils. isbinop (:: Pre ) = false
148
149
Base. nameof (:: Pre ) = :Pre
149
150
Base. show (io:: IO , x:: Pre ) = print (io, " Pre" )
150
- input_timedomain (:: Pre , _ = nothing ) = ContinuousClock ()
151
- output_timedomain (:: Pre , _ = nothing ) = ContinuousClock ()
152
151
unPre (x:: Num ) = unPre (unwrap (x))
153
152
unPre (x:: Symbolics.Arr ) = unPre (unwrap (x))
154
153
unPre (x:: Symbolic ) = (iscall (x) && operation (x) isa Pre) ? only (arguments (x)) : x
@@ -252,6 +251,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
252
251
finalize:: Union{Affect, SymbolicAffect, Nothing}
253
252
rootfind:: Union{Nothing, SciMLBase.RootfindOpt}
254
253
reinitializealg:: SciMLBase.DAEInitializationAlgorithm
254
+ zero_crossing_id:: Symbol
255
255
end
256
256
257
257
function SymbolicContinuousCallback (
@@ -262,6 +262,7 @@ function SymbolicContinuousCallback(
262
262
finalize = nothing ,
263
263
rootfind = SciMLBase. LeftRootFind,
264
264
reinitializealg = nothing ,
265
+ zero_crossing_id = gensym (),
265
266
kwargs... )
266
267
conditions = (conditions isa AbstractVector) ? conditions : [conditions]
267
268
@@ -278,7 +279,7 @@ function SymbolicContinuousCallback(
278
279
SymbolicAffect (affect_neg; kwargs... ),
279
280
SymbolicAffect (initialize; kwargs... ), SymbolicAffect (
280
281
finalize; kwargs... ),
281
- rootfind, reinitializealg)
282
+ rootfind, reinitializealg, zero_crossing_id )
282
283
end # Default affect to nothing
283
284
284
285
function SymbolicContinuousCallback (p:: Pair , args... ; kwargs... )
297
298
function complete (cb:: SymbolicContinuousCallback ; kwargs... )
298
299
SymbolicContinuousCallback (cb. conditions, make_affect (cb. affect; kwargs... ),
299
300
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 )
301
302
end
302
303
303
304
make_affect (affect:: SymbolicAffect ; kwargs... ) = AffectSystem (affect; kwargs... )
@@ -512,7 +513,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
512
513
affect_neg = namespace_affects (affect_negs (cb), s),
513
514
initialize = namespace_affects (initialize_affects (cb), s),
514
515
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)
516
518
end
517
519
518
520
function namespace_conditions (condition, s)
@@ -536,6 +538,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
536
538
s = hash (finalize_affects (cb), s)
537
539
! is_discrete (cb) && (s = hash (cb. rootfind, s))
538
540
hash (cb. reinitializealg, s)
541
+ ! is_discrete (cb) && (s = hash (cb. zero_crossing_id, s))
542
+ return s
539
543
end
540
544
541
545
# ##########################
@@ -570,13 +574,17 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
570
574
end
571
575
572
576
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))
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
580
588
end
581
589
582
590
Base. isempty (cb:: AbstractCallback ) = isempty (cb. conditions)
0 commit comments