diff --git a/groupConnectivity.pyx b/groupConnectivity.pyx index f405d70b38fecf256c36ff3a6bd3b533ad77fcf0..28c4cc88b3b322fe79699264227ed5af94f84ada 100644 --- a/groupConnectivity.pyx +++ b/groupConnectivity.pyx @@ -38,9 +38,21 @@ def pathToEdges(G, path): return ret +def theOtherNeighbour(G, v, w): + """ + Given vertex v of degree 2 returns neighbour + of v not equal to w. + """ + N = G.neighbors(v) + if N[0] == w: + return N[1] + else: + return N[0] + + def testGroupConnectivity(G, group = "Z4", getClasses = False, useTwoCuts = True, useDoubleSubdivisions = True, - debug = False): + useSubgraphs = True, debug = False): cdef AbstractTester* tester = NULL if group == "Z4": tester = new Tester[Z4[int]]() @@ -51,6 +63,20 @@ def testGroupConnectivity(G, group = "Z4", getClasses = False, assert(tester != NULL) + if useSubgraphs and group in ["Z4", "Z2_2"] and not getClasses: + for v in G.vertex_iterator(): + degs = sorted(G.degree(G.neighbors(v))) + if degs[-1] <= 2: + return False + if len(degs) == 3 and degs[0] <= 2 and degs[1] <= 2: + N = [ theOtherNeighbour(G, w, v) for w in G.neighbors(v) if G.degree(w) <= 2 ] + if G.degree(N) == [ 2, 2 ]: + return False + for (u, v, _) in G.edge_iterator(): + if sorted(G.degree(G.neighbors(u))) == [ 2, 2, 3 ] and \ + sorted(G.degree(G.neighbors(v))) == [ 2, 2, 3 ]: + return False + if useTwoCuts: G.relabel()