From 467b7ce16a1f37b5d75992cd05ef201cab927d1d Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Wed, 2 Oct 2013 09:25:46 -0400 Subject: [PATCH] Major bugfix to toposort. --- planetstack/observer/event_loop.py | 15 ++++++++++++--- planetstack/observer/toposort.py | 24 ++++++++++++++++++------ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/planetstack/observer/event_loop.py b/planetstack/observer/event_loop.py index 6dc34da..5dd011b 100644 --- a/planetstack/observer/event_loop.py +++ b/planetstack/observer/event_loop.py @@ -22,7 +22,14 @@ logger = Logger(logfile='observer.log', level=logging.INFO) class StepNotReady(Exception): pass -def toposort(g, steps): +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(): @@ -42,7 +49,7 @@ def toposort(g, steps): if (not v): sources.append(k) - order = [] + rev_order = [] marked = [] while sources: @@ -54,8 +61,10 @@ def toposort(g, steps): marked.append(m) except KeyError: pass - order.append(n) + if (n in steps): + rev_order.append(n) + order = rev_order.reverse() order.extend(set(steps)-set(order)) return order diff --git a/planetstack/observer/toposort.py b/planetstack/observer/toposort.py index 34bf6f5..bfedee9 100755 --- a/planetstack/observer/toposort.py +++ b/planetstack/observer/toposort.py @@ -9,7 +9,15 @@ import json from datetime import datetime from collections import defaultdict -def toposort(g, steps): +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(): @@ -24,15 +32,14 @@ def toposort(g, steps): if not reverse.has_key(k): sources.append(k) - for k,v in reverse.iteritems(): if (not v): sources.append(k) - order = [] + rev_order = [] marked = [] while sources: - n = sources.pop() + n = sources.pop(0) try: for m in g[n]: if m not in marked: @@ -41,8 +48,13 @@ def toposort(g, steps): except KeyError: pass if (n in steps): - order.append(n) + rev_order.append(n) + order = rev_order.reverse() return order -print toposort({'a':'b','b':'c','c':'d','d':'c'},['d','c','b','a']) +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']) -- 2.43.0