Skip to content

Commit db54779

Browse files
fix: retain events and metadata in substitute
1 parent 4578b66 commit db54779

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

src/systems/abstractsystem.jl

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2835,15 +2835,14 @@ function Symbolics.substitute(sys::AbstractSystem, rules::Union{Vector{<:Pair},
28352835
elseif sys isa ODESystem
28362836
rules = todict(map(r -> Symbolics.unwrap(r[1]) => Symbolics.unwrap(r[2]),
28372837
collect(rules)))
2838-
eqs = fast_substitute(get_eqs(sys), rules)
2839-
pdeps = fast_substitute(get_parameter_dependencies(sys), rules)
2840-
defs = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
2838+
newsys = @set sys.eqs = fast_substitute(get_eqs(sys), rules)
2839+
@set! newsys.parameter_dependencies = fast_substitute(
2840+
get_parameter_dependencies(sys), rules)
2841+
@set! newsys.defaults = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
28412842
for (k, v) in get_defaults(sys))
2842-
guess = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
2843+
@set! newsys.guesses = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
28432844
for (k, v) in get_guesses(sys))
2844-
subsys = map(s -> substitute(s, rules), get_systems(sys))
2845-
ODESystem(eqs, get_iv(sys); name = nameof(sys), defaults = defs,
2846-
guesses = guess, parameter_dependencies = pdeps, systems = subsys)
2845+
@set! newsys.systems = map(s -> substitute(s, rules), get_systems(sys))
28472846
else
28482847
error("substituting symbols is not supported for $(typeof(sys))")
28492848
end

test/odesystem.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,3 +1783,26 @@ end
17831783
@test !process_running(proc)
17841784
kill(proc, Base.SIGKILL)
17851785
end
1786+
1787+
@testset "`substitute` retains events and metadata" begin
1788+
@parameters p(t) = 1.0
1789+
@variables x(t) = 0.0
1790+
event = [0.5] => [p ~ t]
1791+
event2 = [x ~ 0.75] => [p ~ 2 * t]
1792+
1793+
eq = [
1794+
D(x) ~ p
1795+
]
1796+
@named sys = ODESystem(eq, t, [x], [p], discrete_events = [event],
1797+
continuous_events = [event2], metadata = "TEST")
1798+
1799+
@variables x2(t) = 0.0
1800+
sys2 = substitute(sys, [x => x2])
1801+
1802+
@test length(ModelingToolkit.get_discrete_events(sys)) == 1
1803+
@test length(ModelingToolkit.get_discrete_events(sys2)) == 1
1804+
@test length(ModelingToolkit.get_continuous_events(sys)) == 1
1805+
@test length(ModelingToolkit.get_continuous_events(sys2)) == 1
1806+
@test ModelingToolkit.get_metadata(sys) == "TEST"
1807+
@test ModelingToolkit.get_metadata(sys2) == "TEST"
1808+
end

0 commit comments

Comments
 (0)