-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathDominatorTree.py.old
More file actions
103 lines (100 loc) · 2.66 KB
/
Copy pathDominatorTree.py.old
File metadata and controls
103 lines (100 loc) · 2.66 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
from Graph import Graph
class DominatorTree(Graph):
def __init__(self, root=None):
Graph.__init__(self)
self.v = []
self.e = []
self.entry = root
vertex = {}
dom = {}
bucket = {}
for i, v in enumerate(root.dfs()): #A
vertex[i] = v
bucket[v] = []
self.v.append(v)
v._semi = i
v._ancestor = 0
v._label = v
for i in range(len(vertex)-1, 0, -1):
w = vertex[i]
for v in w.pres(): # Optimize by building in #A
u = self._EVAL(v)
if u._semi < w._semi:
w._semi = u._semi
bucket[vertex[w._semi]].append(w)
self._LINK(w._dfs_parent, w)
for v in list(bucket[w._dfs_parent]):
bucket[w._dfs_parent].remove(v)
u = self._EVAL(v)
if u._semi < v._semi:
dom[v] = u
else:
dom[v] = w._dfs_parent
for i in range(1,len(vertex)-1):
w = vertex[i]
if dom[w] != vertex[w._semi]:
dom[w] = dom[dom[w]]
for v in dom:
self.add_edge(dom[v],v)
def __str__(self):
return "VERTICES: %s\nEDGES: %s" % (self.v, self.e)
def _EVAL(self, v):
if v._ancestor == 0:
return v
else:
self._COMPRESS(v)
return v._label
def _COMPRESS(self, v):
if v._ancestor._ancestor != 0:
self._COMPRESS(v._ancestor)
if v._ancestor._label._semi < v._label._semi:
v._label = v._ancestor._label
v._ancestor = v._ancestor._ancestor
def _LINK(self, v, w):
w._ancestor = v
from Graph import Vertex
def main():
g = Graph()
r = Vertex(g)
r._id = 'root'
A = Vertex(g)
A._id = 'A'
B = Vertex(g)
B._id = 'B'
C = Vertex(g)
C._id = 'C'
D = Vertex(g)
D._id = 'D'
E = Vertex(g)
E._id = 'E'
F = Vertex(g)
F._id = 'F'
G = Vertex(g)
G._id = 'G'
end = Vertex(g)
end._id = 'end'
g.add_edge(r, A)
g.add_edge(r, end)
g.add_edge(A, B)
g.add_edge(A, C)
g.add_edge(B, C)
g.add_edge(C, D)
g.add_edge(C, E)
g.add_edge(D, F)
g.add_edge(E, F)
g.add_edge(F, B)
g.add_edge(F, G)
g.add_edge(G, end)
dt = DominatorTree(r)
assert (r, end) in dt.e
assert (r, A) in dt.e
assert (A, B) in dt.e
assert (A, C) in dt.e
assert (A, C) in dt.e
assert (C, D) in dt.e
assert (C, E) in dt.e
assert (C, F) in dt.e
assert (F, G) in dt.e
g.entry = r
if __name__ == '__main__':
main()