@@ -173,20 +173,20 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
173173 end
174174
175175 # 5) process parameters as initialization unknowns
176- paramsubs = setup_parameter_initialization! (
176+ solved_params = setup_parameter_initialization! (
177177 sys, pmap, defs, guesses, eqs_ics; check_defguess)
178178
179179 # 6) parameter dependencies become equations, their LHS become unknowns
180180 # non-numeric dependent parameters stay as parameter dependencies
181181 new_parameter_deps = solve_parameter_dependencies! (
182- sys, paramsubs , eqs_ics, defs, guesses)
182+ sys, solved_params , eqs_ics, defs, guesses)
183183
184184 # 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)
186186
187187 # parameters do not include ones that became initialization unknowns
188188 pars = Vector {SymbolicParam} (filter (
189- p -> ! haskey (paramsubs, p ), parameters (sys; initial_parameters = true )))
189+ ! in (solved_params ), parameters (sys; initial_parameters = true )))
190190 push! (pars, get_iv (sys))
191191
192192 # 8) use observed equations for guesses of observed variables if not provided
@@ -198,16 +198,8 @@ function generate_initializesystem_timevarying(sys::AbstractSystem;
198198 end
199199 append! (eqs_ics, trueobs)
200200
201- vars = [vars; collect (values (paramsubs) )]
201+ vars = [vars; collect (solved_params )]
202202
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
211203 initials = Dict (k => v for (k, v) in pmap if isinitial (k))
212204 merge! (defs, initials)
213205 isys = System (Vector {Equation} (eqs_ics),
@@ -299,30 +291,22 @@ function generate_initializesystem_timeindependent(sys::AbstractSystem;
299291 append! (eqs_ics, initialization_eqs)
300292
301293 # process parameters as initialization unknowns
302- paramsubs = setup_parameter_initialization! (
294+ solved_params = setup_parameter_initialization! (
303295 sys, pmap, defs, guesses, eqs_ics; check_defguess)
304296
305297 # parameter dependencies become equations, their LHS become unknowns
306298 # non-numeric dependent parameters stay as parameter dependencies
307299 new_parameter_deps = solve_parameter_dependencies! (
308- sys, paramsubs , eqs_ics, defs, guesses)
300+ sys, solved_params , eqs_ics, defs, guesses)
309301
310302 # 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)
312304
313305 # parameters do not include ones that became initialization unknowns
314306 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)
321309
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
326310 initials = Dict (k => v for (k, v) in pmap if isinitial (k))
327311 merge! (defs, initials)
328312 isys = System (Vector {Equation} (eqs_ics),
@@ -359,7 +343,7 @@ mapping solvable parameters to their `tovar` variants.
359343function setup_parameter_initialization! (
360344 sys:: AbstractSystem , pmap:: AbstractDict , defs:: AbstractDict ,
361345 guesses:: AbstractDict , eqs_ics:: Vector{Equation} ; check_defguess = false )
362- paramsubs = Dict ()
346+ solved_params = Set ()
363347 for p in parameters (sys)
364348 if is_parameter_solvable (p, pmap, defs, guesses)
365349 # If either of them are `missing` the parameter is an unknown
@@ -369,7 +353,7 @@ function setup_parameter_initialization!(
369353 _val2 = get_possibly_array_fallback_singletons (defs, p)
370354 _val3 = get_possibly_array_fallback_singletons (guesses, p)
371355 varp = tovar (p)
372- paramsubs[p] = varp
356+ push! (solved_params, p)
373357 # Has a default of `missing`, and (either an equation using the value passed to `ODEProblem` or a guess)
374358 if _val2 === missing
375359 if _val1 != = nothing && _val1 != = missing
@@ -409,7 +393,7 @@ function setup_parameter_initialization!(
409393 end
410394 end
411395
412- return paramsubs
396+ return solved_params
413397end
414398
415399"""
418402Add appropriate parameter dependencies as initialization equations. Return the new list of
419403parameter dependencies for the initialization system.
420404"""
421- function solve_parameter_dependencies! (sys:: AbstractSystem , paramsubs :: AbstractDict ,
405+ function solve_parameter_dependencies! (sys:: AbstractSystem , solved_params :: AbstractSet ,
422406 eqs_ics:: Vector{Equation} , defs:: AbstractDict , guesses:: AbstractDict )
423407 new_parameter_deps = Equation[]
424408 for eq in parameter_dependencies (sys)
@@ -427,7 +411,7 @@ function solve_parameter_dependencies!(sys::AbstractSystem, paramsubs::AbstractD
427411 continue
428412 end
429413 varp = tovar (eq. lhs)
430- paramsubs[ eq. lhs] = varp
414+ push! (solved_params, eq. lhs)
431415 push! (eqs_ics, eq)
432416 guessval = get (guesses, eq. lhs, eq. rhs)
433417 push! (defs, varp => guessval)
@@ -442,10 +426,10 @@ end
442426Turn values provided for parameter dependencies into initialization equations.
443427"""
444428function handle_dependent_parameter_constraints! (sys:: AbstractSystem , pmap:: AbstractDict ,
445- eqs_ics:: Vector{Equation} , paramsubs :: AbstractDict )
429+ eqs_ics:: Vector{Equation} )
446430 for (k, v) in merge (defaults (sys), pmap)
447431 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)
449433 end
450434 end
451435
@@ -735,7 +719,25 @@ function SciMLBase.late_binding_update_u0_p(
735719 newu0, newp = promote_u0_p (newu0, newp, t0)
736720
737721 # 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
739741 # if `p` is not provided or is symbolic
740742 p === missing || eltype (p) <: Pair || return newu0, newp
741743 (newu0 === nothing || isempty (newu0)) && return newu0, newp
@@ -748,27 +750,27 @@ function SciMLBase.late_binding_update_u0_p(
748750 throw (ArgumentError (" Expected `newu0` to be of same length as unknowns ($(length (prob. u0)) ). Got $(typeof (newu0)) of length $(length (newu0)) " ))
749751 end
750752 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)
765770 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)
769772 end
770773
771- newp = setp_oop (sys, syms)(newp, vals)
772774 return newu0, newp
773775end
774776
0 commit comments