Example #1
0
 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
Example #2
0
    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