From aa5ccf598bbe0943c2dc98215b7db9a11afeb35e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Hu=C5=A1ek?= <PitelVonSacek@gmail.com> Date: Wed, 9 Dec 2015 12:50:15 +0100 Subject: [PATCH] Add twoCut paramter to Tester::init Add aditional parameter to Tester::init method. Unused now but will be utilized by future 2-cut optimalization. Also required a bit of refactoring. --- group-connectivity.h | 10 +++++++--- groupConnectivity.pyx | 15 +++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/group-connectivity.h b/group-connectivity.h index d6f9871..af2ccb9 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 44d8f87..2cb2506 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: -- GitLab