summaryrefslogtreecommitdiff
path: root/src/Witness_complex/example
diff options
context:
space:
mode:
Diffstat (limited to 'src/Witness_complex/example')
-rw-r--r--src/Witness_complex/example/CMakeLists.txt1
-rw-r--r--src/Witness_complex/example/generators.h153
-rw-r--r--src/Witness_complex/example/witness_complex_from_file.cpp77
-rw-r--r--src/Witness_complex/example/witness_complex_sphere.cpp77
4 files changed, 158 insertions, 150 deletions
diff --git a/src/Witness_complex/example/CMakeLists.txt b/src/Witness_complex/example/CMakeLists.txt
index fa6dd062..b304479e 100644
--- a/src/Witness_complex/example/CMakeLists.txt
+++ b/src/Witness_complex/example/CMakeLists.txt
@@ -34,6 +34,7 @@ if(CGAL_FOUND)
add_executable ( witness_complex_sphere witness_complex_sphere.cpp )
target_link_libraries(witness_complex_sphere ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+ add_test( witness_complex_sphere_10 ${CMAKE_CURRENT_BINARY_DIR}/witness_complex_sphere 10)
else()
message(WARNING "Eigen3 not found. Version 3.1.0 is required for witness_complex_sphere example.")
endif()
diff --git a/src/Witness_complex/example/generators.h b/src/Witness_complex/example/generators.h
index 0d42cda2..ac445261 100644
--- a/src/Witness_complex/example/generators.h
+++ b/src/Witness_complex/example/generators.h
@@ -1,11 +1,35 @@
-#ifndef GENERATORS_H
-#define GENERATORS_H
+/* 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): Siargey Kachanovich
+ *
+ * Copyright (C) 2015 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/>.
+ */
-#include <fstream>
+#ifndef EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
+#define EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
#include <CGAL/Epick_d.h>
#include <CGAL/point_generators_d.h>
+#include <fstream>
+#include <string>
+#include <vector>
+
typedef CGAL::Epick_d<CGAL::Dynamic_dimension_tag> K;
typedef K::FT FT;
typedef K::Point_d Point_d;
@@ -18,36 +42,33 @@ typedef CGAL::Random_points_in_ball_d<Point_d> Random_point_iterator;
*
*/
inline void
-off_reader_cust ( std::string file_name , std::vector<Point_d> & 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;
- }
+off_reader_cust(std::string file_name, std::vector<Point_d> & 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;
// Line OFF. No need in it
- if (!getline(in_file, line))
- {
- std::cerr << "No line OFF\n";
- return;
- }
+ if (!getline(in_file, line)) {
+ std::cerr << "No line OFF\n";
+ return;
+ }
// Line with 3 numbers. No need
- if (!getline(in_file, line))
- {
- std::cerr << "No line with 3 numbers\n";
- return;
- }
+ if (!getline(in_file, line)) {
+ std::cerr << "No line with 3 numbers\n";
+ return;
+ }
// Reading points
- while( getline ( in_file , line ) )
- {
- std::vector< double > point;
- std::istringstream iss( line );
- while(iss >> x) { point.push_back(x); }
- points.push_back(Point_d(point));
+ while (getline(in_file, line)) {
+ std::vector< double > point;
+ std::istringstream iss(line);
+ while (iss >> x) {
+ point.push_back(x);
}
+ points.push_back(Point_d(point));
+ }
in_file.close();
}
@@ -57,25 +78,24 @@ off_reader_cust ( std::string file_name , std::vector<Point_d> & points)
*
*/
inline void
-read_points_cust ( std::string file_name , Point_Vector & 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;
- }
+read_points_cust(std::string file_name, Point_Vector & 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); }
- Point_d p(point.begin(), point.end());
- if (point.size() != 1)
- points.push_back(p);
+ while (getline(in_file, line)) {
+ std::vector< double > point;
+ std::istringstream iss(line);
+ while (iss >> x) {
+ point.push_back(x);
}
+ Point_d p(point.begin(), point.end());
+ if (point.size() != 1)
+ points.push_back(p);
+ }
in_file.close();
}
@@ -86,49 +106,42 @@ read_points_cust ( std::string file_name , Point_Vector & points)
* a flat torus, hence the opposite borders are associated.
* The points on border in this case are not placed twice.
*/
-void generate_points_grid(Point_Vector& W, int width, int D, bool torus)
-{
+void generate_points_grid(Point_Vector& W, int width, int D, bool torus) {
int nb_points = 1;
for (int i = 0; i < D; ++i)
nb_points *= width;
- for (int i = 0; i < nb_points; ++i)
- {
- std::vector<double> point;
- int cell_i = i;
- for (int l = 0; l < D; ++l)
- {
- if (torus)
- point.push_back(-1+(2.0/(width-1))*(cell_i%width));
- else
- point.push_back(-1+(2.0/width)*(cell_i%width));
- //attention: the bottom and the right are covered too!
- cell_i /= width;
- }
- W.push_back(point);
+ for (int i = 0; i < nb_points; ++i) {
+ std::vector<double> point;
+ int cell_i = i;
+ for (int l = 0; l < D; ++l) {
+ if (torus)
+ point.push_back(-1 + (2.0 / (width - 1))*(cell_i % width));
+ else
+ point.push_back(-1 + (2.0 / width)*(cell_i % width));
+ // attention: the bottom and the right are covered too!
+ cell_i /= width;
}
+ W.push_back(point);
+ }
}
/** \brief Generate nbP points uniformly in a cube of side 2
* having {+-1}^dim as its vertices and insert them in W.
*/
-void generate_points_random_box(Point_Vector& W, int nbP, int dim)
-{
+void generate_points_random_box(Point_Vector& W, int nbP, int dim) {
Random_cube_iterator rp(dim, 1.0);
- for (int i = 0; i < nbP; i++)
- {
- W.push_back(*rp++);
- }
+ for (int i = 0; i < nbP; i++) {
+ W.push_back(*rp++);
+ }
}
/** \brief Generate nbP points uniformly on a (dim-1)-sphere
* and insert them in W.
*/
-void generate_points_sphere(Point_Vector& W, int nbP, int dim)
-{
- CGAL::Random_points_on_sphere_d<Point_d> rp(dim,1);
+void generate_points_sphere(Point_Vector& W, int nbP, int dim) {
+ CGAL::Random_points_on_sphere_d<Point_d> rp(dim, 1);
for (int i = 0; i < nbP; i++)
W.push_back(*rp++);
}
-
-#endif
+#endif // EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
diff --git a/src/Witness_complex/example/witness_complex_from_file.cpp b/src/Witness_complex/example/witness_complex_from_file.cpp
index 72caf30b..d94502b1 100644
--- a/src/Witness_complex/example/witness_complex_from_file.cpp
+++ b/src/Witness_complex/example/witness_complex_from_file.cpp
@@ -20,17 +20,19 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <iostream>
-#include <fstream>
-#include <ctime>
-
#include <sys/types.h>
#include <sys/stat.h>
-#include "gudhi/Simplex_tree.h"
-#include "gudhi/Witness_complex.h"
-#include "gudhi/Landmark_choice_by_random_point.h"
-#include "gudhi/reader_utils.h"
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Witness_complex.h>
+#include <gudhi/Landmark_choice_by_random_point.h>
+#include <gudhi/reader_utils.h>
+
+#include <iostream>
+#include <fstream>
+#include <ctime>
+#include <string>
+#include <vector>
using namespace Gudhi;
using namespace Gudhi::witness_complex;
@@ -46,24 +48,23 @@ typedef Witness_complex< Simplex_tree<> > WitnessComplex;
*
*/
inline void
-read_points_cust ( 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;
- }
+read_points_cust(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); }
- if (point.size() != 1)
- points.push_back(point);
+ while (getline(in_file, line)) {
+ std::vector< double > point;
+ std::istringstream iss(line);
+ while (iss >> x) {
+ point.push_back(x);
}
+ if (point.size() != 1)
+ points.push_back(point);
+ }
in_file.close();
}
@@ -71,25 +72,22 @@ read_points_cust ( std::string file_name , std::vector< std::vector< double > >
* Data range is a random access range of pairs (arg, value)
*/
template < typename Data_range >
-void write_data( Data_range & data, std::string filename )
-{
+void write_data(Data_range & data, std::string filename) {
std::ofstream ofs(filename, std::ofstream::out);
- for (auto entry: data)
+ for (auto entry : data)
ofs << entry.first << ", " << entry.second << "\n";
ofs.close();
}
-int main (int argc, char * const argv[])
-{
- if (argc != 3)
- {
- std::cerr << "Usage: " << argv[0]
- << " path_to_point_file nbL \n";
- return 0;
- }
+int main(int argc, char * const argv[]) {
+ if (argc != 3) {
+ std::cerr << "Usage: " << argv[0]
+ << " path_to_point_file nbL \n";
+ return 0;
+ }
- std::string file_name = argv[1];
- int nbL = atoi(argv[2]);
+ std::string file_name = argv[1];
+ int nbL = atoi(argv[2]);
clock_t start, end;
// Construct the Simplex Tree
@@ -107,13 +105,12 @@ int main (int argc, char * const argv[])
Landmark_choice_by_random_point(point_vector, nbL, knn);
end = clock();
std::cout << "Landmark choice for " << nbL << " landmarks took "
- << (double)(end-start)/CLOCKS_PER_SEC << " s. \n";
-
+ << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
+
// Compute witness complex
start = clock();
WitnessComplex(knn, simplex_tree, nbL, point_vector[0].size());
end = clock();
std::cout << "Witness complex took "
- << (double)(end-start)/CLOCKS_PER_SEC << " s. \n";
-
+ << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
}
diff --git a/src/Witness_complex/example/witness_complex_sphere.cpp b/src/Witness_complex/example/witness_complex_sphere.cpp
index 9dc458d4..36f63437 100644
--- a/src/Witness_complex/example/witness_complex_sphere.cpp
+++ b/src/Witness_complex/example/witness_complex_sphere.cpp
@@ -22,11 +22,6 @@
#define BOOST_PARAMETER_MAX_ARITY 12
-#include <iostream>
-#include <fstream>
-#include <ctime>
-#include <utility>
-
#include <sys/types.h>
#include <sys/stat.h>
@@ -35,6 +30,13 @@
#include <gudhi/Landmark_choice_by_random_point.h>
#include <gudhi/reader_utils.h>
+#include <iostream>
+#include <fstream>
+#include <ctime>
+#include <utility>
+#include <string>
+#include <vector>
+
#include "generators.h"
using namespace Gudhi;
@@ -44,56 +46,51 @@ typedef std::vector< Vertex_handle > typeVectorVertex;
typedef Witness_complex< Simplex_tree<> > WitnessComplex;
-
/** Write a gnuplot readable file.
* Data range is a random access range of pairs (arg, value)
*/
template < typename Data_range >
-void write_data( Data_range & data, std::string filename )
-{
+void write_data(Data_range & data, std::string filename) {
std::ofstream ofs(filename, std::ofstream::out);
- for (auto entry: data)
+ for (auto entry : data)
ofs << entry.first << ", " << entry.second << "\n";
ofs.close();
}
-int main (int argc, char * const argv[])
-{
- if (argc != 2)
- {
- std::cerr << "Usage: " << argv[0]
- << " nbL \n";
- return 0;
- }
+int main(int argc, char * const argv[]) {
+ if (argc != 2) {
+ std::cerr << "Usage: " << argv[0]
+ << " nbL \n";
+ return 0;
+ }
- int nbL = atoi(argv[1]);
+ int nbL = atoi(argv[1]);
clock_t start, end;
// Construct the Simplex Tree
Simplex_tree<> simplex_tree;
- std::vector< std::pair<int, double> > l_time;
-
+ std::vector< std::pair<int, double> > l_time;
+
// Read the point file
- for (int nbP = 500; nbP < 10000; nbP += 500)
- {
- Point_Vector point_vector;
- generate_points_sphere(point_vector, nbP, 4);
- std::cout << "Successfully generated " << point_vector.size() << " points.\n";
- std::cout << "Ambient dimension is " << point_vector[0].size() << ".\n";
-
- // Choose landmarks
- start = clock();
- std::vector<std::vector< int > > knn;
- Landmark_choice_by_random_point(point_vector, nbL, knn);
-
- // Compute witness complex
- WitnessComplex(knn, simplex_tree, nbL, point_vector[0].size());
- end = clock();
- double time = (double)(end-start)/CLOCKS_PER_SEC;
- std::cout << "Witness complex for " << nbL << " landmarks took "
- << time << " s. \n";
- l_time.push_back(std::make_pair(nbP,time));
- }
+ for (int nbP = 500; nbP < 10000; nbP += 500) {
+ Point_Vector point_vector;
+ generate_points_sphere(point_vector, nbP, 4);
+ std::cout << "Successfully generated " << point_vector.size() << " points.\n";
+ std::cout << "Ambient dimension is " << point_vector[0].size() << ".\n";
+
+ // Choose landmarks
+ start = clock();
+ std::vector<std::vector< int > > knn;
+ Landmark_choice_by_random_point(point_vector, nbL, knn);
+
+ // Compute witness complex
+ WitnessComplex(knn, simplex_tree, nbL, point_vector[0].size());
+ end = clock();
+ double time = static_cast<double>(end - start) / CLOCKS_PER_SEC;
+ std::cout << "Witness complex for " << nbL << " landmarks took "
+ << time << " s. \n";
+ l_time.push_back(std::make_pair(nbP, time));
+ }
write_data(l_time, "w_time.dat");
}