-
Notifications
You must be signed in to change notification settings - Fork 1
/
draw.jl
91 lines (78 loc) · 1.56 KB
/
draw.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
draw(g::AbstractIWGraph;kw...) = begin
GV = Catlab.Graphics.Graphviz
stmts = GV.Statement[]
label(x) = begin
val = subpart(g,:label)[x]
if val isa Tuple
mapreduce(string,(x,y)->x*","*y,val)
else val
end
end
src(x) = subpart(g,:src)[x]
tgt(x) = subpart(g,:tgt)[x]
weight(x) = subpart(g,:weight)[x]
for v in parts(g,:V)
push!(stmts, GV.Node(string(v),Dict(:label=>label(v))))
end
for e in parts(g,:E)
push!(stmts,
GV.Edge(
[string(src(e)),string(tgt(e))],
Dict(:label=>string(weight(e)))
)
)
end
GV.Digraph("myGraph",stmts,kw...)
end
draw(S::Subobject{<:AbstractIWGraph};kw...) = begin
GV = Catlab.Graphics.Graphviz
stmts = GV.Statement[]
label(x) = begin
val = subpart(S.ob,:label)[x]
if val isa Tuple
mapreduce(string,(x,y)->x*","*y,val)
else val
end
end
src(x) = subpart(S.ob,:src)[x]
tgt(x) = subpart(S.ob,:tgt)[x]
weight(x) = subpart(S.ob,:weight)[x]
nodecolor(x) = if isin(x,:V)
"red"
else
"black"
end
edgecolor(x) = if isin(x,:E)
"red"
else
"black"
end
isin(x,T) = begin
comp = S.components[T]
if hasproperty(comp,:hom)
x in comp.hom.func
elseif hasproperty(comp,:predicate)
comp.predicate[x]
else
throw(error("Unknown type"))
end
end
for v in parts(S.ob,:V)
push!(stmts, GV.Node(string(v),Dict(
:label => label(v),
:color => nodecolor(v)
)))
end
for e in parts(S.ob,:E)
push!(stmts,
GV.Edge(
[string(src(e)),string(tgt(e))],
Dict(
:label => string(weight(e)),
:color => edgecolor(e)
)
)
)
end
GV.Digraph("myGraph",stmts,kw...)
end