@@ -676,23 +676,27 @@ function SymbolicUtils.maketerm(::Type{<:BasicSymbolic}, ::Initial, args, meta)
676
676
return metadata (val, meta)
677
677
end
678
678
679
+ supports_initialization (sys:: AbstractSystem ) = true
680
+
679
681
function add_initialization_parameters (sys:: AbstractSystem )
680
682
@assert ! has_systems (sys) || isempty (get_systems (sys))
683
+ supports_initialization (sys) || return sys
684
+ is_initializesystem (sys) && return sys
685
+
681
686
all_initialvars = Set {BasicSymbolic} ()
682
687
# 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)
696
700
end
697
701
end
698
702
for eq in parameter_dependencies (sys)
@@ -722,15 +726,8 @@ Returns true if the parameter `p` is of the form `Initial(x)`.
722
726
"""
723
727
function isinitial (p)
724
728
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 ]))
734
731
end
735
732
736
733
"""
@@ -744,7 +741,8 @@ the global structure of the system.
744
741
One property to note is that if a system is complete, the system will no longer
745
742
namespace its subsystems or variables, i.e. `isequal(complete(sys).v.i, v.i)`.
746
743
"""
747
- function complete (sys:: AbstractSystem ; split = true , flatten = true )
744
+ function complete (
745
+ sys:: AbstractSystem ; split = true , flatten = true , add_initial_parameters = true )
748
746
newunknowns = OrderedSet ()
749
747
newparams = OrderedSet ()
750
748
iv = has_iv (sys) ? get_iv (sys) : nothing
@@ -765,7 +763,9 @@ function complete(sys::AbstractSystem; split = true, flatten = true)
765
763
@set! newsys. parent = complete (sys; split = false , flatten = false )
766
764
end
767
765
sys = newsys
768
- sys = add_initialization_parameters (sys)
766
+ if add_initial_parameters
767
+ sys = add_initialization_parameters (sys)
768
+ end
769
769
end
770
770
if split && has_index_cache (sys)
771
771
@set! sys. index_cache = IndexCache (sys)
@@ -1345,20 +1345,8 @@ function parameters(sys::AbstractSystem; initial_parameters = false)
1345
1345
systems = get_systems (sys)
1346
1346
result = unique (isempty (systems) ? ps :
1347
1347
[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)
1362
1350
end
1363
1351
return result
1364
1352
end
0 commit comments