def operate_on(self,G): # Operate on a hairy graph by deleting an edge and adding a hair to one of the vertices adjacent to the # deleted edge. sgn0 = -1 if G.order() % 2 else 1 image=[] for (i, e) in enumerate(G.edges(labels=False)): (u, v) = e # Only edges not connected to a hair-vertex can be cut if u >= self.domain.n_vertices or v >= self.domain.n_vertices: continue G1 = copy(G) if not self.domain.even_edges: Shared.enumerate_edges(G1) e_label = G1.edge_label(u, v) G1.delete_edge((u, v)) new_hair_idx = self.domain.n_vertices + self.domain.n_hairs G1.add_vertex(new_hair_idx) G2 = copy(G1) G1.add_edge((u, new_hair_idx)) G2.add_edge((v, new_hair_idx)) if not self.domain.even_edges: G1.set_edge_label(u, new_hair_idx, e_label) G2.set_edge_label(v, new_hair_idx, e_label) sgn1 = Shared.edge_perm_sign(G1) sgn2 = Shared.edge_perm_sign(G2) else: sgn1 = 1 sgn2 = -1 image.append((G1, sgn1*sgn0)) image.append((G2, sgn2*sgn0)) return image
def operate_on(self, G): # Operate on a bi colored hairy graph by deleting an edge and adding a hair of colour a to one of the adjacent # vertices and a hair of colour b to the other adjacent vertex. sgn0 = -1 if G.order() % 2 else 1 image = [] for (i, e) in enumerate(G.edges(labels=False)): (u, v) = e # Only edges not connected to a hair-vertex can be split. if u >= self.domain.n_vertices or v >= self.domain.n_vertices: continue G1 = copy(G) if not self.domain.even_edges: Shared.enumerate_edges(G1) e_label = G1.edge_label(u, v) G1.delete_edge((u, v)) new_hair_idx_1 = self.domain.n_vertices + self.domain.n_hairs new_hair_idx_2 = new_hair_idx_1 + 1 G1.add_vertex(new_hair_idx_1) G1.add_edge((u, new_hair_idx_1)) G1.add_vertex(new_hair_idx_2) G1.add_edge((v, new_hair_idx_2)) G2 = copy(G1) vertices = list(range(0, self.domain.n_vertices)) vertices = [] if vertices is None else vertices start_idx_a = self.domain.n_vertices start_idx_b = self.domain.n_vertices + self.domain.n_hairs_a + 1 hairs_a = list(range(start_idx_a + 1, start_idx_b)) hairs_a = [] if hairs_a is None else hairs_a hairs_b = list(range(start_idx_b, new_hair_idx_2)) hairs_b = [] if hairs_b is None else hairs_b p = vertices + hairs_a + hairs_b p1 = p + [start_idx_a, new_hair_idx_2] G1.relabel(p1) p2 = p + [new_hair_idx_2, start_idx_a] G2.relabel(p2) if not self.domain.even_edges: G1.set_edge_label(u, start_idx_a, e_label) G1.set_edge_label(v, new_hair_idx_2, G1.size() - 1) sgn1 = Shared.edge_perm_sign(G1) G2.set_edge_label(v, start_idx_a, e_label) G2.set_edge_label(u, new_hair_idx_2, G2.size() - 1) sgn2 = Shared.edge_perm_sign(G2) else: sgn1 = 1 sgn2 = -1 image.append((G1, sgn1 * sgn0)) image.append((G2, sgn2 * sgn0)) return image