From b522b330b10d11f0da640b8bba7ee689dea774d7 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Thu, 25 Jun 2020 17:10:36 +0200 Subject: Remove interface with boost graphs and use boost transform for data from graphs --- .../example/edge_collapse_basic_example.cpp | 2 +- .../example/edge_collapse_conserve_persistence.cpp | 10 ++++- .../include/gudhi/Flag_complex_edge_collapser.h | 46 +++------------------- src/Collapse/test/collapse_unit_test.cpp | 13 +++++- ...tance_matrix_edge_collapse_rips_persistence.cpp | 9 ++++- .../point_cloud_edge_collapse_rips_persistence.cpp | 9 ++++- 6 files changed, 43 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/Collapse/example/edge_collapse_basic_example.cpp b/src/Collapse/example/edge_collapse_basic_example.cpp index 8e7ca3b1..69ce329e 100644 --- a/src/Collapse/example/edge_collapse_basic_example.cpp +++ b/src/Collapse/example/edge_collapse_basic_example.cpp @@ -25,7 +25,7 @@ int main() { {0, 2, 2.}, {1, 3, 2.}}; - Flag_complex_edge_collapser edge_collapser(graph.begin(), graph.end()); + Flag_complex_edge_collapser edge_collapser(graph); Filtered_edge_list remaining_edges; // Retrieve collapse edges from the output iterator diff --git a/src/Collapse/example/edge_collapse_conserve_persistence.cpp b/src/Collapse/example/edge_collapse_conserve_persistence.cpp index d78a4d54..e6672d25 100644 --- a/src/Collapse/example/edge_collapse_conserve_persistence.cpp +++ b/src/Collapse/example/edge_collapse_conserve_persistence.cpp @@ -15,6 +15,8 @@ #include #include +#include + #include // for std::pair #include #include @@ -109,7 +111,13 @@ int main(int argc, char* argv[]) { int ambient_dim = point_vector[0].size(); // ***** Simplex tree from a flag complex built after collapse ***** - Flag_complex_edge_collapser edge_collapser(proximity_graph); + Flag_complex_edge_collapser edge_collapser( + boost::adaptors::transform(edges(proximity_graph), [&](auto&&edge){ + return std::make_tuple(source(edge, proximity_graph), + target(edge, proximity_graph), + get(Gudhi::edge_filtration_t(), proximity_graph, edge)); + }) + ); Simplex_tree stree_from_collapse; for (Vertex_handle vertex = 0; static_cast(vertex) < point_vector.size(); vertex++) { diff --git a/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h b/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h index 44190997..9cd57d7e 100644 --- a/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h +++ b/src/Collapse/include/gudhi/Flag_complex_edge_collapser.h @@ -289,49 +289,15 @@ class Flag_complex_edge_collapser { public: /** \brief Flag_complex_edge_collapser constructor from a range of filtered edges. * - * @param[in] begin Iterator on the first element of a filtered edges range, aka. `std::begin`. Filtered edges must - * be in `Flag_complex_edge_collapser::Filtered_edge`. - * - * @param[in] end Iterator on the final element of a filtered edges range, aka. `std::end`. Filtered edges must be - * in `Flag_complex_edge_collapser::Filtered_edge`. - * - * There is no need the range to be sorted, as it will be performed in + * @param[in] edges Range of Filtered edges range.There is no need the range to be sorted, as it will be performed in * `Flag_complex_edge_collapser::process_edges`. - */ - template - Flag_complex_edge_collapser(Filtered_edge_iterator begin, Filtered_edge_iterator end) - : f_edge_vector_(begin, end) { } - - /** \brief Inserts all edges given by a OneSkeletonGraph into a vector of - * `Flag_complex_edge_collapser::Filtered_edge`. - * OneSkeletonGraph must be a model of - * boost::EdgeListGraph - * and boost::PropertyGraph. * - * The edge filtration value is accessible through the property tag - * edge_filtration_t. - * - * boost::graph_traits::vertex_descriptor - * must be Vertex_handle. - * boost::graph_traits::directed_category - * can be directed_tag (the fastest, the least RAM use), undirected_tag or even - * bidirected_tag. - * - * It is required to have no duplicated edges in the graph. - * - * `Gudhi::Proximity_graph` is a good candidate for OneSkeletonGraph. + * \tparam FilteredEdgeRange must be a range for which std::begin and std::end return iterators on a + * `Flag_complex_edge_collapser::Filtered_edge`. */ - template - Flag_complex_edge_collapser(const OneSkeletonGraph& one_skeleton_graph) { - // Insert all edges - for (auto edge_it = edges(one_skeleton_graph); - edge_it.first != edge_it.second; ++edge_it.first) { - auto edge = *(edge_it.first); - Vertex_handle u = source(edge, one_skeleton_graph); - Vertex_handle v = target(edge, one_skeleton_graph); - f_edge_vector_.emplace_back(u, v, get(Gudhi::edge_filtration_t(), one_skeleton_graph, edge)); - } - } + template + Flag_complex_edge_collapser(FilteredEdgeRange edges) + : f_edge_vector_(std::begin(edges), std::end(edges)) { } /** \brief Performs edge collapse in a increasing sequence of the filtration value. * diff --git a/src/Collapse/test/collapse_unit_test.cpp b/src/Collapse/test/collapse_unit_test.cpp index 108f77e4..b5ad09c5 100644 --- a/src/Collapse/test/collapse_unit_test.cpp +++ b/src/Collapse/test/collapse_unit_test.cpp @@ -13,6 +13,7 @@ #define BOOST_TEST_MODULE "collapse" #include #include +#include #include #include @@ -49,7 +50,7 @@ void trace_and_check_collapse(const Filtered_edge_range& filtered_edges, const F } std::cout << "COLLAPSE - keep edges: " << std::endl; - Flag_complex_edge_collapser edge_collapser(filtered_edges.begin(), filtered_edges.end()); + Flag_complex_edge_collapser edge_collapser(filtered_edges); Filtered_edge_list remaining_edges; edge_collapser.process_edges( [&remaining_edges](Vertex_handle u, Vertex_handle v, Filtration_value filtration) { @@ -174,7 +175,15 @@ BOOST_AUTO_TEST_CASE(collapse_from_proximity_graph) { Proximity_graph proximity_graph = Gudhi::compute_proximity_graph(point_cloud, threshold, Gudhi::Euclidean_distance()); - Flag_complex_edge_collapser edge_collapser(proximity_graph); + + Flag_complex_edge_collapser edge_collapser( + boost::adaptors::transform(edges(proximity_graph), [&](auto&&edge){ + return std::make_tuple(source(edge, proximity_graph), + target(edge, proximity_graph), + get(Gudhi::edge_filtration_t(), proximity_graph, edge)); + }) + ); + Filtered_edge_list remaining_edges; edge_collapser.process_edges( [&remaining_edges](Vertex_handle u, Vertex_handle v, Filtration_value filtration) { diff --git a/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp b/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp index 88cd7b54..bd9c0152 100644 --- a/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp +++ b/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp @@ -15,6 +15,7 @@ #include #include +#include using Simplex_tree = Gudhi::Simplex_tree; using Filtration_value = Simplex_tree::Filtration_value; @@ -90,7 +91,13 @@ int main(int argc, char* argv[]) { }); // Now we will perform filtered edge collapse to sparsify the edge list edge_t. - Flag_complex_edge_collapser edge_collapser(proximity_graph); + Flag_complex_edge_collapser edge_collapser( + boost::adaptors::transform(edges(proximity_graph), [&](auto&&edge){ + return std::make_tuple(source(edge, proximity_graph), + target(edge, proximity_graph), + get(Gudhi::edge_filtration_t(), proximity_graph, edge)); + }) + ); Simplex_tree stree; for (Vertex_handle vertex = 0; static_cast(vertex) < distances.size(); vertex++) { diff --git a/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp b/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp index 69e83597..4e14d7a8 100644 --- a/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp +++ b/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp @@ -16,6 +16,7 @@ #include #include +#include #include // for std::pair #include @@ -77,7 +78,13 @@ int main(int argc, char* argv[]) { exit(-1); } - Flag_complex_edge_collapser edge_collapser(proximity_graph); + Flag_complex_edge_collapser edge_collapser( + boost::adaptors::transform(edges(proximity_graph), [&](auto&&edge){ + return std::make_tuple(source(edge, proximity_graph), + target(edge, proximity_graph), + get(Gudhi::edge_filtration_t(), proximity_graph, edge)); + }) + ); Simplex_tree stree; for (Vertex_handle vertex = 0; static_cast(vertex) < point_vector.size(); vertex++) { -- cgit v1.2.3