summaryrefslogtreecommitdiff
path: root/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h')
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h287
1 files changed, 138 insertions, 149 deletions
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
index c98b0b45..aaaab8b0 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
@@ -24,6 +24,7 @@
#include <string>
#include <vector>
+#include <map>
#include "gudhi/Off_reader.h"
@@ -36,38 +37,36 @@ namespace skbl {
*/
template<typename Complex>
class Skeleton_blocker_off_flag_visitor_reader {
- Complex& complex_;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Point Point;
-
- const bool load_only_points_;
-
-public:
- explicit Skeleton_blocker_off_flag_visitor_reader(Complex& complex, bool load_only_points = false):
- complex_(complex),
- load_only_points_(load_only_points) {}
-
-
- void init(int dim, int num_vertices, int num_faces, int num_edges) {
- // todo do an assert to check that this number are correctly read
- // todo reserve size for vector points
- }
-
-
- void point(const std::vector<double>& point) {
- complex_.add_vertex(Point(point.begin(),point.end()));
- }
-
- void maximal_face(const std::vector<int>& face) {
- if (!load_only_points_) {
- for (size_t i = 0; i < face.size(); ++i)
- for (size_t j = i+1; j < face.size(); ++j) {
- complex_.add_edge(Vertex_handle(face[i]), Vertex_handle(face[j]));
- }
- }
- }
-
- void done() {}
+ Complex& complex_;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Point Point;
+
+ const bool load_only_points_;
+
+ public:
+ explicit Skeleton_blocker_off_flag_visitor_reader(Complex& complex, bool load_only_points = false) :
+ complex_(complex),
+ load_only_points_(load_only_points) { }
+
+ void init(int dim, int num_vertices, int num_faces, int num_edges) {
+ // todo do an assert to check that this number are correctly read
+ // todo reserve size for vector points
+ }
+
+ void point(const std::vector<double>& point) {
+ complex_.add_vertex(Point(point.begin(), point.end()));
+ }
+
+ void maximal_face(const std::vector<int>& face) {
+ if (!load_only_points_) {
+ for (size_t i = 0; i < face.size(); ++i)
+ for (size_t j = i + 1; j < face.size(); ++j) {
+ complex_.add_edge(Vertex_handle(face[i]), Vertex_handle(face[j]));
+ }
+ }
+ }
+
+ void done() { }
};
/**
@@ -75,137 +74,127 @@ public:
*/
template<typename Complex>
class Skeleton_blocker_off_visitor_reader {
- Complex& complex_;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Simplex_handle Simplex_handle;
- typedef typename Complex::Point Point;
-
- const bool load_only_points_;
- std::vector<Point> points_;
- std::vector<Simplex_handle> maximal_faces_;
-
-public:
- explicit Skeleton_blocker_off_visitor_reader(Complex& complex, bool load_only_points = false):
- complex_(complex),
- load_only_points_(load_only_points) {}
-
-
- void init(int dim, int num_vertices, int num_faces, int num_edges){
- maximal_faces_.reserve(num_faces);
- points_.reserve(num_vertices);
- }
-
-
- void point(const std::vector<double>& point) {
- points_.emplace_back(point.begin(),point.end());
- }
-
- void maximal_face(const std::vector<int>& face) {
- if (!load_only_points_) {
- Simplex_handle s;
- for(auto x : face)
- s.add_vertex(Vertex_handle(x));
- maximal_faces_.emplace_back(s);
- }
- }
-
- void done() {
- complex_ = make_complex_from_top_faces(
- maximal_faces_.begin(),
- maximal_faces_.end(),
- points_.begin(),
- points_.end()
- );
- }
+ Complex& complex_;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Simplex_handle Simplex_handle;
+ typedef typename Complex::Point Point;
+
+ const bool load_only_points_;
+ std::vector<Point> points_;
+ std::vector<Simplex_handle> maximal_faces_;
+
+ public:
+ explicit Skeleton_blocker_off_visitor_reader(Complex& complex, bool load_only_points = false) :
+ complex_(complex),
+ load_only_points_(load_only_points) { }
+
+ void init(int dim, int num_vertices, int num_faces, int num_edges) {
+ maximal_faces_.reserve(num_faces);
+ points_.reserve(num_vertices);
+ }
+
+ void point(const std::vector<double>& point) {
+ points_.emplace_back(point.begin(), point.end());
+ }
+
+ void maximal_face(const std::vector<int>& face) {
+ if (!load_only_points_) {
+ Simplex_handle s;
+ for (auto x : face)
+ s.add_vertex(Vertex_handle(x));
+ maximal_faces_.emplace_back(s);
+ }
+ }
+
+ void done() {
+ complex_ = make_complex_from_top_faces(maximal_faces_.begin(), maximal_faces_.end(),
+ points_.begin(), points_.end() );
+ }
};
-
/**
*@brief Class that allows to load a Skeleton_blocker_complex from an off file.
*/
template<typename Complex>
class Skeleton_blocker_off_reader {
-public:
- /**
- * name_file : file to read
- * read_complex : complex that will receive the file content
- * read_only_points : specify true if only the points must be read
- */
- Skeleton_blocker_off_reader(const std::string & name_file, Complex& read_complex, bool read_only_points = false,bool is_flag = false):valid_(false) {
- std::ifstream stream(name_file);
- if (stream.is_open()) {
- if(is_flag || read_only_points){
- Skeleton_blocker_off_flag_visitor_reader<Complex> off_visitor(read_complex, read_only_points);
- Off_reader off_reader(stream);
- valid_ = off_reader.read(off_visitor);
- }
- else{
- Skeleton_blocker_off_visitor_reader<Complex> off_visitor(read_complex, read_only_points);
- Off_reader off_reader(stream);
- valid_ = off_reader.read(off_visitor);
- }
- }
- }
-
- /**
- * return true iff reading did not meet problems.
- */
- bool is_valid() const {
- return valid_;
- }
-
-private:
- bool valid_;
+ public:
+ /**
+ * name_file : file to read
+ * read_complex : complex that will receive the file content
+ * read_only_points : specify true if only the points must be read
+ */
+ Skeleton_blocker_off_reader(const std::string & name_file, Complex& read_complex,
+ bool read_only_points = false, bool is_flag = false) : valid_(false) {
+ std::ifstream stream(name_file);
+ if (stream.is_open()) {
+ if (is_flag || read_only_points) {
+ Skeleton_blocker_off_flag_visitor_reader<Complex> off_visitor(read_complex, read_only_points);
+ Off_reader off_reader(stream);
+ valid_ = off_reader.read(off_visitor);
+ } else {
+ Skeleton_blocker_off_visitor_reader<Complex> off_visitor(read_complex, read_only_points);
+ Off_reader off_reader(stream);
+ valid_ = off_reader.read(off_visitor);
+ }
+ }
+ }
+
+ /**
+ * return true iff reading did not meet problems.
+ */
+ bool is_valid() const {
+ return valid_;
+ }
+
+ private:
+ bool valid_;
};
-
template<typename Complex>
-class Skeleton_blocker_off_writer{
-public:
- /**
- * name_file : file where the off will be written
- * save_complex : complex that be outputted in the file
- * for now only save triangles.
- */
- Skeleton_blocker_off_writer(const std::string & name_file, const Complex& save_complex){
- typedef typename Complex::Vertex_handle Vertex_handle;
-
- std::ofstream stream(name_file);
- if (stream.is_open()) {
- stream<<"OFF\n";
- size_t num_triangles = std::distance(save_complex.triangle_range().begin(),save_complex.triangle_range().end());
- stream<<save_complex.num_vertices()<<" "<<num_triangles<< " 0 \n";
-
- //in case the complex has deactivated some vertices, eg only has vertices 0 2 5 7 for instance
- //we compute a map from 0 2 5 7 to 0 1 2 3
- std::map<Vertex_handle,size_t> vertex_num;
- size_t current_vertex=0;
-
- for(auto v : save_complex.vertex_range()){
- vertex_num[v]=current_vertex++;
- const auto& pt(save_complex.point(v));
- for(auto x : pt)
- stream<<x<<" ";
- stream<<std::endl;
- }
-
- for(const auto & t : save_complex.triangle_range()){
- stream<<"3 ";
- for(auto x : t)
- stream<<vertex_num[x]<<" ";
- stream<<std::endl;
- }
- stream.close();
- } else std::cerr<<"could not open file "<<name_file<<std::endl;
- }
-
+class Skeleton_blocker_off_writer {
+ public:
+ /**
+ * name_file : file where the off will be written
+ * save_complex : complex that be outputted in the file
+ * for now only save triangles.
+ */
+ Skeleton_blocker_off_writer(const std::string & name_file, const Complex& save_complex) {
+ typedef typename Complex::Vertex_handle Vertex_handle;
+
+ std::ofstream stream(name_file);
+ if (stream.is_open()) {
+ stream << "OFF\n";
+ size_t num_triangles = std::distance(save_complex.triangle_range().begin(), save_complex.triangle_range().end());
+ stream << save_complex.num_vertices() << " " << num_triangles << " 0 \n";
+
+ // in case the complex has deactivated some vertices, eg only has vertices 0 2 5 7 for instance
+ // we compute a map from 0 2 5 7 to 0 1 2 3
+ std::map<Vertex_handle, size_t> vertex_num;
+ size_t current_vertex = 0;
+
+ for (auto v : save_complex.vertex_range()) {
+ vertex_num[v] = current_vertex++;
+ const auto& pt(save_complex.point(v));
+ for (auto x : pt)
+ stream << x << " ";
+ stream << std::endl;
+ }
+
+ for (const auto & t : save_complex.triangle_range()) {
+ stream << "3 ";
+ for (auto x : t)
+ stream << vertex_num[x] << " ";
+ stream << std::endl;
+ }
+ stream.close();
+ } else {
+ std::cerr << "could not open file " << name_file << std::endl;
+ }
+ }
};
-
} // namespace skbl
-
} // namespace Gudhi
-
#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_