From f2ddf79451087605b33747a073c2ebacb1585b93 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Wed, 25 Jun 2025 23:22:01 +0530 Subject: [PATCH] fix: retain events and metadata in `substitute` --- src/systems/abstractsystem.jl | 19 ++++++++++++------- test/odesystem.jl | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/systems/abstractsystem.jl b/src/systems/abstractsystem.jl index 6c00806b7d..d78c48a857 100644 --- a/src/systems/abstractsystem.jl +++ b/src/systems/abstractsystem.jl @@ -2835,15 +2835,20 @@ function Symbolics.substitute(sys::AbstractSystem, rules::Union{Vector{<:Pair}, elseif sys isa ODESystem rules = todict(map(r -> Symbolics.unwrap(r[1]) => Symbolics.unwrap(r[2]), collect(rules))) - eqs = fast_substitute(get_eqs(sys), rules) - pdeps = fast_substitute(get_parameter_dependencies(sys), rules) - defs = Dict(fast_substitute(k, rules) => fast_substitute(v, rules) + newsys = @set sys.eqs = fast_substitute(get_eqs(sys), rules) + @set! newsys.unknowns = map(get_unknowns(sys)) do var + get(rules, var, var) + end + @set! newsys.ps = map(get_ps(sys)) do var + get(rules, var, var) + end + @set! newsys.parameter_dependencies = fast_substitute( + get_parameter_dependencies(sys), rules) + @set! newsys.defaults = Dict(fast_substitute(k, rules) => fast_substitute(v, rules) for (k, v) in get_defaults(sys)) - guess = Dict(fast_substitute(k, rules) => fast_substitute(v, rules) + @set! newsys.guesses = Dict(fast_substitute(k, rules) => fast_substitute(v, rules) for (k, v) in get_guesses(sys)) - subsys = map(s -> substitute(s, rules), get_systems(sys)) - ODESystem(eqs, get_iv(sys); name = nameof(sys), defaults = defs, - guesses = guess, parameter_dependencies = pdeps, systems = subsys) + @set! newsys.systems = map(s -> substitute(s, rules), get_systems(sys)) else error("substituting symbols is not supported for $(typeof(sys))") end diff --git a/test/odesystem.jl b/test/odesystem.jl index 6065e9e70f..5cdce4f2eb 100644 --- a/test/odesystem.jl +++ b/test/odesystem.jl @@ -1783,3 +1783,26 @@ end @test !process_running(proc) kill(proc, Base.SIGKILL) end + +@testset "`substitute` retains events and metadata" begin + @parameters p(t) = 1.0 + @variables x(t) = 0.0 + event = [0.5] => [p ~ t] + event2 = [x ~ 0.75] => [p ~ 2 * t] + + eq = [ + D(x) ~ p + ] + @named sys = ODESystem(eq, t, [x], [p], discrete_events = [event], + continuous_events = [event2], metadata = "TEST") + + @variables x2(t) = 0.0 + sys2 = substitute(sys, [x => x2]) + + @test length(ModelingToolkit.get_discrete_events(sys)) == 1 + @test length(ModelingToolkit.get_discrete_events(sys2)) == 1 + @test length(ModelingToolkit.get_continuous_events(sys)) == 1 + @test length(ModelingToolkit.get_continuous_events(sys2)) == 1 + @test ModelingToolkit.get_metadata(sys) == "TEST" + @test ModelingToolkit.get_metadata(sys2) == "TEST" +end