@@ -173,20 +173,20 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
173
173
end
174
174
175
175
# 5) process parameters as initialization unknowns
176
- paramsubs = setup_parameter_initialization! (
176
+ solved_params = setup_parameter_initialization! (
177
177
sys, pmap, defs, guesses, eqs_ics; check_defguess)
178
178
179
179
# 6) parameter dependencies become equations, their LHS become unknowns
180
180
# non-numeric dependent parameters stay as parameter dependencies
181
181
new_parameter_deps = solve_parameter_dependencies! (
182
- sys, paramsubs , eqs_ics, defs, guesses)
182
+ sys, solved_params , eqs_ics, defs, guesses)
183
183
184
184
# 7) handle values provided for dependent parameters similar to values for observed variables
185
- handle_dependent_parameter_constraints! (sys, pmap, eqs_ics, paramsubs )
185
+ handle_dependent_parameter_constraints! (sys, pmap, eqs_ics)
186
186
187
187
# parameters do not include ones that became initialization unknowns
188
188
pars = Vector {SymbolicParam} (filter (
189
- p -> ! haskey (paramsubs, p ), parameters (sys; initial_parameters = true )))
189
+ ! in (solved_params ), parameters (sys; initial_parameters = true )))
190
190
push! (pars, get_iv (sys))
191
191
192
192
# 8) use observed equations for guesses of observed variables if not provided
@@ -198,16 +198,8 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
198
198
end
199
199
append! (eqs_ics, trueobs)
200
200
201
- vars = [vars; collect (values (paramsubs) )]
201
+ vars = [vars; collect (solved_params )]
202
202
203
- # even if `p => tovar(p)` is in `paramsubs`, `isparameter(p[1]) === true` after substitution
204
- # so add scalarized versions as well
205
- scalarize_varmap! (paramsubs)
206
-
207
- eqs_ics = Symbolics. substitute .(eqs_ics, (paramsubs,))
208
- for k in keys (defs)
209
- defs[k] = substitute (defs[k], paramsubs)
210
- end
211
203
initials = Dict (k => v for (k, v) in pmap if isinitial (k))
212
204
merge! (defs, initials)
213
205
isys = System (Vector {Equation} (eqs_ics),
@@ -299,30 +291,22 @@ function generate_initializesystem_timeindependent(sys::AbstractSystem;
299
291
append! (eqs_ics, initialization_eqs)
300
292
301
293
# process parameters as initialization unknowns
302
- paramsubs = setup_parameter_initialization! (
294
+ solved_params = setup_parameter_initialization! (
303
295
sys, pmap, defs, guesses, eqs_ics; check_defguess)
304
296
305
297
# parameter dependencies become equations, their LHS become unknowns
306
298
# non-numeric dependent parameters stay as parameter dependencies
307
299
new_parameter_deps = solve_parameter_dependencies! (
308
- sys, paramsubs , eqs_ics, defs, guesses)
300
+ sys, solved_params , eqs_ics, defs, guesses)
309
301
310
302
# handle values provided for dependent parameters similar to values for observed variables
311
- handle_dependent_parameter_constraints! (sys, pmap, eqs_ics, paramsubs )
303
+ handle_dependent_parameter_constraints! (sys, pmap, eqs_ics)
312
304
313
305
# parameters do not include ones that became initialization unknowns
314
306
pars = Vector {SymbolicParam} (filter (
315
- p -> ! haskey (paramsubs, p ), parameters (sys; initial_parameters = true )))
316
- vars = collect (values (paramsubs) )
307
+ ! in (solved_params ), parameters (sys; initial_parameters = true )))
308
+ vars = collect (solved_params )
317
309
318
- # even if `p => tovar(p)` is in `paramsubs`, `isparameter(p[1]) === true` after substitution
319
- # so add scalarized versions as well
320
- scalarize_varmap! (paramsubs)
321
-
322
- eqs_ics = Vector {Equation} (Symbolics. substitute .(eqs_ics, (paramsubs,)))
323
- for k in keys (defs)
324
- defs[k] = substitute (defs[k], paramsubs)
325
- end
326
310
initials = Dict (k => v for (k, v) in pmap if isinitial (k))
327
311
merge! (defs, initials)
328
312
isys = System (Vector {Equation} (eqs_ics),
@@ -359,7 +343,7 @@ mapping solvable parameters to their `tovar` variants.
359
343
function setup_parameter_initialization! (
360
344
sys:: AbstractSystem , pmap:: AbstractDict , defs:: AbstractDict ,
361
345
guesses:: AbstractDict , eqs_ics:: Vector{Equation} ; check_defguess = false )
362
- paramsubs = Dict ()
346
+ solved_params = Set ()
363
347
for p in parameters (sys)
364
348
if is_parameter_solvable (p, pmap, defs, guesses)
365
349
# If either of them are `missing` the parameter is an unknown
@@ -369,7 +353,7 @@ function setup_parameter_initialization!(
369
353
_val2 = get_possibly_array_fallback_singletons (defs, p)
370
354
_val3 = get_possibly_array_fallback_singletons (guesses, p)
371
355
varp = tovar (p)
372
- paramsubs[p] = varp
356
+ push! (solved_params, p)
373
357
# Has a default of `missing`, and (either an equation using the value passed to `ODEProblem` or a guess)
374
358
if _val2 === missing
375
359
if _val1 != = nothing && _val1 != = missing
@@ -409,7 +393,7 @@ function setup_parameter_initialization!(
409
393
end
410
394
end
411
395
412
- return paramsubs
396
+ return solved_params
413
397
end
414
398
415
399
"""
418
402
Add appropriate parameter dependencies as initialization equations. Return the new list of
419
403
parameter dependencies for the initialization system.
420
404
"""
421
- function solve_parameter_dependencies! (sys:: AbstractSystem , paramsubs :: AbstractDict ,
405
+ function solve_parameter_dependencies! (sys:: AbstractSystem , solved_params :: AbstractSet ,
422
406
eqs_ics:: Vector{Equation} , defs:: AbstractDict , guesses:: AbstractDict )
423
407
new_parameter_deps = Equation[]
424
408
for eq in parameter_dependencies (sys)
@@ -427,7 +411,7 @@ function solve_parameter_dependencies!(sys::AbstractSystem, paramsubs::AbstractD
427
411
continue
428
412
end
429
413
varp = tovar (eq. lhs)
430
- paramsubs[ eq. lhs] = varp
414
+ push! (solved_params, eq. lhs)
431
415
push! (eqs_ics, eq)
432
416
guessval = get (guesses, eq. lhs, eq. rhs)
433
417
push! (defs, varp => guessval)
@@ -442,10 +426,10 @@ end
442
426
Turn values provided for parameter dependencies into initialization equations.
443
427
"""
444
428
function handle_dependent_parameter_constraints! (sys:: AbstractSystem , pmap:: AbstractDict ,
445
- eqs_ics:: Vector{Equation} , paramsubs :: AbstractDict )
429
+ eqs_ics:: Vector{Equation} )
446
430
for (k, v) in merge (defaults (sys), pmap)
447
431
if is_variable_floatingpoint (k) && has_parameter_dependency_with_lhs (sys, k)
448
- push! (eqs_ics, paramsubs[k] ~ v)
432
+ push! (eqs_ics, k ~ v)
449
433
end
450
434
end
451
435
0 commit comments