Skip to content

Commit f543d8d

Browse files
fix: fix substitute not propagating to pdeps, defs, guesses and subsystems
1 parent 5561d71 commit f543d8d

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

src/systems/abstractsystem.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2940,7 +2940,14 @@ function Symbolics.substitute(sys::AbstractSystem, rules::Union{Vector{<:Pair},
29402940
rules = todict(map(r -> Symbolics.unwrap(r[1]) => Symbolics.unwrap(r[2]),
29412941
collect(rules)))
29422942
eqs = fast_substitute(equations(sys), rules)
2943-
ODESystem(eqs, get_iv(sys); name = nameof(sys))
2943+
pdeps = fast_substitute(parameter_dependencies(sys), rules)
2944+
defs = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
2945+
for (k, v) in defaults(sys))
2946+
guess = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
2947+
for (k, v) in guesses(sys))
2948+
subsys = map(s -> substitute(s, rules), get_systems(sys))
2949+
ODESystem(eqs, get_iv(sys); name = nameof(sys), defaults = defs,
2950+
guesses = guess, parameter_dependencies = pdeps, systems = subsys)
29442951
else
29452952
error("substituting symbols is not supported for $(typeof(sys))")
29462953
end

test/odesystem.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,3 +1315,19 @@ end
13151315
@named sys = compose(sys, sys) # nest into a hierarchical system
13161316
@test t === sys.t === sys.sys.t
13171317
end
1318+
1319+
@testset "Substituting preserves parameter dependencies, defaults, guesses" begin
1320+
@parameters p1 p2
1321+
@variables x(t) y(t)
1322+
@named sys = ODESystem([D(x) ~ y + p2], t; parameter_dependencies = [p2 ~ 2p1],
1323+
defaults = [p1 => 1.0, p2 => 2.0], guesses = [p1 => 2.0, p2 => 3.0])
1324+
@parameters p3
1325+
sys2 = substitute(sys, [p1 => p3])
1326+
@test length(parameters(sys2)) == 1
1327+
@test is_parameter(sys2, p3)
1328+
@test !is_parameter(sys2, p1)
1329+
@test length(ModelingToolkit.defaults(sys2)) == 2
1330+
@test ModelingToolkit.defaults(sys2)[p3] == 1.0
1331+
@test length(ModelingToolkit.guesses(sys2)) == 2
1332+
@test ModelingToolkit.guesses(sys2)[p3] == 2.0
1333+
end

0 commit comments

Comments
 (0)