Skip to content

Commit a9f4251

Browse files
fix: fix propagation of guesses in hierarchical systems
1 parent 709148e commit a9f4251

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
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),

test/odesystem.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,3 +1120,15 @@ tearing_state = TearingState(expand_connections(sys))
11201120
ts_vars = tearing_state.fullvars
11211121
orig_vars = unknowns(sys)
11221122
@test isempty(setdiff(ts_vars, orig_vars))
1123+
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

0 commit comments

Comments
 (0)