diff options
Diffstat (limited to 'src/Skeleton_blocker')
-rw-r--r-- | src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h | 18 | ||||
-rw-r--r-- | src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp | 37 |
2 files changed, 51 insertions, 4 deletions
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h index 865ff55a..fb1e440d 100644 --- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h +++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h @@ -239,8 +239,21 @@ public: } if(all_edges_here){ //eg this->contains(max_face) max_face.add_vertex(nv); - if(!cofaces[first_v]->contains(max_face)) + if(!cofaces[first_v]->contains(max_face)){ + // if there exists a blocker included in max_face, we remove it + // as it is not a minimum missing face + // the other alternative would be to check to all properfaces + // are in the complex before adding a blocker but that + // would be more expensive if there are few blockers + std::vector<Blocker_handle> blockers_to_remove; + for(auto b : blocker_range(first_v)) + if(b->contains(max_face)) + blockers_to_remove.push_back(b); + for(auto b : blockers_to_remove) + this->delete_blocker(b); + add_blocker(max_face); + } max_face.remove_vertex(nv); } } @@ -690,9 +703,8 @@ public: * @remark sigma has to belongs to the set of blockers */ void remove_blocker(const Blocker_handle sigma) { - for (auto vertex : *sigma) { + for (auto vertex : *sigma) remove_blocker(sigma, vertex); - } num_blockers_--; } diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp index 9392cc9e..468a4fca 100644 --- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp +++ b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp @@ -758,6 +758,11 @@ bool test_constructor3(){ Complex complex(simplices.begin(),simplices.end()); DBGVALUE(complex.to_string()); + if(complex.num_blockers()!=1) return false; + Sh expected_blocker(Vh(0),Vh(1),Vh(2)); + for(auto b : complex.const_blocker_range()) + if(*b!=expected_blocker) return false; + return complex.num_vertices()==3 && complex.num_blockers()==1; } @@ -767,7 +772,6 @@ bool test_constructor4(){ typedef Simplex_handle Sh; std::vector<Simplex_handle> simplices; auto subf(subfaces(Sh(Vh(0),Vh(1),Vh(2),Vh(3)))); - // subf.pop_back(); //remove max face -> now a blocker 012 simplices.insert(simplices.begin(),subf.begin(),subf.end()); simplices.push_back(Sh(Vh(4))); @@ -778,6 +782,10 @@ bool test_constructor4(){ Complex complex(simplices.begin(),simplices.end()); DBGVALUE(complex.to_string()); + if(complex.num_blockers()!=1) return false; + Sh expected_blocker(Vh(0),Vh(1),Vh(4)); + for(auto b : complex.const_blocker_range()) + if(*b!=expected_blocker) return false; return complex.num_vertices()==5 && complex.num_blockers()==1 && complex.num_edges()==8; } @@ -810,6 +818,31 @@ bool test_constructor5(){ } +bool test_constructor6(){ + typedef Vertex_handle Vh; + typedef Simplex_handle Sh; + std::vector<Simplex_handle> simplices; + auto subf(subfaces(Sh(Vh(0),Vh(1),Vh(2),Vh(3)))); + for(auto s:subf){ + Sh s1(Vh(0),Vh(1),Vh(2),Vh(3)); + Sh s2(Vh(1),Vh(2),Vh(3)); + if(s!=s1 && s!=s2) simplices.push_back(s); + } + + DBGCONT(simplices); + Complex complex(simplices.begin(),simplices.end()); + + DBGVALUE(complex.to_string()); + + if(complex.num_blockers()!=1) return false; + Sh expected_blocker(Vh(1),Vh(2),Vh(3)); + for(auto b : complex.const_blocker_range()) + if(*b!=expected_blocker) return false; + return complex.num_vertices()==4 && complex.num_blockers()==1 && complex.num_edges()==6; +} + + + int main (int argc, char *argv[]) { Tests tests_complex; @@ -843,6 +876,8 @@ int main (int argc, char *argv[]) tests_complex.add("test_constructor_list_simplices3",test_constructor3); tests_complex.add("test_constructor_list_simplices4",test_constructor4); tests_complex.add("test_constructor_list_simplices5",test_constructor5); + tests_complex.add("test_constructor_list_simplices6",test_constructor6); + if(tests_complex.run()){ return EXIT_SUCCESS; |