From 21e5f5dbb74e2a4aca8b25f79dd8998eea1abc38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20Hu=C5=A1ek?= <PitelVonSacek@gmail.com> Date: Wed, 9 Dec 2015 11:38:51 +0100 Subject: [PATCH] Add compile time option SAVE_MEMORY --- Makefile | 2 +- compileTimeOptions.h | 11 +++++++++++ group-connectivity.h | 25 +++++++++++++++++++++---- 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 compileTimeOptions.h diff --git a/Makefile b/Makefile index 457b506..c870548 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ default: groupConnectivity.so clean_obj -groupConnectivity.so: groupConnectivity.pyx group-connectivity.h setup.py +groupConnectivity.so: groupConnectivity.pyx group-connectivity.h setup.py compileTimeOptions.h python setup.py build_ext cp build/lib*/groupConnectivity.so . diff --git a/compileTimeOptions.h b/compileTimeOptions.h new file mode 100644 index 0000000..1f6ff8f --- /dev/null +++ b/compileTimeOptions.h @@ -0,0 +1,11 @@ +#ifndef __COMPILE_TIME_OPTIONS_H__ +#define __COMPILE_TIME_OPTIONS_H__ + +// bool; use vector<bool> instead of vector<size_t> for classes +#ifndef SAVE_MEMORY +#define SAVE_MEMORY 0 +#endif + + +#endif + diff --git a/group-connectivity.h b/group-connectivity.h index 024d7c6..d6f9871 100644 --- a/group-connectivity.h +++ b/group-connectivity.h @@ -1,6 +1,8 @@ #ifndef __GROUP_CONNECTIVITY_H__ #define __GROUP_CONNECTIVITY_H__ +#include "compileTimeOptions.h" + namespace Ring { #define MakeRing(Name, Size, Plus, Negate, Multiply, One) \ @@ -24,8 +26,13 @@ MakeRing(Z2_2, 4, a^b, a, a&b, 3); struct AbstractTester { bool isConnected; - std::vector<size_t> classes; - +#if SAVE_MEMORY + typedef std::vector<bool> ClassesType; +#else + typedef std::vector<size_t> ClassesType; +#endif + ClassesType classes; + typedef int EdgeId; typedef int DirectedEdgeId; @@ -75,7 +82,7 @@ struct Tester : public AbstractTester { size_t num_classes = 1; edges_ = spanningTree.size(); while (edges_-- > 0) num_classes *= Ring::size; - std::vector<size_t> C(num_classes, 0); + ClassesType C(num_classes, 0); C.swap(classes); for (auto e : spanningTree) @@ -127,7 +134,13 @@ struct Tester : public AbstractTester { virtual std::vector<size_t> getClasses() { +#if SAVE_MEMORY + std::vector<size_t> ret(classes.size()); + for (size_t i = 0; i < classes.size(); i++) ret[i] = classes[i]; + return ret; +#else return classes; +#endif } @@ -135,9 +148,13 @@ struct Tester : public AbstractTester { Mapping forb(edges, 0); for (size_t i = 0; i < numForb; i++) +#if SAVE_MEMORY + classes[pack(cannonize(unpack(i, forb)))] = true; +#else classes[pack(cannonize(unpack(i, forb)))]++; +#endif - for (auto &c : classes) if (!c) return (isConnected = false); + for (const auto &c : classes) if (!c) return (isConnected = false); return (isConnected = true); } -- GitLab