Skip to content

Commit fa41f97

Browse files
Merge pull request #3961 from vyudu/retain_inputs_when_compose
fix: retain inputs when compose
2 parents 0a12d70 + 918a083 commit fa41f97

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/systems/abstractsystem.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,6 +2665,19 @@ function compose(sys::AbstractSystem, systems::AbstractArray; name = nameof(sys)
26652665
end
26662666
@set! sys.unknowns = unique!(vcat(get_unknowns(sys), collect(newunknowns)))
26672667
@set! sys.ps = unique!(vcat(get_ps(sys), collect(newparams)))
2668+
2669+
newinputs = map(systems) do sys
2670+
map(x -> namespace_expr(x, sys), inputs(sys))
2671+
end
2672+
newoutputs = map(systems) do sys
2673+
map(x -> namespace_expr(x, sys), outputs(sys))
2674+
end
2675+
2676+
newinputs = reduce(vcat, newinputs)
2677+
newoutputs = reduce(vcat, newoutputs)
2678+
2679+
@set! sys.inputs = OrderedSet(vcat(inputs(sys), newinputs))
2680+
@set! sys.outputs = OrderedSet(vcat(outputs(sys), newoutputs))
26682681
return sys
26692682
end
26702683
"""

test/input_output_handling.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,3 +485,16 @@ end
485485
@test issetequal(ModelingToolkit.inputs(ss2), [z])
486486
@test issetequal(ModelingToolkit.outputs(ss2), [y])
487487
end
488+
489+
@testset "Retain inputs when composing systems" begin
490+
@variables x(t) y(t) [input=true]
491+
@named sys = System([D(x) ~ y * x], t)
492+
csys = compose(System(Equation[], t; name = :outer), sys)
493+
@test issetequal(ModelingToolkit.inputs(csys), [sys.y])
494+
495+
# More complex hierarchy
496+
@variables z(t) [input = true] w(t)
497+
@named sys2 = System([D(w) ~ z - w], t)
498+
cosys = compose(System(Equation[], t; name = :outermost), [csys, sys2])
499+
@test issetequal(ModelingToolkit.inputs(cosys), [csys.sys.y, sys2.z])
500+
end

0 commit comments

Comments
 (0)