@@ -30,7 +30,8 @@ function generate_initializesystem(sys::ODESystem;
3030 # 1) process dummy derivatives and u0map into initialization system
3131 eqs_ics = eqs[idxs_alge] # start equation list with algebraic equations
3232 defs = copy (defaults (sys)) # copy so we don't modify sys.defaults
33- guesses = merge (get_guesses (sys), todict (guesses))
33+ additional_guesses = anydict (guesses)
34+ guesses = merge (get_guesses (sys), additional_guesses)
3435 schedule = getfield (sys, :schedule )
3536 if ! isnothing (schedule)
3637 for x in filter (x -> ! isnothing (x[1 ]), schedule. dummy_sub)
@@ -178,7 +179,7 @@ function generate_initializesystem(sys::ODESystem;
178179 for k in keys (defs)
179180 defs[k] = substitute (defs[k], paramsubs)
180181 end
181- meta = InitializationSystemMetadata (Dict {Any, Any} (u0map), Dict {Any, Any} (pmap))
182+ meta = InitializationSystemMetadata (anydict (u0map), anydict (pmap), additional_guesses )
182183 return NonlinearSystem (eqs_ics,
183184 vars,
184185 pars;
193194struct InitializationSystemMetadata
194195 u0map:: Dict{Any, Any}
195196 pmap:: Dict{Any, Any}
197+ additional_guesses:: Dict{Any, Any}
196198end
197199
198200function is_parameter_solvable (p, pmap, defs, guesses)
@@ -208,17 +210,16 @@ function is_parameter_solvable(p, pmap, defs, guesses)
208210 _val1 === nothing && _val2 != = nothing )) && _val3 != = nothing
209211end
210212
211- function SciMLBase. remake_initializeprob (sys:: ODESystem , odefn, u0, t0, p)
213+ function SciMLBase. remake_initialization_data (sys:: ODESystem , odefn, u0, t0, p, newu0, newp )
212214 if u0 === missing && p === missing
213- return odefn. initializeprob, odefn. update_initializeprob!, odefn. initializeprobmap,
214- odefn. initializeprobpmap
215+ return odefn. initialization_data
215216 end
216217 if ! (eltype (u0) <: Pair ) && ! (eltype (p) <: Pair )
217218 oldinitprob = odefn. initializeprob
218- if oldinitprob === nothing || ! SciMLBase . has_sys (oldinitprob . f) ||
219- ! (oldinitprob. f. sys isa NonlinearSystem)
220- return oldinitprob, odefn. update_initializeprob!, odefn . initializeprobmap ,
221- odefn. initializeprobpmap
219+ oldinitprob === nothing && return nothing
220+ if ! SciMLBase . has_sys (oldinitprob . f) || ! (oldinitprob. f. sys isa NonlinearSystem)
221+ return SciMLBase . OverrideInitData ( oldinitprob, odefn. update_initializeprob!,
222+ odefn. initializeprobmap, odefn . initializeprobpmap)
222223 end
223224 pidxs = ParameterIndex[]
224225 pvals = []
@@ -260,78 +261,69 @@ function SciMLBase.remake_initializeprob(sys::ODESystem, odefn, u0, t0, p)
260261 oldinitprob. f. sys, parameter_values (oldinitprob), pidxs, pvals)
261262 end
262263 initprob = remake (oldinitprob; u0 = newu0, p = newp)
263- return initprob, odefn. update_initializeprob!, odefn . initializeprobmap ,
264- odefn. initializeprobpmap
264+ return SciMLBase . OverrideInitData ( initprob, odefn. update_initializeprob!,
265+ odefn. initializeprobmap, odefn . initializeprobpmap)
265266 end
266- if u0 === missing || isempty (u0)
267- u0 = Dict ()
268- elseif ! (eltype (u0) <: Pair )
269- u0 = Dict (unknowns (sys) .=> u0)
270- end
271- if p === missing
272- p = Dict ()
273- end
274- if t0 === nothing
275- t0 = 0.0
276- end
277- u0 = todict (u0)
267+ dvs = unknowns (sys)
268+ ps = parameters (sys)
269+ u0map = to_varmap (u0, dvs)
270+ symbols_to_symbolics! (sys, u0map)
271+ pmap = to_varmap (p, ps)
272+ symbols_to_symbolics! (sys, pmap)
273+ guesses = Dict ()
278274 defs = defaults (sys)
279- varmap = merge (defs, u0)
280- for k in collect (keys (varmap))
281- if varmap[k] === nothing
282- delete! (varmap, k)
275+ if SciMLBase. has_initializeprob (odefn)
276+ oldsys = odefn. initializeprob. f. sys
277+ meta = get_metadata (oldsys)
278+ if meta isa InitializationSystemMetadata
279+ u0map = merge (meta. u0map, u0map)
280+ pmap = merge (meta. pmap, pmap)
281+ merge! (guesses, meta. additional_guesses)
283282 end
284- end
285- varmap = canonicalize_varmap (varmap)
286- missingvars = setdiff (unknowns (sys), collect (keys (varmap)))
287- setobserved = filter (keys (varmap)) do var
288- has_observed_with_lhs (sys, var) || has_observed_with_lhs (sys, default_toterm (var))
289- end
290- p = todict (p)
291- guesses = ModelingToolkit. guesses (sys)
292- solvablepars = [par
293- for par in parameters (sys)
294- if is_parameter_solvable (par, p, defs, guesses)]
295- pvarmap = merge (defs, p)
296- setparobserved = filter (keys (pvarmap)) do var
297- has_parameter_dependency_with_lhs (sys, var)
298- end
299- if (((! isempty (missingvars) || ! isempty (solvablepars) ||
300- ! isempty (setobserved) || ! isempty (setparobserved)) &&
301- ModelingToolkit. get_tearing_state (sys) != = nothing ) ||
302- ! isempty (initialization_equations (sys)))
303- if SciMLBase. has_initializeprob (odefn)
304- oldsys = odefn. initializeprob. f. sys
305- meta = get_metadata (oldsys)
306- if meta isa InitializationSystemMetadata
307- u0 = merge (meta. u0map, u0)
308- p = merge (meta. pmap, p)
283+ else
284+ # there is no initializeprob, so the original problem construction
285+ # had no solvable parameters and had the differential variables
286+ # specified in `u0map`.
287+ if u0 === missing
288+ # the user didn't pass `u0` to `remake`, so they want to retain
289+ # existing values. Fill the differential variables in `u0map`,
290+ # initialization will either be elided or solve for the algebraic
291+ # variables
292+ diff_idxs = isdiffeq .(equations (sys))
293+ for i in eachindex (dvs)
294+ diff_idxs[i] || continue
295+ u0map[dvs[i]] = newu0[i]
309296 end
310297 end
311- for k in collect (keys (u0))
312- if u0[k] === nothing
313- delete! (u0, k)
298+ if p === missing
299+ # the user didn't pass `p` to `remake`, so they want to retain
300+ # existing values. Fill all parameters in `pmap` so that none of
301+ # them are solvable.
302+ for p in ps
303+ pmap[p] = getp (sys, p)(newp)
314304 end
315305 end
316- for k in collect (keys (p))
317- if p[k] === nothing
318- delete! (p, k)
319- end
306+ # all non-solvable parameters need values regardless
307+ for p in ps
308+ haskey (pmap, p) && continue
309+ is_parameter_solvable (p, pmap, defs, guesses) && continue
310+ pmap[p] = getp (sys, p)(newp)
320311 end
321-
322- initprob = InitializationProblem (sys, t0, u0, p)
323- initprobmap = getu (initprob, unknowns (sys))
324- punknowns = [p for p in all_variable_symbols (initprob) if is_parameter (sys, p)]
325- getpunknowns = getu (initprob, punknowns)
326- setpunknowns = setp (sys, punknowns)
327- initprobpmap = GetUpdatedMTKParameters (getpunknowns, setpunknowns)
328- reqd_syms = parameter_symbols (initprob)
329- update_initializeprob! = UpdateInitializeprob (
330- getu (sys, reqd_syms), setu (initprob, reqd_syms))
331- return initprob, update_initializeprob!, initprobmap, initprobpmap
332- else
333- return nothing , nothing , nothing , nothing
334312 end
313+ if t0 === nothing
314+ t0 = 0.0
315+ end
316+ filter_missing_values! (u0map)
317+ filter_missing_values! (pmap)
318+ f, _ = process_SciMLProblem (EmptySciMLFunction, sys, u0map, pmap; guesses, t = t0)
319+ kws = f. kwargs
320+ initprob = get (kws, :initializeprob , nothing )
321+ if initprob === nothing
322+ return nothing
323+ end
324+ return SciMLBase. OverrideInitData (initprob, get (kws, :update_initializeprob! , nothing ),
325+ get (kws, :initializeprobmap , nothing ),
326+ get (kws, :initializeprobpmap , nothing ))
335327end
336328
337329"""
0 commit comments