Source code for curver.kernel.partition


''' A module for representing partition graphs. '''

from itertools import permutations, combinations_with_replacement
import networkx

[docs]class CurvePartitionGraph(object): ''' This represents a partition graph of a MultiCurve. ''' def __init__(self, multicurve, graph): self.multicurve = multicurve self.graph = graph def __str__(self): G = self.graph N = G.nodes(data=True) return min(','.join('%d:%d' % (N[p]['genus'], N[p]['vertices']) for p in perm) + '-' + ','.join([':'.join(str(x) for x in sorted(d['weight'] for d in G.get_edge_data(i, j, default={}).values())) for i, j in combinations_with_replacement(perm, r=2)]) for perm in permutations(range(len(G)))) def __repr__(self): return str(self) def __eq__(self, other): node_match = lambda v1, v2: v1['genus'] == v2['genus'] and v1['vertices'] == v2['vertices'] edge_match = lambda e1, e2: sorted(e['weight'] for e in e1.values()) == sorted(e['weight'] for e in e2.values()) return networkx.is_isomorphic(self.graph, other.graph, node_match=node_match, edge_match=edge_match) def __ne__(self, other): return not self == other def __hash__(self): return hash(tuple(sorted((d['genus'], d['vertices']) for _, d in self.graph.nodes(data=True))) + tuple(sorted([e['weight'] for _, _, e in self.graph.edges(data=True)])))