#!/usr/bin/python | |
import time | |
import traceback | |
import commands | |
import threading | |
import json | |
from datetime import datetime | |
from collections import defaultdict | |
def toposort(g, steps=None): | |
if (not steps): | |
keys = set(g.keys()) | |
values = set({}) | |
for v in g.values(): | |
values=values | set(v) | |
steps=list(keys|values) | |
reverse = {} | |
for k,v in g.items(): | |
for rk in v: | |
try: | |
reverse[rk].append(k) | |
except: | |
reverse[rk]=k | |
sources = [] | |
for k,v in g.items(): | |
if not reverse.has_key(k): | |
sources.append(k) | |
for k,v in reverse.iteritems(): | |
if (not v): | |
sources.append(k) | |
order = [] | |
marked = [] | |
while sources: | |
n = sources.pop(0) | |
try: | |
for m in g[n]: | |
if m not in marked: | |
sources.append(m) | |
marked.append(m) | |
except KeyError: | |
pass | |
if (n in steps): | |
order.append(n) | |
order.reverse() | |
return order | |
graph_file=open('model-deps').read() | |
g = json.loads(graph_file) | |
print toposort(g) | |
#print toposort({'a':'b','b':'c','c':'d','d':'c'},['d','c','b','a']) |