diff options
Diffstat (limited to 'src/Bottleneck_distance')
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.); } |