@@ -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