Skip to content

Instantly share code, notes, and snippets.

@calvingiles
Created June 10, 2016 17:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save calvingiles/dc5554bbe96c25b80539ad58b435fe00 to your computer and use it in GitHub Desktop.
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
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