summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Bottleneck_distance/concept/Persistence_diagram.h11
-rw-r--r--src/Bottleneck_distance/example/bottleneck_example.cpp2
-rw-r--r--src/Bottleneck_distance/include/gudhi/Bottleneck.h20
-rw-r--r--src/Bottleneck_distance/include/gudhi/Persistence_diagrams_graph.h4
-rw-r--r--src/Bottleneck_distance/test/bottleneck_unit_test.cpp1
5 files changed, 16 insertions, 22 deletions
diff --git a/src/Bottleneck_distance/concept/Persistence_diagram.h b/src/Bottleneck_distance/concept/Persistence_diagram.h
index 4c69343c..1ab768ba 100644
--- a/src/Bottleneck_distance/concept/Persistence_diagram.h
+++ b/src/Bottleneck_distance/concept/Persistence_diagram.h
@@ -27,23 +27,22 @@ namespace Gudhi {
namespace bottleneck_distance {
-/** \brief Concept of persistence diagram point. The double first is the birth of the component and the double second is the death of the component.
+/** \brief Concept of persistence diagram point. get<0>() must return the birth of the component and get<1>() its death.
*
* \ingroup bottleneck_distance
*/
struct Diagram_point{
- double first;
- double second;
+ double get<int>();
};
-/** \brief Concept of persistence diagram.
+/** \brief Concept of persistence diagram. It's a range of Diagram_point.
*
* \ingroup bottleneck_distance
*/
struct Persistence_Diagram
{
- const_iterator<Diagram_point> cbegin() const;
- const_iterator<Diagram_point> cend() const;
+ const_iterator<Diagram_point> begin();
+ const_iterator<Diagram_point> end();
};
} // namespace bottleneck_distance
diff --git a/src/Bottleneck_distance/example/bottleneck_example.cpp b/src/Bottleneck_distance/example/bottleneck_example.cpp
index fd0f8ed5..b1b98a82 100644
--- a/src/Bottleneck_distance/example/bottleneck_example.cpp
+++ b/src/Bottleneck_distance/example/bottleneck_example.cpp
@@ -73,5 +73,5 @@ int main( int argc , char** argv )
tolerance = atof( argv[3] );
}
double b = Gudhi::bottleneck_distance::compute(diag1, diag2, tolerance);
- std::cout << "The distance between the diagrams is : " << b << ". The tolerace is : " << tolerance << std::endl;
+ std::cout << "The distance between the diagrams is : " << b << ". The tolerance is : " << tolerance << std::endl;
}
diff --git a/src/Bottleneck_distance/include/gudhi/Bottleneck.h b/src/Bottleneck_distance/include/gudhi/Bottleneck.h
index 1ae7788c..71845e25 100644
--- a/src/Bottleneck_distance/include/gudhi/Bottleneck.h
+++ b/src/Bottleneck_distance/include/gudhi/Bottleneck.h
@@ -29,17 +29,6 @@ namespace Gudhi {
namespace bottleneck_distance {
-/** \brief Function to use in order to compute the Bottleneck distance between two persistence diagrams. You get an additive e-approximation.
- *
- *
- * \ingroup bottleneck_distance
- */
-template<typename Persistence_diagram1, typename Persistence_diagram2>
-double compute(const Persistence_diagram1& diag1, const Persistence_diagram2& diag2, double e = 0.);
-
-template<typename Persistence_diagram1, typename Persistence_diagram2>
-double compute_exactly(const Persistence_diagram1& diag1, const Persistence_diagram2& diag2);
-
template<typename Persistence_diagram1, typename Persistence_diagram2>
double compute_exactly(const Persistence_diagram1 &diag1, const Persistence_diagram2 &diag2) {
G::initialize(diag1, diag2, 0.);
@@ -66,9 +55,14 @@ double compute_exactly(const Persistence_diagram1 &diag1, const Persistence_diag
return sd.at(idmin);
}
+/** \brief Function to use in order to compute the Bottleneck distance between two persistence diagrams.
+ * If the last parameter e is not 0 (default value if not explicited), you get an additive e-approximation.
+ *
+ * \ingroup bottleneck_distance
+ */
template<typename Persistence_diagram1, typename Persistence_diagram2>
-double compute(const Persistence_diagram1 &diag1, const Persistence_diagram2 &diag2, double e) {
- if(e< std::numeric_limits<double>::min())
+double compute(const Persistence_diagram1 &diag1, const Persistence_diagram2 &diag2, double e=0.) {
+ if(e == 0.)
return compute_exactly(diag1, diag2);
G::initialize(diag1, diag2, e);
int in = G::diameter()/e;
diff --git a/src/Bottleneck_distance/include/gudhi/Persistence_diagrams_graph.h b/src/Bottleneck_distance/include/gudhi/Persistence_diagrams_graph.h
index 7af149e4..7d37b9e0 100644
--- a/src/Bottleneck_distance/include/gudhi/Persistence_diagrams_graph.h
+++ b/src/Bottleneck_distance/include/gudhi/Persistence_diagrams_graph.h
@@ -83,10 +83,10 @@ inline void G::initialize(const Persistence_diagram1 &diag1,
v.clear();
for (auto it = diag1.cbegin(); it != diag1.cend(); ++it)
if (it->second - it->first > e)
- u.push_back(Internal_point(it->first, it->second, u.size()));
+ 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)
- v.push_back(Internal_point(it->first, it->second, v.size()));
+ v.push_back(Internal_point(std::get<0>(*it), std::get<1>(*it), v.size()));
if (u.size() < v.size())
swap(u, v);
}
diff --git a/src/Bottleneck_distance/test/bottleneck_unit_test.cpp b/src/Bottleneck_distance/test/bottleneck_unit_test.cpp
index b757ce54..e2cd3c05 100644
--- a/src/Bottleneck_distance/test/bottleneck_unit_test.cpp
+++ b/src/Bottleneck_distance/test/bottleneck_unit_test.cpp
@@ -186,4 +186,5 @@ BOOST_AUTO_TEST_CASE(global){
v2.emplace_back(std::max(a,b),std::max(a,b)+y);
}
BOOST_CHECK(compute(v1, v2) <= upper_bound/100.);
+ BOOST_CHECK(compute(v1, v2, upper_bound/1000.) <= upper_bound/100. + upper_bound/1000.);
}