From 34207229b3ab2936aecd953997286a0daab88a83 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Fri, 29 May 2020 17:56:45 +0200 Subject: convert matrix to SimplexTree --- src/python/include/Simplex_tree_interface.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 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..295b1b7f 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -36,6 +36,8 @@ class Simplex_tree_interface : public Simplex_tree { using Skeleton_simplex_iterator = typename Base::Skeleton_simplex_iterator; using Complex_simplex_iterator = typename Base::Complex_simplex_iterator; using Extended_filtration_data = typename Base::Extended_filtration_data; + using Siblings = typename Base::Siblings; + using Node = typename Base::Node; public: @@ -57,6 +59,30 @@ class Simplex_tree_interface : public Simplex_tree { return (result.second); } + void insert_matrix(double* filtrations, int n, int stride0, int stride1, double max_filtration) { + // We could delegate to insert_graph, but wrapping the matrix in a graph interface is too much work + assert(this->num_simplices() == 0); + auto& rm = this->root()->members_; + for(int i=0; i max_filtration) continue; + auto sh = rm.emplace_hint(rm.end(), i, Node(this->root(), fv)); + Siblings* children = nullptr; + // Should we make a first pass to count the number of edges so we can reserve the right space? + for(int j=i+1; j max_filtration) continue; + if(!children) { + children = new Siblings(this->root(), i); + sh->second.assign_children(children); + } + children->members().emplace_hint(children->members().end(), j, Node(children, fe)); + } + } + + } + // Do not interface this function, only used in alpha complex interface for complex creation bool insert_simplex(const Simplex& simplex, Filtration_value filtration = 0) { Insertion_result result = Base::insert_simplex(simplex, filtration); -- cgit v1.2.3 From 723c5cc3d48d887e6855f0d8b562c178bf396652 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Fri, 29 May 2020 18:23:29 +0200 Subject: comment --- src/python/include/Simplex_tree_interface.h | 3 ++- 1 file changed, 2 insertions(+), 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 295b1b7f..d94755d7 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -60,7 +60,8 @@ class Simplex_tree_interface : public Simplex_tree { } void insert_matrix(double* filtrations, int n, int stride0, int stride1, double max_filtration) { - // We could delegate to insert_graph, but wrapping the matrix in a graph interface is too much work + // We could delegate to insert_graph, but wrapping the matrix in a graph interface is too much work, + // and this is a bit more efficient. assert(this->num_simplices() == 0); auto& rm = this->root()->members_; for(int i=0; i Date: Wed, 8 Jul 2020 21:36:10 +0200 Subject: Remove redundant check already done in the caller --- 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 d94755d7..f570c5fc 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -62,7 +62,6 @@ class Simplex_tree_interface : public Simplex_tree { void insert_matrix(double* filtrations, int n, int stride0, int stride1, double max_filtration) { // We could delegate to insert_graph, but wrapping the matrix in a graph interface is too much work, // and this is a bit more efficient. - assert(this->num_simplices() == 0); auto& rm = this->root()->members_; for(int i=0; i Date: Thu, 30 Jul 2020 19:45:36 +0200 Subject: Review comments --- src/python/gudhi/simplex_tree.pyx | 5 +---- src/python/include/Simplex_tree_interface.h | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) (limited to 'src/python/include/Simplex_tree_interface.h') diff --git a/src/python/gudhi/simplex_tree.pyx b/src/python/gudhi/simplex_tree.pyx index 9d2c30a9..1df2420e 100644 --- a/src/python/gudhi/simplex_tree.pyx +++ b/src/python/gudhi/simplex_tree.pyx @@ -233,10 +233,7 @@ cdef class SimplexTree: """ # TODO: optimize this for edge in zip(edges.row, edges.col, edges.data): - if edge[0] == edge[1]: - self.get_ptr().insert((edge[0],), edge[2]) - else: - self.get_ptr().insert((edge[0], edge[1]), edge[2]) + self.get_ptr().insert((edge[0], edge[1]), edge[2]) def get_simplices(self): """This function returns a generator with simplices and their given diff --git a/src/python/include/Simplex_tree_interface.h b/src/python/include/Simplex_tree_interface.h index f570c5fc..3061884f 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -64,14 +64,14 @@ class Simplex_tree_interface : public Simplex_tree { // and this is a bit more efficient. auto& rm = this->root()->members_; for(int i=0; i(filtrations) + i * stride0; + double fv = *reinterpret_cast(p + i * stride1); if(fv > max_filtration) continue; auto sh = rm.emplace_hint(rm.end(), i, Node(this->root(), fv)); Siblings* children = nullptr; // Should we make a first pass to count the number of edges so we can reserve the right space? for(int j=i+1; j(p + j * stride1); if(fe > max_filtration) continue; if(!children) { children = new Siblings(this->root(), i); -- cgit v1.2.3