@@ -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))
317
-
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)
307
+ ! in (solved_params), parameters (sys; initial_parameters = true )))
308
+ vars = collect (solved_params)
321
309
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
@@ -735,7 +719,25 @@ function SciMLBase.late_binding_update_u0_p(
735
719
newu0, newp = promote_u0_p (newu0, newp, t0)
736
720
737
721
# non-symbolic u0 updates initials...
738
- if ! (eltype (u0) <: Pair )
722
+ if eltype (u0) <: Pair
723
+ syms = []
724
+ vals = []
725
+ allsyms = all_symbols (sys)
726
+ for (k, v) in u0
727
+ v === nothing && continue
728
+ (symbolic_type (v) == NotSymbolic () && ! is_array_of_symbolics (v)) || continue
729
+ if k isa Symbol
730
+ k2 = symbol_to_symbolic (sys, k; allsyms)
731
+ # if it is returned as-is, there is no match so skip it
732
+ k2 === k && continue
733
+ k = k2
734
+ end
735
+ is_parameter (sys, Initial (k)) || continue
736
+ push! (syms, Initial (k))
737
+ push! (vals, v)
738
+ end
739
+ newp = setp_oop (sys, syms)(newp, vals)
740
+ else
739
741
# if `p` is not provided or is symbolic
740
742
p === missing || eltype (p) <: Pair || return newu0, newp
741
743
(newu0 === nothing || isempty (newu0)) && return newu0, newp
@@ -748,27 +750,27 @@ function SciMLBase.late_binding_update_u0_p(
748
750
throw (ArgumentError (" Expected `newu0` to be of same length as unknowns ($(length (prob. u0)) ). Got $(typeof (newu0)) of length $(length (newu0)) " ))
749
751
end
750
752
newp = meta. set_initial_unknowns! (newp, newu0)
751
- return newu0, newp
752
- end
753
-
754
- syms = []
755
- vals = []
756
- allsyms = all_symbols (sys)
757
- for (k, v) in u0
758
- v === nothing && continue
759
- (symbolic_type (v) == NotSymbolic () && ! is_array_of_symbolics (v)) || continue
760
- if k isa Symbol
761
- k2 = symbol_to_symbolic (sys, k; allsyms)
762
- # if it is returned as-is, there is no match so skip it
763
- k2 === k && continue
764
- k = k2
753
+ end
754
+
755
+ if eltype (p) <: Pair
756
+ syms = []
757
+ vals = []
758
+ for (k, v) in p
759
+ v === nothing && continue
760
+ (symbolic_type (v) == NotSymbolic () && ! is_array_of_symbolics (v)) || continue
761
+ if k isa Symbol
762
+ k2 = symbol_to_symbolic (sys, k; allsyms)
763
+ # if it is returned as-is, there is no match so skip it
764
+ k2 === k && continue
765
+ k = k2
766
+ end
767
+ is_parameter (sys, Initial (k)) || continue
768
+ push! (syms, Initial (k))
769
+ push! (vals, v)
765
770
end
766
- is_parameter (sys, Initial (k)) || continue
767
- push! (syms, Initial (k))
768
- push! (vals, v)
771
+ newp = setp_oop (sys, syms)(newp, vals)
769
772
end
770
773
771
- newp = setp_oop (sys, syms)(newp, vals)
772
774
return newu0, newp
773
775
end
774
776
0 commit comments