summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-12-08 22:17:04 +0000
committervrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-12-08 22:17:04 +0000
commitb41fb07d4dbaf4e12c31b952cc2bc24e30c55384 (patch)
tree0393f116d51636a64287d5cab8815cf08735b2c4
parentccc1ca066fa7c1fb35929eceb52f2f36179aea37 (diff)
replace euclidean_distance with a class Euclidean_distance containing an operator()
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/distance_matrix_in_rips_module@1840 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: b1619401ac0ef978257709c5deeb7e19fbcff32c
-rw-r--r--src/GudhUI/utils/Persistence_compute.h2
-rw-r--r--src/Persistent_cohomology/benchmark/performance_rips_persistence.cpp3
-rw-r--r--src/Persistent_cohomology/example/rips_multifield_persistence.cpp3
-rw-r--r--src/Persistent_cohomology/example/rips_persistence.cpp3
-rw-r--r--src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp3
-rw-r--r--src/Rips_complex/example/example_one_skeleton_rips_from_points.cpp2
-rw-r--r--src/Rips_complex/example/example_rips_complex_from_off_file.cpp3
-rw-r--r--src/Rips_complex/test/test_rips_complex.cpp36
-rw-r--r--src/Witness_complex/include/gudhi/Construct_closest_landmark_table.h2
-rw-r--r--src/common/include/gudhi/distance_functions.h23
10 files changed, 39 insertions, 41 deletions
diff --git a/src/GudhUI/utils/Persistence_compute.h b/src/GudhUI/utils/Persistence_compute.h
index d2973d84..12283cbe 100644
--- a/src/GudhUI/utils/Persistence_compute.h
+++ b/src/GudhUI/utils/Persistence_compute.h
@@ -76,7 +76,7 @@ template<typename SkBlComplex> class Persistence_compute {
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp>;
- Rips_complex rips_complex(points, params.threshold, euclidean_distance<Filtration_value, Point_t>);
+ Rips_complex rips_complex(points, params.threshold, Euclidean_distance());
Simplex_tree st;
if (rips_complex.create_complex(st, params.max_dim)) {
diff --git a/src/Persistent_cohomology/benchmark/performance_rips_persistence.cpp b/src/Persistent_cohomology/benchmark/performance_rips_persistence.cpp
index a9eab5dd..ba752999 100644
--- a/src/Persistent_cohomology/benchmark/performance_rips_persistence.cpp
+++ b/src/Persistent_cohomology/benchmark/performance_rips_persistence.cpp
@@ -83,8 +83,7 @@ int main(int argc, char * argv[]) {
// Compute the proximity graph of the points
start = std::chrono::system_clock::now();
- Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold,
- euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Euclidean_distance());
end = std::chrono::system_clock::now();
elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
std::cout << "Compute Rips graph in " << elapsed_sec << " ms.\n";
diff --git a/src/Persistent_cohomology/example/rips_multifield_persistence.cpp b/src/Persistent_cohomology/example/rips_multifield_persistence.cpp
index aaa71db9..3389d8e1 100644
--- a/src/Persistent_cohomology/example/rips_multifield_persistence.cpp
+++ b/src/Persistent_cohomology/example/rips_multifield_persistence.cpp
@@ -62,8 +62,7 @@ int main(int argc, char * argv[]) {
program_options(argc, argv, off_file_points, filediag, threshold, dim_max, min_p, max_p, min_persistence);
Points_off_reader off_reader(off_file_points);
- Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold,
- euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
Simplex_tree simplex_tree;
diff --git a/src/Persistent_cohomology/example/rips_persistence.cpp b/src/Persistent_cohomology/example/rips_persistence.cpp
index 0b1873d4..bc62b736 100644
--- a/src/Persistent_cohomology/example/rips_persistence.cpp
+++ b/src/Persistent_cohomology/example/rips_persistence.cpp
@@ -61,8 +61,7 @@ int main(int argc, char * argv[]) {
program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence);
Points_off_reader off_reader(off_file_points);
- Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold,
- euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
Simplex_tree simplex_tree;
diff --git a/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp b/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp
index b7daf6ae..63da9847 100644
--- a/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp
+++ b/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp
@@ -70,8 +70,7 @@ int main(int argc, char * argv[]) {
program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence);
Points_off_reader off_reader(off_file_points);
- Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold,
- euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
Simplex_tree& st = *new Simplex_tree;
diff --git a/src/Rips_complex/example/example_one_skeleton_rips_from_points.cpp b/src/Rips_complex/example/example_one_skeleton_rips_from_points.cpp
index 68fc3629..e9e7ecd4 100644
--- a/src/Rips_complex/example/example_one_skeleton_rips_from_points.cpp
+++ b/src/Rips_complex/example/example_one_skeleton_rips_from_points.cpp
@@ -38,7 +38,7 @@ int main(int argc, char **argv) {
// ----------------------------------------------------------------------------
// Init of a rips complex from points
// ----------------------------------------------------------------------------
- Rips_complex rips_complex_from_points(points, threshold, euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_points(points, threshold, Euclidean_distance());
Simplex_tree simplex;
if (rips_complex_from_points.create_complex(simplex, 1)) {
diff --git a/src/Rips_complex/example/example_rips_complex_from_off_file.cpp b/src/Rips_complex/example/example_rips_complex_from_off_file.cpp
index 469de403..af2c7029 100644
--- a/src/Rips_complex/example/example_rips_complex_from_off_file.cpp
+++ b/src/Rips_complex/example/example_rips_complex_from_off_file.cpp
@@ -33,8 +33,7 @@ int main(int argc, char **argv) {
// Init of a rips complex from an OFF file
// ----------------------------------------------------------------------------
Gudhi::Points_off_reader<Point> off_reader(off_file_name);
- Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold,
- euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Euclidean_distance());
std::streambuf* streambufffer;
std::ofstream ouput_file_stream;
diff --git a/src/Rips_complex/test/test_rips_complex.cpp b/src/Rips_complex/test/test_rips_complex.cpp
index faedbf4a..2db1554d 100644
--- a/src/Rips_complex/test/test_rips_complex.cpp
+++ b/src/Rips_complex/test/test_rips_complex.cpp
@@ -61,8 +61,7 @@ BOOST_AUTO_TEST_CASE(RIPS_DOC_OFF_file) {
rips_threshold << "==========" << std::endl;
Gudhi::Points_off_reader<Point> off_reader(off_file_name);
- Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), rips_threshold,
- euclidean_distance<Filtration_value, Point>);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), rips_threshold, Euclidean_distance());
const int DIMENSION_1 = 1;
Simplex_tree st;
@@ -91,10 +90,10 @@ BOOST_AUTO_TEST_CASE(RIPS_DOC_OFF_file) {
std::cout << vertex << ",";
vp.push_back(off_reader.get_point_cloud().at(vertex));
}
- std::cout << ") - distance =" << euclidean_distance<double>(vp.at(0), vp.at(1)) <<
+ std::cout << ") - distance =" << Euclidean_distance()(vp.at(0), vp.at(1)) <<
" - filtration =" << st.filtration(f_simplex) << std::endl;
BOOST_CHECK(vp.size() == 2);
- BOOST_CHECK(are_almost_the_same(st.filtration(f_simplex), euclidean_distance<double>(vp.at(0), vp.at(1))));
+ BOOST_CHECK(are_almost_the_same(st.filtration(f_simplex), Euclidean_distance()(vp.at(0), vp.at(1))));
}
}
@@ -157,19 +156,20 @@ bool is_point_in_list(Vector_of_points points_list, Point point) {
return false; // point not found
}
-/* Compute the square value of Euclidean distance between two Points given by a range of coordinates.
- * The points are assumed to have the same dimension. */
-template< typename Point >
-double custom_square_euclidean_distance(const Point &p1,const Point &p2) {
- double dist = 0.;
- auto it1 = p1.begin();
- auto it2 = p2.begin();
- for (; it1 != p1.end(); ++it1, ++it2) {
- double tmp = *it1 - *it2;
- dist += tmp*tmp;
+class Custom_square_euclidean_distance {
+ public:
+ template< typename Point >
+ auto operator()(const Point& p1, const Point& p2) -> typename Point::value_type {
+ auto it1 = p1.begin();
+ auto it2 = p2.begin();
+ typename Point::value_type dist = 0.;
+ for (; it1 != p1.end(); ++it1, ++it2) {
+ typename Point::value_type tmp = (*it1) - (*it2);
+ dist += tmp*tmp;
+ }
+ return dist;
}
- return dist;
-}
+};
BOOST_AUTO_TEST_CASE(Rips_complex_from_points) {
// ----------------------------------------------------------------------------
@@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(Rips_complex_from_points) {
// ----------------------------------------------------------------------------
// Init of a rips complex from the list of points
// ----------------------------------------------------------------------------
- Rips_complex rips_complex_from_points(points, 2.0, custom_square_euclidean_distance<Point>);
+ Rips_complex rips_complex_from_points(points, 2.0, Custom_square_euclidean_distance());
std::cout << "========== Rips_complex_from_points ==========" << std::endl;
Simplex_tree st;
@@ -327,4 +327,4 @@ BOOST_AUTO_TEST_CASE(Rips_doc_csv_file) {
" - f023= " << f023 << std::endl;
BOOST_CHECK(are_almost_the_same(f0123, std::max(f012, std::max(f123, std::max(f013, f023)))));
-} \ No newline at end of file
+}
diff --git a/src/Witness_complex/include/gudhi/Construct_closest_landmark_table.h b/src/Witness_complex/include/gudhi/Construct_closest_landmark_table.h
index 1ae2e393..a8cdd096 100644
--- a/src/Witness_complex/include/gudhi/Construct_closest_landmark_table.h
+++ b/src/Witness_complex/include/gudhi/Construct_closest_landmark_table.h
@@ -73,7 +73,7 @@ namespace witness_complex {
int landmarks_i = 0;
for (landmarks_it = landmarks.begin(), landmarks_i = 0; landmarks_it != landmarks.end();
++landmarks_it, landmarks_i++) {
- dist_i dist = std::make_pair(euclidean_distance<FiltrationValue>(points[points_i], *landmarks_it),
+ dist_i dist = std::make_pair(Euclidean_distance()(points[points_i], *landmarks_it),
landmarks_i);
l_heap.push(dist);
}
diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h
index 58a513e7..5c7f3d55 100644
--- a/src/common/include/gudhi/distance_functions.h
+++ b/src/common/include/gudhi/distance_functions.h
@@ -31,16 +31,19 @@
/** @brief Compute the Euclidean distance between two Points given by a range of coordinates. The points are assumed to
* have the same dimension. */
-template< typename Filtration_value, typename Point >
-Filtration_value euclidean_distance(const Point &p1, const Point &p2) {
- Filtration_value dist = 0.;
- auto it1 = p1.begin();
- auto it2 = p2.begin();
- for (; it1 != p1.end(); ++it1, ++it2) {
- Filtration_value tmp = static_cast<double>(*it1) - static_cast<double>(*it2);
- dist += tmp*tmp;
+class Euclidean_distance {
+ public:
+ template< typename Point >
+ auto operator()(const Point& p1, const Point& p2) -> typename Point::value_type {
+ auto it1 = p1.begin();
+ auto it2 = p2.begin();
+ typename Point::value_type dist = 0.;
+ for (; it1 != p1.end(); ++it1, ++it2) {
+ typename Point::value_type tmp = (*it1) - (*it2);
+ dist += tmp*tmp;
+ }
+ return std::sqrt(dist);
}
- return std::sqrt(dist);
-}
+};
#endif // DISTANCE_FUNCTIONS_H_