Created
June 10, 2016 17:29
-
-
Save calvingiles/dc5554bbe96c25b80539ad58b435fe00 to your computer and use it in GitHub Desktop.
Pure python methods for modelling simple graphs and building a set of disjoint graphs edge by ende
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Graph(object): | |
def __init__(self, nodes, edges=None): | |
self.nodes = nodes | |
self.edges = set() | |
self.add_edges(edges or set()) | |
def __hash__(self): | |
return hash(frozenset(self.edges)) + hash(frozenset(self.nodes)) | |
def __repr__(self): | |
return 'Graph(nodes={}, edges={})'.format(self.nodes, self.edges) | |
def add_directed_edge(self, from_node, to_node): | |
hash(from_node) | |
hash(to_node) | |
if from_node not in self.nodes and to_node not in self.nodes: | |
raise ValueError('Neither node in graph') | |
self.nodes.add(from_node) | |
self.nodes.add(to_node) | |
self.edges.add((from_node, to_node)) | |
def add_undirected_edge(self, from_node, to_node): | |
self.add_directed_edge(from_node, to_node) | |
self.add_directed_edge(to_node, from_node) | |
def add_edges(self, edges): | |
for from_node, to_node in edges: | |
self.add_directed_edge(from_node, to_node) | |
def update(self, graph): | |
self.nodes |= graph.nodes | |
self.add_edges(graph.edges) | |
class GraphSet(object): | |
def __init__(self): | |
self.graphs = {} | |
def add_directed_edge(self, from_node, to_node): | |
from_node_graph = self.graphs.get(from_node) or Graph({from_node}) | |
to_node_graph = self.graphs.get(to_node) or Graph({to_node}) | |
from_node_graph.add_directed_edge(from_node, to_node) | |
if id(from_node_graph) == id(to_node_graph): | |
return | |
if hash(from_node_graph) != hash(to_node_graph): | |
from_node_graph.update(to_node_graph) | |
for k in from_node_graph.nodes: | |
self.graphs[k] = from_node_graph | |
def add_undirected_edge(self, from_node, to_node): | |
self.add_directed_edge(from_node, to_node) | |
self.add_directed_edge(to_node, from_node) | |
def unique(self): | |
return set(self.graphs.values()) | |
def __len__(self): | |
return len(self.graphs) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment