@@ -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)
@@ -208,17 +210,16 @@ function is_parameter_solvable(p, pmap, defs, guesses)
208
210
_val1 === nothing && _val2 != = nothing )) && _val3 != = nothing
209
211
end
210
212
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 )
212
214
if u0 === missing && p === missing
213
- return odefn. initializeprob, odefn. update_initializeprob!, odefn. initializeprobmap,
214
- odefn. initializeprobpmap
215
+ return odefn. initialization_data
215
216
end
216
217
if ! (eltype (u0) <: Pair ) && ! (eltype (p) <: Pair )
217
218
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)
222
223
end
223
224
pidxs = ParameterIndex[]
224
225
pvals = []
@@ -260,78 +261,69 @@ function SciMLBase.remake_initializeprob(sys::ODESystem, odefn, u0, t0, p)
260
261
oldinitprob. f. sys, parameter_values (oldinitprob), pidxs, pvals)
261
262
end
262
263
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)
265
266
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 ()
278
274
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)
283
282
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]
309
296
end
310
297
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)
314
304
end
315
305
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)
320
311
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
312
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 ))
335
327
end
336
328
337
329
"""
0 commit comments