Skip to content

Commit d17b040

Browse files
feat: add zero_crossing_id to SymbolicContinuousCallback
1 parent f7fabf5 commit d17b040

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

src/systems/callbacks.jl

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ struct SymbolicContinuousCallback <: AbstractCallback
252252
finalize::Union{Affect, SymbolicAffect, Nothing}
253253
rootfind::Union{Nothing, SciMLBase.RootfindOpt}
254254
reinitializealg::SciMLBase.DAEInitializationAlgorithm
255+
zero_crossing_id::Symbol
255256
end
256257

257258
function SymbolicContinuousCallback(
@@ -262,6 +263,7 @@ function SymbolicContinuousCallback(
262263
finalize = nothing,
263264
rootfind = SciMLBase.LeftRootFind,
264265
reinitializealg = nothing,
266+
zero_crossing_id = gensym(),
265267
kwargs...)
266268
conditions = (conditions isa AbstractVector) ? conditions : [conditions]
267269

@@ -278,7 +280,7 @@ function SymbolicContinuousCallback(
278280
SymbolicAffect(affect_neg; kwargs...),
279281
SymbolicAffect(initialize; kwargs...), SymbolicAffect(
280282
finalize; kwargs...),
281-
rootfind, reinitializealg)
283+
rootfind, reinitializealg, zero_crossing_id)
282284
end # Default affect to nothing
283285

284286
function SymbolicContinuousCallback(p::Pair, args...; kwargs...)
@@ -297,7 +299,7 @@ end
297299
function complete(cb::SymbolicContinuousCallback; kwargs...)
298300
SymbolicContinuousCallback(cb.conditions, make_affect(cb.affect; kwargs...),
299301
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)
301303
end
302304

303305
make_affect(affect::SymbolicAffect; kwargs...) = AffectSystem(affect; kwargs...)
@@ -512,7 +514,8 @@ function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuo
512514
affect_neg = namespace_affects(affect_negs(cb), s),
513515
initialize = namespace_affects(initialize_affects(cb), s),
514516
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)
516519
end
517520

518521
function namespace_conditions(condition, s)
@@ -536,6 +539,8 @@ function Base.hash(cb::AbstractCallback, s::UInt)
536539
s = hash(finalize_affects(cb), s)
537540
!is_discrete(cb) && (s = hash(cb.rootfind, s))
538541
hash(cb.reinitializealg, s)
542+
!is_discrete(cb) && (s = hash(cb.zero_crossing_id, s))
543+
return s
539544
end
540545

541546
###########################
@@ -570,13 +575,16 @@ function finalize_affects(cbs::Vector{<:AbstractCallback})
570575
end
571576

572577
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
580588
end
581589

582590
Base.isempty(cb::AbstractCallback) = isempty(cb.conditions)

0 commit comments

Comments
 (0)