@@ -30,7 +30,8 @@ function generate_initializesystem(sys::ODESystem;
30
30
# 1) process dummy derivatives and u0map into initialization system
31
31
eqs_ics = eqs[idxs_alge] # start equation list with algebraic equations
32
32
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)
34
35
schedule = getfield (sys, :schedule )
35
36
if ! isnothing (schedule)
36
37
for x in filter (x -> ! isnothing (x[1 ]), schedule. dummy_sub)
@@ -178,7 +179,7 @@ function generate_initializesystem(sys::ODESystem;
178
179
for k in keys (defs)
179
180
defs[k] = substitute (defs[k], paramsubs)
180
181
end
181
- meta = InitializationSystemMetadata (Dict {Any, Any} (u0map), Dict {Any, Any} (pmap))
182
+ meta = InitializationSystemMetadata (anydict (u0map), anydict (pmap), additional_guesses )
182
183
return NonlinearSystem (eqs_ics,
183
184
vars,
184
185
pars;
193
194
struct InitializationSystemMetadata
194
195
u0map:: Dict{Any, Any}
195
196
pmap:: Dict{Any, Any}
197
+ additional_guesses:: Dict{Any, Any}
196
198
end
197
199
198
200
function is_parameter_solvable (p, pmap, defs, guesses)
@@ -263,75 +265,29 @@ function SciMLBase.remake_initializeprob(sys::ODESystem, odefn, u0, t0, p)
263
265
return initprob, odefn. update_initializeprob!, odefn. initializeprobmap,
264
266
odefn. initializeprobpmap
265
267
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 ()
268
+ dvs = unknowns (sys)
269
+ ps = parameters (sys)
270
+ u0map = to_varmap (u0, dvs)
271
+ pmap = to_varmap (p, ps)
272
+ guesses = Dict ()
273
+ if SciMLBase. has_initializeprob (odefn)
274
+ oldsys = odefn. initializeprob. f. sys
275
+ meta = get_metadata (oldsys)
276
+ if meta isa InitializationSystemMetadata
277
+ u0map = merge (meta. u0map, u0map)
278
+ pmap = merge (meta. pmap, pmap)
279
+ merge! (guesses, meta. additional_guesses)
280
+ end
273
281
end
274
282
if t0 === nothing
275
283
t0 = 0.0
276
284
end
277
- u0 = todict (u0)
278
- defs = defaults (sys)
279
- varmap = merge (defs, u0)
280
- for k in collect (keys (varmap))
281
- if varmap[k] === nothing
282
- delete! (varmap, k)
283
- 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)
309
- end
310
- end
311
- for k in collect (keys (u0))
312
- if u0[k] === nothing
313
- delete! (u0, k)
314
- end
315
- end
316
- for k in collect (keys (p))
317
- if p[k] === nothing
318
- delete! (p, k)
319
- end
320
- 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
334
- end
285
+ filter_missing_values! (u0map)
286
+ filter_missing_values! (pmap)
287
+ f, _ = process_SciMLProblem (EmptySciMLFunction, sys, u0map, pmap; guesses, t = t0)
288
+ kws = f. kwargs
289
+ return get (kws, :initializeprob , nothing ), get (kws, :update_initializeprob! , nothing ), get (kws, :initializeprobmap , nothing ),
290
+ get (kws, :initializeprobpmap , nothing )
335
291
end
336
292
337
293
"""
0 commit comments