From 5f5cd999afaee2822e7a8a847cb96fa72f996249 Mon Sep 17 00:00:00 2001 From: Ulrich Bauer Date: Tue, 10 Mar 2020 07:14:01 +0100 Subject: fixed sparse matrix apparent pairs reduction --- ripser.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/ripser.cpp b/ripser.cpp index de4bf7b..20f0703 100644 --- a/ripser.cpp +++ b/ripser.cpp @@ -263,9 +263,9 @@ struct sparse_distance_matrix { index_t num_edges; - mutable std::vector::const_reverse_iterator> neighbor_it; - mutable std::vector::const_reverse_iterator> neighbor_end; - +// mutable std::vector::const_reverse_iterator> neighbor_it; +// mutable std::vector::const_reverse_iterator> neighbor_end; +// sparse_distance_matrix(std::vector>&& _neighbors, index_t _num_edges) : neighbors(std::move(_neighbors)), num_edges(_num_edges) {} @@ -456,7 +456,6 @@ public: class simplex_boundary_enumerator { private: index_t idx_below, idx_above, v, k; - std::vector& vertices; const diameter_entry_t simplex; const coefficient_t modulus; const binomial_coeff_table& binomial_coeff; @@ -467,10 +466,8 @@ public: simplex_boundary_enumerator(const diameter_entry_t _simplex, const index_t _dim, const ripser& _parent) : idx_below(get_index(_simplex)), idx_above(0), v(_parent.n - 1), k(_dim + 1), - vertices(_parent.vertices), simplex(_simplex), modulus(_parent.modulus), + simplex(_simplex), modulus(_parent.modulus), binomial_coeff(_parent.binomial_coeff), dim(_dim), parent(_parent) { - vertices.resize(dim + 1); - parent.get_simplex_vertices(get_index(_simplex), _dim, parent.n, vertices.begin()); } bool has_next() { @@ -557,6 +554,9 @@ public: std::vector next_simplices; for (diameter_index_t& simplex : simplices) { + std::vector simplex_vertices; + get_simplex_vertices(get_index(simplex), dim, n, std::back_inserter(simplex_vertices)); + simplex_coboundary_enumerator cofacets(diameter_entry_t(simplex, 1), dim, *this); while (cofacets.has_next(false)) { @@ -569,6 +569,9 @@ public: } #endif auto cofacet = cofacets.next(); + std::vector cofacet_vertices; + get_simplex_vertices(get_index(cofacet), dim + 1, n, std::back_inserter(cofacet_vertices)); + if (get_diameter(cofacet) <= threshold) { next_simplices.push_back({get_diameter(cofacet), get_index(cofacet)}); @@ -876,8 +879,8 @@ template <> class ripser::simplex_coboundary_enumerator const coefficient_t modulus; const sparse_distance_matrix& dist; const binomial_coeff_table& binomial_coeff; - std::vector::const_reverse_iterator>& neighbor_it; - std::vector::const_reverse_iterator>& neighbor_end; + std::vector::const_reverse_iterator> neighbor_it; + std::vector::const_reverse_iterator> neighbor_end; index_diameter_t neighbor; public: @@ -885,11 +888,7 @@ public: const ripser& _parent) : parent(_parent), idx_below(get_index(_simplex)), idx_above(0), k(_dim + 1), vertices(_dim + 1), simplex(_simplex), modulus(parent.modulus), dist(parent.dist), - binomial_coeff(parent.binomial_coeff), neighbor_it(dist.neighbor_it), - neighbor_end(dist.neighbor_end) { - neighbor_it.clear(); - neighbor_end.clear(); - + binomial_coeff(parent.binomial_coeff) { parent.get_simplex_vertices(idx_below, _dim, parent.n, vertices.rbegin()); for (auto v : vertices) { neighbor_it.push_back(dist.neighbors[v].rbegin()); -- cgit v1.2.3