Skip to content

Commit dc54976

Browse files
Merge pull request #3769 from AayushSabharwal/as/substitute-retain-data
fix: retain events and metadata in `substitute`
2 parents a0ce384 + 9e0db44 commit dc54976

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

src/systems/abstractsystem.jl

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,22 +2683,27 @@ function Symbolics.substitute(sys::AbstractSystem, rules::Union{Vector{<:Pair},
26832683
elseif sys isa System
26842684
rules = todict(map(r -> Symbolics.unwrap(r[1]) => Symbolics.unwrap(r[2]),
26852685
collect(rules)))
2686-
eqs = fast_substitute(get_eqs(sys), rules)
2687-
pdeps = fast_substitute(get_parameter_dependencies(sys), rules)
2688-
defs = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
2686+
newsys = @set sys.eqs = fast_substitute(get_eqs(sys), rules)
2687+
@set! newsys.unknowns = map(get_unknowns(sys)) do var
2688+
get(rules, var, var)
2689+
end
2690+
@set! newsys.ps = map(get_ps(sys)) do var
2691+
get(rules, var, var)
2692+
end
2693+
@set! newsys.parameter_dependencies = fast_substitute(
2694+
get_parameter_dependencies(sys), rules)
2695+
@set! newsys.defaults = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
26892696
for (k, v) in get_defaults(sys))
2690-
guess = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
2697+
@set! newsys.guesses = Dict(fast_substitute(k, rules) => fast_substitute(v, rules)
26912698
for (k, v) in get_guesses(sys))
2692-
noise_eqs = fast_substitute(get_noise_eqs(sys), rules)
2693-
costs = fast_substitute(get_costs(sys), rules)
2694-
observed = fast_substitute(get_observed(sys), rules)
2695-
initialization_eqs = fast_substitute(get_initialization_eqs(sys), rules)
2696-
cstrs = fast_substitute(get_constraints(sys), rules)
2697-
subsys = map(s -> substitute(s, rules), get_systems(sys))
2698-
newsys = System(eqs, get_iv(sys); name = nameof(sys), defaults = defs,
2699-
guesses = guess, systems = subsys, noise_eqs,
2700-
observed, initialization_eqs, constraints = cstrs)
2701-
@set! newsys.parameter_dependencies = pdeps
2699+
@set! newsys.noise_eqs = fast_substitute(get_noise_eqs(sys), rules)
2700+
@set! newsys.costs = Vector{Union{Real, BasicSymbolic}}(fast_substitute(
2701+
get_costs(sys), rules))
2702+
@set! newsys.observed = fast_substitute(get_observed(sys), rules)
2703+
@set! newsys.initialization_eqs = fast_substitute(
2704+
get_initialization_eqs(sys), rules)
2705+
@set! newsys.constraints = fast_substitute(get_constraints(sys), rules)
2706+
@set! newsys.systems = map(s -> substitute(s, rules), get_systems(sys))
27022707
else
27032708
error("substituting symbols is not supported for $(typeof(sys))")
27042709
end

test/odesystem.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,3 +1574,28 @@ end
15741574
prob = ODEProblem(sys, [x => 1.0], (0.0, 1.0))
15751575
@test prob.problem_type == "A"
15761576
end
1577+
1578+
@testset "`substitute` retains events and metadata" begin
1579+
@parameters p(t) = 1.0
1580+
@variables x(t) = 0.0
1581+
event = [0.5] => [p ~ Pre(t)]
1582+
event2 = [x ~ 0.75] => [p ~ 2 * Pre(t)]
1583+
1584+
struct TestMeta end
1585+
1586+
eq = [
1587+
D(x) ~ p
1588+
]
1589+
@named sys = System(eq, t, [x], [p], discrete_events = [event],
1590+
continuous_events = [event2], metadata = Dict(TestMeta => "test"))
1591+
1592+
@variables x2(t) = 0.0
1593+
sys2 = substitute(sys, [x => x2])
1594+
1595+
@test length(ModelingToolkit.get_discrete_events(sys)) == 1
1596+
@test length(ModelingToolkit.get_discrete_events(sys2)) == 1
1597+
@test length(ModelingToolkit.get_continuous_events(sys)) == 1
1598+
@test length(ModelingToolkit.get_continuous_events(sys2)) == 1
1599+
@test getmetadata(sys, TestMeta, nothing) == "test"
1600+
@test getmetadata(sys2, TestMeta, nothing) == "test"
1601+
end

0 commit comments

Comments
 (0)