summaryrefslogtreecommitdiff
path: root/src/python/include/Simplex_tree_interface.h
diff options
context:
space:
mode:
authorROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-07-30 12:36:16 +0200
committerROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-07-30 12:36:16 +0200
commit76a61bcd3279a98bd84856b011869a0be2ba99cd (patch)
tree3f0ae47afa99f97470114aa6bb970c8fcac42e1e /src/python/include/Simplex_tree_interface.h
parent9938ed3c3beedbc7fc946068e3b7e47187a83903 (diff)
collapse edges for python simplex tree
Diffstat (limited to 'src/python/include/Simplex_tree_interface.h')
-rw-r--r--src/python/include/Simplex_tree_interface.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/python/include/Simplex_tree_interface.h b/src/python/include/Simplex_tree_interface.h
index 56d7c41d..7500098d 100644
--- a/src/python/include/Simplex_tree_interface.h
+++ b/src/python/include/Simplex_tree_interface.h
@@ -15,10 +15,12 @@
#include <gudhi/distance_functions.h>
#include <gudhi/Simplex_tree.h>
#include <gudhi/Points_off_io.h>
+#include <gudhi/Flag_complex_edge_collapser.h>
#include <iostream>
#include <vector>
#include <utility> // std::pair
+#include <tuple>
namespace Gudhi {
@@ -157,6 +159,33 @@ class Simplex_tree_interface : public Simplex_tree<SimplexTreeOptions> {
return new_dgm;
}
+ Simplex_tree_interface* collapse_edges(int nb_collapse_iteration) {
+ using Filtered_edge = std::tuple<Vertex_handle, Vertex_handle, Filtration_value>;
+ std::vector<Filtered_edge> edges;
+ for (Simplex_handle sh : Base::skeleton_simplex_range(1)) {
+ if (Base::dimension(sh) == 1) {
+ typename Base::Simplex_vertex_range rg = Base::simplex_vertex_range(sh);
+ std::vector<Vertex_handle> rips_edge(rg.begin(), rg.end());
+ edges.push_back(std::make_tuple(rips_edge[0], rips_edge[1], Base::filtration(sh)));
+ }
+ }
+
+ std::vector<Filtered_edge> remaining_edges;
+ for (int iteration = 0; iteration < nb_collapse_iteration; iteration++) {
+ remaining_edges = Gudhi::collapse::flag_complex_collapse_edges(edges);
+ edges = std::move(remaining_edges);
+ remaining_edges.clear();
+ }
+ Simplex_tree_interface* collapsed_stree_ptr = new Simplex_tree_interface();
+ for (auto remaining_edge : edges) {
+ collapsed_stree_ptr->insert({std::get<0>(remaining_edge)}, 0.);
+ collapsed_stree_ptr->insert({std::get<1>(remaining_edge)}, 0.);
+ collapsed_stree_ptr->insert({std::get<0>(remaining_edge), std::get<1>(remaining_edge)}, std::get<2>(remaining_edge));
+ }
+ collapsed_stree_ptr->initialize_filtration();
+ return collapsed_stree_ptr;
+ }
+
// Iterator over the simplex tree
Complex_simplex_iterator get_simplices_iterator_begin() {
// this specific case works because the range is just a pair of iterators - won't work if range was a vector