diff --git a/Makefile b/Makefile
index 457b5064ba0f0401ca735c218bd3549b95c1e42a..c870548c1fbab8690af880a12cd17fb510d708af 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 0000000000000000000000000000000000000000..1f6ff8f5732fe3779fd5eff0db9f6b51b7f9a485
--- /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 024d7c619a0ad1dc74690a1e71dc4ca078272532..d6f9871a55aba65fc5e67be71d73d265693f9f1f 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);
}