Skip to content

Commit

Permalink
refactored dependency-solver DFS to use stack+loop
Browse files Browse the repository at this point in the history
  • Loading branch information
David Hartmann committed Oct 21, 2022
1 parent 4bc38a1 commit fe4d23d
Showing 1 changed file with 15 additions and 11 deletions.
26 changes: 15 additions & 11 deletions src/miniflask/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -469,24 +469,30 @@ def topological_sort(node_dict): # noqa: C901
visited = [False for i in range(len(nodes))]
sorted_nodes, cycles, unresolved = [], [], []

# note: rewrite this recursive DFS to while-loop if RecursionError occurs
def DFS(node_i, parentnodes=None):
if parentnodes is None:
parentnodes = []
# the following code implements DFS using a stack of nodes-to-traverse
stack = [(node_i, []) for node_i in range(len(nodes) - 1, -1, -1)]
while len(stack) > 0:
node_i, parentnodes = stack.pop()

if node_i == "add_to_sorted_nodes":
sorted_nodes.append(parentnodes)
continue

node = nodes[node_i]

if node in parentnodes:
cycles.append(parentnodes + [node])
return
continue

parentnodes = parentnodes + [node]

if visited[node_i]:
return
continue

visited[node_i] = True
stack.append(("add_to_sorted_nodes", node))

dependency_stack = []
for dependency in node.depends_on:
if dependency not in node.mf.state:

Expand All @@ -507,12 +513,10 @@ def DFS(node_i, parentnodes=None):
else:
dependency_varid = dependency
dependency_i = varid2index[dependency_varid]
DFS(dependency_i, parentnodes=parentnodes)

sorted_nodes.append(node)
dependency_stack.append((dependency_i, parentnodes))

for i in range(len(nodes)):
DFS(i)
dependency_stack.reverse()
stack = stack + dependency_stack

return sorted_nodes, cycles, unresolved

Expand Down

0 comments on commit fe4d23d

Please sign in to comment.