@@ -945,8 +945,9 @@ function DiffEqBase.ODEProblem{iip, specialize}(sys::AbstractODESystem, u0map =
945
945
has_difference = has_difference,
946
946
check_length, kwargs... )
947
947
cbs = process_events (sys; callback, has_difference, kwargs... )
948
+ inits = []
948
949
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
949
- affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
950
+ affects, inits, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
950
951
discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
951
952
if clock isa Clock
952
953
PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -976,7 +977,13 @@ function DiffEqBase.ODEProblem{iip, specialize}(sys::AbstractODESystem, u0map =
976
977
if svs != = nothing
977
978
kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
978
979
end
979
- ODEProblem {iip} (f, u0, tspan, p, pt; kwargs1... , kwargs... )
980
+ prob = ODEProblem {iip} (f, u0, tspan, p, pt; kwargs1... , kwargs... )
981
+ if ! isempty (inits)
982
+ for init in inits
983
+ init (prob. p, tspan[1 ])
984
+ end
985
+ end
986
+ prob
980
987
end
981
988
get_callback (prob:: ODEProblem ) = prob. kwargs[:callback ]
982
989
@@ -1045,8 +1052,9 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1045
1052
h = h_oop
1046
1053
u0 = h (p, tspan[1 ])
1047
1054
cbs = process_events (sys; callback, has_difference, kwargs... )
1055
+ inits = []
1048
1056
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
1049
- affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1057
+ affects, inits, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1050
1058
discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
1051
1059
if clock isa Clock
1052
1060
PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -1075,7 +1083,13 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1075
1083
if svs != = nothing
1076
1084
kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
1077
1085
end
1078
- DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
1086
+ prob = DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
1087
+ if ! isempty (inits)
1088
+ for init in inits
1089
+ init (prob. p, tspan[1 ])
1090
+ end
1091
+ end
1092
+ prob
1079
1093
end
1080
1094
1081
1095
function DiffEqBase. SDDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
@@ -1099,8 +1113,9 @@ function DiffEqBase.SDDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1099
1113
h (p, t) = h_oop (p, t)
1100
1114
u0 = h (p, tspan[1 ])
1101
1115
cbs = process_events (sys; callback, has_difference, kwargs... )
1116
+ inits = []
1102
1117
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
1103
- affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1118
+ affects, inits, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
1104
1119
discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
1105
1120
if clock isa Clock
1106
1121
PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -1140,8 +1155,15 @@ function DiffEqBase.SDDEProblem{iip}(sys::AbstractODESystem, u0map = [],
1140
1155
else
1141
1156
noise_rate_prototype = zeros (eltype (u0), size (noiseeqs))
1142
1157
end
1143
- SDDEProblem {iip} (f, f. g, u0, h, tspan, p; noise_rate_prototype =
1158
+ prob = SDDEProblem {iip} (f, f. g, u0, h, tspan, p;
1159
+ noise_rate_prototype =
1144
1160
noise_rate_prototype, kwargs1... , kwargs... )
1161
+ if ! isempty (inits)
1162
+ for init in inits
1163
+ init (prob. p, tspan[1 ])
1164
+ end
1165
+ end
1166
+ prob
1145
1167
end
1146
1168
1147
1169
"""
0 commit comments