@@ -945,8 +945,9 @@ function DiffEqBase.ODEProblem{iip, specialize}(sys::AbstractODESystem, u0map =
945945 has_difference = has_difference,
946946 check_length, kwargs... )
947947 cbs = process_events (sys; callback, has_difference, kwargs... )
948+ inits = []
948949 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... )
950951 discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
951952 if clock isa Clock
952953 PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -976,7 +977,13 @@ function DiffEqBase.ODEProblem{iip, specialize}(sys::AbstractODESystem, u0map =
976977 if svs != = nothing
977978 kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
978979 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
980987end
981988get_callback (prob:: ODEProblem ) = prob. kwargs[:callback ]
982989
@@ -1045,8 +1052,9 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
10451052 h = h_oop
10461053 u0 = h (p, tspan[1 ])
10471054 cbs = process_events (sys; callback, has_difference, kwargs... )
1055+ inits = []
10481056 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... )
10501058 discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
10511059 if clock isa Clock
10521060 PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -1075,7 +1083,13 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
10751083 if svs != = nothing
10761084 kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
10771085 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
10791093end
10801094
10811095function DiffEqBase. SDDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
@@ -1099,8 +1113,9 @@ function DiffEqBase.SDDEProblem{iip}(sys::AbstractODESystem, u0map = [],
10991113 h (p, t) = h_oop (p, t)
11001114 u0 = h (p, tspan[1 ])
11011115 cbs = process_events (sys; callback, has_difference, kwargs... )
1116+ inits = []
11021117 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... )
11041119 discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
11051120 if clock isa Clock
11061121 PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
@@ -1140,8 +1155,15 @@ function DiffEqBase.SDDEProblem{iip}(sys::AbstractODESystem, u0map = [],
11401155 else
11411156 noise_rate_prototype = zeros (eltype (u0), size (noiseeqs))
11421157 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 =
11441160 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
11451167end
11461168
11471169"""
0 commit comments