#include <cpptest-suite.h>
#include <libstick-0.1/simplicialcomplex.h>
+#include <libstick-0.1/matrixreduction.h>
using namespace libstick;
TEST_ADD(SimplicialComplexTestSuite::test_isOrderFiltration);
TEST_ADD(SimplicialComplexTestSuite::test_isOrderMonotone);
TEST_ADD(SimplicialComplexTestSuite::test_boundaryMatrix);
+ TEST_ADD(SimplicialComplexTestSuite::test_matrixreduction);
}
protected:
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();
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;
}
};