diff --git a/group-connectivity.h b/group-connectivity.h index d6f9871a55aba65fc5e67be71d73d265693f9f1f..af2ccb972a82225d065012bd0f8d5ff973cb1419 100644 --- a/group-connectivity.h +++ b/group-connectivity.h @@ -24,6 +24,10 @@ MakeRing(Z2_2, 4, a^b, a, a&b, 3); #include <vector> +typedef int EdgeId; +typedef int DirectedEdgeId; +typedef std::pair<DirectedEdgeId, DirectedEdgeId> TwoCut; + struct AbstractTester { bool isConnected; #if SAVE_MEMORY @@ -33,12 +37,10 @@ struct AbstractTester { #endif ClassesType classes; - typedef int EdgeId; - typedef int DirectedEdgeId; - virtual void init( int edges, std::vector<EdgeId> spanningTree, + std::vector<TwoCut> twoCuts, std::vector< std::vector<DirectedEdgeId> > elementaryCycles ) =0; virtual std::vector<size_t> getClasses() =0; @@ -47,6 +49,7 @@ struct AbstractTester { virtual ~AbstractTester() {} }; + template < typename Ring_ > struct Tester : public AbstractTester { typedef Ring_ Ring; @@ -73,6 +76,7 @@ struct Tester : public AbstractTester { virtual void init( int edges_, std::vector<EdgeId> spanningTree, + std::vector<TwoCut> twoCuts, std::vector< std::vector<DirectedEdgeId> > elementaryCycles ) { edges = edges_; diff --git a/groupConnectivity.pyx b/groupConnectivity.pyx index 44d8f874c9034deb8e6b83ff99d27c400e3bdd6c..2cb25061d003ddf3dc8a1f1a715b64719bdb3c2c 100644 --- a/groupConnectivity.pyx +++ b/groupConnectivity.pyx @@ -1,5 +1,6 @@ from libcpp.vector cimport vector -from libcpp cimport bool, pair +from libcpp cimport bool +from libcpp.utility cimport pair from sage.graphs.graph import Graph cdef extern from "group-connectivity.h" namespace "Ring": @@ -11,8 +12,12 @@ cdef extern from "group-connectivity.h" namespace "Ring": pass cdef extern from "group-connectivity.h": + ctypedef int EdgeId + ctypedef int DirectedEdgeId + ctypedef pair[DirectedEdgeId, DirectedEdgeId] TwoCut + cdef cppclass AbstractTester: - void init(int, vector[int], vector[vector[int]]) + void init(int, vector[EdgeId], vector[TwoCut], vector[vector[DirectedEdgeId]]) vector[size_t] getClasses() bool run() @@ -51,11 +56,13 @@ def testGroupConnectivity(G, group = "Z4", getClasses = False, debug = False): for (u, v, l) in set(G.edge_iterator()) - set(spanningTree.edge_iterator()) ] + spanningTreeEdges = [ l for (_, _, l) in spanningTree.edge_iterator() ] + if debug: - print "Spanning Tree: ", [ l for (_, _, l) in spanningTree.edge_iterator() ] + print "Spanning Tree: ", spanningTreeEdges print "Elementary cycles: ", elemCycles - tester.init(G.num_edges(), [ l for (_, _, l) in spanningTree.edge_iterator() ], elemCycles) + tester.init(G.num_edges(), spanningTreeEdges, [], elemCycles) ret = tester.run() if getClasses: