in core/maxframe/core/graph/core.pyx [0:0]
def topological_iter(self, succ_checker=None, reverse=False):
cdef:
dict preds, succs
set visited = set()
list stack
if len(self) == 0:
return
if reverse:
preds, succs = self._successors, self._predecessors
else:
preds, succs = self._predecessors, self._successors
# copy predecessors and successors
succs = dict((k, set(v)) for k, v in succs.items())
preds = dict((k, set(v)) for k, v in preds.items())
def _default_succ_checker(_, predecessors):
return len(predecessors) == 0
succ_checker = succ_checker or _default_succ_checker
stack = list((p for p, l in preds.items() if len(l) == 0))
if not stack:
raise GraphContainsCycleError
while stack:
node = stack.pop()
yield node
visited.add(node)
for succ in succs.get(node, {}):
if succ in visited:
raise GraphContainsCycleError
succ_preds = preds[succ]
succ_preds.remove(node)
if succ_checker(succ, succ_preds):
stack.append(succ)
if len(visited) != len(self):
raise GraphContainsCycleError