Skip to content

Commit 791115e

Browse files
committed
flatten and reduction on flatten
1 parent fdfb665 commit 791115e

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

src/systems/abstractsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ pins(sys::AbstractSystem) = isempty(sys.systems) ? sys.pins : [sys.pins;reduce(v
194194
function observed(sys::AbstractSystem)
195195
[sys.observed;
196196
reduce(vcat,
197-
(namespace_equation.(s.observed, s.name, s.iv.name) for s in sys.systems),
197+
(namespace_equation.(observed(s), s.name, s.iv.name) for s in sys.systems),
198198
init=Equation[])]
199199
end
200200

src/systems/reduction.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
export alias_elimination
22

3+
function flatten(sys::ODESystem)
4+
ODESystem(equations(sys),
5+
independent_variable(sys),
6+
states(sys),
7+
parameters(sys),
8+
observed=observed(sys))
9+
end
10+
11+
312
function substitute_aliases(diffeqs, outputs)
413
lhss(diffeqs) .~ substitute.(rhss(diffeqs), (Dict(lhss(outputs) .=> rhss(outputs)),))
514
end
615

16+
function make_lhs_0(eq)
17+
if eq.lhs isa Constant && iszero(eq.lhs)
18+
return eq
19+
else
20+
0 ~ eq.lhs - eq.rhs
21+
end
22+
end
23+
724
function alias_elimination(sys::ODESystem)
8-
eqs = equations(sys)
25+
eqs = vcat(equations(sys),
26+
make_lhs_0.(observed(sys)))
927

1028
new_stateops = map(eqs) do eq
1129
if eq.lhs isa Operation && eq.lhs.op isa Differential

test/reduction.jl

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using ModelingToolkit, OrdinaryDiffEq, Test
22

33
@parameters t σ ρ β F(t)
4-
@variables x(t) y(t) z(t) a(t)
4+
@variables x(t) y(t) z(t) a(t) u(t)
55
@derivatives D'~t
66

77
eqs = [D(x) ~ σ*(y-x),
@@ -21,57 +21,64 @@ eqs = [D(x) ~ σ*(y-x),
2121

2222
@test lorenz1_aliased == ODESystem(eqs,t,[x,y,z],[σ,ρ,β],observed=[a ~ x],name=:lorenz1)
2323

24-
#=
2524
# Multi-System Reduction
2625

2726
eqs1 = [D(x) ~ σ*(y-x) + F,
2827
D(y) ~ x*-z)-u,
2928
D(z) ~ x*y - β*z]
29+
3030
aliases = [u ~ x + y - z]
31+
3132
lorenz1 = ODESystem(eqs1,pins=[F],observed=aliases,name=:lorenz1)
3233

3334
eqs2 = [D(x) ~ F,
3435
D(y) ~ x*-z)-x,
3536
D(z) ~ x*y - β*z]
37+
3638
aliases2 = [u ~ x - y - z]
39+
3740
lorenz2 = ODESystem(eqs2,pins=[F],observed=aliases2,name=:lorenz2)
3841

3942
connections = [lorenz1.F ~ lorenz2.u,
4043
lorenz2.F ~ lorenz1.u]
44+
4145
connected = ODESystem([0 ~ a + lorenz1.x - lorenz2.y],t,[a],[],observed=connections,systems=[lorenz1,lorenz2])
4246

4347
# Reduced Unflattened System
48+
#=
4449
4550
connections2 = [lorenz1.F ~ lorenz2.u,
4651
lorenz2.F ~ lorenz1.u,
4752
a ~ -lorenz1.x + lorenz2.y]
4853
connected = ODESystem(Equation[],t,[],[],observed=connections2,systems=[lorenz1,lorenz2])
54+
=#
4955

5056
# Reduced Flattened System
5157

52-
flattened_system = flatten(connected)
53-
flatten(sys::AbstractSystem) = ODESystem(equations(sys),states(sys),parameters(sys),independent_variable(sys))
58+
flattened_system = ModelingToolkit.flatten(connected)
5459

5560
aliased_flattened_system = alias_elimination(flattened_system)
5661

57-
states(reduced_flattened_system) == [
62+
@test states(aliased_flattened_system) == convert.(Variable, [
5863
lorenz1.x
5964
lorenz1.y
6065
lorenz1.z
6166
lorenz2.x
6267
lorenz2.y
6368
lorenz2.z
64-
]
69+
])
6570

66-
parameters(reduced_flattened_system) == [
71+
@test setdiff(parameters(aliased_flattened_system), convert.(Variable, [
6772
lorenz1.σ
6873
lorenz1.ρ
6974
lorenz1.β
70-
lorenz2.σ
75+
lorenz1.F
76+
lorenz2.F
7177
lorenz2.ρ
7278
lorenz2.β
73-
]
79+
])) |> isempty
7480

81+
#=
7582
equations(reduced_flattened_system) == [
7683
D(lorenz1.x) ~ lorenz1.σ*(lorenz1.y-lorenz1.x) + lorenz2.x - lorenz2.y - lorenz2.z,
7784
D(lorenz1.y) ~ lorenz1.x*(ρ-z)-lorenz1.x - lorenz1.y + lorenz1.z,

0 commit comments

Comments
 (0)