blob: bfedee9efddcc69c5bf8524d73da2a54514ad7f0 [file] [log] [blame]
Sapan Bhatia24836f12013-08-27 10:16:05 -04001#!/usr/bin/python
2
3import time
4import traceback
5import commands
6import threading
7import json
8
9from datetime import datetime
10from collections import defaultdict
11
Sapan Bhatia467b7ce2013-10-02 09:25:46 -040012def toposort(g, steps=None):
13 if (not steps):
14 keys = set(g.keys())
15 values = set({})
16 for v in g.values():
17 values=values | set(v)
18
19 steps=list(keys|values)
20
Sapan Bhatia24836f12013-08-27 10:16:05 -040021 reverse = {}
22
23 for k,v in g.items():
24 for rk in v:
25 try:
26 reverse[rk].append(k)
27 except:
28 reverse[rk]=k
29
30 sources = []
31 for k,v in g.items():
32 if not reverse.has_key(k):
33 sources.append(k)
34
Sapan Bhatia24836f12013-08-27 10:16:05 -040035 for k,v in reverse.iteritems():
36 if (not v):
37 sources.append(k)
38
Sapan Bhatia467b7ce2013-10-02 09:25:46 -040039 rev_order = []
Sapan Bhatia24836f12013-08-27 10:16:05 -040040 marked = []
41 while sources:
Sapan Bhatia467b7ce2013-10-02 09:25:46 -040042 n = sources.pop(0)
Sapan Bhatia24836f12013-08-27 10:16:05 -040043 try:
44 for m in g[n]:
45 if m not in marked:
46 sources.append(m)
47 marked.append(m)
48 except KeyError:
49 pass
50 if (n in steps):
Sapan Bhatia467b7ce2013-10-02 09:25:46 -040051 rev_order.append(n)
52 order = rev_order.reverse()
Sapan Bhatia24836f12013-08-27 10:16:05 -040053
54 return order
55
Sapan Bhatia467b7ce2013-10-02 09:25:46 -040056graph_file=open('model-deps').read()
57g = json.loads(graph_file)
58print toposort(g)
59
60#print toposort({'a':'b','b':'c','c':'d','d':'c'},['d','c','b','a'])