Source code for poppy.core.generic.graph

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import collections

__all__ = ["Graph"]


[docs]class Graph(object): """ A class to manage the graph that is storing the topology of the graph. """ def __init__(self): """ Init the structure containing nodes and their relation. """ self.graph = collections.defaultdict(set)
[docs] def add_node(self, node, child): """ Add a node to the graph, with a given child. """ self.graph[node].add(child)
[docs] def find_all_paths(self, start, end, path=None): """ Find all existing paths between to nodes. """ if path is None: path = [] path = path + [start] if start == end: return [path] if start not in self.graph: return [] paths = [] for node in self.graph[start]: if node not in path: newpaths = self.find_all_paths(node, end, path) for newpath in newpaths: paths.append(newpath) return paths
[docs] def find_linking_nodes(self, start, end): """ To find all nodes between two nodes. This is the concatenation of all paths between the two nodes in argument. """ # get all paths paths = self.find_all_paths(start, end) # loop over paths to get the set of unique nodes nodes = set() for path in paths: for node in path: nodes.add(node) return nodes
def __contains__(self, task): return task in self.graph
# vim: set tw=79 :