Mercurial > lcfOS
diff python/graph.py @ 277:046017431c6a
Started register allocator
author | Windel Bouwman |
---|---|
date | Thu, 26 Sep 2013 21:14:25 +0200 |
parents | ea93e0a7a31e |
children | 9fca39eebe50 |
line wrap: on
line diff
--- a/python/graph.py Mon Sep 16 21:51:17 2013 +0200 +++ b/python/graph.py Thu Sep 26 21:14:25 2013 +0200 @@ -4,25 +4,45 @@ Generic graph base class. Can dump to graphiz dot format for example! """ - def __init__(self): - self.nodes = [] - self.edges = [] + def __init__(self, directed): + self.directed = directed + self.nodes = set() + self.edges = set() def newNode(self): n = Node(self) - self.nodes.append(n) + self.addNode(n) return n + def addNode(self, n): + self.nodes.add(n) + + def delNode(self, n): + self.nodes.remove(n) + def addEdge(self, n, m): """ Add an edge from n to m """ if (n, m) not in self.edges and (m, n) not in self.edges: - self.edges.append((n, m)) - n.succ.append(m) - m.pred.append(n) + self.edges.add((n, m)) + + def hasEdge(self, n, m): + # This can be directional or not :) + if self.directed: + return (n, m) in self.edges + else: + return (n, m) in self.edges or (m, n) in self.edges - def delEdge(self): - # TODO - pass + def adjecent(self, n): + """ Return all nodes with edges to n """ + return set(m for m in self.nodes if self.hasEdge(n, m)) + + def preceeding(self, n): + assert self.directed + return set(m for m in self.nodes if self.hasEdge(m, n)) + + def succeeding(self, n): + assert self.directed + return set(m for m in self.nodes if self.hasEdge(n, m)) def to_dot(self, f): """ Generate graphviz dot representation """ @@ -40,11 +60,22 @@ """ def __init__(self, g): self.g = g - self.succ = [] - self.pred = [] + + @property + def Succ(self): + return self.g.succeeding(self) + + @property + def Pred(self): + """ Return a set of predecessors """ + return self.g.preceeding(self) @property def Adj(self): - return set(self.succ) | set(self.pred) + return self.g.adjecent(self) + + @property + def Degree(self): + return len(self.Adj)