in core/maxframe/core/graph/core.pyx [0:0]
def dfs(self, start=None, visit_predicate=None, successors=None, reverse=False):
cdef:
set visited = set()
list stack
bint visit_all = False
if reverse:
pred_fun, succ_fun = self.successors, self.predecessors
else:
pred_fun, succ_fun = self.predecessors, self.successors
if start:
if not isinstance(start, (list, tuple)):
start = [start]
stack = list(start)
else:
stack = list(self.iter_indep(reverse=reverse))
def _default_visit_predicate(n, visited):
cdef list preds
preds = pred_fun(n)
return not preds or all(pred in visited for pred in preds)
successors = successors or succ_fun
visit_all = (visit_predicate == 'all')
visit_predicate = visit_predicate or _default_visit_predicate
while stack:
node = stack.pop()
if node in visited:
continue
preds = self.predecessors(node)
if visit_all or visit_predicate(node, visited):
yield node
visited.add(node)
stack.extend(n for n in successors(node) if n not in visited)
else:
stack.append(node)
stack.extend(n for n in preds if n not in visited)