summaryrefslogtreecommitdiff
path: root/src/Skeleton_blocker
diff options
context:
space:
mode:
authorsalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2014-12-18 13:29:14 +0000
committersalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2014-12-18 13:29:14 +0000
commitf3b0595a69340ca5fee47b8c5686f69262beaa58 (patch)
tree3f74420f1dfce588016f82ba138a4005d5cb4cd7 /src/Skeleton_blocker
parentc685b05b2ed30d96554ec3271bbbb68f874c54e1 (diff)
skbl add_simplex method
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@382 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 0d325bee25bf0f45741aadd29ffe9628dcabb413
Diffstat (limited to 'src/Skeleton_blocker')
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h4
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h1
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h42
-rw-r--r--src/Skeleton_blocker/test/TestSimplifiable.cpp76
4 files changed, 109 insertions, 14 deletions
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
index 77f59e35..8f7e1590 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
@@ -180,7 +180,9 @@ The Euler Characteristic is 1
\subsection Acknowledgements
The author wishes to thank Dominique Attali and André Lieutier for
-their collaboration to write the two initial papers (cite socg_blockers_2011,\cite blockers2012) about this data-structure
+their collaboration to write the two initial papers
+\cite socg_blockers_2011,\cite blockers2012
+ about this data-structure
and also Dominique for leaving him use a prototype.
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
index 81ff0231..02dffc15 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
@@ -717,6 +717,7 @@ public:
* returns a Blocker_handle toward it if was not present before and 0 otherwise.
*/
Blocker_handle add_blocker(const Simplex_handle& blocker){
+ assert(blocker.dimension()>1);
if (contains_blocker(blocker))
{
//std::cerr << "ATTEMPT TO ADD A BLOCKER ALREADY THERE ---> BLOCKER IGNORED" << endl;
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
index 1a51e709..d254222d 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
@@ -251,22 +251,56 @@ public:
else
if (sigma.dimension()==1)
remove_star(sigma.first_vertex(),sigma.last_vertex());
+ else{
+ remove_blocker_containing_simplex(sigma);
+ this->add_blocker(sigma);
+ }
+ }
+
+ /**
+ * @brief add the simplex plus all its cofaces
+ * @details in the case where sigma is a vertex, the simplex
+ * added has an id which is set to the number of vertices
+ */
+ void add_simplex(const Simplex_handle& sigma){
+ assert(!this->contains(sigma));
+ if (sigma.dimension()==0)
+ this->add_vertex();
+ else
+ if (sigma.dimension()==1)
+ this->add_edge(sigma.first_vertex(),sigma.last_vertex());
else
- update_blockers_after_remove_star_of_simplex(sigma);
+ remove_blocker_include_in_simplex(sigma);
}
private:
- void update_blockers_after_remove_star_of_simplex(const Simplex_handle& sigma){
- std::list <Blocker_handle> blockers_to_remove;
+ /**
+ * remove all blockers that contains sigma
+ */
+ void remove_blocker_containing_simplex(const Simplex_handle& sigma){
+ std::vector <Blocker_handle> blockers_to_remove;
for (auto blocker : this->blocker_range(sigma.first_vertex())){
if(blocker->contains(sigma))
blockers_to_remove.push_back(blocker);
}
for(auto blocker_to_update : blockers_to_remove)
this->delete_blocker(blocker_to_update);
- this->add_blocker(sigma);
}
+ /**
+ * remove all blockers that contains sigma
+ */
+ void remove_blocker_include_in_simplex(const Simplex_handle& sigma){
+ std::vector <Blocker_handle> blockers_to_remove;
+ for (auto blocker : this->blocker_range(sigma.first_vertex())){
+ if(sigma.contains(*blocker))
+ blockers_to_remove.push_back(blocker);
+ }
+ for(auto blocker_to_update : blockers_to_remove)
+ this->delete_blocker(blocker_to_update);
+ }
+
+
public:
enum simplifiable_status{ NOT_HOMOTOPY_EQ,MAYBE_HOMOTOPY_EQ,HOMOTOPY_EQ};
diff --git a/src/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp
index 2dafda52..49c064c1 100644
--- a/src/Skeleton_blocker/test/TestSimplifiable.cpp
+++ b/src/Skeleton_blocker/test/TestSimplifiable.cpp
@@ -151,11 +151,7 @@ bool test_link_condition1(){
}
-
-
-bool test_collapse1(){
- // xxx implement remove_star(simplex) before
-
+bool test_collapse0(){
Complex complex(5);
build_complete(4,complex);
complex.add_vertex();
@@ -176,6 +172,27 @@ bool test_collapse1(){
return blocker123_here;
}
+
+bool test_collapse1(){
+ Complex complex(5);
+ build_complete(4,complex);
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
+ // Print result
+ cerr << "initial complex :\n"<< complex.to_string();
+ cerr <<endl<<endl;
+
+ Simplex_handle simplex_123(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
+ complex.remove_star(simplex_123);
+ cerr << "complex.remove_star(1,2,3):\n"<< complex.to_string();
+ cerr <<endl<<endl;
+
+ // verification
+ bool res = complex.contains_blocker(simplex_123);
+ res = res && complex.num_blockers()==1;
+ cerr <<"----> Ocomplex \n";
+ return res;
+}
+
bool test_collapse2(){
Complex complex(5);
build_complete(4,complex);
@@ -216,13 +233,50 @@ bool test_collapse3(){
bool blocker134_here = complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(3),Vertex_handle(4)));
bool blocker1234_here = complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4)));
- // verification
- // assert_blocker(complex,1,2,3);
- // assert(!complex.ContainsBlocker(new AddressSimplex(1,2,3,4)));
- cerr <<"----> Ocomplex \n";
return blocker134_here && !blocker1234_here;
}
+bool test_add_simplex(){
+ Complex complex(5);
+ build_complete(4,complex);
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
+ // Print result
+ cerr << "initial complex:\n"<< complex.to_string();
+ cerr <<endl<<endl;
+
+ complex.add_simplex(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
+ cerr << "complex after add_simplex:\n"<< complex.to_string();
+
+ return complex.num_blockers()==0;
+}
+
+bool test_add_simplex2(){
+ Complex complex(5);
+ build_complete(4,complex);
+ complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
+ // Print result
+ cerr << "initial complex:\n"<< complex.to_string();
+ cerr <<endl<<endl;
+
+ Complex copy;
+
+ std::vector<Simplex_handle> simplices(complex.simplex_range().begin(),complex.simplex_range().end());
+ sort(simplices.begin(),simplices.end(),[&](const Simplex_handle& s1,const Simplex_handle& s2){
+ return s1.dimension()<s2.dimension();
+ });
+ for(const auto & simplex : simplices){
+ if(!copy.contains(simplex))
+ copy.add_simplex(simplex);
+ }
+
+ complex.add_simplex(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
+ cerr << "complex after add_simplex:\n"<< complex.to_string();
+
+ return complex.num_blockers()==copy.num_blockers() &&
+ complex.num_edges()==copy.num_edges() &&
+ complex.num_vertices()==copy.num_vertices();
+}
+
bool test_remove_popable_blockers(){
@@ -282,10 +336,14 @@ int main (int argc, char *argv[])
tests_simplifiable_complex.add("Test remove popable blockers",test_remove_popable_blockers);
+ tests_simplifiable_complex.add("Test collapse 0",test_collapse0);
tests_simplifiable_complex.add("Test collapse 1",test_collapse1);
tests_simplifiable_complex.add("Test collapse 2",test_collapse2);
tests_simplifiable_complex.add("Test collapse 3",test_collapse3);
+ tests_simplifiable_complex.add("Test add simplex",test_add_simplex);
+ tests_simplifiable_complex.add("Test add simplex2",test_add_simplex2);
+
tests_simplifiable_complex.run();