summaryrefslogtreecommitdiff
path: root/src/Collapse
diff options
context:
space:
mode:
authorROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-06-25 17:10:36 +0200
committerROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-06-25 17:10:36 +0200
commitb522b330b10d11f0da640b8bba7ee689dea774d7 (patch)
treeb94adbfcb414b86433f2023a633374bfd2142d8d /src/Collapse
parent2610ce8092a3935e228065884bcbd70d910b40cd (diff)
Remove interface with boost graphs and use boost transform for data from graphs
Diffstat (limited to 'src/Collapse')
-rw-r--r--src/Collapse/example/edge_collapse_basic_example.cpp2
-rw-r--r--src/Collapse/example/edge_collapse_conserve_persistence.cpp10
-rw-r--r--src/Collapse/include/gudhi/Flag_complex_edge_collapser.h46
-rw-r--r--src/Collapse/test/collapse_unit_test.cpp13
-rw-r--r--src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp9
-rw-r--r--src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp9
6 files changed, 43 insertions, 46 deletions
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 <gudhi/Points_off_io.h>
#include <gudhi/graph_simplicial_complex.h>
+#include <boost/range/adaptor/transformed.hpp>
+
#include<utility> // for std::pair
#include<vector>
#include<tuple>
@@ -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<std::size_t>(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<typename Filtered_edge_iterator>
- 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
- * <a href="http://www.boost.org/doc/libs/1_73_0/libs/graph/doc/EdgeListGraph.html">boost::EdgeListGraph</a>
- * and <a href="http://www.boost.org/doc/libs/1_73_0/libs/graph/doc/PropertyGraph.html">boost::PropertyGraph</a>.
*
- * The edge filtration value is accessible through the property tag
- * edge_filtration_t.
- *
- * boost::graph_traits<OneSkeletonGraph>::vertex_descriptor
- * must be Vertex_handle.
- * boost::graph_traits<OneSkeletonGraph>::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<Flag_complex_edge_collapser>` 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<class OneSkeletonGraph>
- 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<typename FilteredEdgeRange>
+ 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 <boost/test/unit_test.hpp>
#include <boost/mpl/list.hpp>
+#include <boost/range/adaptor/transformed.hpp>
#include <gudhi/Flag_complex_edge_collapser.h>
#include <gudhi/distance_functions.h>
@@ -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<Flag_complex_edge_collapser>(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 <gudhi/graph_simplicial_complex.h>
#include <boost/program_options.hpp>
+#include <boost/range/adaptor/transformed.hpp>
using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
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<std::size_t>(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 <gudhi/graph_simplicial_complex.h>
#include <boost/program_options.hpp>
+#include <boost/range/adaptor/transformed.hpp>
#include<utility> // for std::pair
#include<vector>
@@ -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<std::size_t>(vertex) < point_vector.size(); vertex++) {