def enumerate(self): GraphSet.set_universe(self.bond_universe) # 全域グラフのみ列挙 self.paths = GraphSet.graphs( vertex_groups=[self.atm_no_list], degree_constraints=self.degree_constraints, no_loop=True) self.paths_num = len(self.paths)
def connected_edges(start_node, target_node, num_edges): """ start_nodeをパスのスタートノードとし、かつtarget_nodeを含まない 長さがnum_edgesのパスを含むグラフセットを返す パスが仮想ノードを2個以上通るときnum_edgesよりも短いパスもグラフセットに含まれてしまう arguments: * start_node(node label) * target_node(node label) * num_edges(int) パスの長さ returns: * di_path(GraphSet) 有向性を考慮したパスだけを含むグラフセット """ all_nodes = set(original_nodes()) | set(virtual_nodes()) v_nodes = virtual_nodes() degree_constraints = {} for node in all_nodes: if node in v_nodes: degree_constraints[node] = [0, 2] elif node == start_node: degree_constraints[node] = 1 elif node == target_node: degree_constraints[node] = 0 else: degree_constraints[node] = [0, 1, 2] elms = invalid_direction_elms(start_node, target_node) v_edges = virtual_node_edges() n_range = GraphSet.graphs(vertex_groups=[[start_node]], no_loop=True, num_edges=num_edges, degree_constraints=degree_constraints) n_inc_range = GraphSet.graphs(vertex_groups=[[start_node]], no_loop=True, num_edges=num_edges + 1, degree_constraints=degree_constraints) n_range = n_range.excluding(GraphSet(elms))\ .excluding(GraphSet(v_edges)) n_inc_range = n_inc_range.excluding(GraphSet(elms))\ .including(GraphSet(v_edges)) return n_range | n_inc_range
def _enumerate_forests(self, suspicious_cut): vg = [[r] for r in self.graph.roots] dc = {} l = len(self.graph.graph.nodes()) for v in self.graph.graph.nodes(): if v in suspicious_cut: dc[v] = 0 elif v in self.graph.roots: dc[v] = xrange(l) else: dc[v] = xrange(1, l) return GraphSet.graphs(vertex_groups=vg, degree_constraints=dc, no_loop=True)
def test_linear_constraints(self): GraphSet.set_universe([(1, 2), (1, 4), (2, 3), (2, 5), (3, 6), (4, 5), (5, 6)]) gs = GraphSet.graphs(linear_constraints=[([(2, 3)], (2, 1))]) self.assertEqual(gs, GraphSet()) gs = GraphSet.graphs(linear_constraints=[([], (1, 2))]) self.assertEqual(gs, GraphSet()) gs = GraphSet.graphs(linear_constraints=[([(5, 6, -1.5)], (-1.5, 0))]) self.assertEqual(gs, GraphSet.graphs()) gs = GraphSet.graphs(linear_constraints=[([(1, 2, 3.14)], (0, float("inf")))]) self.assertEqual(gs, GraphSet.graphs()) gs = GraphSet.graphs(linear_constraints=[(GraphSet.universe(), (0, float("inf")))]) self.assertEqual(gs, GraphSet.graphs()) gs = GraphSet.graphs(linear_constraints=[(GraphSet.universe(), (7, 7))]) self.assertEqual(gs, GraphSet([GraphSet.universe()])) gs = GraphSet.graphs(linear_constraints=[(GraphSet.universe(), (1, 7))]) self.assertEqual(gs, GraphSet.graphs() - GraphSet([[]])) gs = GraphSet.graphs(linear_constraints=[([(2, 3, -1), (2, 5, 10), (4, 1), (3, 6), (4, 5, -1), (5, 6)], (10, 100))]) self.assertEqual(len(gs), 52) gs = GraphSet.graphs(linear_constraints=[([(2, 3), (2, 5, -10), (4, 1, -1), (3, 6, -1), (4, 5), (5, 6, -1)], (-100, -10))]) self.assertEqual(len(gs), 52) gs = GraphSet.graphs(linear_constraints=[([(1, 2)], (1, 1)), ([(1, 4)], (1, 2)), ([(2, 3)], (1, 3)), ([(2, 5)], (1, 4)), ([(4, 5)], (1, 6)), ([(5, 6)], (1, 7))]) self.assertEqual(len(gs), 2)
def test_graphs(self): GraphSet.set_universe([(1, 2), (1, 4), (2, 3), (2, 5), (3, 6), (4, 5), (5, 6)]) # any subgraph gs = GraphSet.graphs() self.assertTrue(isinstance(gs, GraphSet)) self.assertEqual(len(gs), 2**7) self.assertTrue([(1, 2)] in gs) # subgraphs separating [1, 5] and [2] gs = GraphSet.graphs(vertex_groups=[[1, 5], [2]]) self.assertEqual(len(gs), 6) self.assertTrue([(1, 4), (4, 5)] in gs) self.assertTrue([(1, 2), (1, 4), (4, 5)] not in gs) # matching dc = {} for v in range(1, 7): dc[v] = range(0, 2) gs = GraphSet.graphs(degree_constraints=dc) self.assertEqual(len(gs), 22) self.assertTrue([(1, 2), (3, 6)] in gs) self.assertTrue([(1, 2), (2, 3), (3, 6)] not in gs) for g in gs: self.assertTrue(len(g) < 4) # subgraphs with 1 or 2 edges gs = GraphSet.graphs(num_edges=range(1, 3)) self.assertEqual(len(gs), 28) for g in gs: self.assertTrue(1 <= len(g) and len(g) < 3) # single connected component and vertex islands gs = GraphSet.graphs(vertex_groups=[[]]) self.assertEqual(len(gs), 80) self.assertTrue([(1, 2), (2, 3)] in gs) self.assertTrue([(1, 2), (2, 3), (4, 5)] not in gs) # any forest gs = GraphSet.graphs(no_loop=True) self.assertEqual(len(gs), 112) self.assertTrue([(1, 2), (1, 4), (2, 5)] in gs) self.assertTrue([(1, 2), (1, 4), (2, 5), (4, 5)] not in gs) for g in gs: self.assertTrue(len(g) < 6) # constrained by GraphSet gs = GraphSet.graphs(no_loop=True) gs = gs.graphs(vertex_groups=[[]]) self.assertEqual(len(gs), 66) self.assertTrue([(1, 2), (1, 4), (2, 5)] in gs) self.assertTrue([(1, 2), (1, 4), (2, 5), (4, 5)] not in gs) # single connected components across 1, 3, and 5 gs = GraphSet.connected_components([1, 3, 5]) self.assertEqual(len(gs), 35) self.assertTrue([(1, 2), (2, 3), (2, 5)] in gs) self.assertTrue([(1, 2), (2, 3), (5, 6)] not in gs) GraphSet.set_universe([(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]) # cliques with 4 vertices gs = GraphSet.cliques(4) self.assertEqual(len(gs), 5) self.assertTrue([(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] in gs) self.assertTrue([(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 5)] not in gs) GraphSet.set_universe([(1, 2), (1, 4), (2, 3), (2, 5), (3, 6), (4, 5), (5, 6)]) # trees rooted at 1 gs = GraphSet.trees(1) self.assertEqual(len(gs), 45) self.assertTrue([] in gs) self.assertTrue([(1, 2), (1, 4), (2, 5), (4, 5)] not in gs) # spanning trees gs = GraphSet.trees(is_spanning=True) self.assertEqual(len(gs), 15) self.assertTrue([(1, 2), (1, 4), (2, 3), (2, 5), (3, 6)] in gs) self.assertTrue([(1, 2), (1, 4), (2, 3), (2, 5), (4, 5)] not in gs) for g in gs: self.assertEqual(len(g), 5) # forests rooted at 1 and 3 gs = GraphSet.forests([1, 3]) self.assertEqual(len(gs), 54) self.assertTrue([] in gs) self.assertTrue([(1, 2), (2, 3)] not in gs) # spanning forests rooted at 1 and 3 gs = GraphSet.forests([1, 3], is_spanning=True) self.assertEqual(len(gs), 20) self.assertTrue([(1, 2), (1, 4), (2, 5), (3, 6)] in gs) self.assertTrue([(1, 2), (1, 4), (2, 3), (2, 5)] not in gs) for g in gs: self.assertEqual(len(g), 4) # cycles gs = GraphSet.cycles() self.assertEqual(len(gs), 3) self.assertTrue([(1, 2), (1, 4), (2, 5), (4, 5)] in gs) self.assertTrue([] not in gs) # hamilton cycles gs = GraphSet.cycles(is_hamilton=True) self.assertEqual(len(gs), 1) self.assertTrue([(1, 2), (1, 4), (2, 3), (3, 6), (4, 5), (5, 6)] in gs) # paths between 1 and 6 gs = GraphSet.paths(1, 6) self.assertEqual(len(gs), 4) self.assertTrue([(1, 2), (2, 3), (3, 6)] in gs) self.assertTrue([(1, 2), (2, 3), (5, 6)] not in gs) # hamilton paths between 1 and 6 gs = GraphSet.paths(1, 6, is_hamilton=True) self.assertEqual(len(gs), 1) self.assertTrue([(1, 4), (2, 3), (2, 5), (3, 6), (4, 5)] in gs) # called as instance methods gs = GraphSet.graphs(no_loop=True) _ = gs.connected_components([1, 3, 5]) _ = gs.cliques(4) _ = gs.trees(1) _ = gs.forests([1, 3]) _ = gs.cycles() _ = gs.paths(1, 6) # exceptions self.assertRaises(KeyError, GraphSet.graphs, vertex_groups=[[7]]) self.assertRaises(KeyError, GraphSet.graphs, degree_constraints={7: 1})
def test_linear_constraints(self): GraphSet.set_universe([(1, 2), (1, 4), (2, 3), (2, 5), (3, 6), (4, 5), (5, 6)]) gs = GraphSet.graphs(linear_constraints=[([(2, 3)], (2, 1))]) self.assertEqual(gs, GraphSet()) gs = GraphSet.graphs(linear_constraints=[([], (1, 2))]) self.assertEqual(gs, GraphSet()) gs = GraphSet.graphs(linear_constraints=[([(5, 6, -1.5)], (-1.5, 0))]) self.assertEqual(gs, GraphSet.graphs()) gs = GraphSet.graphs(linear_constraints=[([(1, 2, 3.14)], (0, float("inf")))]) self.assertEqual(gs, GraphSet.graphs()) gs = GraphSet.graphs(linear_constraints=[(GraphSet.universe(), (0, float("inf")))]) self.assertEqual(gs, GraphSet.graphs()) gs = GraphSet.graphs(linear_constraints=[(GraphSet.universe(), (7, 7))]) self.assertEqual(gs, GraphSet([GraphSet.universe()])) gs = GraphSet.graphs(linear_constraints=[(GraphSet.universe(), (1, 7))]) self.assertEqual(gs, GraphSet.graphs() - GraphSet([[]])) gs = GraphSet.graphs( linear_constraints=[([(2, 3, -1), (2, 5, 10), (4, 1), (3, 6), (4, 5, -1), (5, 6)], (10, 100))]) self.assertEqual(len(gs), 52) gs = GraphSet.graphs( linear_constraints=[([(2, 3), (2, 5, -10), (4, 1, -1), (3, 6, -1), (4, 5), (5, 6, -1)], (-100, -10))]) self.assertEqual(len(gs), 52) gs = GraphSet.graphs(linear_constraints=[([(1, 2)], ( 1, 1)), ([(1, 4)], (1, 2)), ([(2, 3)], (1, 3)), ([(2, 5)], (1, 4)), ([(4, 5)], (1, 6)), ([(5, 6)], (1, 7))]) self.assertEqual(len(gs), 2)
if a[i][j] != 0: degs[cellId[i][j]] = 1 if a[i][j] in clue: clue[a[i][j]].append(cellId[i][j]) else: clue[a[i][j]] = [cellId[i][j]] else: degs[cellId[i][j]] = 2 grps = [] for _, p in clue.items(): grps.append(p) GraphSet.set_universe(edges) sols = GraphSet.graphs(vertex_groups=grps, degree_constraints=degs, no_loop=True) print('# of Solutions: %d' % sols.len()) def choose(gs): for g in gs.rand_iter(): return g sol = choose(sols) def output(sol): sh, sw = h * 2 + 1, w * 4 + 1
if a[i][j] != 0: degs[cellId[i][j]] = 1 if a[i][j] in clue: clue[a[i][j]].append(cellId[i][j]) else: clue[a[i][j]] = [cellId[i][j]] else: degs[cellId[i][j]] = 2 grps = [] for _,p in clue.items(): grps.append(p) GraphSet.set_universe(edges) sols = GraphSet.graphs(vertex_groups=grps, degree_constraints=degs, no_loop=True) print('# of Solutions: %d' % sols.len()) def choose(gs): for g in gs.rand_iter(): return g sol = choose(sols) def output(sol): sh,sw = h*2+1,w*4+1 s = [[' ' for j in range(sw)] for i in range(sh)] for i in range(sh): s[i][0] = s[i][-1] = '|'