Package obitools :: Package graph :: Module dag
[hide private]
[frames] | no frames]

Source Code for Module obitools.graph.dag

 1  from obitools.graph import DiGraph,Node 
 2   
3 -class DAG(DiGraph):
4 - def __init__(self,label='G',indexer=None,nodes=None,edges=None):
5 ''' 6 Directed Graph constructor. 7 8 @param label: Graph name, set to 'G' by default 9 @type label: str 10 @param indexer: node label indexer 11 @type indexer: Indexer instance 12 @param nodes: set of nodes to add to the graph 13 @type nodes: iterable value 14 @param edges: set of edges to add to the graph 15 @type edges: iterable value 16 ''' 17 18 self._parents={} 19 DiGraph.__init__(self, label, indexer, nodes, edges)
20
21 - def getNode(self,node=None,index=None):
22 if index is None: 23 index = self._index.getIndex(node, True) 24 return DAGNode(index,self)
25
26 - def addEdge(self,parent=None,node=None,indexp=None,index=None,**data):
27 indexp=self.addNode(parent, indexp) 28 index =self.addNode(node , index) 29 30 pindex = set(n.index 31 for n in self.getNode(index=indexp).ancestorIterator()) 32 33 assert index not in pindex,'Child node cannot be a parent node' 34 35 DiGraph.addEdge(self,index1=indexp,index2=index,**data) 36 37 if index in self._parents: 38 self._parents[index].add(indexp) 39 else: 40 self._parents[index]=set([indexp]) 41 42 43 return (indexp,index)
44 45 46
47 -class DAGNode(Node):
48
49 - def ancestorIterator(self):
50 if self.index in self.graph._parents: 51 for p in self.graph._parents[self.index]: 52 parent = DAGNode(p,self.graph) 53 yield parent 54 for pnode in parent.ancestorIterator(): 55 yield pnode
56