Skip to content

Commit 7f2c743

Browse files
authored
Merge pull request #919 from anandijain/master
[wip] pretty print system
2 parents aa5c4de + 176834a commit 7f2c743

File tree

7 files changed

+114
-84
lines changed

7 files changed

+114
-84
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ authors = ["Chris Rackauckas <[email protected]>"]
44
version = "5.13.6"
55

66
[deps]
7+
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
78
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
89
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
910
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
@@ -35,11 +36,11 @@ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
3536
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
3637
SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b"
3738
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
38-
TreeViews = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7"
3939
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
4040
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
4141

4242
[compat]
43+
AbstractTrees = "0.3"
4344
ArrayInterface = "2.8, 3.0"
4445
ConstructionBase = "1"
4546
DataStructures = "0.17, 0.18"
@@ -66,7 +67,6 @@ SpecialFunctions = "0.7, 0.8, 0.9, 0.10, 1.0"
6667
StaticArrays = "0.10, 0.11, 0.12, 1.0"
6768
SymbolicUtils = "0.8.3, 0.9"
6869
Symbolics = "0.1.8"
69-
TreeViews = "0.3"
7070
UnPack = "0.1, 1.0"
7171
Unitful = "1.1"
7272
julia = "1.2"

src/ModelingToolkit.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ $(DocStringExtensions.README)
33
"""
44
module ModelingToolkit
55
using DocStringExtensions
6-
6+
using AbstractTrees
77
using DiffEqBase, SciMLBase, Reexport
88
using Distributed
99
using StaticArrays, LinearAlgebra, SparseArrays, LabelledArrays
@@ -54,8 +54,6 @@ import DiffEqBase: @add_kwonly
5454

5555
import LightGraphs: SimpleDiGraph, add_edge!
5656

57-
import TreeViews
58-
5957
using Requires
6058

6159
for fun in [:toexpr]

src/systems/abstractsystem.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,3 +539,7 @@ struct InvalidSystemException <: Exception
539539
msg::String
540540
end
541541
Base.showerror(io::IO, e::InvalidSystemException) = print(io, "InvalidSystemException: ", e.msg)
542+
543+
AbstractTrees.children(sys::ModelingToolkit.AbstractSystem) = ModelingToolkit.get_systems(sys)
544+
AbstractTrees.printnode(io::IO, sys::ModelingToolkit.AbstractSystem) = print(io, nameof(sys))
545+
AbstractTrees.nodetype(::ModelingToolkit.AbstractSystem) = ModelingToolkit.AbstractSystem

test/components.jl

Lines changed: 1 addition & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,8 @@
11
using Test
22
using ModelingToolkit, OrdinaryDiffEq
33

4-
# Basic electric components
5-
const t = Sym{ModelingToolkit.Parameter{Real}}(:t)
6-
function Pin(;name)
7-
@variables v(t) i(t)
8-
ODESystem(Equation[], t, [v, i], [], name=name, defaults=[v=>1.0, i=>1.0])
9-
end
4+
include("rc_model.jl")
105

11-
function Ground(name)
12-
@named g = Pin()
13-
eqs = [g.v ~ 0]
14-
ODESystem(eqs, t, [], [], systems=[g], name=name)
15-
end
16-
17-
function ConstantVoltage(name; V = 1.0)
18-
val = V
19-
@named p = Pin()
20-
@named n = Pin()
21-
@parameters V
22-
eqs = [
23-
V ~ p.v - n.v
24-
0 ~ p.i + n.i
25-
]
26-
ODESystem(eqs, t, [], [V], systems=[p, n], defaults=Dict(V => val), name=name)
27-
end
28-
29-
function Resistor(name; R = 1.0)
30-
val = R
31-
@named p = Pin()
32-
@named n = Pin()
33-
@variables v(t)
34-
@parameters R
35-
eqs = [
36-
v ~ p.v - n.v
37-
0 ~ p.i + n.i
38-
v ~ p.i * R
39-
]
40-
ODESystem(eqs, t, [v], [R], systems=[p, n], defaults=Dict(R => val), name=name)
41-
end
42-
43-
function Capacitor(name; C = 1.0)
44-
val = C
45-
@named p = Pin()
46-
@named n = Pin()
47-
@variables v(t)
48-
@parameters C
49-
D = Differential(t)
50-
eqs = [
51-
v ~ p.v - n.v
52-
0 ~ p.i + n.i
53-
D(v) ~ p.i / C
54-
]
55-
ODESystem(eqs, t, [v], [C], systems=[p, n], defaults=Dict(C => val), name=name)
56-
end
57-
58-
R = 1.0
59-
C = 1.0
60-
V = 1.0
61-
resistor = Resistor(:resistor, R=R)
62-
capacitor = Capacitor(:capacitor, C=C)
63-
source = ConstantVoltage(:source, V=V)
64-
ground = Ground(:ground)
65-
66-
function connect(ps...)
67-
eqs = [
68-
0 ~ sum(p->p.i, ps) # KCL
69-
]
70-
# KVL
71-
for i in 1:length(ps)-1
72-
push!(eqs, ps[i].v ~ ps[i+1].v)
73-
end
74-
75-
return eqs
76-
end
77-
rc_eqs = [
78-
connect(source.p, resistor.p)
79-
connect(resistor.n, capacitor.p)
80-
connect(capacitor.n, source.n, ground.g)
81-
]
82-
83-
rc_model = ODESystem(rc_eqs, t, systems=[resistor, capacitor, source, ground], name=:rc)
846
sys = structural_simplify(rc_model)
857
@test !isempty(ModelingToolkit.defaults(sys))
868
u0 = [

test/print_tree.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using ModelingToolkit, AbstractTrees, Test
2+
3+
include("rc_model.jl")
4+
5+
io = IOBuffer()
6+
print_tree(io, rc_model)
7+
ser = String(take!(io))
8+
str =
9+
"""rc
10+
├─ resistor
11+
│ ├─ p
12+
│ └─ n
13+
├─ capacitor
14+
│ ├─ p
15+
│ └─ n
16+
├─ source
17+
│ ├─ p
18+
│ └─ n
19+
└─ ground
20+
└─ g
21+
"""
22+
@test strip(ser) == strip(str)

test/rc_model.jl

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using Test
2+
using ModelingToolkit, OrdinaryDiffEq
3+
4+
# Basic electric components
5+
const t = Sym{ModelingToolkit.Parameter{Real}}(:t)
6+
function Pin(;name)
7+
@variables v(t) i(t)
8+
ODESystem(Equation[], t, [v, i], [], name=name, defaults=[v=>1.0, i=>1.0])
9+
end
10+
11+
function Ground(name)
12+
@named g = Pin()
13+
eqs = [g.v ~ 0]
14+
ODESystem(eqs, t, [], [], systems=[g], name=name)
15+
end
16+
17+
function ConstantVoltage(name; V = 1.0)
18+
val = V
19+
@named p = Pin()
20+
@named n = Pin()
21+
@parameters V
22+
eqs = [
23+
V ~ p.v - n.v
24+
0 ~ p.i + n.i
25+
]
26+
ODESystem(eqs, t, [], [V], systems=[p, n], defaults=Dict(V => val), name=name)
27+
end
28+
29+
function Resistor(name; R = 1.0)
30+
val = R
31+
@named p = Pin()
32+
@named n = Pin()
33+
@variables v(t)
34+
@parameters R
35+
eqs = [
36+
v ~ p.v - n.v
37+
0 ~ p.i + n.i
38+
v ~ p.i * R
39+
]
40+
ODESystem(eqs, t, [v], [R], systems=[p, n], defaults=Dict(R => val), name=name)
41+
end
42+
43+
function Capacitor(name; C = 1.0)
44+
val = C
45+
@named p = Pin()
46+
@named n = Pin()
47+
@variables v(t)
48+
@parameters C
49+
D = Differential(t)
50+
eqs = [
51+
v ~ p.v - n.v
52+
0 ~ p.i + n.i
53+
D(v) ~ p.i / C
54+
]
55+
ODESystem(eqs, t, [v], [C], systems=[p, n], defaults=Dict(C => val), name=name)
56+
end
57+
58+
R = 1.0
59+
C = 1.0
60+
V = 1.0
61+
resistor = Resistor(:resistor, R=R)
62+
capacitor = Capacitor(:capacitor, C=C)
63+
source = ConstantVoltage(:source, V=V)
64+
ground = Ground(:ground)
65+
66+
function connect(ps...)
67+
eqs = [
68+
0 ~ sum(p->p.i, ps) # KCL
69+
]
70+
# KVL
71+
for i in 1:length(ps)-1
72+
push!(eqs, ps[i].v ~ ps[i+1].v)
73+
end
74+
75+
return eqs
76+
end
77+
rc_eqs = [
78+
connect(source.p, resistor.p)
79+
connect(resistor.n, capacitor.p)
80+
connect(capacitor.n, source.n, ground.g)
81+
]
82+
83+
rc_model = ODESystem(rc_eqs, t, systems=[resistor, capacitor, source, ground], name=:rc)

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ println("Last test requires gcc available in the path!")
3535
@safetestset "Latexify recipes Test" begin include("latexify.jl") end
3636
@safetestset "StructuralTransformations" begin include("structural_transformation/runtests.jl") end
3737
@testset "Serialization" begin include("serialization.jl") end
38+
@safetestset "print_tree" begin include("print_tree.jl") end

0 commit comments

Comments
 (0)