From 945c7a6ccd23abd0c854777eebda762dea450490 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 26 Jun 2020 12:08:32 +0200 Subject: Free function, doc and basic example --- .../include/gudhi/Flag_complex_edge_collapser.h | 40 ++++++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'src/Collapse/include') diff --git a/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h b/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h index 9cd57d7e..981ec88d 100644 --- a/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h +++ b/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h @@ -12,11 +12,9 @@ #ifndef FLAG_COMPLEX_EDGE_COLLAPSER_H_ #define FLAG_COMPLEX_EDGE_COLLAPSER_H_ -#include #include #include -#include #include #include @@ -39,12 +37,11 @@ namespace Gudhi { namespace collapse { -/** +/** \private + * * \class Flag_complex_edge_collapser * \brief Flag complex sparse matrix data structure. * - * \ingroup collapse - * * \details * This class stores a Flag complex * in an Eigen sparse matrix. @@ -296,7 +293,7 @@ class Flag_complex_edge_collapser { * `Flag_complex_edge_collapser::Filtered_edge`. */ template - Flag_complex_edge_collapser(FilteredEdgeRange edges) + Flag_complex_edge_collapser(const FilteredEdgeRange& edges) : f_edge_vector_(std::begin(edges), std::end(edges)) { } /** \brief Performs edge collapse in a increasing sequence of the filtration value. @@ -310,7 +307,7 @@ class Flag_complex_edge_collapser { // Sort edges auto sort_by_filtration = [](const Filtered_edge& edge_a, const Filtered_edge& edge_b) -> bool { - return (get<2>(edge_a) < get<2>(edge_b)); + return (std::get<2>(edge_a) < std::get<2>(edge_b)); }; #ifdef GUDHI_USE_TBB @@ -342,6 +339,35 @@ class Flag_complex_edge_collapser { }; +/** \brief Constructs a Flag complex from edges as an input, collapse edges and returns remaining edges. + * + * \fn auto Gudhi::collapse::flag_complex_collapse_edges(FilteredEdgeRange const& edges) + * + * \tparam FilteredEdgeRange furnishes `std::begin` and `std::end` methods and returns an iterator on a + * FilteredEdge of type `std::tuple` + * + * \ingroup edge_collapse + * + */ +template auto flag_complex_collapse_edges(const FilteredEdgeRange& edges) { + auto first_edge_itr = std::begin(edges); + auto first_vertex = std::get<0>(*first_edge_itr); + auto first_filt = std::get<2>(*first_edge_itr); + using Vertex_handle = decltype(first_vertex); + using Filtration_value = decltype(first_filt); + using Edge_collapser = Flag_complex_edge_collapser; + std::vector remaining_edges; + if (first_edge_itr != std::end(edges)) { + Edge_collapser edge_collapser(edges); + edge_collapser.process_edges( + [&remaining_edges](Vertex_handle u, Vertex_handle v, Filtration_value filtration) { + // insert the edge + remaining_edges.emplace_back(u, v, filtration); + }); + } + return remaining_edges; +} + } // namespace collapse } // namespace Gudhi -- cgit v1.2.3