Bugfix
[plstackapi.git] / planetstack / openstack_observer / toposort.py
1 #!/usr/bin/python
2
3 import time
4 import traceback
5 import commands
6 import threading
7 import json
8 import pdb
9
10 from datetime import datetime
11 from collections import defaultdict
12
13 # Topological sort
14 # Notes:
15 # - Uses a stack instead of recursion
16 # - Forfeits optimization involving tracking currently visited nodes
17 def toposort(g, steps=None):
18         # Get set of all nodes, including those without outgoing edges
19         keys = set(g.keys())
20         values = set({})
21         for v in g.values():
22                 values=values | set(v)
23         
24         all_nodes=list(keys|values)
25         if (not steps):
26                 steps = all_nodes
27
28         # Final order
29         order = []
30
31         # DFS stack, not using recursion
32         stack = []
33
34         # Unmarked set
35         unmarked = all_nodes
36
37         # visiting = [] - skip, don't expect 1000s of nodes, |E|/|V| is small
38
39         while unmarked:
40                 stack.insert(0,unmarked[0]) # push first unmarked
41
42                 while (stack):
43                         n = stack[0]
44                         print stack
45                         print "Trying %s"%n
46                         add = True
47                         try:
48                                 for m in g[n]:
49                                         if (m in unmarked):
50                                             add = False
51                                             stack.insert(0,m)
52                         except KeyError:
53                                 pass
54                         if (add):
55                                 if (n in steps and n not in order):
56                                         order.append(n)
57                                 item = stack.pop(0)
58                                 try:
59                                         unmarked.remove(item)
60                                 except ValueError:
61                                         pass
62
63         noorder = list(set(steps) - set(order))
64         return order + noorder
65
66 def main():
67         graph_file=open('planetstack.deps').read()
68         g = json.loads(graph_file)
69         print toposort(g)
70
71 if (__name__=='__main__'):
72         main()
73
74 #print toposort({'a':'b','b':'c','c':'d','d':'c'},['d','c','b','a'])