@@ -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) )
307+ ! in (solved_params ), parameters (sys; initial_parameters = true )))
308+ vars = collect (solved_params )
317309
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
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
0 commit comments