@@ -716,12 +716,18 @@ function generate_callback(cbs::Vector{SymbolicContinuousCallback}, sys; kwargs.
716716 return generate_callback (cbs[cb_ind], sys; kwargs... )
717717 end
718718
719+ if is_split (sys)
720+ ic = get_index_cache (sys)
721+ else
722+ ic = nothing
723+ end
719724 trigger = compile_condition (
720725 cbs, sys, unknowns (sys), parameters (sys; initial_parameters = true ); kwargs... )
721726 affects = []
722727 affect_negs = []
723728 inits = []
724729 finals = []
730+ saved_clock_partitions = Vector{Int}[]
725731 for cb in cbs
726732 affect = compile_affect (cb. affect, cb, sys; default = EMPTY_AFFECT, kwargs... )
727733 push! (affects, affect)
@@ -731,8 +737,15 @@ function generate_callback(cbs::Vector{SymbolicContinuousCallback}, sys; kwargs.
731737 push! (affect_negs, affect_neg)
732738 push! (inits,
733739 compile_affect (
734- cb. initialize, cb, sys; default = nothing , is_init = true , kwargs... ))
740+ cb. initialize, cb, sys; default = nothing , kwargs... ))
735741 push! (finals, compile_affect (cb. finalize, cb, sys; default = nothing , kwargs... ))
742+
743+ if ic != = nothing
744+ save_idxs = get (ic. callback_to_clocks, cb, Int[])
745+ for _ in conditions (cb)
746+ push! (saved_clock_partitions, save_idxs)
747+ end
748+ end
736749 end
737750
738751 # Since there may be different number of conditions and affects,
@@ -758,7 +771,8 @@ function generate_callback(cbs::Vector{SymbolicContinuousCallback}, sys; kwargs.
758771
759772 return VectorContinuousCallback (
760773 trigger, affect, affect_neg, length (eqs); initialize, finalize,
761- rootfind = cbs[1 ]. rootfind, initializealg = cbs[1 ]. reinitializealg)
774+ rootfind = cbs[1 ]. rootfind, initializealg = cbs[1 ]. reinitializealg,
775+ saved_clock_partitions)
762776end
763777
764778function generate_callback (cb, sys; kwargs... )
@@ -775,27 +789,33 @@ function generate_callback(cb, sys; kwargs...)
775789 compile_affect (cb. affect_neg, cb, sys; default = EMPTY_AFFECT, kwargs... )
776790 end
777791 init = compile_affect (cb. initialize, cb, sys; default = SciMLBase. INITIALIZE_DEFAULT,
778- is_init = true , kwargs... )
792+ kwargs... )
779793 final = compile_affect (
780794 cb. finalize, cb, sys; default = SciMLBase. FINALIZE_DEFAULT, kwargs... )
781795
782796 initialize = isnothing (cb. initialize) ? init : ((c, u, t, i) -> init (i))
783797 finalize = isnothing (cb. finalize) ? final : ((c, u, t, i) -> final (i))
784798
799+ saved_clock_partitions = if is_split (sys)
800+ get (get_index_cache (sys). callback_to_clocks, cb, ())
801+ else
802+ ()
803+ end
785804 if is_discrete (cb)
786805 if is_timed && conditions (cb) isa AbstractVector
787806 return PresetTimeCallback (trigger, affect; initialize,
788- finalize, initializealg = cb. reinitializealg)
807+ finalize, initializealg = cb. reinitializealg, saved_clock_partitions )
789808 elseif is_timed
790809 return PeriodicCallback (
791- affect, trigger; initialize, finalize, initializealg = cb. reinitializealg)
810+ affect, trigger; initialize, finalize, initializealg = cb. reinitializealg,
811+ saved_clock_partitions)
792812 else
793813 return DiscreteCallback (trigger, affect; initialize,
794- finalize, initializealg = cb. reinitializealg)
814+ finalize, initializealg = cb. reinitializealg, saved_clock_partitions )
795815 end
796816 else
797817 return ContinuousCallback (trigger, affect, affect_neg; initialize, finalize,
798- rootfind = cb. rootfind, initializealg = cb. reinitializealg)
818+ rootfind = cb. rootfind, initializealg = cb. reinitializealg, saved_clock_partitions )
799819 end
800820end
801821
@@ -810,41 +830,13 @@ Notes
810830"""
811831function compile_affect (
812832 aff:: Union{Nothing, Affect} , cb:: AbstractCallback , sys:: AbstractSystem ;
813- default = nothing , is_init = false , kwargs... )
814- save_idxs = if ! (has_index_cache (sys) && (ic = get_index_cache (sys)) != = nothing )
815- Int[]
816- else
817- get (ic. callback_to_clocks, cb, Int[])
818- end
819-
833+ default = nothing , kwargs... )
820834 if isnothing (aff)
821- is_init ? wrap_save_discretes (default, save_idxs) : default
835+ default
822836 elseif aff isa AffectSystem
823- f = compile_equational_affect (aff, sys; kwargs... )
824- wrap_save_discretes (f, save_idxs)
837+ compile_equational_affect (aff, sys; kwargs... )
825838 elseif aff isa ImperativeAffect
826- f = compile_functional_affect (aff, sys; kwargs... )
827- wrap_save_discretes (f, save_idxs)
828- end
829- end
830-
831- function wrap_save_discretes (f, save_idxs)
832- let save_idxs = save_idxs, f = f
833- if f === SciMLBase. INITIALIZE_DEFAULT
834- (c, u, t, i) -> begin
835- f (c, u, t, i)
836- for idx in save_idxs
837- SciMLBase. save_discretes! (i, idx)
838- end
839- end
840- else
841- (i) -> begin
842- isnothing (f) || f (i)
843- for idx in save_idxs
844- SciMLBase. save_discretes! (i, idx)
845- end
846- end
847- end
839+ compile_functional_affect (aff, sys; kwargs... )
848840 end
849841end
850842
0 commit comments