Skip to content

Commit 0948934

Browse files
refactor: do not build and use paramsubs in generate_initializesystem
Simplification doesn't care for metadata, so this is unnecessary and expensive.
1 parent 02ae459 commit 0948934

File tree

1 file changed

+17
-33
lines changed

1 file changed

+17
-33
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
359343
function 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
413397
end
414398

415399
"""
@@ -418,7 +402,7 @@ end
418402
Add appropriate parameter dependencies as initialization equations. Return the new list of
419403
parameter 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
442426
Turn values provided for parameter dependencies into initialization equations.
443427
"""
444428
function 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

Comments
 (0)