From d55d30d2fadff5b7f9a045c596e9f8ad37c6b206 Mon Sep 17 00:00:00 2001 From: salinasd Date: Thu, 5 Feb 2015 15:30:39 +0000 Subject: skbl add test skbl constructor git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@454 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 3d83eeb565fb1d4299edaf9958a54bbe7719aedf --- .../include/gudhi/Skeleton_blocker_complex.h | 18 +++++++++-- .../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 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 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 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; -- cgit v1.2.3