@@ -697,12 +697,18 @@ function generate_callback(cbs::Vector{SymbolicContinuousCallback}, sys; kwargs.
697
697
return generate_callback (cbs[cb_ind], sys; kwargs... )
698
698
end
699
699
700
+ if is_split (sys)
701
+ ic = get_index_cache (sys)
702
+ else
703
+ ic = nothing
704
+ end
700
705
trigger = compile_condition (
701
706
cbs, sys, unknowns (sys), parameters (sys; initial_parameters = true ); kwargs... )
702
707
affects = []
703
708
affect_negs = []
704
709
inits = []
705
710
finals = []
711
+ discrete_save_idxs = Vector{Int}[]
706
712
for cb in cbs
707
713
affect = compile_affect (cb. affect, cb, sys; default = EMPTY_AFFECT, kwargs... )
708
714
push! (affects, affect)
@@ -712,8 +718,12 @@ function generate_callback(cbs::Vector{SymbolicContinuousCallback}, sys; kwargs.
712
718
push! (affect_negs, affect_neg)
713
719
push! (inits,
714
720
compile_affect (
715
- cb. initialize, cb, sys; default = nothing , is_init = true , kwargs... ))
721
+ cb. initialize, cb, sys; default = nothing , kwargs... ))
716
722
push! (finals, compile_affect (cb. finalize, cb, sys; default = nothing , kwargs... ))
723
+
724
+ if ic != = nothing
725
+ push! (discrete_save_idxs, get (ic. callback_to_clocks, cb, Int[]))
726
+ end
717
727
end
718
728
719
729
# Since there may be different number of conditions and affects,
@@ -739,7 +749,8 @@ function generate_callback(cbs::Vector{SymbolicContinuousCallback}, sys; kwargs.
739
749
740
750
return VectorContinuousCallback (
741
751
trigger, affect, affect_neg, length (eqs); initialize, finalize,
742
- rootfind = cbs[1 ]. rootfind, initializealg = cbs[1 ]. reinitializealg)
752
+ rootfind = cbs[1 ]. rootfind, initializealg = cbs[1 ]. reinitializealg,
753
+ discrete_save_idxs)
743
754
end
744
755
745
756
function generate_callback (cb, sys; kwargs... )
@@ -756,27 +767,33 @@ function generate_callback(cb, sys; kwargs...)
756
767
compile_affect (cb. affect_neg, cb, sys; default = EMPTY_AFFECT, kwargs... )
757
768
end
758
769
init = compile_affect (cb. initialize, cb, sys; default = SciMLBase. INITIALIZE_DEFAULT,
759
- is_init = true , kwargs... )
770
+ kwargs... )
760
771
final = compile_affect (
761
772
cb. finalize, cb, sys; default = SciMLBase. FINALIZE_DEFAULT, kwargs... )
762
773
763
774
initialize = isnothing (cb. initialize) ? init : ((c, u, t, i) -> init (i))
764
775
finalize = isnothing (cb. finalize) ? final : ((c, u, t, i) -> final (i))
765
776
777
+ discrete_save_idxs = if is_split (sys)
778
+ get (get_index_cache (sys). callback_to_clocks, cb, ())
779
+ else
780
+ ()
781
+ end
766
782
if is_discrete (cb)
767
783
if is_timed && conditions (cb) isa AbstractVector
768
784
return PresetTimeCallback (trigger, affect; initialize,
769
- finalize, initializealg = cb. reinitializealg)
785
+ finalize, initializealg = cb. reinitializealg, discrete_save_idxs )
770
786
elseif is_timed
771
787
return PeriodicCallback (
772
- affect, trigger; initialize, finalize, initializealg = cb. reinitializealg)
788
+ affect, trigger; initialize, finalize, initializealg = cb. reinitializealg,
789
+ discrete_save_idxs)
773
790
else
774
791
return DiscreteCallback (trigger, affect; initialize,
775
- finalize, initializealg = cb. reinitializealg)
792
+ finalize, initializealg = cb. reinitializealg, discrete_save_idxs )
776
793
end
777
794
else
778
795
return ContinuousCallback (trigger, affect, affect_neg; initialize, finalize,
779
- rootfind = cb. rootfind, initializealg = cb. reinitializealg)
796
+ rootfind = cb. rootfind, initializealg = cb. reinitializealg, discrete_save_idxs )
780
797
end
781
798
end
782
799
@@ -791,41 +808,13 @@ Notes
791
808
"""
792
809
function compile_affect (
793
810
aff:: Union{Nothing, Affect} , cb:: AbstractCallback , sys:: AbstractSystem ;
794
- default = nothing , is_init = false , kwargs... )
795
- save_idxs = if ! (has_index_cache (sys) && (ic = get_index_cache (sys)) != = nothing )
796
- Int[]
797
- else
798
- get (ic. callback_to_clocks, cb, Int[])
799
- end
800
-
811
+ default = nothing , kwargs... )
801
812
if isnothing (aff)
802
- is_init ? wrap_save_discretes (default, save_idxs) : default
813
+ default
803
814
elseif aff isa AffectSystem
804
- f = compile_equational_affect (aff, sys; kwargs... )
805
- wrap_save_discretes (f, save_idxs)
815
+ compile_equational_affect (aff, sys; kwargs... )
806
816
elseif aff isa ImperativeAffect
807
- f = compile_functional_affect (aff, sys; kwargs... )
808
- wrap_save_discretes (f, save_idxs)
809
- end
810
- end
811
-
812
- function wrap_save_discretes (f, save_idxs)
813
- let save_idxs = save_idxs, f = f
814
- if f === SciMLBase. INITIALIZE_DEFAULT
815
- (c, u, t, i) -> begin
816
- f (c, u, t, i)
817
- for idx in save_idxs
818
- SciMLBase. save_discretes! (i, idx)
819
- end
820
- end
821
- else
822
- (i) -> begin
823
- isnothing (f) || f (i)
824
- for idx in save_idxs
825
- SciMLBase. save_discretes! (i, idx)
826
- end
827
- end
828
- end
817
+ compile_functional_affect (aff, sys; kwargs... )
829
818
end
830
819
end
831
820
0 commit comments