Skip to content

Commit 74ef64f

Browse files
Merge pull request #2654 from AayushSabharwal/as/fix-hierarchical-guesses
fix: fix guesses in hierarchical system, getguess for array variables
2 parents fbf437d + 225810c commit 74ef64f

File tree

5 files changed

+38
-4
lines changed

5 files changed

+38
-4
lines changed

src/systems/abstractsystem.jl

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,11 @@ function namespace_defaults(sys)
859859
for (k, v) in pairs(defs))
860860
end
861861

862+
function namespace_guesses(sys)
863+
guess = guesses(sys)
864+
Dict(unknowns(sys, k) => namespace_expr(v, sys) for (k, v) in guess)
865+
end
866+
862867
function namespace_equations(sys::AbstractSystem, ivs = independent_variables(sys))
863868
eqs = equations(sys)
864869
isempty(eqs) && return Equation[]
@@ -968,7 +973,13 @@ function full_parameters(sys::AbstractSystem)
968973
end
969974

970975
function guesses(sys::AbstractSystem)
971-
get_guesses(sys)
976+
guess = get_guesses(sys)
977+
systems = get_systems(sys)
978+
isempty(systems) && return guess
979+
for subsys in systems
980+
guess = merge(guess, namespace_guesses(subsys))
981+
end
982+
return guess
972983
end
973984

974985
# required in `src/connectors.jl:437`

src/systems/diffeqs/odesystem.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ function flatten(sys::ODESystem, noeqs = false)
354354
get_iv(sys),
355355
unknowns(sys),
356356
parameters(sys),
357+
guesses = guesses(sys),
357358
observed = observed(sys),
358359
continuous_events = continuous_events(sys),
359360
discrete_events = discrete_events(sys),

src/variables.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ end
456456
## Guess ======================================================================
457457
struct VariableGuess end
458458
Symbolics.option_to_metadata_type(::Val{:guess}) = VariableGuess
459-
getguess(x::Num) = getguess(Symbolics.unwrap(x))
459+
getguess(x::Union{Num, Symbolics.Arr}) = getguess(Symbolics.unwrap(x))
460460

461461
"""
462462
getguess(x)
@@ -469,8 +469,6 @@ Create variables with a guess like this
469469
```
470470
"""
471471
function getguess(x)
472-
p = Symbolics.getparent(x, nothing)
473-
p === nothing || (x = p)
474472
Symbolics.getmetadata(x, VariableGuess, nothing)
475473
end
476474

test/odesystem.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,18 @@ ts_vars = tearing_state.fullvars
11211121
orig_vars = unknowns(sys)
11221122
@test isempty(setdiff(ts_vars, orig_vars))
11231123

1124+
# Guesses in hierarchical systems
1125+
@variables x(t) y(t)
1126+
@named sys = ODESystem(Equation[], t, [x], []; guesses = [x => 1.0])
1127+
@named outer = ODESystem(
1128+
[D(y) ~ sys.x + t, 0 ~ t + y - sys.x * y], t, [y], []; systems = [sys])
1129+
@test ModelingToolkit.guesses(outer)[sys.x] == 1.0
1130+
outer = structural_simplify(outer)
1131+
@test ModelingToolkit.get_guesses(outer)[sys.x] == 1.0
1132+
prob = ODEProblem(outer, [outer.y => 2.0], (0.0, 10.0))
1133+
int = init(prob, Rodas4())
1134+
@test int[outer.sys.x] == 1.0
1135+
11241136
# Ensure indexes of array symbolics are cached appropriately
11251137
@variables x(t)[1:2]
11261138
@named sys = ODESystem(Equation[], t, [x], [])

test/test_variable_metadata.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ using ModelingToolkit
1616
@test hasguess(y) === true
1717
@test ModelingToolkit.dump_variable_metadata(y).guess == 0
1818

19+
# Issue#2653
20+
@variables y[1:3] [guess = ones(3)]
21+
@test getguess(y) == ones(3)
22+
@test hasguess(y) === true
23+
@test ModelingToolkit.dump_variable_metadata(y).guess == ones(3)
24+
25+
for i in 1:3
26+
@test getguess(y[i]) == 1.0
27+
@test hasguess(y[i]) === true
28+
@test ModelingToolkit.dump_variable_metadata(y[i]).guess == 1.0
29+
end
30+
1931
@variables y
2032
@test hasguess(y) === false
2133
@test !haskey(ModelingToolkit.dump_variable_metadata(y), :guess)

0 commit comments

Comments
 (0)