summaryrefslogtreecommitdiff
path: root/src/Simplex_tree
diff options
context:
space:
mode:
authorROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-08-18 14:38:31 +0200
committerROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-08-18 14:38:31 +0200
commitddb2118f0af865588d7c14b88171dc04bb27c529 (patch)
tree74825f2f0c4e353511bbe09979ff8ae9aabe431d /src/Simplex_tree
parenta1cd7e9ead030654a1fdb6cfd50408103c458529 (diff)
reset_filtration from a dimension (instead of 'until')
Diffstat (limited to 'src/Simplex_tree')
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree.h31
-rw-r--r--src/Simplex_tree/test/simplex_tree_unit_test.cpp14
2 files changed, 27 insertions, 18 deletions
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h
index adc8e801..89b4a5df 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h
@@ -1668,31 +1668,36 @@ class Simplex_tree {
}
public:
- /** \brief This function resets filtration value until a given dimension.
+ /** \brief This function resets filtration value from a given dimension. Resets all the Simplex_tree when
+ * `min_dim = 0`.
* @param[in] filt_value The new filtration value.
- * @param[in] max_dim The maximal dimension.
+ * @param[in] min_dim The minimal dimension.
*/
- void reset_filtration(Filtration_value filt_value, int max_dim) {
+ void reset_filtration(Filtration_value filt_value, int min_dim) {
for (auto& simplex : root_.members()) {
- simplex.second.assign_filtration(filt_value);
- if (has_children(&simplex) && max_dim > 0) {
- rec_reset_filtration(simplex.second.children(), filt_value, (max_dim - 1));
+ if (min_dim <= 0) {
+ simplex.second.assign_filtration(filt_value);
+ }
+ if (has_children(&simplex)) {
+ rec_reset_filtration(simplex.second.children(), filt_value, min_dim);
}
}
clear_filtration(); // Drop the cache.
}
private:
- /** \brief Recursively resets filtration value until a given dimension.
+ /** \brief Recursively resets filtration value from a given dimension.
* @param[in] sib Siblings to be parsed.
* @param[in] filt_value The new filtration value.
- * @param[in] max_dim The maximal dimension.
+ * @param[in] min_dim The maximal dimension.
*/
- void rec_reset_filtration(Siblings * sib, Filtration_value filt_value, int max_dim) {
- for (auto& simplex : sib->members()) {
- simplex.second.assign_filtration(filt_value);
- if (has_children(&simplex) && max_dim > 0) {
- rec_reset_filtration(simplex.second.children(), filt_value, (max_dim - 1));
+ void rec_reset_filtration(Siblings * sib, Filtration_value filt_value, int min_dim) {
+ for (auto sh = sib->members().begin(); sh != sib->members().end(); ++sh) {
+ if (min_dim <= dimension(sh)) {
+ sh->second.assign_filtration(filt_value);
+ }
+ if (has_children(sh)) {
+ rec_reset_filtration(sh->second.children(), filt_value, min_dim);
}
}
}
diff --git a/src/Simplex_tree/test/simplex_tree_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_unit_test.cpp
index 9780f5b0..bdd41d34 100644
--- a/src/Simplex_tree/test/simplex_tree_unit_test.cpp
+++ b/src/Simplex_tree/test/simplex_tree_unit_test.cpp
@@ -965,21 +965,25 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes
for (auto vertex : st.simplex_vertex_range(f_simplex)) {
std::clog << vertex << ",";
}
- std::clog << ") - filtration =" << st.filtration(f_simplex) << std::endl;
+ std::clog << ") - filtration = " << st.filtration(f_simplex);
+ std::clog << " - dimension = " << st.dimension(f_simplex) << std::endl;
+ // Guaranteed by construction
BOOST_CHECK(st.filtration(f_simplex) >= 2.);
}
// dimension until 5 even if simplex tree is of dimension 3 to test the limits
- for(int dimension = 0; dimension < 6; dimension ++) {
+ for(int dimension = 5; dimension >= 0; dimension --) {
+ std::clog << "### reset_filtration - dimension = " << dimension << "\n";
st.reset_filtration(0., dimension);
for (auto f_simplex : st.skeleton_simplex_range(3)) {
std::clog << "vertex = (";
for (auto vertex : st.simplex_vertex_range(f_simplex)) {
std::clog << vertex << ",";
}
- std::clog << ") - filtration =" << st.filtration(f_simplex) << std::endl;
- if (st.dimension(f_simplex) > dimension)
- BOOST_CHECK(st.filtration(f_simplex) >= 1.);
+ std::clog << ") - filtration = " << st.filtration(f_simplex);
+ std::clog << " - dimension = " << st.dimension(f_simplex) << std::endl;
+ if (st.dimension(f_simplex) < dimension)
+ BOOST_CHECK(st.filtration(f_simplex) >= 2.);
else
BOOST_CHECK(st.filtration(f_simplex) == 0.);
}