+
+ void test_lowestones() {
+ test_lowestones_impl(oring);
+ test_lowestones_impl(otorus);
+ test_lowestones_impl(oball);
+ }
+
+ void test_lowestones_impl(const scomplex::simplex_order& so) {
+ pers p(so);
+ p.compute_matrices();
+ const bm &lowestones = p.get_lowestones_matrix();
+
+ for (unsigned c=0; c < lowestones.size(); ++c)
+ assert(lowestones.get_column(c).size() <= 1);
+ for (unsigned r=0; r < lowestones.size(); ++r)
+ assert(lowestones.get_row(r).size() <= 1);
+ for (unsigned c=0; c < lowestones.size(); ++c) {
+ // If (r,c) is a one then
+ // (i) a cycle dies with c --> row c is zero
+ // (ii) a cycle is born with r --> column r is zero
+ //Hence
+ // (i) the column r is a zero-column
+ // (i) the row c is a zero-column
+ if (lowestones.get_column(c).size() > 0) {
+ const uint32_t r = lowestones.get_column(c).back();
+ assert(lowestones.get_column(r).size() == 0);
+ assert(lowestones.get_row(c).size() == 0);
+ }
+ }
+ }