Source code for pyrobopath.process.dependency_graph
import networkx as nx
from itertools import product
[docs]
class DependencyGraph(object):
"""Directed Acyclic Graph"""
def __init__(self):
self._graph = nx.DiGraph()
self._completed_tasks = set()
def add_node(self, node, dependencies=None):
self._graph.add_node(node)
if dependencies is None:
return
for d in dependencies:
if not d in self._graph.nodes:
self._graph.add_node(d)
edges = product(dependencies, [node])
self._graph.add_edges_from(edges)
def mark_complete(self, node):
self._completed_tasks.add(node)
def can_start(self, node):
parents = self._graph.predecessors(node)
return all(p in self._completed_tasks for p in parents)
def pending_tasks(self):
return [n for n in self._graph.nodes if n not in self._completed_tasks]
def roots(self):
return [n for n in self._graph.nodes if self._graph.in_degree(n) == 0]
def reset(self):
self._completed_tasks.clear()
def draw(self, show=True):
import matplotlib.pyplot as plt
from networkx.drawing.nx_pydot import graphviz_layout
_, ax = plt.subplots()
pos = graphviz_layout(self._graph, prog="dot")
nx.draw(self._graph, pos, ax, with_labels=True)
if show:
plt.show()