From 76a61bcd3279a98bd84856b011869a0be2ba99cd Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Thu, 30 Jul 2020 12:36:16 +0200 Subject: collapse edges for python simplex tree --- src/python/include/Simplex_tree_interface.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/python/include/Simplex_tree_interface.h') 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 #include #include +#include #include #include #include // std::pair +#include namespace Gudhi { @@ -157,6 +159,33 @@ class Simplex_tree_interface : public Simplex_tree { return new_dgm; } + Simplex_tree_interface* collapse_edges(int nb_collapse_iteration) { + using Filtered_edge = std::tuple; + std::vector 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 rips_edge(rg.begin(), rg.end()); + edges.push_back(std::make_tuple(rips_edge[0], rips_edge[1], Base::filtration(sh))); + } + } + + std::vector 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 -- cgit v1.2.3