Add matrix reduction code
[libstick.git] / tests / simplicialcomplex.h
index fa829e1f31dfa08ed02f9641ff7369feaee3a0e1..afc9fab1c8f649603b4044f7c602bfd1e0b4a22b 100644 (file)
@@ -5,6 +5,7 @@
 #include <cpptest-suite.h>
 
 #include <libstick-0.1/simplicialcomplex.h>
+#include <libstick-0.1/matrixreduction.h>
 
 using namespace libstick;
 
@@ -32,6 +33,7 @@ class SimplicialComplexTestSuite: public Test::Suite {
             TEST_ADD(SimplicialComplexTestSuite::test_isOrderFiltration);
             TEST_ADD(SimplicialComplexTestSuite::test_isOrderMonotone);
             TEST_ADD(SimplicialComplexTestSuite::test_boundaryMatrix);
+            TEST_ADD(SimplicialComplexTestSuite::test_matrixreduction);
         }
 
     protected:
@@ -43,43 +45,43 @@ class SimplicialComplexTestSuite: public Test::Suite {
             const unsigned num = 11;
             scomplex::Simplex ss[num] = {
                 // dimension, faces, value...
-                {0, {0, 0, 0}, 0},
-                {0, {0, 0, 0}, 1},
-                {0, {0, 0, 0}, 2},
-                {0, {0, 0, 0}, 3},
-                {1, {0, 1, 0}, 4},
-                {1, {1, 2, 0}, 5},
-                {1, {2, 3, 0}, 6},
-                {1, {3, 0, 0}, 7},
-                {1, {0, 2, 0}, 8},
-                {2, {6, 7, 8}, 9},
-                {2, {4, 5, 8}, 10}
+                {0, {}, 1},
+                {0, {}, 2},
+                {0, {}, 3},
+                {0, {}, 4},
+                {1, {1, 2}, 5},
+                {1, {2, 3}, 6},
+                {1, {3, 4}, 7},
+                {1, {4, 1}, 8},
+                {1, {1, 3}, 9},
+                {2, {7, 8, 9}, 10},
+                {2, {5, 6, 9}, 11}
             };
 
             //  This is o1        This is o2         This is o3(b)
             //  (value = index)   (values)           (values)
             //
-            //  0  ----4---- 1    0  ----4---- 1     0  ----4---- 1
-            //  |\           |    |\           |     |\           |
-            //  |  \     10  |    |  \     10  |     |  \     12  |
-            //  |    \       |    |    \       |     |    \       |
-            //  |      \     |    |      \     |     |      \     |
-            //  7       8    5    7       8    11    7       8    11
-            //  |        \   |    |        \   |     |        \   |
-            //  |   9     \  |    |   9     \  |     |   9     \  |
-            //  |          \ |    |          \ |     |          \ |
-            //  |           \|    |           \|     |           \|
-            //  3  ----6---- 2    3  ----6---- 2     3  ----6---- 2
+            //  1 ----5---- 2    1 ----5---- 2     1 ----5---- 2
+            //  |\          |    |\          |     |\          |
+            //  | \     11  |    | \     11  |     | \     13  |
+            //  |   \       |    |   \       |     |   \       |
+            //  |     \     |    |     \     |     |     \     |
+            //  8      9    6    8      9    12    8      9    12
+            //  |       \   |    |       \   |     |       \   |
+            //  |  10    \  |    |  10    \  |     |  10    \  |
+            //  |         \ |    |         \ |     |         \ |
+            //  |          \|    |          \|     |          \|
+            //  4 ----7---- 3    4 ----7---- 3     4 ----7---- 3
 
             // Build the complex
             for (unsigned i=0; i<num; ++i)
                 c1.addSimplex(ss[i]);
 
             c2 = c1;
-            c2.simplices[5].value = 11;
+            c2.simplices[6].value = 12;
 
             c3 = c2;
-            c3.simplices[10].value = 12;
+            c3.simplices[11].value = 13;
 
             o1.reset();
             o2.reset();
@@ -120,48 +122,70 @@ class SimplicialComplexTestSuite: public Test::Suite {
         void test_boundaryMatrix() {
             bm mat1 = o1.getBoundaryMatrix();
             bm mat1e(c1.size());
+            mat1e.set(0, 1, true);
+            mat1e.set(0, 2, true);
+            mat1e.set(0, 3, true);
             mat1e.set(0, 4, true);
-            mat1e.set(1, 4, true);
             mat1e.set(1, 5, true);
             mat1e.set(2, 5, true);
             mat1e.set(2, 6, true);
             mat1e.set(3, 6, true);
             mat1e.set(3, 7, true);
-            mat1e.set(0, 7, true);
-            mat1e.set(0, 8, true);
-            mat1e.set(2, 8, true);
-            mat1e.set(6, 9, true);
-            mat1e.set(7, 9, true);
-            mat1e.set(8, 9, true);
-            mat1e.set(4, 10, true);
-            mat1e.set(5, 10, true);
+            mat1e.set(4, 7, true);
+            mat1e.set(4, 8, true);
+            mat1e.set(1, 8, true);
+            mat1e.set(1, 9, true);
+            mat1e.set(3, 9, true);
+            mat1e.set(7, 10, true);
             mat1e.set(8, 10, true);
+            mat1e.set(9, 10, true);
+            mat1e.set(5, 11, true);
+            mat1e.set(6, 11, true);
+            mat1e.set(9, 11, true);
             TEST_ASSERT(mat1 == mat1e);
 
             bm mat3b = o3b.getBoundaryMatrix();
             bm mat3be(c1.size());
+            mat3be.set(0, 1, true);
+            mat3be.set(0, 2, true);
+            mat3be.set(0, 3, true);
             mat3be.set(0, 4, true);
-            mat3be.set(1, 4, true);
+            mat3be.set(1, 5, true);
             mat3be.set(2, 5, true);
-            mat3be.set(3, 5, true);
             mat3be.set(3, 6, true);
-            mat3be.set(0, 6, true);
-            mat3be.set(0, 7, true);
-            mat3be.set(2, 7, true);
-            mat3be.set(5, 8, true);
-            mat3be.set(6, 8, true);
-            mat3be.set(7, 8, true);
-            mat3be.set(1, 9, true);
-            mat3be.set(2, 9, true);
-            mat3be.set(4, 10, true);
-            mat3be.set(7, 10, true);
-            mat3be.set(9, 10, true);
+            mat3be.set(4, 6, true);
+            mat3be.set(4, 7, true);
+            mat3be.set(1, 7, true);
+            mat3be.set(1, 8, true);
+            mat3be.set(3, 8, true);
+            mat3be.set(6, 9, true);
+            mat3be.set(7, 9, true);
+            mat3be.set(8, 9, true);
+            mat3be.set(2, 10, true);
+            mat3be.set(3, 10, true);
+            mat3be.set(5, 11, true);
+            mat3be.set(8, 11, true);
+            mat3be.set(10, 11, true);
+            TEST_ASSERT(mat3b == mat3be);
 
             //std::cout << mat3b << std::endl << std::endl;
+            //std::cout << mat3be << std::endl << std::endl;
             //std::cout << ((bm::colbase) mat3b) << std::endl << std::endl;
             //std::cout << ((bm::rowbase) mat3b) << std::endl << std::endl;
+        }
 
-            TEST_ASSERT(mat3b == mat3be);
+        void test_matrixreduction() {
+            bm b = o3b.getBoundaryMatrix();
+            bm v = unitMatrix<bm>(b.size());
+
+            bm b_orig = b;
+            reduceBoundaryMatrix(b, v);
+            TEST_ASSERT(b == b_orig*v);
+
+            //std::cout << std::endl << "after reduce: " << std::endl;
+            //std::cout << std::endl << b << std::endl;
+            //std::cout << std::endl << v << std::endl;
+            //std::cout << std::endl << (b_orig*v) << std::endl;
         }
 };