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