Skip to content

Commit 16ac26f

Browse files
feat: add Initial parameters for unknowns to all non-initialization systems
1 parent 41ce7f5 commit 16ac26f

File tree

1 file changed

+18
-36
lines changed

1 file changed

+18
-36
lines changed

src/systems/abstractsystem.jl

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -678,21 +678,22 @@ end
678678

679679
function add_initialization_parameters(sys::AbstractSystem)
680680
@assert !has_systems(sys) || isempty(get_systems(sys))
681+
is_initializesystem(sys) && return sys
682+
681683
all_initialvars = Set{BasicSymbolic}()
682684
# 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
685+
# but may initialize parameters using guesses for unknowns
686+
eqs = equations(sys)
687+
if !(eqs isa Vector{Equation})
688+
eqs = Equation[x for x in eqs if x isa Equation]
689+
end
690+
obs, eqs = unhack_observed(observed(sys), eqs)
691+
for x in Iterators.flatten((unknowns(sys), Iterators.map(eq -> eq.lhs, obs)))
692+
x = unwrap(x)
693+
if iscall(x) && operation(x) == getindex
694+
push!(all_initialvars, arguments(x)[1])
695+
else
696+
push!(all_initialvars, x)
696697
end
697698
end
698699
for eq in parameter_dependencies(sys)
@@ -722,15 +723,8 @@ Returns true if the parameter `p` is of the form `Initial(x)`.
722723
"""
723724
function isinitial(p)
724725
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
726+
return iscall(p) && (operation(p) isa Initial ||
727+
operation(p) === getindex && isinitial(arguments(p)[1]))
734728
end
735729

736730
"""
@@ -1345,20 +1339,8 @@ function parameters(sys::AbstractSystem; initial_parameters = false)
13451339
systems = get_systems(sys)
13461340
result = unique(isempty(systems) ? ps :
13471341
[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
1342+
if !initial_parameters && !is_initializesystem(sys)
1343+
filter!(x -> !iscall(x) || !isa(operation(x), Initial), result)
13621344
end
13631345
return result
13641346
end

0 commit comments

Comments
 (0)