@@ -676,23 +676,27 @@ function SymbolicUtils.maketerm(::Type{<:BasicSymbolic}, ::Initial, args, meta)
676676 return metadata (val, meta)
677677end
678678
679+ supports_initialization (sys:: AbstractSystem ) = true
680+
679681function add_initialization_parameters (sys:: AbstractSystem )
680682 @assert ! has_systems (sys) || isempty (get_systems (sys))
683+ supports_initialization (sys) || return sys
684+ is_initializesystem (sys) && return sys
685+
681686 all_initialvars = Set {BasicSymbolic} ()
682687 # time-independent systems don't initialize unknowns
683- if is_time_dependent (sys)
684- eqs = equations (sys)
685- if ! (eqs isa Vector{Equation})
686- eqs = Equation[x for x in eqs if x isa Equation]
687- end
688- obs, eqs = unhack_observed (observed (sys), eqs)
689- for x in Iterators. flatten ((unknowns (sys), Iterators. map (eq -> eq. lhs, obs)))
690- x = unwrap (x)
691- if iscall (x) && operation (x) == getindex
692- push! (all_initialvars, arguments (x)[1 ])
693- else
694- push! (all_initialvars, x)
695- end
688+ # but may initialize parameters using guesses for unknowns
689+ eqs = equations (sys)
690+ if ! (eqs isa Vector{Equation})
691+ eqs = Equation[x for x in eqs if x isa Equation]
692+ end
693+ obs, eqs = unhack_observed (observed (sys), eqs)
694+ for x in Iterators. flatten ((unknowns (sys), Iterators. map (eq -> eq. lhs, obs)))
695+ x = unwrap (x)
696+ if iscall (x) && operation (x) == getindex
697+ push! (all_initialvars, arguments (x)[1 ])
698+ else
699+ push! (all_initialvars, x)
696700 end
697701 end
698702 for eq in parameter_dependencies (sys)
@@ -722,15 +726,8 @@ Returns true if the parameter `p` is of the form `Initial(x)`.
722726"""
723727function isinitial (p)
724728 p = unwrap (p)
725- if iscall (p)
726- operation (p) isa Initial && return true
727- if operation (p) === getindex
728- operation (arguments (p)[1 ]) isa Initial && return true
729- end
730- else
731- return false
732- end
733- return false
729+ return iscall (p) && (operation (p) isa Initial ||
730+ operation (p) === getindex && isinitial (arguments (p)[1 ]))
734731end
735732
736733"""
@@ -744,7 +741,8 @@ the global structure of the system.
744741One property to note is that if a system is complete, the system will no longer
745742namespace its subsystems or variables, i.e. `isequal(complete(sys).v.i, v.i)`.
746743"""
747- function complete (sys:: AbstractSystem ; split = true , flatten = true )
744+ function complete (
745+ sys:: AbstractSystem ; split = true , flatten = true , add_initial_parameters = true )
748746 newunknowns = OrderedSet ()
749747 newparams = OrderedSet ()
750748 iv = has_iv (sys) ? get_iv (sys) : nothing
@@ -765,7 +763,9 @@ function complete(sys::AbstractSystem; split = true, flatten = true)
765763 @set! newsys. parent = complete (sys; split = false , flatten = false )
766764 end
767765 sys = newsys
768- sys = add_initialization_parameters (sys)
766+ if add_initial_parameters
767+ sys = add_initialization_parameters (sys)
768+ end
769769 end
770770 if split && has_index_cache (sys)
771771 @set! sys. index_cache = IndexCache (sys)
@@ -1345,20 +1345,8 @@ function parameters(sys::AbstractSystem; initial_parameters = false)
13451345 systems = get_systems (sys)
13461346 result = unique (isempty (systems) ? ps :
13471347 [ps; reduce (vcat, namespace_parameters .(systems))])
1348- if ! initial_parameters
1349- if is_time_dependent (sys)
1350- # time-dependent systems have `Initial` parameters for all their
1351- # unknowns/pdeps, all of which should be hidden.
1352- filter! (x -> ! iscall (x) || ! isa (operation (x), Initial), result)
1353- else
1354- # time-independent systems only have `Initial` parameters for
1355- # pdeps. Any other `Initial` parameters should be kept (e.g. initialization
1356- # systems)
1357- filter! (
1358- x -> ! iscall (x) || ! isa (operation (x), Initial) ||
1359- ! has_parameter_dependency_with_lhs (sys, only (arguments (x))),
1360- result)
1361- end
1348+ if ! initial_parameters && ! is_initializesystem (sys)
1349+ filter! (x -> ! iscall (x) || ! isa (operation (x), Initial), result)
13621350 end
13631351 return result
13641352end
0 commit comments