@@ -938,8 +938,9 @@ function DiffEqBase.ODEProblem{iip, specialize}(sys::AbstractODESystem, u0map =
938
938
has_difference = has_difference,
939
939
check_length, kwargs... )
940
940
cbs = process_events (sys; callback, has_difference, kwargs... )
941
+ inits = []
941
942
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
942
- affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
943
+ affects, inits, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
943
944
discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
944
945
if clock isa Clock
945
946
PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -969,7 +970,13 @@ function DiffEqBase.ODEProblem{iip, specialize}(sys::AbstractODESystem, u0map =
969
970
if svs != = nothing
970
971
kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
971
972
end
972
- ODEProblem {iip} (f, u0, tspan, p, pt; kwargs1... , kwargs... )
973
+ prob = ODEProblem {iip} (f, u0, tspan, p, pt; kwargs1... , kwargs... )
974
+ if ! isempty (inits)
975
+ for init in inits
976
+ init (prob. p, tspan[1 ])
977
+ end
978
+ end
979
+ prob
973
980
end
974
981
get_callback (prob:: ODEProblem ) = prob. kwargs[:callback ]
975
982
@@ -1038,8 +1045,9 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1038
1045
h = h_oop
1039
1046
u0 = h (p, tspan[1 ])
1040
1047
cbs = process_events (sys; callback, has_difference, kwargs... )
1048
+ inits = []
1041
1049
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
1042
- affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1050
+ affects, inits, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1043
1051
discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
1044
1052
if clock isa Clock
1045
1053
PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -1068,7 +1076,13 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1068
1076
if svs != = nothing
1069
1077
kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
1070
1078
end
1071
- DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
1079
+ prob = DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
1080
+ if ! isempty (inits)
1081
+ for init in inits
1082
+ init (prob. p, tspan[1 ])
1083
+ end
1084
+ end
1085
+ prob
1072
1086
end
1073
1087
1074
1088
function DiffEqBase. SDDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
@@ -1092,8 +1106,9 @@ function DiffEqBase.SDDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1092
1106
h (p, t) = h_oop (p, t)
1093
1107
u0 = h (p, tspan[1 ])
1094
1108
cbs = process_events (sys; callback, has_difference, kwargs... )
1109
+ inits = []
1095
1110
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
1096
- affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1111
+ affects, inits, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1097
1112
discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
1098
1113
if clock isa Clock
1099
1114
PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -1133,8 +1148,15 @@ function DiffEqBase.SDDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1133
1148
else
1134
1149
noise_rate_prototype = zeros (eltype (u0), size (noiseeqs))
1135
1150
end
1136
- SDDEProblem {iip} (f, f. g, u0, h, tspan, p; noise_rate_prototype =
1151
+ prob = SDDEProblem {iip} (f, f. g, u0, h, tspan, p;
1152
+ noise_rate_prototype =
1137
1153
noise_rate_prototype, kwargs1... , kwargs... )
1154
+ if ! isempty (inits)
1155
+ for init in inits
1156
+ init (prob. p, tspan[1 ])
1157
+ end
1158
+ end
1159
+ prob
1138
1160
end
1139
1161
1140
1162
"""
0 commit comments