summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfgodi <fgodi@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-11-29 09:00:07 +0000
committerfgodi <fgodi@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-11-29 09:00:07 +0000
commit759b53891e1572df0ea0562828fcd88d8f8f3031 (patch)
tree5d408c097c79cd82e9942e0f24c33e81cf0f3109
parent0cf9b8901ed858cba7ac16fcd5a65e631dc22782 (diff)
basic example, infinity
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/bottleneck_integration@1797 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 23432677e7f1628dda596e9ba31138fc5063a608
-rw-r--r--src/Bottleneck_distance/concept/Persistence_diagram.h3
-rw-r--r--src/Bottleneck_distance/example/CMakeLists.txt3
-rw-r--r--src/Bottleneck_distance/example/bottleneck_basic_example.cpp48
-rw-r--r--src/Bottleneck_distance/example/bottleneck_read_file_example.cpp (renamed from src/Bottleneck_distance/example/bottleneck_example.cpp)2
-rw-r--r--src/Bottleneck_distance/include/gudhi/Persistence_graph.h5
-rw-r--r--src/Bottleneck_distance/test/bottleneck_unit_test.cpp4
6 files changed, 58 insertions, 7 deletions
diff --git a/src/Bottleneck_distance/concept/Persistence_diagram.h b/src/Bottleneck_distance/concept/Persistence_diagram.h
index 2ca10094..d55f5573 100644
--- a/src/Bottleneck_distance/concept/Persistence_diagram.h
+++ b/src/Bottleneck_distance/concept/Persistence_diagram.h
@@ -27,7 +27,8 @@ namespace Gudhi {
namespace bottleneck_distance {
-/** \brief Concept of persistence diagram point. get<0>() must return the birth of the component and get<1>() its death.
+/** \brief Concept of Diagram_point. get<0>() must return the birth of the corresponding component and get<1>() its death.
+ * If the component stay alive, get<1>() must return std::numeric_limits<double>::infinity().
*
* \ingroup bottleneck_distance
*/
diff --git a/src/Bottleneck_distance/example/CMakeLists.txt b/src/Bottleneck_distance/example/CMakeLists.txt
index 6f3204f6..cd53ccfc 100644
--- a/src/Bottleneck_distance/example/CMakeLists.txt
+++ b/src/Bottleneck_distance/example/CMakeLists.txt
@@ -6,7 +6,8 @@ project(Bottleneck_distance_examples)
if(CGAL_FOUND)
if (NOT CGAL_VERSION VERSION_LESS 4.8.0)
if (EIGEN3_FOUND)
- add_executable (bottleneck_example bottleneck_example.cpp)
+ add_executable (bottleneck_read_file_example bottleneck_read_file_example.cpp)
+ add_executable (bottleneck_basic_example bottleneck_basic_example.cpp)
endif()
endif ()
endif()
diff --git a/src/Bottleneck_distance/example/bottleneck_basic_example.cpp b/src/Bottleneck_distance/example/bottleneck_basic_example.cpp
new file mode 100644
index 00000000..95548579
--- /dev/null
+++ b/src/Bottleneck_distance/example/bottleneck_basic_example.cpp
@@ -0,0 +1,48 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Authors: Francois Godi, small modifications by Pawel Dlotko
+ *
+ * Copyright (C) 2015 INRIA (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 <gudhi/Bottleneck.h>
+#include <iostream>
+
+int main() {
+
+ std::vector< std::pair<double, double> > v1, v2;
+
+ v1.emplace_back(2.7, 3.7);
+ v1.emplace_back(9.6, 14.);
+ v1.emplace_back(34.2, 34.974);
+ v1.emplace_back(3., std::numeric_limits<double>::infinity());
+
+ v2.emplace_back(2.8, 4.45);
+ v2.emplace_back(9.5, 14.1);
+ v2.emplace_back(3.2, std::numeric_limits<double>::infinity());
+
+
+ double b = Gudhi::bottleneck_distance::compute(v1, v2);
+
+ std::cout << "Bottleneck distance = " << b << std::endl;
+
+ b = Gudhi::bottleneck_distance::compute(v1, v2, 0.1);
+
+ std::cout << "Approx bottleneck distance = " << b << std::endl;
+
+}
diff --git a/src/Bottleneck_distance/example/bottleneck_example.cpp b/src/Bottleneck_distance/example/bottleneck_read_file_example.cpp
index 28e458a5..4a503e4c 100644
--- a/src/Bottleneck_distance/example/bottleneck_example.cpp
+++ b/src/Bottleneck_distance/example/bottleneck_read_file_example.cpp
@@ -67,7 +67,7 @@ int main( int argc , char** argv )
}
std::vector< std::pair< double , double > > diag1 = read_diagram_from_file( argv[1] );
std::vector< std::pair< double , double > > diag2 = read_diagram_from_file( argv[2] );
- double tolerance = 0;
+ double tolerance = 0.;
if ( argc == 4 )
{
tolerance = atof( argv[3] );
diff --git a/src/Bottleneck_distance/include/gudhi/Persistence_graph.h b/src/Bottleneck_distance/include/gudhi/Persistence_graph.h
index a4ea6968..506dba52 100644
--- a/src/Bottleneck_distance/include/gudhi/Persistence_graph.h
+++ b/src/Bottleneck_distance/include/gudhi/Persistence_graph.h
@@ -74,10 +74,10 @@ Persistence_graph::Persistence_graph(const Persistence_diagram1 &diag1,
: u(), v()
{
for (auto it = diag1.cbegin(); it != diag1.cend(); ++it)
- if (it->second - it->first > e)
+ if (it->second != std::numeric_limits<double>::infinity() && it->second - it->first > e)
u.push_back(Internal_point(std::get<0>(*it), std::get<1>(*it), u.size()));
for (auto it = diag2.cbegin(); it != diag2.cend(); ++it)
- if (it->second - it->first > e)
+ if (it->second != std::numeric_limits<double>::infinity() && it->second - it->first > e)
v.push_back(Internal_point(std::get<0>(*it), std::get<1>(*it), v.size()));
if (u.size() < v.size())
swap(u, v);
@@ -120,6 +120,7 @@ inline std::vector<double> Persistence_graph::sorted_distances() const {
for (int u_point_index = 0; u_point_index < size(); ++u_point_index)
for (int v_point_index = 0; v_point_index < size(); ++v_point_index)
sorted_distances.emplace(distance(u_point_index, v_point_index));
+ sorted_distances.emplace(std::numeric_limits<double>::infinity());
return std::vector<double>(sorted_distances.begin(),sorted_distances.end());
}
diff --git a/src/Bottleneck_distance/test/bottleneck_unit_test.cpp b/src/Bottleneck_distance/test/bottleneck_unit_test.cpp
index 2237b073..84101274 100644
--- a/src/Bottleneck_distance/test/bottleneck_unit_test.cpp
+++ b/src/Bottleneck_distance/test/bottleneck_unit_test.cpp
@@ -39,7 +39,7 @@ std::uniform_real_distribution<double> unif(0.,upper_bound);
std::default_random_engine re;
std::vector< std::pair<double, double> > v1, v2;
-BOOST_AUTO_TEST_CASE(persistence_diagrams_graph){
+BOOST_AUTO_TEST_CASE(persistence_graph){
// Random construction
for (int i = 0; i < n1; i++) {
double a = unif(re);
@@ -70,7 +70,7 @@ BOOST_AUTO_TEST_CASE(persistence_diagrams_graph){
//
BOOST_CHECK(g.size()==(n1+n2));
//
- BOOST_CHECK((int) d.size() <= (n1+n2)*(n1+n2) - n1*n2 + 1);
+ BOOST_CHECK((int) d.size() <= (n1+n2)*(n1+n2) - n1*n2 + 2);
BOOST_CHECK(std::count(d.begin(), d.end(), g.distance(0,0))==1);
BOOST_CHECK(std::count(d.begin(), d.end(), g.distance(0,n1-1))==1);
BOOST_CHECK(std::count(d.begin(), d.end(), g.distance(0,n1))==1);