summaryrefslogtreecommitdiff
path: root/src/Skeleton_blocker/include
diff options
context:
space:
mode:
authorsalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2015-01-30 13:03:25 +0000
committersalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2015-01-30 13:03:25 +0000
commitfa6598d26033b44f3c65f3bbbdc9f09713488be7 (patch)
tree2d608a613a2d9a5d264800916805545afb058272 /src/Skeleton_blocker/include
parent9e4b5532c0cf675de75b493f805d998e3e8f1fff (diff)
skbl add an example
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@450 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 1a0efe7084ccff068823a4ab33bd3ec8522349ed
Diffstat (limited to 'src/Skeleton_blocker/include')
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h56
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h21
2 files changed, 66 insertions, 11 deletions
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
index 1d1a9bba..7057437c 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
@@ -116,7 +116,7 @@ You may want to use this visitor to compute statistics or to update another data
\section Example
-\subsection s Iterating through vertices, edges, blockers and simplices
+\subsection Iterating Iterating through vertices, edges, blockers and simplices
Iteration through vertices, edges, simplices or blockers is straightforward with c++11 for range loops.
Note that simplex iteration with this implicit data-structure just takes
@@ -177,8 +177,60 @@ The Euler Characteristic is 1
\endverbatim
+\subsection s Constructing a skeleton-blockers from a list of maximal faces or from a list of faces
-\subsection Acknowledgements
+ \code{.cpp}
+ std::vector<Simplex_handle> simplices;
+
+ //add 4 triangles of a tetrahedron 0123
+ simplices.push_back(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
+ simplices.push_back(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
+ simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2)));
+ simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1)));
+
+ Complex complex;
+ //get complex from top faces
+ make_complex_from_top_faces(complex,simplices.begin(),simplices.end());
+
+ std::cout << "Simplices:"<<std::endl;
+ for(const Simplex & s : complex.simplex_range())
+ std::cout << s << " ";
+ std::cout << std::endl;
+
+ //One blocker as simplex 0123 is not in the complex but all its proper faces are.
+ std::cout << "Blockers: "<<complex.blockers_to_string()<<std::endl;
+
+ //now build a complex from its full list of simplices
+ simplices.clear();
+ simplices.push_back(Simplex_handle(Vertex_handle(0)));
+ simplices.push_back(Simplex_handle(Vertex_handle(1)));
+ simplices.push_back(Simplex_handle(Vertex_handle(2)));
+ simplices.push_back(Simplex_handle(Vertex_handle(0),Vertex_handle(1)));
+ simplices.push_back(Simplex_handle(Vertex_handle(1),Vertex_handle(2)));
+ simplices.push_back(Simplex_handle(Vertex_handle(2),Vertex_handle(0)));
+ complex = Complex(simplices.begin(),simplices.end());
+
+ std::cout << "Simplices:"<<std::endl;
+ for(const Simplex & s : complex.simplex_range())
+ std::cout << s << " ";
+ std::cout << std::endl;
+
+ //One blocker as simplex 012 is not in the complex but all its proper faces are.
+ std::cout << "Blockers: "<<complex.blockers_to_string()<<std::endl;
+ \endcode
+\verbatim
+./SkeletonBlockerFromSimplices
+Simplices:
+{0} {0,1} {0,2} {0,3} {0,1,2} {0,1,3} {0,2,3} {1} {1,2} {1,3} {1,2,3} {2} {2,3} {3}
+Blockers: {0,1,2,3}
+
+Simplices:
+{0} {0,1} {0,2} {1} {1,2} {2}
+Blockers: {0,1,2}
+\endverbatim
+
+
+\section 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
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
index a013ba52..865ff55a 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
@@ -198,11 +198,14 @@ public:
visitor(visitor_){
std::vector<std::pair<Vertex_handle,Vertex_handle>> edges;
- //first pass add vertices and store edges
+ //first pass count vertices and store edges
+ int num_vertex = -1;
for(auto s_it = simplex_begin; s_it != simplex_end; ++s_it){
- if(s_it->dimension()==0) add_vertex();
+ if(s_it->dimension()==0) num_vertex = (std::max)(num_vertex,s_it->first_vertex().vertex);
if(s_it->dimension()==1) edges.emplace_back(s_it->first_vertex(),s_it->last_vertex());
}
+ while(num_vertex-->=0) add_vertex();
+
for(const auto& e : edges)
add_edge(e.first,e.second);
@@ -1213,7 +1216,7 @@ public:
std::string vertices_to_string() const {
std::ostringstream stream;
for (auto vertex : vertex_range()) {
- stream << "(" << (*this)[vertex].get_id() << "),";
+ stream << "{" << (*this)[vertex].get_id() << "} ";
}
stream << std::endl;
return stream.str();
@@ -1221,18 +1224,17 @@ public:
std::string edges_to_string() const {
std::ostringstream stream;
- for (auto edge : edge_range()) {
- stream << "(" << (*this)[edge].first() << "," << (*this)[edge].second() << ")" << " id = " << (*this)[edge].index() << std::endl;
- }
+ for (auto edge : edge_range())
+ stream << "{" << (*this)[edge].first() << "," << (*this)[edge].second() << "} ";
stream << std::endl;
return stream.str();
}
std::string blockers_to_string() const {
std::ostringstream stream;
- for (auto bl : blocker_map_) {
- stream << bl.first << " => " << bl.second << ":" << *bl.second << std::endl;
- }
+
+ for(auto b : const_blocker_range())
+ stream<<*b<<std::endl;
return stream.str();
}
@@ -1254,6 +1256,7 @@ unsigned make_complex_from_top_faces(Complex& complex,SimplexHandleIterator begi
auto subfaces_topface = subfaces(*top_face);
simplices.insert(simplices.end(),subfaces_topface.begin(),subfaces_topface.end());
}
+
complex = Complex(simplices.begin(),simplices.end());
return simplices.size();
}