-
Notifications
You must be signed in to change notification settings - Fork 128
/
Copy pathtopsort.py
52 lines (41 loc) · 1.29 KB
/
topsort.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""An implementation of the topological sorting algorithm."""
def sort(data, get_depencencies):
"""
Topologically sort data.
Arguments:
- data - a dict from object ids to their dependencies.
- get_depencencies - a function that gets a list of dependend object ids.
Returns a list of object ids sorted topologically.
"""
nodes = {}
for key in data.keys():
value = data[key]
nodes[key] = _Node(value, get_depencencies(value))
results = []
while _visit_node(nodes, results):
pass
return results
def _visit_node(data, results):
for key in data.keys():
if not data[key].visited:
_visit(data, key, results)
return True
return False
def _visit(data, key, results):
value = data[key]
if value.in_stack:
raise ValueError("Not a DAG!")
if value.visited:
return
value.in_stack = True
for depencency in value.depencencies:
_visit(data, depencency, results)
value.visited = True
value.in_stack = False
results.append(key)
class _Node(object): # pylint: disable=too-few-public-methods
def __init__(self, value, depencencies):
self.value = value
self.depencencies = depencencies
self.in_stack = False
self.visited = False