summaryrefslogtreecommitdiff
path: root/src/common/include/gudhi/reader_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/include/gudhi/reader_utils.h')
-rw-r--r--src/common/include/gudhi/reader_utils.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/common/include/gudhi/reader_utils.h b/src/common/include/gudhi/reader_utils.h
new file mode 100644
index 00000000..5c8cbeb7
--- /dev/null
+++ b/src/common/include/gudhi/reader_utils.h
@@ -0,0 +1,181 @@
+ /* 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): Clément Maria
+ *
+ * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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/>.
+ */
+
+#ifndef GUDHI_READER_UTILS_H
+#define GUDHI_READER_UTILS_H
+
+#include <iostream>
+#include <fstream>
+#include <boost/graph/adjacency_list.hpp>
+#include "gudhi/graph_simplicial_complex.h"
+
+/**
+ * \brief Read a set of points to turn it
+ * into a vector< vector<double> > by filling points
+ *
+ * File format: 1 point per line
+ * X11 X12 ... X1d
+ * X21 X22 ... X2d
+ * etc
+ */
+inline void
+read_points ( std::string file_name
+ , std::vector< std::vector< double > > & points)
+{
+ std::ifstream in_file (file_name.c_str(),std::ios::in);
+ if(!in_file.is_open()) {
+ std::cerr << "Unable to open file " << file_name << std::endl;
+ return;}
+
+ std::string line;
+ double x;
+ while( getline ( in_file , line ) )
+ {
+ std::vector< double > point;
+ std::istringstream iss( line );
+ while(iss >> x) { point.push_back(x); }
+ points.push_back(point);
+ }
+ in_file.close();
+}
+
+/**
+ * \brief Read a graph from a file.
+ *
+ * File format: 1 simplex per line
+ * Dim1 X11 X12 ... X1d Fil1
+ * Dim2 X21 X22 ... X2d Fil2
+ * etc
+ *
+ * The vertices must be labeled from 0 to n-1.
+ * Every simplex must appear exactly once.
+ * Simplices of dimension more than 1 are ignored.
+ */
+inline Graph_t
+read_graph ( std::string file_name )
+{
+ std::ifstream in_ (file_name.c_str(),std::ios::in);
+ if(!in_.is_open()) { std::cerr << "Unable to open file " << file_name << std::endl; }
+
+ std::vector< Edge_t > edges;
+ std::vector< Filtration_value > edges_fil;
+ std::map< Vertex_handle, Filtration_value > vertices;
+
+ std::string line;
+ int dim;
+ Vertex_handle u,v,max_h = -1;
+ Filtration_value fil;
+ while( getline ( in_ , line ) )
+ {
+ std::istringstream iss( line );
+ while(iss >> dim) {
+ switch ( dim ) {
+ case 0 : {
+ iss >> u; iss >> fil;
+ vertices[u] = fil;
+ if(max_h < u) { max_h = u; }
+ break;
+ }
+ case 1 : {
+ iss >> u; iss >> v; iss >> fil;
+ edges.push_back(Edge_t(u,v));
+ edges_fil.push_back(fil);
+ break;
+ }
+ default: {break;}
+ }
+ }
+ }
+ in_.close();
+
+ if((size_t)(max_h+1) != vertices.size())
+ { std::cerr << "Error: vertices must be labeled from 0 to n-1 \n"; }
+
+ Graph_t skel_graph(edges.begin(),edges.end(),edges_fil.begin(),vertices.size());
+ auto vertex_prop = boost::get(vertex_filtration_t(),skel_graph);
+
+ boost::graph_traits<Graph_t>::vertex_iterator vi, vi_end;
+ auto v_it = vertices.begin();
+ for (tie(vi, vi_end) = boost::vertices(skel_graph); vi != vi_end; ++vi,++v_it)
+ { boost::put(vertex_prop, *vi, v_it->second); }
+
+ return skel_graph;
+}
+
+/**
+ * \brief Read a face from a file.
+ *
+ * File format: 1 simplex per line
+ * Dim1 X11 X12 ... X1d Fil1
+ * Dim2 X21 X22 ... X2d Fil2
+ * etc
+ *
+ * The vertices must be labeled from 0 to n-1.
+ * Every simplex must appear exactly once.
+ * Simplices of dimension more than 1 are ignored.
+ */
+template< typename Vertex_handle
+ , typename Filtration_value >
+bool read_simplex ( std::istream & in_
+ , std::vector< Vertex_handle > & simplex
+ , Filtration_value & fil )
+{
+ int dim=0;
+ if(!(in_ >> dim)) return false;
+ Vertex_handle v;
+ for(int i=0; i<dim+1; ++i)
+ { in_ >> v; simplex.push_back(v); }
+ in_ >> fil;
+ in_.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore until the carriage return
+ return true;
+}
+
+/**
+ * \brief Read a hasse simplex from a file.
+ *
+ * File format: 1 simplex per line
+ * Dim1 k11 k12 ... k1Dim1 Fil1
+ * Dim2 k21 k22 ... k2Dim2 Fil2
+ * etc
+ *
+ * The key of a simplex is its position in the filtration order
+ * and also the number of its row in the file.
+ * Dimi ki1 ki2 ... kiDimi Fili means that the ith simplex in the
+ * filtration has dimension Dimi, filtration value fil1 and simplices with
+ * key ki1 ... kiDimi in its boundary.*/
+template< typename Simplex_key
+ , typename Filtration_value >
+bool read_hasse_simplex ( std::istream & in_
+ , std::vector< Simplex_key > & boundary
+ , Filtration_value & fil )
+{
+ int dim;
+ if(!(in_ >> dim)) return false;
+ if(dim == 0) {in_ >> fil; return true;}
+ Simplex_key key;
+ for(int i=0; i<dim+1; ++i)
+ { in_ >> key; boundary.push_back(key); }
+ in_ >> fil;
+ return true;
+}
+
+#endif // GUDHI_READER_UTILS_H