comparison python/graph.py @ 277:046017431c6a

Started register allocator
author Windel Bouwman
date Thu, 26 Sep 2013 21:14:25 +0200
parents ea93e0a7a31e
children 9fca39eebe50
comparison
equal deleted inserted replaced
276:56d37ed4b4d2 277:046017431c6a
2 class Graph: 2 class Graph:
3 """ 3 """
4 Generic graph base class. 4 Generic graph base class.
5 Can dump to graphiz dot format for example! 5 Can dump to graphiz dot format for example!
6 """ 6 """
7 def __init__(self): 7 def __init__(self, directed):
8 self.nodes = [] 8 self.directed = directed
9 self.edges = [] 9 self.nodes = set()
10 self.edges = set()
10 11
11 def newNode(self): 12 def newNode(self):
12 n = Node(self) 13 n = Node(self)
13 self.nodes.append(n) 14 self.addNode(n)
14 return n 15 return n
16
17 def addNode(self, n):
18 self.nodes.add(n)
19
20 def delNode(self, n):
21 self.nodes.remove(n)
15 22
16 def addEdge(self, n, m): 23 def addEdge(self, n, m):
17 """ Add an edge from n to m """ 24 """ Add an edge from n to m """
18 if (n, m) not in self.edges and (m, n) not in self.edges: 25 if (n, m) not in self.edges and (m, n) not in self.edges:
19 self.edges.append((n, m)) 26 self.edges.add((n, m))
20 n.succ.append(m)
21 m.pred.append(n)
22 27
23 def delEdge(self): 28 def hasEdge(self, n, m):
24 # TODO 29 # This can be directional or not :)
25 pass 30 if self.directed:
31 return (n, m) in self.edges
32 else:
33 return (n, m) in self.edges or (m, n) in self.edges
34
35 def adjecent(self, n):
36 """ Return all nodes with edges to n """
37 return set(m for m in self.nodes if self.hasEdge(n, m))
38
39 def preceeding(self, n):
40 assert self.directed
41 return set(m for m in self.nodes if self.hasEdge(m, n))
42
43 def succeeding(self, n):
44 assert self.directed
45 return set(m for m in self.nodes if self.hasEdge(n, m))
26 46
27 def to_dot(self, f): 47 def to_dot(self, f):
28 """ Generate graphviz dot representation """ 48 """ Generate graphviz dot representation """
29 #print('digraph G {', file=f) 49 #print('digraph G {', file=f)
30 for node in self.nodes: 50 for node in self.nodes:
38 """ 58 """
39 Node in a graph. 59 Node in a graph.
40 """ 60 """
41 def __init__(self, g): 61 def __init__(self, g):
42 self.g = g 62 self.g = g
43 self.succ = [] 63
44 self.pred = [] 64 @property
65 def Succ(self):
66 return self.g.succeeding(self)
67
68 @property
69 def Pred(self):
70 """ Return a set of predecessors """
71 return self.g.preceeding(self)
45 72
46 @property 73 @property
47 def Adj(self): 74 def Adj(self):
48 return set(self.succ) | set(self.pred) 75 return self.g.adjecent(self)
76
77 @property
78 def Degree(self):
79 return len(self.Adj)
49 80
50 81