summaryrefslogtreecommitdiff
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
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
-rw-r--r--src/Skeleton_blocker/example/CMakeLists.txt5
-rw-r--r--src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp83
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h56
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h21
4 files changed, 152 insertions, 13 deletions
diff --git a/src/Skeleton_blocker/example/CMakeLists.txt b/src/Skeleton_blocker/example/CMakeLists.txt
index c8e976cd..d9eab4e1 100644
--- a/src/Skeleton_blocker/example/CMakeLists.txt
+++ b/src/Skeleton_blocker/example/CMakeLists.txt
@@ -1,7 +1,8 @@
cmake_minimum_required(VERSION 2.6)
project(GUDHIskbl)
+
+add_executable(SkeletonBlockerFromSimplices Skeleton_blocker_from_simplices.cpp)
+
add_executable(SkeletonBlockerIteration Skeleton_blocker_iteration.cpp)
target_link_libraries(SkeletonBlockerIteration ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBRARY})
-
-add_test(SkeletonBlockerIteration ${CMAKE_CURRENT_BINARY_DIR}/SkeletonBlockerIteration)
diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp
new file mode 100644
index 00000000..db3a759c
--- /dev/null
+++ b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp
@@ -0,0 +1,83 @@
+ /* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): David Salinas
+ *
+ * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+#include <fstream>
+#include <sstream>
+
+
+#include "gudhi/Skeleton_blocker.h"
+
+using namespace std;
+using namespace Gudhi;
+using namespace skbl;
+
+typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
+typedef Complex::Vertex_handle Vertex_handle;
+typedef Complex::Simplex_handle Simplex_handle;
+typedef Complex::Simplex_handle Simplex;
+
+int main (int argc, char *argv[]){
+ 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;
+
+ return EXIT_SUCCESS;
+}
+
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();
}