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 From 70196802c49104e27617e5bff1e3c6afd09271ea Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 31 Jul 2020 17:09:36 +0200 Subject: code review: using a vector is overkill. emplace_back is more efficient --- src/python/include/Simplex_tree_interface.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (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 7500098d..45b178a2 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -21,6 +21,7 @@ #include #include // std::pair #include +#include // for std::distance namespace Gudhi { @@ -163,10 +164,11 @@ class Simplex_tree_interface : public Simplex_tree { 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))); + typename Base::Simplex_vertex_range rg = Base::simplex_vertex_range(sh); + auto rg_begin = rg.begin(); + // We take only edges into account + if (std::distance(rg_begin, rg.end()) == 2) { + edges.emplace_back(*rg_begin, *std::next(rg_begin), Base::filtration(sh)); } } -- cgit v1.2.3 From 3a05c55a04a73b6e61d49506ef72a260ce6cd436 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 31 Jul 2020 17:15:54 +0200 Subject: code review: remove initialize_filtration --- src/python/include/Simplex_tree_interface.h | 1 - 1 file changed, 1 deletion(-) (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 45b178a2..959257fa 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -184,7 +184,6 @@ class Simplex_tree_interface : public Simplex_tree { 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; } -- cgit v1.2.3 From c9b743e5fed3f33b2084d5d8add2b7db2504004b Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 31 Jul 2020 17:19:30 +0200 Subject: code review: no need to use any other temporary vector --- src/python/include/Simplex_tree_interface.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (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 959257fa..ad0f9a28 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -172,11 +172,8 @@ class Simplex_tree_interface : public Simplex_tree { } } - 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(); + edges = Gudhi::collapse::flag_complex_collapse_edges(edges); } Simplex_tree_interface* collapsed_stree_ptr = new Simplex_tree_interface(); for (auto remaining_edge : edges) { -- cgit v1.2.3 From 39fba06ef758483bc237b9375413974c3bbc16e4 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Fri, 31 Jul 2020 17:34:47 +0200 Subject: code review: collapse edges should copy the 0-skeleton. A test was added --- src/python/include/Simplex_tree_interface.h | 7 +++++-- src/python/test/test_simplex_tree.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) (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 ad0f9a28..f786ad6e 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -176,9 +176,12 @@ class Simplex_tree_interface : public Simplex_tree { edges = Gudhi::collapse::flag_complex_collapse_edges(edges); } Simplex_tree_interface* collapsed_stree_ptr = new Simplex_tree_interface(); + // Copy the original 0-skeleton + for (Simplex_handle sh : Base::skeleton_simplex_range(0)) { + collapsed_stree_ptr->insert({*(Base::simplex_vertex_range(sh).begin())}, Base::filtration(sh)); + } + // Insert remaining edges 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)); } return collapsed_stree_ptr; diff --git a/src/python/test/test_simplex_tree.py b/src/python/test/test_simplex_tree.py index 30a8f5e0..83be0602 100755 --- a/src/python/test/test_simplex_tree.py +++ b/src/python/test/test_simplex_tree.py @@ -356,3 +356,5 @@ def test_collapse_edges(): st.collapse_edges() assert st.num_simplices() == 9 assert st.find([1, 3]) == False + for simplex in st.get_skeleton(0): + assert simplex[1] == 1. -- cgit v1.2.3 From c3a4fc7bdcc69a5d56761c67a77c7e5b6ff6d1ee Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Mon, 3 Aug 2020 08:32:48 +0200 Subject: code review: simplify edge parsing --- src/python/include/Simplex_tree_interface.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (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 f786ad6e..e288a8cf 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -164,11 +164,12 @@ class Simplex_tree_interface : public Simplex_tree { using Filtered_edge = std::tuple; std::vector edges; for (Simplex_handle sh : Base::skeleton_simplex_range(1)) { - typename Base::Simplex_vertex_range rg = Base::simplex_vertex_range(sh); - auto rg_begin = rg.begin(); - // We take only edges into account - if (std::distance(rg_begin, rg.end()) == 2) { - edges.emplace_back(*rg_begin, *std::next(rg_begin), Base::filtration(sh)); + if (Base::dimension(sh) == 1) { + typename Base::Simplex_vertex_range rg = Base::simplex_vertex_range(sh); + auto vit = rg.begin(); + Vertex_handle v = *vit; + Vertex_handle w = *++vit; + edges.emplace_back(v, w, Base::filtration(sh)); } } -- cgit v1.2.3