From 60b7325bacc7c103b817560e7167ceb8ae115865 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Thu, 28 Sep 2023 16:04:13 +0200 Subject: [PATCH 01/87] CPP part only --- .../test/betti_numbers_unit_test.cpp | 2 + .../test/persistent_cohomology_unit_test.cpp | 1 + .../simplex_tree_cofaces_benchmark.cpp | 1 + src/Simplex_tree/concept/SimplexTreeOptions.h | 2 + src/Simplex_tree/include/gudhi/Simplex_tree.h | 93 +++++-- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 231 ++++++++++++++++++ .../Simplex_tree_node_explicit_storage.h | 2 +- .../Simplex_tree/multi_filtrations/box.h | 164 +++++++++++++ .../finitely_critical_filtrations.h | 150 ++++++++++++ .../Simplex_tree/multi_filtrations/line.h | 94 +++++++ .../simplex_tree_ctor_and_move_unit_test.cpp | 1 + ...simplex_tree_graph_expansion_unit_test.cpp | 1 + ...ke_filtration_non_decreasing_unit_test.cpp | 1 + .../test/simplex_tree_unit_test.cpp | 1 + 14 files changed, 720 insertions(+), 24 deletions(-) create mode 100644 src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h create mode 100644 src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/box.h create mode 100644 src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h create mode 100644 src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/line.h diff --git a/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp b/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp index eccd17b21f..96b880cc94 100644 --- a/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp +++ b/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp @@ -19,6 +19,8 @@ struct MiniSTOptions : Gudhi::Simplex_tree_options_full_featured { static const bool store_key = true; // I have few vertices typedef short Vertex_handle; + + static const bool is_multi_parameter = false; }; using Mini_simplex_tree = Gudhi::Simplex_tree; diff --git a/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp b/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp index 5a68ffb600..71c6717087 100644 --- a/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp +++ b/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp @@ -177,6 +177,7 @@ struct MiniSTOptions { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; using Mini_simplex_tree = Gudhi::Simplex_tree; diff --git a/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp b/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp index f6e001b631..e4353977b6 100644 --- a/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp +++ b/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp @@ -91,6 +91,7 @@ struct Simplex_tree_options_stable_simplex_handles { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; int main(int argc, char *argv[]) { diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h index 0c95d3011c..45e5f03bca 100644 --- a/src/Simplex_tree/concept/SimplexTreeOptions.h +++ b/src/Simplex_tree/concept/SimplexTreeOptions.h @@ -31,5 +31,7 @@ struct SimplexTreeOptions { static const bool link_nodes_by_label; /// If true, Simplex_handle will not be invalidated after insertions or removals. static const bool stable_simplex_handles; + /// If true, assumes that Filtration_value is vector-like instead of float-like. This also assumes that Filtration_values is a class, which has a push_to method to push a filtration value $x$ onto $this>=0$. + static const bool is_multi_parameter; }; diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 9f93672d63..0effd69a34 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -151,16 +151,18 @@ class Simplex_tree { Key_simplex_base; struct Filtration_simplex_base_real { - Filtration_simplex_base_real() : filt_(0) {} - void assign_filtration(Filtration_value f) { filt_ = f; } - Filtration_value filtration() const { return filt_; } + Filtration_simplex_base_real() : filt_{} {} + void assign_filtration(const Filtration_value& f) { filt_ = f; } + const Filtration_value& filtration() const { return filt_; } + Filtration_value& filtration() { return filt_; } private: Filtration_value filt_; }; struct Filtration_simplex_base_dummy { Filtration_simplex_base_dummy() {} void assign_filtration(Filtration_value GUDHI_CHECK_code(f)) { GUDHI_CHECK(f == 0, "filtration value specified for a complex that does not store them"); } - Filtration_value filtration() const { return 0; } + const Filtration_value& filtration() const { return null_value; } + static constexpr Filtration_value null_value={}; }; typedef typename std::conditional::type Filtration_simplex_base; @@ -576,7 +578,7 @@ class Simplex_tree { * * Same as `filtration()`, but does not handle `null_simplex()`. */ - static Filtration_value filtration_(Simplex_handle sh) { + static const Filtration_value& filtration_(Simplex_handle sh) { GUDHI_CHECK (sh != null_simplex(), "null simplex"); return sh->second.filtration(); } @@ -604,18 +606,25 @@ class Simplex_tree { * Called on the null_simplex, it returns infinity. * If SimplexTreeOptions::store_filtration is false, returns 0. */ - static Filtration_value filtration(Simplex_handle sh) { + static const Filtration_value& filtration(Simplex_handle sh){ if (sh != null_simplex()) { return sh->second.filtration(); } else { - return std::numeric_limits::infinity(); + return inf_; + } + } + static Filtration_value& filtration_mutable(Simplex_handle sh){ + if (sh != null_simplex()) { + return sh->second.filtration(); + } else { + return inf_; } } /** \brief Sets the filtration value of a simplex. * \exception std::invalid_argument In debug mode, if sh is a null_simplex. */ - void assign_filtration(Simplex_handle sh, Filtration_value fv) { + void assign_filtration(Simplex_handle sh, const Filtration_value& fv) { GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("Simplex_tree::assign_filtration - cannot assign filtration on null_simplex")); sh->second.assign_filtration(fv); @@ -829,7 +838,7 @@ class Simplex_tree { */ template > std::pair insert_simplex_raw(const RandomVertexHandleRange& simplex, - Filtration_value filtration) { + const Filtration_value& filtration) { Siblings * curr_sib = &root_; std::pair res_insert; auto vi = simplex.begin(); @@ -895,7 +904,7 @@ class Simplex_tree { * .end() return input iterators, with 'value_type' Vertex_handle. */ template> std::pair insert_simplex(const InputVertexRange & simplex, - Filtration_value filtration = 0) { + const Filtration_value& filtration = {}) { auto first = std::begin(simplex); auto last = std::end(simplex); @@ -924,7 +933,7 @@ class Simplex_tree { */ template> std::pair insert_simplex_and_subfaces(const InputVertexRange& Nsimplex, - Filtration_value filtration = 0) { + const Filtration_value& filtration = {}) { auto first = std::begin(Nsimplex); auto last = std::end(Nsimplex); @@ -953,7 +962,7 @@ class Simplex_tree { std::pair rec_insert_simplex_and_subfaces_sorted(Siblings* sib, ForwardVertexIterator first, ForwardVertexIterator last, - Filtration_value filt) { + const Filtration_value& filt) { // An alternative strategy would be: // - try to find the complete simplex, if found (and low filtration) exit // - insert all the vertices at once in sib @@ -970,8 +979,20 @@ class Simplex_tree { Simplex_handle simplex_one = insertion_result.first; bool one_is_new = insertion_result.second; if (!one_is_new) { - if (filtration(simplex_one) > filt) { - assign_filtration(simplex_one, filt); + if (!(filtration(simplex_one) <= filt)) { + if constexpr (SimplexTreeOptions::is_multi_parameter){ + // By default, does nothing and assumes that the user is smart. + if (filt < filtration(simplex_one)){ + // placeholder for comparable filtrations + } + else{ + // placeholder for incomparable filtrations + } + } + else{ // non-multiparameter + assign_filtration(simplex_one, filt); + } + } else { // FIXME: this interface makes no sense, and it doesn't seem to be tested. insertion_result.first = null_simplex(); @@ -1316,7 +1337,7 @@ class Simplex_tree { * The complex does not need to be empty before calling this function. However, if a vertex is * already present, its filtration value is not modified, unlike with other insertion functions. */ template - void insert_batch_vertices(VertexRange const& vertices, Filtration_value filt = 0) { + void insert_batch_vertices(VertexRange const& vertices, const Filtration_value& filt ={}) { auto verts = vertices | boost::adaptors::transformed([&](auto v){ return Dit_value_t(v, Node(&root_, filt)); }); root_.members_.insert(boost::begin(verts), boost::end(verts)); @@ -1403,7 +1424,7 @@ class Simplex_tree { static void intersection(std::vector >& intersection, Dictionary_it begin1, Dictionary_it end1, Dictionary_it begin2, Dictionary_it end2, - Filtration_value filtration_) { + const Filtration_value& filtration_) { if (begin1 == end1 || begin2 == end2) return; // ----->> while (true) { @@ -1610,12 +1631,22 @@ class Simplex_tree { if (dim == 0) return; // Find the maximum filtration value in the border Boundary_simplex_range&& boundary = boundary_simplex_range(sh); - Boundary_simplex_iterator max_border = std::max_element(std::begin(boundary), std::end(boundary), + Filtration_value max_filt_border_value; + if constexpr (SimplexTreeOptions::is_multi_parameter){ + // in that case, we assume that Filtration_value has a `push_to` member to handle this. + max_filt_border_value = Filtration_value(this->number_of_parameters_); + for (auto &face_sh : boundary){ + max_filt_border_value.push_to(filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration + } + } + else{ + Boundary_simplex_iterator max_border = std::max_element(std::begin(boundary), std::end(boundary), [](Simplex_handle sh1, Simplex_handle sh2) { return filtration(sh1) < filtration(sh2); }); - - Filtration_value max_filt_border_value = filtration(*max_border); + max_filt_border_value = filtration(*max_border); + } + // Replacing if(f=max)) would mean that if f is NaN, we replace it with the max of the children. // That seems more useful than keeping NaN. if (!(sh->second.filtration() >= max_filt_border_value)) { @@ -1650,7 +1681,7 @@ class Simplex_tree { * than it was before. However, `upper_bound_dimension()` will return the old value, which remains a valid upper * bound. If you care, you can call `dimension()` to recompute the exact dimension. */ - bool prune_above_filtration(Filtration_value filtration) { + bool prune_above_filtration(const Filtration_value& filtration) { if (std::numeric_limits::has_infinity && filtration == std::numeric_limits::infinity()) return false; // ---->> bool modified = rec_prune_above_filtration(root(), filtration); @@ -1660,7 +1691,7 @@ class Simplex_tree { } private: - bool rec_prune_above_filtration(Siblings* sib, Filtration_value filt) { + bool rec_prune_above_filtration(Siblings* sib, const Filtration_value& filt) { auto&& list = sib->members(); auto last = std::remove_if(list.begin(), list.end(), [this,filt](Dit_value_t& simplex) { if (simplex.second.filtration() <= filt) return false; @@ -2070,7 +2101,7 @@ class Simplex_tree { * @param[in] filt_value The new filtration value. * @param[in] min_dim The minimal dimension. Default value is 0. */ - void reset_filtration(Filtration_value filt_value, int min_dim = 0) { + void reset_filtration(const Filtration_value& filt_value, int min_dim = 0) { rec_reset_filtration(&root_, filt_value, min_dim); clear_filtration(); // Drop the cache. } @@ -2081,7 +2112,7 @@ class Simplex_tree { * @param[in] filt_value The new filtration value. * @param[in] min_depth The minimal depth. */ - void rec_reset_filtration(Siblings * sib, Filtration_value filt_value, int min_depth) { + void rec_reset_filtration(Siblings * sib, const Filtration_value& filt_value, int min_depth) { for (auto sh = sib->members().begin(); sh != sib->members().end(); ++sh) { if (min_depth <= 0) { sh->second.assign_filtration(filt_value); @@ -2246,6 +2277,18 @@ class Simplex_tree { /** \brief Upper bound on the dimension of the simplicial complex.*/ int dimension_; bool dimension_to_be_lowered_ = false; + +//MULTIPERS STUFF +public: + void set_number_of_parameters(int num){ + number_of_parameters_ = num; + } + int get_number_of_parameters() const{ + return number_of_parameters_; + } + inline static Filtration_value inf_ = std::numeric_limits::infinity(); +private: + int number_of_parameters_; }; // Print a Simplex_tree in os. @@ -2297,6 +2340,7 @@ struct Simplex_tree_options_full_featured { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; /** Model of SimplexTreeOptions, faster than `Simplex_tree_options_full_featured` but note the unsafe @@ -2314,6 +2358,7 @@ struct Simplex_tree_options_fast_persistence { static const bool contiguous_vertices = true; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; /** Model of SimplexTreeOptions, faster cofaces than `Simplex_tree_options_full_featured`, note the @@ -2331,6 +2376,8 @@ struct Simplex_tree_options_fast_cofaces { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; + }; /** @}*/ // end addtogroup simplex_tree diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h new file mode 100644 index 0000000000..b2eae92cab --- /dev/null +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -0,0 +1,231 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2014 Inria """ + * + * + * Modification(s): + * - 2022/11 David Loiseaux / Hannah Schreiber : added multify / flatten to interface standard simplextree. + * - YYYY/MM Author: Description of the modification + */ +#ifndef SIMPLEX_TREE_MULTI_H_ +#define SIMPLEX_TREE_MULTI_H_ + +#include +#include +#include +#include + + + + + +namespace Gudhi::multiparameter { +/** Model of SimplexTreeOptions. + * + * Maximum number of simplices to compute persistence is std::numeric_limits::max() + * (about 4 billions of simplices). */ + + +struct Simplex_tree_options_multidimensional_filtration { +public: + typedef linear_indexing_tag Indexing_tag; + typedef int Vertex_handle; + typedef float value_type; + using Filtration_value = multi_filtrations::Finitely_critical_multi_filtration; + typedef std::uint32_t Simplex_key; + static const bool store_key = true; + static const bool store_filtration = true; + static const bool contiguous_vertices = false; + static const bool link_nodes_by_label = true; + static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = true; +}; + + + +using options_multi = Simplex_tree_options_multidimensional_filtration; +using options_std = Simplex_tree_options_full_featured; +using simplextree_std = Simplex_tree; +using simplextree_multi = Simplex_tree; + +using multi_filtration_type = std::vector; +using multi_filtration_grid = std::vector; + +// Turns a 1-parameter simplextree into a multiparameter simplextree, and keeps the 1-filtration in the 1st axis +template +void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_parameters, const typename simplextree_multi::Options::Filtration_value& default_values={}){ + typename simplextree_multi::Options::Filtration_value f(num_parameters); + for (auto i = 0u; i(default_values.size()), static_cast(num_parameters-1));i++) + f[i+1] = default_values[i]; + std::vector simplex; + simplex.reserve(st.dimension()+1); + for (auto &simplex_handle : st.complex_simplex_range()){ + simplex.clear(); + for (auto vertex : st.simplex_vertex_range(simplex_handle)) + simplex.push_back(vertex); + + if (num_parameters > 0) + f[0] = st.filtration(simplex_handle); + auto filtration_copy = f; + st_multi.insert_simplex(simplex,filtration_copy); + + } +} + + + +// Turns a multi-parameter simplextree into a 1-parameter simplextree +template +void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimension = 0){ + for (const auto &simplex_handle : st_multi.complex_simplex_range()){ + std::vector simplex; + for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) + simplex.push_back(vertex); + typename simplextree_multi::Options::value_type f = dimension >= 0 ? st_multi.filtration(simplex_handle)[dimension] : 0; + st.insert_simplex(simplex,f); + } +} + +// Applies a linear form (i.e. scalar product with Riesz rpz) to the filtration to flatten a simplextree multi +template +void linear_projection(simplextree_std &st, simplextree_multi &st_multi, const std::vector& linear_form){ + auto sh = st.complex_simplex_range().begin(); + auto sh_multi = st_multi.complex_simplex_range().begin(); + auto end = st.complex_simplex_range().end(); + typename simplextree_multi::Options::Filtration_value multi_filtration; + for (; sh != end; ++sh, ++sh_multi){ + multi_filtration = st_multi.filtration(*sh_multi); + auto projected_filtration = multi_filtration.linear_projection(linear_form); + st.assign_filtration(*sh, projected_filtration); + } +} + +template +void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, const std::vector basepoint, int dimension){ + multi_filtrations::Line l(basepoint); + for (const auto &simplex_handle : st_multi.complex_simplex_range()){ + std::vector simplex; + for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) + simplex.push_back(vertex); + + std::vector f = st_multi.filtration(simplex_handle); + if (dimension <0) dimension = 0; + typename simplextree_multi::Options::value_type new_filtration = l.push_forward(f)[dimension]; + st.insert_simplex(simplex,new_filtration); + } +} + + + + + +/// @brief turns filtration value x into coordinates in the grid +/// @tparam out_type +/// @param x +/// @param grid +/// @return +template +inline void find_coordinates(vector_like& x, const multi_filtration_grid &grid){ + // TODO: optimize with, e.g., dichotomy + + for (auto parameter = 0u; parameter < grid.size(); parameter++){ + const auto& filtration = grid[parameter]; // assumes its sorted + const auto to_project = x[parameter]; + if constexpr (std::numeric_limits::has_infinity) + if (to_project == std::numeric_limits::infinity()){ + x[parameter] = std::numeric_limits::infinity(); + continue; + } + if (to_project >= filtration.back()){ + x[parameter] = filtration.size()-1; + continue; + } // deals with infinite value at the end of the grid + + unsigned int i = 0; + while (to_project > filtration[i] && i &st_multi = *(Gudhi::Simplex_tree*)(splxptr); + auto num_parameters = static_cast(st_multi.get_number_of_parameters()); + if (grid.size() != num_parameters){ + std::cerr << "Bad grid !" << std::endl; + throw; + } + for (const auto &simplex_handle : st_multi.complex_simplex_range()){ + auto& simplex_filtration = st_multi.filtration_mutable(simplex_handle); + find_coordinates(simplex_filtration, grid); // turns the simplexfiltration into coords in the grid + if (!coordinate_values){ + for (auto parameter = 0u; parameter < num_parameters; parameter++) + simplex_filtration[parameter] = grid[parameter][simplex_filtration[parameter]]; + } + } + return; +} + +// retrieves the filtration values of a simplextree. Useful to generate a grid. +std::vector get_filtration_values(const uintptr_t splxptr, const std::vector °rees){ + Simplex_tree &st_multi = *(Gudhi::Simplex_tree*)(splxptr); + int num_parameters = st_multi.get_number_of_parameters(); + std::vector out(degrees.size(), multi_filtration_grid(num_parameters)); + std::vector degree_index(degrees.size()); + int count = 0; + for (auto degree : degrees){ + degree_index[degree] = count; count++; + out[degree_index[degree]].reserve(st_multi.num_simplices()); + } + + for (const auto &simplex_handle : st_multi.complex_simplex_range()){ + const auto filtration = st_multi.filtration(simplex_handle); + const auto degree = st_multi.dimension(simplex_handle); + if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end()) continue; + for (int parameter=0; parameter < num_parameters; parameter++){ + out[degree_index[degree]][parameter].push_back(filtration[parameter]); + } + } + return out; + +} + +} // namespace Gudhi + + + +namespace std { + +template<> +class numeric_limits +{ +public: + static Gudhi::multiparameter::multi_filtration_type infinity() throw(){ + return Gudhi::multiparameter::multi_filtration_type(1, std::numeric_limits::infinity()); + }; + + + static Gudhi::multiparameter::multi_filtration_type quiet_NaN() throw(){ + return Gudhi::multiparameter::multi_filtration_type(1, numeric_limits::quiet_NaN()); + }; + +}; + +} + + +#endif // SIMPLEX_TREE_MULTI_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h index d7dbb541be..cb3205f816 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h @@ -41,7 +41,7 @@ struct GUDHI_EMPTY_BASE_CLASS_OPTIMIZATION Simplex_tree_node_explicit_storage : typedef typename SimplexTree::Simplex_key Simplex_key; Simplex_tree_node_explicit_storage(Siblings * sib = nullptr, - Filtration_value filtration = 0) + const Filtration_value& filtration = {}) : children_(sib) { this->assign_filtration(filtration); } diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/box.h new file mode 100644 index 0000000000..a4c28fdf1f --- /dev/null +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/box.h @@ -0,0 +1,164 @@ +/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. + * See file LICENSE for full license details. + * Author(s): David Loiseaux + * + * Copyright (C) 2021 Inria + * + * Modification(s): + * + */ +/** + * @file box.h + * @author David Loiseaux + * @brief BOX. + */ + +#ifndef BOX_H_INCLUDED +#define BOX_H_INCLUDED + +#include +#include +#include +#include +#include + +#include "finitely_critical_filtrations.h" + + + + +/** + * @brief Simple box in $\mathbb R^n$ . + */ + +namespace Gudhi::multiparameter::multi_filtrations{ + +template +class Box +{ + + using point_type = Finitely_critical_multi_filtration; +public: + Box(); + Box(T a, T b, T c, T d) : bottomCorner_({a,b}), upperCorner_({c,d}) {}; + Box(const point_type& bottomCorner, const point_type& upperCorner); + Box(const std::pair& box); + + void inflate(T delta); + const point_type& get_bottom_corner() const; + const point_type& get_upper_corner() const; + point_type& get_bottom_corner(); + point_type& get_upper_corner(); + bool contains(const point_type& point) const; + void infer_from_filters(const std::vector &Filters_list); + bool is_trivial() const ; + std::pair get_pair() const{ + return {bottomCorner_,upperCorner_}; + } + std::pair get_pair(){ + return {bottomCorner_,upperCorner_}; + } + +private: + point_type bottomCorner_; + point_type upperCorner_; +}; + +template +inline Box::Box() +{} + +template +inline Box::Box(const point_type &bottomCorner, const point_type &upperCorner) + : bottomCorner_(bottomCorner), + upperCorner_(upperCorner) +{ + assert(bottomCorner.size() == upperCorner.size() + && bottomCorner <= upperCorner + && "This box is trivial !"); +} + +template +inline Box::Box(const std::pair &box) + : bottomCorner_(box.first), + upperCorner_(box.second) +{} + + +template +inline void Box::inflate(T delta) +{ + bottomCorner_ -= delta; + upperCorner_ += delta; +} + +template +inline void Box::infer_from_filters(const std::vector &Filters_list){ + int dimension = Filters_list.size(); + int nsplx = Filters_list[0].size(); + std::vector lower(dimension); + std::vector upper(dimension); + for (int i = 0; i < dimension; i++){ + T min = Filters_list[i][0]; + T max = Filters_list[i][0]; + for (int j=1; j +inline bool Box::is_trivial() const { + return bottomCorner_.empty() || upperCorner_.empty() || bottomCorner_.size() != upperCorner_.size(); +} + +template +inline const typename Box::point_type &Box::get_bottom_corner() const +{ + return bottomCorner_; +} + +template +inline const typename Box::point_type &Box::get_upper_corner() const +{ + return upperCorner_; +} + +template +inline typename Box::point_type &Box::get_bottom_corner() +{ + return bottomCorner_; +} + +template +inline typename Box::point_type &Box::get_upper_corner() +{ + return upperCorner_; +} + +template +inline bool Box::contains(const point_type &point) const +{ + if (point.size() != bottomCorner_.size()) return false; + + return bottomCorner_ <= point && point <= upperCorner_; +} + +template +std::ostream& operator<<(std::ostream& os, const Box& box) +{ + os << "Box -- Bottom corner : "; + os << box.get_bottom_corner(); + os << ", Top corner : "; + os << box.get_upper_corner(); + return os; +} + +} // namespace Gudhi + + +#endif // BOX_H_INCLUDED diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h new file mode 100644 index 0000000000..a75c45c641 --- /dev/null +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h @@ -0,0 +1,150 @@ +#ifndef FINITELY_CRITICAL_FILTRATIONS_H_ +#define FINITELY_CRITICAL_FILTRATIONS_H_ + +#include +#include +#include + +namespace Gudhi::multiparameter::multi_filtrations{ + +template +class Finitely_critical_multi_filtration : public std::vector { + // Class to prevent doing illegal stuff with the standard library, e.g., compare two vectors +public: + Finitely_critical_multi_filtration() : std::vector() {}; + Finitely_critical_multi_filtration(int n) : std::vector(n, -std::numeric_limits::infinity()) {}; // minus infinity by default + Finitely_critical_multi_filtration(int n, T value) : std::vector(n,value) {}; + Finitely_critical_multi_filtration(std::initializer_list init) : std::vector(init) {}; + Finitely_critical_multi_filtration(const std::vector& v) : std::vector(v) {}; + Finitely_critical_multi_filtration(typename std::vector::iterator it_begin,typename std::vector::iterator it_end) : std::vector(it_begin, it_end) {}; + Finitely_critical_multi_filtration(typename std::vector::const_iterator it_begin,typename std::vector::const_iterator it_end) : std::vector(it_begin, it_end) {}; + + + operator std::vector&() const { + return *this; + } + std::vector get_vector() const{ + return static_cast>(*this); + } + + + + friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) + { + bool isSame = true; + int n = std::min(a.size(), b.size()); + for (int i = 0; i < n; ++i){ + if (a[i] > b[i]) return false; + if (isSame && a[i] != b[i]) isSame = false; + } + if (isSame) return false; + return true; + } + friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) + { + int n = std::min(a.size(), b.size()); + for (int i = 0; i < n; ++i){ + if (a[i] > b[i]) return false; + } + return true; + } + + + + //GREATER THAN OPERATORS + friend bool operator>(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) + { + return b=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) + { + return b<=a; + } + + Finitely_critical_multi_filtration& operator=(const Finitely_critical_multi_filtration& a){ + std::vector::operator=(a); + return *this; + } + + std::vector& _convert_back(){ + return *this; + } + + + + + friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration &result, const Finitely_critical_multi_filtration &to_substract){ + std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); + return result; + } + friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration &result, const Finitely_critical_multi_filtration &to_add){ + std::transform(result.begin(), result.end(), to_add.begin(),result.begin(), std::plus()); + return result; + } + + friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration &result, const T &to_substract){ + // std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); + for (auto & truc : result){ + truc -= to_substract; + } + return result; + } + friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration &result, const T &to_add){ + for (auto & truc : result){ + truc += to_add; + } + return result; + } + + static std::vector> to_python(const std::vector>& to_convert){ + return std::vector>(to_convert.begin(), to_convert.end()); + } + + + static std::vector> from_python(const std::vector>& to_convert){ + return std::vector>(to_convert.begin(), to_convert.end());; + } + void push_to(const Finitely_critical_multi_filtration& x){ + if (this->size() != x.size()){ + std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->size() << " and " << x.size() << "are different !" << std::endl; + throw std::logic_error("Bad sizes"); + } + for (unsigned int i = 0; i < x.size(); i++) + this->at(i) = this->at(i) > x[i] ? this->at(i) : x[i]; + } + // Warning, this function assumes that the comparisons checks have already been made ! + void insert_new(Finitely_critical_multi_filtration to_concatenate){ + this->insert( + this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end()) + ); + } + + + // scalar product of a filtration value with x. + T linear_projection(const std::vector& x){ + T projection=0; + unsigned int size = std::min(x.size(), this->size()); + for (auto i =0u; iat(i); + return projection; + } + + // easy debug + friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc){ + stream << "["; + for(unsigned int i = 0; i < truc.size()-1; i++){ + stream << truc[i] << ", "; + } + if(!truc.empty()) stream << truc.back(); + stream << "]"; + return stream; + } + + + + +}; + + +} // namespace Gudhi +#endif // FINITELY_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/line.h new file mode 100644 index 0000000000..0fa82cf715 --- /dev/null +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/line.h @@ -0,0 +1,94 @@ +/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. + * See file LICENSE for full license details. + * Author(s): David Loiseaux + * + * Copyright (C) 2022 Inria + * + * Modification(s): + */ +/** + * @file line_filtration_translation.h + * @author David Loiseaux + * @brief + */ + + +#ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED +#define LINE_FILTRATION_TRANSLATION_H_INCLUDED + +#include "box.h" +#include "finitely_critical_filtrations.h" + +namespace Gudhi::multiparameter::multi_filtrations{ + + + template + class Line + { + + public: + using point_type = Finitely_critical_multi_filtration; + Line(); + Line(point_type x); + Line(point_type x, point_type v); + point_type push_forward(point_type x) const; + point_type push_back(point_type x) const; + int get_dim() const; + std::pair get_bounds(const Box &box) const; + + + private: + point_type basepoint_; // any point on the line + point_type direction_; // direction of the line + + }; + template + Line::Line(){} + + template + Line::Line(point_type x){ + this->basepoint_.swap(x); + // this->direction_ = {}; // diagonal line + } + template + Line::Line(point_type x, point_type v){ + this->basepoint_.swap(x); + this->direction_.swap(v); + } + template + typename Line::point_type Line::push_forward(point_type x) const { //TODO remove copy + x -= basepoint_; + T t = - std::numeric_limits::infinity();; + for (std::size_t i = 0; idirection_.size() > i ? direction_[i] : 1; + t = std::max(t, x[i]/dir); + } + point_type out(basepoint_.size()); + for (unsigned int i = 0; i < out.size(); i++) + out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1) ; + return out; + } + template + typename Line::point_type Line::push_back(point_type x) const{ + x -= basepoint_; + T t = std::numeric_limits::infinity(); + for (unsigned int i = 0; idirection_.size() > i ? direction_[i] : 1; + t = std::min(t, x[i]/dir); + } + point_type out(basepoint_.size()); + for (unsigned int i = 0; i < out.size(); i++) + out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1) ; + return out; + } + template + int Line::get_dim() const{ + return basepoint_.size(); + } + template + std::pair::point_type, typename Line::point_type> Line::get_bounds(const Box &box) const{ + return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; + } +} + +#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED diff --git a/src/Simplex_tree/test/simplex_tree_ctor_and_move_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_ctor_and_move_unit_test.cpp index 986f811b54..e119008670 100644 --- a/src/Simplex_tree/test/simplex_tree_ctor_and_move_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_ctor_and_move_unit_test.cpp @@ -36,6 +36,7 @@ struct Simplex_tree_options_stable_simplex_handles { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; typedef boost::mpl::list, diff --git a/src/Simplex_tree/test/simplex_tree_graph_expansion_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_graph_expansion_unit_test.cpp index ed0f38d632..3a0eea485f 100644 --- a/src/Simplex_tree/test/simplex_tree_graph_expansion_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_graph_expansion_unit_test.cpp @@ -31,6 +31,7 @@ struct Simplex_tree_options_stable_simplex_handles { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; typedef boost::mpl::list, diff --git a/src/Simplex_tree/test/simplex_tree_make_filtration_non_decreasing_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_make_filtration_non_decreasing_unit_test.cpp index 05b7052612..3ac3b97401 100644 --- a/src/Simplex_tree/test/simplex_tree_make_filtration_non_decreasing_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_make_filtration_non_decreasing_unit_test.cpp @@ -33,6 +33,7 @@ struct Simplex_tree_options_stable_simplex_handles { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; typedef boost::mpl::list, diff --git a/src/Simplex_tree/test/simplex_tree_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_unit_test.cpp index fa1a444151..de1303e1e2 100644 --- a/src/Simplex_tree/test/simplex_tree_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_unit_test.cpp @@ -41,6 +41,7 @@ struct Simplex_tree_options_stable_simplex_handles { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; typedef boost::mpl::list, From 1fa3aa9cde4f090f69ee634a7d000a69e6d223c2 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Thu, 28 Sep 2023 17:50:04 +0200 Subject: [PATCH 02/87] some tests --- .../finitely_critical_filtrations.h | 13 +- src/Simplex_tree/test/CMakeLists.txt | 6 + .../test/simplex_tree_multi_unit_test.cpp | 686 ++++++++++++++++++ 3 files changed, 704 insertions(+), 1 deletion(-) create mode 100644 src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h index a75c45c641..188fde79a1 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h @@ -96,6 +96,16 @@ class Finitely_critical_multi_filtration : public std::vector { return result; } + // template + friend bool operator==(Finitely_critical_multi_filtration &self, const Finitely_critical_multi_filtration &to_compare){ + if (self.size() != to_compare.size()) return false; + auto it = to_compare.begin(); + for (auto i = 0u; i> to_python(const std::vector>& to_convert){ return std::vector>(to_convert.begin(), to_convert.end()); } @@ -131,7 +141,8 @@ class Finitely_critical_multi_filtration : public std::vector { // easy debug friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc){ - stream << "["; + if (truc.empty()) {stream << "[]"; return stream;} + stream << "["; for(unsigned int i = 0; i < truc.size()-1; i++){ stream << truc[i] << ", "; } diff --git a/src/Simplex_tree/test/CMakeLists.txt b/src/Simplex_tree/test/CMakeLists.txt index e4535e1b7e..a6bc2f44c0 100644 --- a/src/Simplex_tree/test/CMakeLists.txt +++ b/src/Simplex_tree/test/CMakeLists.txt @@ -11,6 +11,12 @@ if(TARGET TBB::tbb) endif() gudhi_add_boost_test(Simplex_tree_test_unit) +add_executable ( Simplex_tree_multi_test_unit simplex_tree_multi_unit_test.cpp ) +if(TARGET TBB::tbb) + target_link_libraries(Simplex_tree_multi_test_unit TBB::tbb) +endif() +gudhi_add_boost_test(Simplex_tree_multi_test_unit) + add_executable ( Simplex_tree_remove_test_unit simplex_tree_remove_unit_test.cpp ) if(TARGET TBB::tbb) target_link_libraries(Simplex_tree_remove_test_unit TBB::tbb) diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp new file mode 100644 index 0000000000..b094908246 --- /dev/null +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -0,0 +1,686 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Vincent Rouvreau + * + * Copyright (C) 2014 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#include +#include +#include +#include +#include // std::pair, std::make_pair +#include // float comparison +#include +#include // greater +#include // std::tie +#include // for std::distance +#include // for std::size_t + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "simplex_tree" +#include +#include + +// ^ +// /!\ Nothing else from Simplex_tree shall be included to test includes are well defined. +#include "gudhi/Simplex_tree/Simplex_tree_multi.h" +#include "gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h" + +using namespace Gudhi; +using namespace Gudhi::multiparameter; +using Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration; +using vec=Finitely_critical_multi_filtration; + +typedef boost::mpl::list> list_of_tested_variants; + +template +void test_empty_simplex_tree(typeST& tst) { + typedef typename typeST::Vertex_handle Vertex_handle; + const Vertex_handle DEFAULT_VERTEX_VALUE = Vertex_handle(- 1); + BOOST_CHECK(tst.null_vertex() == DEFAULT_VERTEX_VALUE); + BOOST_CHECK(tst.num_vertices() == (size_t) 0); + BOOST_CHECK(tst.num_simplices() == (size_t) 0); + BOOST_CHECK(tst.is_empty()); + BOOST_CHECK(tst.num_simplices_by_dimension() == std::vector()); + typename typeST::Siblings* STRoot = tst.root(); + BOOST_CHECK(STRoot != nullptr); + BOOST_CHECK(STRoot->oncles() == nullptr); + BOOST_CHECK(STRoot->parent() == DEFAULT_VERTEX_VALUE); + BOOST_CHECK(tst.dimension() == -1); +} + +template +void test_iterators_on_empty_simplex_tree(typeST& tst) { + std::clog << "Iterator on vertices: " << std::endl; + for (auto vertex : tst.complex_vertex_range()) { + std::clog << "vertice:" << vertex << std::endl; + BOOST_CHECK(false); // shall be empty + } + std::clog << "Iterator on simplices: " << std::endl; + for (auto simplex : tst.complex_simplex_range()) { + BOOST_CHECK(simplex != simplex); // shall be empty - to remove warning of non-used simplex + } + + std::clog + << "Iterator on Simplices in the filtration, with [filtration value]:" + << std::endl; + for (auto f_simplex : tst.filtration_simplex_range()) { + BOOST_CHECK(false); // shall be empty + std::clog << "test_iterators_on_empty_simplex_tree - filtration=" + << tst.filtration(f_simplex) << std::endl; + } +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_when_empty, typeST, list_of_tested_variants) { + typedef std::pair typePairSimplexBool; + typedef std::vector typeVectorVertex; + + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST OF DEFAULT CONSTRUCTOR" << std::endl; + typeST st; + + test_empty_simplex_tree(st); + + test_iterators_on_empty_simplex_tree(st); + // TEST OF EMPTY INSERTION + std::clog << "TEST OF EMPTY INSERTION" << std::endl; + typeVectorVertex simplexVectorEmpty; + BOOST_CHECK(simplexVectorEmpty.empty() == true); + typePairSimplexBool returnEmptyValue = st.insert_simplex(simplexVectorEmpty, 0.0); + BOOST_CHECK(returnEmptyValue.first == typeST::null_simplex()); + BOOST_CHECK(returnEmptyValue.second == true); + + test_empty_simplex_tree(st); + + test_iterators_on_empty_simplex_tree(st); +} + +bool AreAlmostTheSame(float a, float b) { + return std::fabs(a - b) < std::numeric_limits::epsilon(); +} +bool AreAlmostTheSame(Finitely_critical_multi_filtration a, Finitely_critical_multi_filtration b) { + assert(a.size() == b.size()); + for (auto i=0u; i std::numeric_limits::epsilon()) + return false; + return true; +} + + +template +void test_simplex_tree_contains(typeST& simplexTree, typeSimplex& simplex, int pos) { + auto f_simplex = simplexTree.filtration_simplex_range().begin() + pos; + + std::clog << "test_simplex_tree_contains - filtration=" << simplexTree.filtration(*f_simplex) << "||" << simplex.second << std::endl; + BOOST_CHECK(AreAlmostTheSame(simplexTree.filtration(*f_simplex), simplex.second)); + + int simplexIndex = simplex.first.size() - 1; + std::sort(simplex.first.begin(), simplex.first.end()); // if the simplex wasn't sorted, the next test could fail + for (auto vertex : simplexTree.simplex_vertex_range(*f_simplex)) { + std::clog << "test_simplex_tree_contains - vertex=" << vertex << "||" << simplex.first.at(simplexIndex) << std::endl; + BOOST_CHECK(vertex == simplex.first.at(simplexIndex)); + BOOST_CHECK(simplexIndex >= 0); + simplexIndex--; + } +} + +template +void test_simplex_tree_insert_returns_true(const typePairSimplexBool& returnValue) { + BOOST_CHECK(returnValue.second == true); + // Simplex_handle = boost::container::flat_map< typeST::Vertex_handle, Node >::iterator + typename typeST::Simplex_handle shReturned = returnValue.first; + BOOST_CHECK(shReturned != typeST::null_simplex()); +} + +// Global variables +int dim_max = -1; + +template +void set_and_test_simplex_tree_dim_fil(typeST& simplexTree, int vectorSize, const Filtration_value& fil) { + if (vectorSize > dim_max + 1) { + dim_max = vectorSize - 1; + simplexTree.set_dimension(dim_max); + std::clog << " set_and_test_simplex_tree_dim_fil - dim_max=" << dim_max + << std::endl; + } + + BOOST_CHECK(simplexTree.dimension() == dim_max); + + // Another way to count simplices: + size_t num_simp = 0; + for (auto f_simplex : simplexTree.complex_simplex_range()) { + // Remove warning + (void) f_simplex; + num_simp++; + } + + BOOST_CHECK(simplexTree.num_simplices() == num_simp); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_insertion, typeST, list_of_tested_variants) { + typedef typename typeST::Filtration_value Filtration_value; + typedef std::pair typePairSimplexBool; + typedef std::vector typeVectorVertex; + typedef std::pair typeSimplex; + const Filtration_value FIRST_FILTRATION_VALUE = {0.1,0.15}; + const Filtration_value SECOND_FILTRATION_VALUE = {0.2, 0.25}; + const Filtration_value THIRD_FILTRATION_VALUE = {0.3, 0.35}; + const Filtration_value FOURTH_FILTRATION_VALUE = {0.4, 0.45}; + // reset since we run the test several times + dim_max = -1; + + // TEST OF INSERTION + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST OF INSERTION" << std::endl; + typeST st; + + // ++ FIRST + std::clog << " - INSERT 0" << std::endl; + typeVectorVertex firstSimplexVector{0}; + BOOST_CHECK(firstSimplexVector.size() == 1); + typeSimplex firstSimplex = std::make_pair(firstSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE)); + typePairSimplexBool returnValue = st.insert_simplex(firstSimplex.first, firstSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, firstSimplexVector.size(), firstSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 1); + + // ++ SECOND + std::clog << " - INSERT 1" << std::endl; + typeVectorVertex secondSimplexVector{1}; + BOOST_CHECK(secondSimplexVector.size() == 1); + typeSimplex secondSimplex = std::make_pair(secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE)); + returnValue = st.insert_simplex(secondSimplex.first, secondSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, secondSimplexVector.size(), secondSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 2); + + // ++ THIRD + std::clog << " - INSERT (0,1)" << std::endl; + typeVectorVertex thirdSimplexVector{0, 1}; + BOOST_CHECK(thirdSimplexVector.size() == 2); + typeSimplex thirdSimplex = std::make_pair(thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE)); + returnValue = st.insert_simplex(thirdSimplex.first, thirdSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, thirdSimplexVector.size(), thirdSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 2); // Not incremented !! + + // ++ FOURTH + std::clog << " - INSERT 2" << std::endl; + typeVectorVertex fourthSimplexVector{2}; + BOOST_CHECK(fourthSimplexVector.size() == 1); + typeSimplex fourthSimplex = std::make_pair(fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE)); + returnValue = st.insert_simplex(fourthSimplex.first, fourthSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, fourthSimplexVector.size(), fourthSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 3); + + // ++ FIFTH + std::clog << " - INSERT (2,0)" << std::endl; + typeVectorVertex fifthSimplexVector{2, 0}; + BOOST_CHECK(fifthSimplexVector.size() == 2); + typeSimplex fifthSimplex = std::make_pair(fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE)); + returnValue = st.insert_simplex(fifthSimplex.first, fifthSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, fifthSimplexVector.size(), fifthSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 3); // Not incremented !! + + // ++ SIXTH + std::clog << " - INSERT (2,1)" << std::endl; + typeVectorVertex sixthSimplexVector{2, 1}; + BOOST_CHECK(sixthSimplexVector.size() == 2); + typeSimplex sixthSimplex = std::make_pair(sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE)); + returnValue = st.insert_simplex(sixthSimplex.first, sixthSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, sixthSimplexVector.size(), sixthSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 3); // Not incremented !! + + // ++ SEVENTH + std::clog << " - INSERT (2,1,0)" << std::endl; + typeVectorVertex seventhSimplexVector{2, 1, 0}; + BOOST_CHECK(seventhSimplexVector.size() == 3); + typeSimplex seventhSimplex = std::make_pair(seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE)); + returnValue = st.insert_simplex(seventhSimplex.first, seventhSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, seventhSimplexVector.size(), seventhSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 3); // Not incremented !! + + // ++ EIGHTH + std::clog << " - INSERT 3" << std::endl; + typeVectorVertex eighthSimplexVector{3}; + BOOST_CHECK(eighthSimplexVector.size() == 1); + typeSimplex eighthSimplex = std::make_pair(eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE)); + returnValue = st.insert_simplex(eighthSimplex.first, eighthSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, eighthSimplexVector.size(), eighthSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 4); + + // ++ NINTH + std::clog << " - INSERT (3,0)" << std::endl; + typeVectorVertex ninethSimplexVector{3, 0}; + BOOST_CHECK(ninethSimplexVector.size() == 2); + typeSimplex ninethSimplex = std::make_pair(ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE)); + returnValue = st.insert_simplex(ninethSimplex.first, ninethSimplex.second); + + test_simplex_tree_insert_returns_true(returnValue); + set_and_test_simplex_tree_dim_fil(st, ninethSimplexVector.size(), ninethSimplex.second); + BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented !! + + // ++ TENTH + std::clog << " - INSERT 0 (already inserted)" << std::endl; + typeVectorVertex tenthSimplexVector{0}; + BOOST_CHECK(tenthSimplexVector.size() == 1); + // With a different filtration value + typeSimplex tenthSimplex = std::make_pair(tenthSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE)); + returnValue = st.insert_simplex(tenthSimplex.first, tenthSimplex.second); + + BOOST_CHECK(returnValue.second == false); + // Simplex_handle = boost::container::flat_map< typeST::Vertex_handle, Node >::iterator + typename typeST::Simplex_handle shReturned = returnValue.first; + BOOST_CHECK(shReturned == typeST::null_simplex()); + std::clog << "st.num_vertices()=" << st.num_vertices() << std::endl; + BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented !! + BOOST_CHECK(st.dimension() == dim_max); + + // ++ ELEVENTH + std::clog << " - INSERT (2,1,0) (already inserted)" << std::endl; + typeVectorVertex eleventhSimplexVector{2, 1, 0}; + BOOST_CHECK(eleventhSimplexVector.size() == 3); + typeSimplex eleventhSimplex = std::make_pair(eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE)); + returnValue = st.insert_simplex(eleventhSimplex.first, eleventhSimplex.second); + + BOOST_CHECK(returnValue.second == false); + // Simplex_handle = boost::container::flat_map< typeST::Vertex_handle, Node >::iterator + shReturned = returnValue.first; + BOOST_CHECK(shReturned == typeST::null_simplex()); + BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented !! + BOOST_CHECK(st.dimension() == dim_max); + BOOST_CHECK(st.num_simplices_by_dimension() == std::vector({4, 4, 1})); + + /* Inserted simplex: */ + /* 1 */ + /* o */ + /* /X\ */ + /* o---o---o */ + /* 2 0 3 */ + + // [0.1] 0 + // [0.1] 1 + // [0.1] 2 + // [0.1] 3 + // [0.2] 1 0 + // [0.2] 2 0 + // [0.2] 2 1 + // [0.2] 3 0 + // [0.3] 2 1 0 + // !! Be careful, simplex are sorted by filtration value on insertion !! + std::clog << "simplex_tree_insertion - first - 0" << std::endl; + test_simplex_tree_contains(st, firstSimplex, 0); // (0) -> 0 + std::clog << "simplex_tree_insertion - second - 1" << std::endl; + test_simplex_tree_contains(st, secondSimplex, 1); // (1) -> 1 + std::clog << "simplex_tree_insertion - third - 4" << std::endl; + test_simplex_tree_contains(st, thirdSimplex, 4); // (0,1) -> 4 + std::clog << "simplex_tree_insertion - fourth - 2" << std::endl; + test_simplex_tree_contains(st, fourthSimplex, 2); // (2) -> 2 + std::clog << "simplex_tree_insertion - fifth - 5" << std::endl; + test_simplex_tree_contains(st, fifthSimplex, 5); // (2,0) -> 5 + std::clog << "simplex_tree_insertion - sixth - 6" << std::endl; + test_simplex_tree_contains(st, sixthSimplex, 6); //(2,1) -> 6 + std::clog << "simplex_tree_insertion - seventh - 8" << std::endl; + test_simplex_tree_contains(st, seventhSimplex, 8); // (2,1,0) -> 8 + std::clog << "simplex_tree_insertion - eighth - 3" << std::endl; + test_simplex_tree_contains(st, eighthSimplex, 3); // (3) -> 3 + std::clog << "simplex_tree_insertion - ninth - 7" << std::endl; + test_simplex_tree_contains(st, ninethSimplex, 7); // (3,0) -> 7 + + // Display the Simplex_tree - Can not be done in the middle of 2 inserts + std::clog << "The complex contains " << st.num_simplices() << " simplices" << std::endl; + std::clog << " - dimension " << st.dimension() << std::endl; + std::clog << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl; + for (auto f_simplex : st.filtration_simplex_range()) { + std::clog << " " << "[" << st.filtration(f_simplex) << "] "; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::clog << (int) vertex << " "; + } + std::clog << std::endl; + } + +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(NSimplexAndSubfaces_tree_insertion, typeST, list_of_tested_variants) { + typedef std::pair typePairSimplexBool; + typedef std::vector typeVectorVertex; + typedef std::pair typeSimplex; + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST OF RECURSIVE INSERTION" << std::endl; + typeST st; + typePairSimplexBool returnValue; + int position = 0; + + // ++ FIRST + std::clog << " - INSERT (2,1,0)" << std::endl; + typeVectorVertex SimplexVector1{2, 1, 0}; + BOOST_CHECK(SimplexVector1.size() == 3); + returnValue = st.insert_simplex_and_subfaces(SimplexVector1); + + BOOST_CHECK(st.num_vertices() == (size_t) 3); // +3 (2, 1 and 0 are not existing) + + // Check it is well inserted + BOOST_CHECK(true == returnValue.second); + position = 0; + std::sort(SimplexVector1.begin(), SimplexVector1.end(), std::greater()); + for (auto vertex : st.simplex_vertex_range(returnValue.first)) { + // Check returned Simplex_handle + std::clog << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector1[position] << std::endl; + BOOST_CHECK(vertex == SimplexVector1[position]); + position++; + } + + // ++ SECOND + std::clog << " - INSERT 3" << std::endl; + typeVectorVertex SimplexVector2{3}; + BOOST_CHECK(SimplexVector2.size() == 1); + returnValue = st.insert_simplex_and_subfaces(SimplexVector2); + + BOOST_CHECK(st.num_vertices() == (size_t) 4); // +1 (3 is not existing) + + // Check it is well inserted + BOOST_CHECK(true == returnValue.second); + position = 0; + std::sort(SimplexVector2.begin(), SimplexVector2.end(), std::greater()); + for (auto vertex : st.simplex_vertex_range(returnValue.first)) { + // Check returned Simplex_handle + std::clog << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector2[position] << std::endl; + BOOST_CHECK(vertex == SimplexVector2[position]); + position++; + } + + // ++ THIRD + std::clog << " - INSERT (0,3)" << std::endl; + typeVectorVertex SimplexVector3{3, 0}; + BOOST_CHECK(SimplexVector3.size() == 2); + returnValue = st.insert_simplex_and_subfaces(SimplexVector3); + + BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented (all are existing) + + // Check it is well inserted + BOOST_CHECK(true == returnValue.second); + position = 0; + std::sort(SimplexVector3.begin(), SimplexVector3.end(), std::greater()); + for (auto vertex : st.simplex_vertex_range(returnValue.first)) { + // Check returned Simplex_handle + std::clog << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector3[position] << std::endl; + BOOST_CHECK(vertex == SimplexVector3[position]); + position++; + } + + // ++ FOURTH + std::clog << " - INSERT (1,0) (already inserted)" << std::endl; + typeVectorVertex SimplexVector4{1, 0}; + BOOST_CHECK(SimplexVector4.size() == 2); + returnValue = st.insert_simplex_and_subfaces(SimplexVector4); + + BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented (all are existing) + + // Check it was not inserted (already there from {2,1,0} insertion) + BOOST_CHECK(false == returnValue.second); + + // ++ FIFTH + std::clog << " - INSERT (3,4,5)" << std::endl; + typeVectorVertex SimplexVector5{3, 4, 5}; + BOOST_CHECK(SimplexVector5.size() == 3); + returnValue = st.insert_simplex_and_subfaces(SimplexVector5); + + BOOST_CHECK(st.num_vertices() == (size_t) 6); + + // Check it is well inserted + BOOST_CHECK(true == returnValue.second); + position = 0; + std::sort(SimplexVector5.begin(), SimplexVector5.end(), std::greater()); + for (auto vertex : st.simplex_vertex_range(returnValue.first)) { + // Check returned Simplex_handle + std::clog << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector5[position] << std::endl; + BOOST_CHECK(vertex == SimplexVector5[position]); + position++; + } + + // ++ SIXTH + std::clog << " - INSERT (0,1,6,7)" << std::endl; + typeVectorVertex SimplexVector6{0, 1, 6, 7}; + BOOST_CHECK(SimplexVector6.size() == 4); + returnValue = st.insert_simplex_and_subfaces(SimplexVector6); + + BOOST_CHECK(st.num_vertices() == (size_t) 8); // +2 (6 and 7 are not existing - 0 and 1 are already existing) + + // Check it is well inserted + BOOST_CHECK(true == returnValue.second); + position = 0; + std::sort(SimplexVector6.begin(), SimplexVector6.end(), std::greater()); + for (auto vertex : st.simplex_vertex_range(returnValue.first)) { + // Check returned Simplex_handle + std::clog << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector6[position] << std::endl; + BOOST_CHECK(vertex == SimplexVector6[position]); + position++; + } + + /* Inserted simplex: */ + /* 1 6 */ + /* o---o */ + /* /X\7/ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + /* */ + /* In other words: */ + /* A facet [2,1,0] */ + /* An edge [0,3] */ + /* A facet [3,4,5] */ + /* A cell [0,1,6,7] */ + + typeSimplex simplexPair1 = std::make_pair(SimplexVector1, 0.0); + typeSimplex simplexPair2 = std::make_pair(SimplexVector2, 0.0); + typeSimplex simplexPair3 = std::make_pair(SimplexVector3, 0.0); + typeSimplex simplexPair4 = std::make_pair(SimplexVector4, 0.0); + typeSimplex simplexPair5 = std::make_pair(SimplexVector5, 0.0); + typeSimplex simplexPair6 = std::make_pair(SimplexVector6, 0.0); + test_simplex_tree_contains(st, simplexPair1, 6); // (2,1,0) is in position 6 + test_simplex_tree_contains(st, simplexPair2, 7); // (3) is in position 7 + test_simplex_tree_contains(st, simplexPair3, 8); // (3,0) is in position 8 + test_simplex_tree_contains(st, simplexPair4, 2); // (1,0) is in position 2 + test_simplex_tree_contains(st, simplexPair5, 14); // (3,4,5) is in position 14 + test_simplex_tree_contains(st, simplexPair6, 26); // (7,6,1,0) is in position 26 + + // ------------------------------------------------------------------------------------------------------------------ + // Find in the simplex_tree + // ------------------------------------------------------------------------------------------------------------------ + typeVectorVertex simpleSimplexVector{1}; + typename typeST::Simplex_handle simplexFound = st.find(simpleSimplexVector); + std::clog << "**************IS THE SIMPLEX {1} IN THE SIMPLEX TREE ?\n"; + if (simplexFound != st.null_simplex()) + std::clog << "***+ YES IT IS!\n"; + else + std::clog << "***- NO IT ISN'T\n"; + // Check it is found + BOOST_CHECK(simplexFound != st.null_simplex()); + + typeVectorVertex unknownSimplexVector{15}; + simplexFound = st.find(unknownSimplexVector); + std::clog << "**************IS THE SIMPLEX {15} IN THE SIMPLEX TREE ?\n"; + if (simplexFound != st.null_simplex()) + std::clog << "***+ YES IT IS!\n"; + else + std::clog << "***- NO IT ISN'T\n"; + // Check it is NOT found + BOOST_CHECK(simplexFound == st.null_simplex()); + + simplexFound = st.find(SimplexVector6); + std::clog << "**************IS THE SIMPLEX {0,1,6,7} IN THE SIMPLEX TREE ?\n"; + if (simplexFound != st.null_simplex()) + std::clog << "***+ YES IT IS!\n"; + else + std::clog << "***- NO IT ISN'T\n"; + // Check it is found + BOOST_CHECK(simplexFound != st.null_simplex()); + + typeVectorVertex otherSimplexVector{1, 15}; + simplexFound = st.find(otherSimplexVector); + std::clog << "**************IS THE SIMPLEX {15,1} IN THE SIMPLEX TREE ?\n"; + if (simplexFound != st.null_simplex()) + std::clog << "***+ YES IT IS!\n"; + else + std::clog << "***- NO IT ISN'T\n"; + // Check it is NOT found + BOOST_CHECK(simplexFound == st.null_simplex()); + + typeVectorVertex invSimplexVector{1, 2, 0}; + simplexFound = st.find(invSimplexVector); + std::clog << "**************IS THE SIMPLEX {1,2,0} IN THE SIMPLEX TREE ?\n"; + if (simplexFound != st.null_simplex()) + std::clog << "***+ YES IT IS!\n"; + else + std::clog << "***- NO IT ISN'T\n"; + // Check it is found + BOOST_CHECK(simplexFound != st.null_simplex()); + + // Display the Simplex_tree - Can not be done in the middle of 2 inserts + std::clog << "The complex contains " << st.num_simplices() << " simplices" << std::endl; + std::clog << " - dimension " << st.dimension() << std::endl; + std::clog << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl; + for (auto f_simplex : st.filtration_simplex_range()) { + std::clog << " " << "[" << st.filtration(f_simplex) << "] "; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::clog << (int) vertex << " "; + } + std::clog << std::endl; + } +} + + +template +void test_simplex_is_vertex(typeST& st, typename typeST::Simplex_handle sh, typename typeST::Vertex_handle v) { + BOOST_CHECK(st.dimension(sh) == 0); + auto&& r = st.simplex_vertex_range(sh); + auto i = std::begin(r); + BOOST_CHECK(*i == v); + BOOST_CHECK(++i == std::end(r)); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tested_variants) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST RESET FILTRATION" << std::endl; + typeST st; + + st.insert_simplex_and_subfaces({2, 1, 0}, 3.); + st.insert_simplex_and_subfaces({3, 0}, 2.); + st.insert_simplex_and_subfaces({3, 4, 5}, 3.); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, 4.); + + /* Inserted simplex: */ + /* 1 6 */ + /* o---o */ + /* /X\7/ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + + 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::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 = 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::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) == st.inf_); + } + } + +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variants) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST SIMPLEX TREE CLEAR" << std::endl; + typeST st; + st.insert_simplex_and_subfaces({0, 1}, vec{1.5}); + st.initialize_filtration(); + st.clear(); + BOOST_CHECK(st.num_vertices() == 0); + BOOST_CHECK(st.num_simplices() == 0); + BOOST_CHECK(st.upper_bound_dimension() == -1); + BOOST_CHECK(st.dimension() == -1); + BOOST_CHECK(boost::size(st.filtration_simplex_range()) == 0); + typeST st_empty; + BOOST_CHECK(st == st_empty); + st.insert_simplex_and_subfaces({0}, vec{2.5}); + BOOST_CHECK(boost::size(st.cofaces_simplex_range(st.find({0}), 1)) == 0); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(for_each_simplex_skip_iteration, typeST, list_of_tested_variants) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST FOR_EACH ITERATION SKIP MECHANISM" << std::endl; + typeST st; + + st.insert_simplex_and_subfaces({2, 1, 0}, 3.); + st.insert_simplex_and_subfaces({3, 0}, 2.); + st.insert_simplex_and_subfaces({3, 4, 5}, 3.); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, 4.); + + /* Inserted simplex: */ + /* 1 6 */ + /* o---o */ + /* /X\7/ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + + std::vector num_simplices_by_dim_until_two(2); + auto lambda_nb_simp_by_dim = [&num_simplices_by_dim_until_two](typename typeST::Simplex_handle, int dim) + { + BOOST_CHECK (dim < 2); + ++num_simplices_by_dim_until_two[dim]; + return dim >= 1; // The iteration will skip the children in this case + }; + st.for_each_simplex(lambda_nb_simp_by_dim); + for (auto num_simplices : num_simplices_by_dim_until_two) + std::cout << num_simplices << ", "; + std::cout << std::endl; + + auto num_simplices_by_dim = st.num_simplices_by_dimension(); + for (auto num_simplices : num_simplices_by_dim) + std::cout << num_simplices << ", "; + std::cout << std::endl; + + BOOST_CHECK(num_simplices_by_dim_until_two[0] == num_simplices_by_dim[0]); + BOOST_CHECK(num_simplices_by_dim_until_two[1] == num_simplices_by_dim[1]); +} From 04d8d8c68f06bfe83c459dfee0b14c2d1e7c2d06 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 10:23:41 +0200 Subject: [PATCH 03/87] Update src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp Co-authored-by: Vincent Rouvreau <10407034+VincentRouvreau@users.noreply.github.com> --- src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index b094908246..91e3986f62 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -1,8 +1,8 @@ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): Vincent Rouvreau + * Author(s): David Loiseaux * - * Copyright (C) 2014 Inria + * Copyright (C) 2023 Inria * * Modification(s): * - YYYY/MM Author: Description of the modification From 2cab38866cdd9fa286b3974090d83775ab08c86a Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 10:24:18 +0200 Subject: [PATCH 04/87] Rename box.h to Box.h --- .../include/gudhi/Simplex_tree/multi_filtrations/{box.h => Box.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/{box.h => Box.h} (100%) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h similarity index 100% rename from src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/box.h rename to src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h From cba6c6feef180eddfcede7d6dfe0c176ebfb7364 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 10:26:40 +0200 Subject: [PATCH 05/87] Rename line.h to Line.h --- .../gudhi/Simplex_tree/multi_filtrations/{line.h => Line.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/{line.h => Line.h} (100%) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h similarity index 100% rename from src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/line.h rename to src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h From ddd26fe64c53b889b7812d2e96ec303d7e821bd8 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 10:27:17 +0200 Subject: [PATCH 06/87] Rename finitely_critical_filtrations.h to Finitely_critical_filtrations.h --- ...ely_critical_filtrations.h => Finitely_critical_filtrations.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/{finitely_critical_filtrations.h => Finitely_critical_filtrations.h} (100%) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h similarity index 100% rename from src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h rename to src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h From 9d3b51bdf6548820be8362562cd146ba3186b9f5 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 10:36:38 +0200 Subject: [PATCH 07/87] copyrights --- .../include/gudhi/Simplex_tree/Simplex_tree_multi.h | 6 ++---- .../gudhi/Simplex_tree/multi_filtrations/Box.h | 8 ++++---- .../Finitely_critical_filtrations.h | 10 ++++++++++ .../gudhi/Simplex_tree/multi_filtrations/Line.h | 13 ++++--------- .../test/simplex_tree_multi_unit_test.cpp | 4 ++-- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index b2eae92cab..0d14634e25 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -1,12 +1,10 @@ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): Hannah Schreiber - * - * Copyright (C) 2014 Inria """ + * Author(s): David Loiseaux, Hannah Schreiber * + * Copyright (C) 2023 Inria * * Modification(s): - * - 2022/11 David Loiseaux / Hannah Schreiber : added multify / flatten to interface standard simplextree. * - YYYY/MM Author: Description of the modification */ #ifndef SIMPLEX_TREE_MULTI_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h index a4c28fdf1f..5d04d3c86b 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h @@ -1,11 +1,11 @@ -/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. - * See file LICENSE for full license details. +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. * Author(s): David Loiseaux * - * Copyright (C) 2021 Inria + * Copyright (C) 2023 Inria * * Modification(s): - * + * - YYYY/MM Author: Description of the modification */ /** * @file box.h diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 188fde79a1..8812d85ac8 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -1,3 +1,13 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): David Loiseaux + * + * Copyright (C) 2023 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + #ifndef FINITELY_CRITICAL_FILTRATIONS_H_ #define FINITELY_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h index 0fa82cf715..995dfa3a58 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h @@ -1,17 +1,12 @@ -/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. - * See file LICENSE for full license details. +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. * Author(s): David Loiseaux * - * Copyright (C) 2022 Inria + * Copyright (C) 2023 Inria * * Modification(s): + * - YYYY/MM Author: Description of the modification */ -/** - * @file line_filtration_translation.h - * @author David Loiseaux - * @brief - */ - #ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED #define LINE_FILTRATION_TRANSLATION_H_INCLUDED diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 91e3986f62..4e7f5fa045 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -631,7 +631,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant std::clog << "********************************************************************" << std::endl; std::clog << "TEST SIMPLEX TREE CLEAR" << std::endl; typeST st; - st.insert_simplex_and_subfaces({0, 1}, vec{1.5}); + st.insert_simplex_and_subfaces({0, 1}, vec{{1.5}}); st.initialize_filtration(); st.clear(); BOOST_CHECK(st.num_vertices() == 0); @@ -641,7 +641,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant BOOST_CHECK(boost::size(st.filtration_simplex_range()) == 0); typeST st_empty; BOOST_CHECK(st == st_empty); - st.insert_simplex_and_subfaces({0}, vec{2.5}); + st.insert_simplex_and_subfaces({0}, vec{{2.5}}); BOOST_CHECK(boost::size(st.cofaces_simplex_range(st.find({0}), 1)) == 0); } From 685ae139315d5f64247858a6b6fdb045558fb60d Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 10:51:42 +0200 Subject: [PATCH 08/87] format --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 67 ++--- .../Simplex_tree/multi_filtrations/Box.h | 193 ++++++------ .../Finitely_critical_filtrations.h | 282 +++++++++--------- .../Simplex_tree/multi_filtrations/Line.h | 132 ++++---- 4 files changed, 310 insertions(+), 364 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 0effd69a34..9164488d97 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -831,9 +831,11 @@ class Simplex_tree { * to the new simplex. * If the insertion fails (the simplex is already there), the bool is set to false. If the insertion * fails and the simplex already in the complex has a filtration value strictly bigger than 'filtration', + * and the simplex tree is not multi parameter (`SimplexTreeOptions::is_multi_parameter == false`), * we assign this simplex with the new value 'filtration', and set the Simplex_handle field of the - * output pair to the Simplex_handle of the simplex. Otherwise, we set the Simplex_handle part to - * null_simplex. + * output pair to the Simplex_handle of the simplex. When the simplex tree is multi parameter, + * the existing filtration values are not updated. If the insertion fails for other reasons, + * we set the Simplex_handle part to `null_simplex`. * */ template > @@ -978,26 +980,17 @@ class Simplex_tree { Simplex_handle simplex_one = insertion_result.first; bool one_is_new = insertion_result.second; - if (!one_is_new) { - if (!(filtration(simplex_one) <= filt)) { - if constexpr (SimplexTreeOptions::is_multi_parameter){ - // By default, does nothing and assumes that the user is smart. - if (filt < filtration(simplex_one)){ - // placeholder for comparable filtrations - } - else{ - // placeholder for incomparable filtrations - } - } - else{ // non-multiparameter - assign_filtration(simplex_one, filt); + if constexpr (!SimplexTreeOptions::is_multi_parameter){ // Ignores the assign part for multiparameter filtrations. + if (!one_is_new) { + if (filtration(simplex_one) > filt){ + assign_filtration(simplex_one, filt); + } else { + // FIXME: this interface makes no sense, and it doesn't seem to be tested. + insertion_result.first = null_simplex(); } - - } else { - // FIXME: this interface makes no sense, and it doesn't seem to be tested. - insertion_result.first = null_simplex(); } } + if (++first == last) return insertion_result; if (!has_children(simplex_one)) // TODO: have special code here, we know we are building the whole subtree from scratch. @@ -1632,21 +1625,20 @@ class Simplex_tree { // Find the maximum filtration value in the border Boundary_simplex_range&& boundary = boundary_simplex_range(sh); Filtration_value max_filt_border_value; - if constexpr (SimplexTreeOptions::is_multi_parameter){ + if constexpr (SimplexTreeOptions::is_multi_parameter) { // in that case, we assume that Filtration_value has a `push_to` member to handle this. max_filt_border_value = Filtration_value(this->number_of_parameters_); - for (auto &face_sh : boundary){ - max_filt_border_value.push_to(filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration + for (auto& face_sh : boundary) { + max_filt_border_value.push_to( + filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration } - } - else{ - Boundary_simplex_iterator max_border = std::max_element(std::begin(boundary), std::end(boundary), - [](Simplex_handle sh1, Simplex_handle sh2) { - return filtration(sh1) < filtration(sh2); - }); + } else { + Boundary_simplex_iterator max_border = + std::max_element(std::begin(boundary), std::end(boundary), + [](Simplex_handle sh1, Simplex_handle sh2) { return filtration(sh1) < filtration(sh2); }); max_filt_border_value = filtration(*max_border); } - + // Replacing if(f=max)) would mean that if f is NaN, we replace it with the max of the children. // That seems more useful than keeping NaN. if (!(sh->second.filtration() >= max_filt_border_value)) { @@ -2278,17 +2270,14 @@ class Simplex_tree { int dimension_; bool dimension_to_be_lowered_ = false; -//MULTIPERS STUFF -public: - void set_number_of_parameters(int num){ - number_of_parameters_ = num; - } - int get_number_of_parameters() const{ - return number_of_parameters_; - } + // MULTIPERS STUFF + public: + void set_number_of_parameters(int num) { number_of_parameters_ = num; } + int get_number_of_parameters() const { return number_of_parameters_; } inline static Filtration_value inf_ = std::numeric_limits::infinity(); -private: - int number_of_parameters_; + + private: + int number_of_parameters_; }; // Print a Simplex_tree in os. diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h index 5d04d3c86b..aaf33842b2 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h @@ -24,141 +24,116 @@ #include "finitely_critical_filtrations.h" - - - /** * @brief Simple box in $\mathbb R^n$ . */ -namespace Gudhi::multiparameter::multi_filtrations{ - -template -class Box -{ - - using point_type = Finitely_critical_multi_filtration; -public: - Box(); - Box(T a, T b, T c, T d) : bottomCorner_({a,b}), upperCorner_({c,d}) {}; - Box(const point_type& bottomCorner, const point_type& upperCorner); - Box(const std::pair& box); - - void inflate(T delta); - const point_type& get_bottom_corner() const; - const point_type& get_upper_corner() const; - point_type& get_bottom_corner(); - point_type& get_upper_corner(); - bool contains(const point_type& point) const; - void infer_from_filters(const std::vector &Filters_list); - bool is_trivial() const ; - std::pair get_pair() const{ - return {bottomCorner_,upperCorner_}; - } - std::pair get_pair(){ - return {bottomCorner_,upperCorner_}; - } - -private: - point_type bottomCorner_; - point_type upperCorner_; +namespace Gudhi::multiparameter::multi_filtrations { + +template +class Box { + using point_type = Finitely_critical_multi_filtration; + + public: + Box(); + Box(T a, T b, T c, T d) : bottomCorner_({a, b}), upperCorner_({c, d}){}; + Box(const point_type& bottomCorner, const point_type& upperCorner); + Box(const std::pair& box); + + void inflate(T delta); + const point_type& get_bottom_corner() const; + const point_type& get_upper_corner() const; + point_type& get_bottom_corner(); + point_type& get_upper_corner(); + bool contains(const point_type& point) const; + void infer_from_filters(const std::vector& Filters_list); + bool is_trivial() const; + std::pair get_pair() const { return {bottomCorner_, upperCorner_}; } + std::pair get_pair() { return {bottomCorner_, upperCorner_}; } + + private: + point_type bottomCorner_; + point_type upperCorner_; }; -template -inline Box::Box() -{} - -template -inline Box::Box(const point_type &bottomCorner, const point_type &upperCorner) - : bottomCorner_(bottomCorner), - upperCorner_(upperCorner) -{ - assert(bottomCorner.size() == upperCorner.size() - && bottomCorner <= upperCorner - && "This box is trivial !"); -} +template +inline Box::Box() {} -template -inline Box::Box(const std::pair &box) - : bottomCorner_(box.first), - upperCorner_(box.second) -{} +template +inline Box::Box(const point_type& bottomCorner, const point_type& upperCorner) + : bottomCorner_(bottomCorner), upperCorner_(upperCorner) { + assert(bottomCorner.size() == upperCorner.size() && bottomCorner <= upperCorner && "This box is trivial !"); +} +template +inline Box::Box(const std::pair& box) : bottomCorner_(box.first), upperCorner_(box.second) {} -template -inline void Box::inflate(T delta) -{ - bottomCorner_ -= delta; - upperCorner_ += delta; +template +inline void Box::inflate(T delta) { + bottomCorner_ -= delta; + upperCorner_ += delta; } -template -inline void Box::infer_from_filters(const std::vector &Filters_list){ - int dimension = Filters_list.size(); - int nsplx = Filters_list[0].size(); - std::vector lower(dimension); - std::vector upper(dimension); - for (int i = 0; i < dimension; i++){ - T min = Filters_list[i][0]; - T max = Filters_list[i][0]; - for (int j=1; j +inline void Box::infer_from_filters(const std::vector& Filters_list) { + int dimension = Filters_list.size(); + int nsplx = Filters_list[0].size(); + std::vector lower(dimension); + std::vector upper(dimension); + for (int i = 0; i < dimension; i++) { + T min = Filters_list[i][0]; + T max = Filters_list[i][0]; + for (int j = 1; j < nsplx; j++) { + min = std::min(min, Filters_list[i][j]); + max = std::max(max, Filters_list[i][j]); + } + lower[i] = min; + upper[i] = max; + } + bottomCorner_.swap(lower); + upperCorner_.swap(upper); } -template +template inline bool Box::is_trivial() const { - return bottomCorner_.empty() || upperCorner_.empty() || bottomCorner_.size() != upperCorner_.size(); + return bottomCorner_.empty() || upperCorner_.empty() || bottomCorner_.size() != upperCorner_.size(); } -template -inline const typename Box::point_type &Box::get_bottom_corner() const -{ - return bottomCorner_; +template +inline const typename Box::point_type& Box::get_bottom_corner() const { + return bottomCorner_; } -template -inline const typename Box::point_type &Box::get_upper_corner() const -{ - return upperCorner_; +template +inline const typename Box::point_type& Box::get_upper_corner() const { + return upperCorner_; } -template -inline typename Box::point_type &Box::get_bottom_corner() -{ - return bottomCorner_; +template +inline typename Box::point_type& Box::get_bottom_corner() { + return bottomCorner_; } -template -inline typename Box::point_type &Box::get_upper_corner() -{ - return upperCorner_; +template +inline typename Box::point_type& Box::get_upper_corner() { + return upperCorner_; } -template -inline bool Box::contains(const point_type &point) const -{ - if (point.size() != bottomCorner_.size()) return false; +template +inline bool Box::contains(const point_type& point) const { + if (point.size() != bottomCorner_.size()) return false; - return bottomCorner_ <= point && point <= upperCorner_; + return bottomCorner_ <= point && point <= upperCorner_; } -template -std::ostream& operator<<(std::ostream& os, const Box& box) -{ - os << "Box -- Bottom corner : "; - os << box.get_bottom_corner(); - os << ", Top corner : "; - os << box.get_upper_corner(); - return os; +template +std::ostream& operator<<(std::ostream& os, const Box& box) { + os << "Box -- Bottom corner : "; + os << box.get_bottom_corner(); + os << ", Top corner : "; + os << box.get_upper_corner(); + return os; } -} // namespace Gudhi - +} // namespace Gudhi::multiparameter::multi_filtrations -#endif // BOX_H_INCLUDED +#endif // BOX_H_INCLUDED diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 8812d85ac8..d6bed8450a 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -15,157 +15,143 @@ #include #include -namespace Gudhi::multiparameter::multi_filtrations{ +namespace Gudhi::multiparameter::multi_filtrations { -template +template class Finitely_critical_multi_filtration : public std::vector { - // Class to prevent doing illegal stuff with the standard library, e.g., compare two vectors -public: - Finitely_critical_multi_filtration() : std::vector() {}; - Finitely_critical_multi_filtration(int n) : std::vector(n, -std::numeric_limits::infinity()) {}; // minus infinity by default - Finitely_critical_multi_filtration(int n, T value) : std::vector(n,value) {}; - Finitely_critical_multi_filtration(std::initializer_list init) : std::vector(init) {}; - Finitely_critical_multi_filtration(const std::vector& v) : std::vector(v) {}; - Finitely_critical_multi_filtration(typename std::vector::iterator it_begin,typename std::vector::iterator it_end) : std::vector(it_begin, it_end) {}; - Finitely_critical_multi_filtration(typename std::vector::const_iterator it_begin,typename std::vector::const_iterator it_end) : std::vector(it_begin, it_end) {}; - - - operator std::vector&() const { - return *this; - } - std::vector get_vector() const{ - return static_cast>(*this); - } - - - - friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) - { - bool isSame = true; - int n = std::min(a.size(), b.size()); - for (int i = 0; i < n; ++i){ - if (a[i] > b[i]) return false; - if (isSame && a[i] != b[i]) isSame = false; - } - if (isSame) return false; - return true; - } - friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) - { - int n = std::min(a.size(), b.size()); - for (int i = 0; i < n; ++i){ - if (a[i] > b[i]) return false; - } - return true; - } - - - - //GREATER THAN OPERATORS - friend bool operator>(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) - { - return b=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) - { - return b<=a; - } - - Finitely_critical_multi_filtration& operator=(const Finitely_critical_multi_filtration& a){ - std::vector::operator=(a); - return *this; - } - - std::vector& _convert_back(){ - return *this; - } - - - - - friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration &result, const Finitely_critical_multi_filtration &to_substract){ - std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); - return result; - } - friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration &result, const Finitely_critical_multi_filtration &to_add){ - std::transform(result.begin(), result.end(), to_add.begin(),result.begin(), std::plus()); - return result; - } - - friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration &result, const T &to_substract){ - // std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); - for (auto & truc : result){ - truc -= to_substract; - } - return result; - } - friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration &result, const T &to_add){ - for (auto & truc : result){ - truc += to_add; - } - return result; - } - - // template - friend bool operator==(Finitely_critical_multi_filtration &self, const Finitely_critical_multi_filtration &to_compare){ - if (self.size() != to_compare.size()) return false; - auto it = to_compare.begin(); - for (auto i = 0u; i> to_python(const std::vector>& to_convert){ - return std::vector>(to_convert.begin(), to_convert.end()); - } - - - static std::vector> from_python(const std::vector>& to_convert){ - return std::vector>(to_convert.begin(), to_convert.end());; - } - void push_to(const Finitely_critical_multi_filtration& x){ - if (this->size() != x.size()){ - std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->size() << " and " << x.size() << "are different !" << std::endl; - throw std::logic_error("Bad sizes"); - } - for (unsigned int i = 0; i < x.size(); i++) - this->at(i) = this->at(i) > x[i] ? this->at(i) : x[i]; - } - // Warning, this function assumes that the comparisons checks have already been made ! - void insert_new(Finitely_critical_multi_filtration to_concatenate){ - this->insert( - this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end()) - ); - } - - - // scalar product of a filtration value with x. - T linear_projection(const std::vector& x){ - T projection=0; - unsigned int size = std::min(x.size(), this->size()); - for (auto i =0u; iat(i); - return projection; - } - - // easy debug - friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc){ - if (truc.empty()) {stream << "[]"; return stream;} - stream << "["; - for(unsigned int i = 0; i < truc.size()-1; i++){ - stream << truc[i] << ", "; - } - if(!truc.empty()) stream << truc.back(); - stream << "]"; - return stream; + // Class to prevent doing illegal stuff with the standard library, e.g., compare two vectors + public: + Finitely_critical_multi_filtration() : std::vector(){}; + Finitely_critical_multi_filtration(int n) + : std::vector(n, -std::numeric_limits::infinity()){}; // minus infinity by default + Finitely_critical_multi_filtration(int n, T value) : std::vector(n, value){}; + Finitely_critical_multi_filtration(std::initializer_list init) : std::vector(init){}; + Finitely_critical_multi_filtration(const std::vector& v) : std::vector(v){}; + Finitely_critical_multi_filtration(typename std::vector::iterator it_begin, + typename std::vector::iterator it_end) + : std::vector(it_begin, it_end){}; + Finitely_critical_multi_filtration(typename std::vector::const_iterator it_begin, + typename std::vector::const_iterator it_end) + : std::vector(it_begin, it_end){}; + + operator std::vector&() const { return *this; } + std::vector get_vector() const { return static_cast>(*this); } + + friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + bool isSame = true; + int n = std::min(a.size(), b.size()); + for (int i = 0; i < n; ++i) { + if (a[i] > b[i]) return false; + if (isSame && a[i] != b[i]) isSame = false; } - - - - + if (isSame) return false; + return true; + } + friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + int n = std::min(a.size(), b.size()); + for (int i = 0; i < n; ++i) { + if (a[i] > b[i]) return false; + } + return true; + } + + // GREATER THAN OPERATORS + friend bool operator>(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + return b < a; + } + friend bool operator>=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + return b <= a; + } + + Finitely_critical_multi_filtration& operator=(const Finitely_critical_multi_filtration& a) { + std::vector::operator=(a); + return *this; + } + + std::vector& _convert_back() { return *this; } + + friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, + const Finitely_critical_multi_filtration& to_substract) { + std::transform(result.begin(), result.end(), to_substract.begin(), result.begin(), std::minus()); + return result; + } + friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, + const Finitely_critical_multi_filtration& to_add) { + std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::plus()); + return result; + } + + friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, + const T& to_substract) { + // std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); + for (auto& truc : result) { + truc -= to_substract; + } + return result; + } + friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, + const T& to_add) { + for (auto& truc : result) { + truc += to_add; + } + return result; + } + + // template + friend bool operator==(Finitely_critical_multi_filtration& self, + const Finitely_critical_multi_filtration& to_compare) { + if (self.size() != to_compare.size()) return false; + auto it = to_compare.begin(); + for (auto i = 0u; i < self.size(); i++) { + if (self.at(i) != *(it++)) return false; + } + return true; + } + + static std::vector> to_python(const std::vector>& to_convert) { + return std::vector>(to_convert.begin(), to_convert.end()); + } + + static std::vector> from_python(const std::vector>& to_convert) { + return std::vector>(to_convert.begin(), to_convert.end()); + ; + } + void push_to(const Finitely_critical_multi_filtration& x) { + if (this->size() != x.size()) { + std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->size() << " and " << x.size() + << "are different !" << std::endl; + throw std::logic_error("Bad sizes"); + } + for (unsigned int i = 0; i < x.size(); i++) this->at(i) = this->at(i) > x[i] ? this->at(i) : x[i]; + } + // Warning, this function assumes that the comparisons checks have already been made ! + void insert_new(Finitely_critical_multi_filtration to_concatenate) { + this->insert(this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end())); + } + + // scalar product of a filtration value with x. + T linear_projection(const std::vector& x) { + T projection = 0; + unsigned int size = std::min(x.size(), this->size()); + for (auto i = 0u; i < size; i++) projection += x[i] * this->at(i); + return projection; + } + + // easy debug + friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc) { + if (truc.empty()) { + stream << "[]"; + return stream; + } + stream << "["; + for (unsigned int i = 0; i < truc.size() - 1; i++) { + stream << truc[i] << ", "; + } + if (!truc.empty()) stream << truc.back(); + stream << "]"; + return stream; + } }; - -} // namespace Gudhi +} // namespace Gudhi::multiparameter::multi_filtrations #endif // FINITELY_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h index 995dfa3a58..7ff3769e77 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h @@ -14,76 +14,72 @@ #include "box.h" #include "finitely_critical_filtrations.h" -namespace Gudhi::multiparameter::multi_filtrations{ +namespace Gudhi::multiparameter::multi_filtrations { - - template - class Line - { - - public: - using point_type = Finitely_critical_multi_filtration; - Line(); - Line(point_type x); - Line(point_type x, point_type v); - point_type push_forward(point_type x) const; - point_type push_back(point_type x) const; - int get_dim() const; - std::pair get_bounds(const Box &box) const; +template +class Line { + public: + using point_type = Finitely_critical_multi_filtration; + Line(); + Line(point_type x); + Line(point_type x, point_type v); + point_type push_forward(point_type x) const; + point_type push_back(point_type x) const; + int get_dim() const; + std::pair get_bounds(const Box &box) const; + private: + point_type basepoint_; // any point on the line + point_type direction_; // direction of the line +}; +template +Line::Line() {} - private: - point_type basepoint_; // any point on the line - point_type direction_; // direction of the line - - }; - template - Line::Line(){} - - template - Line::Line(point_type x){ - this->basepoint_.swap(x); - // this->direction_ = {}; // diagonal line - } - template - Line::Line(point_type x, point_type v){ - this->basepoint_.swap(x); - this->direction_.swap(v); - } - template - typename Line::point_type Line::push_forward(point_type x) const { //TODO remove copy - x -= basepoint_; - T t = - std::numeric_limits::infinity();; - for (std::size_t i = 0; idirection_.size() > i ? direction_[i] : 1; - t = std::max(t, x[i]/dir); - } - point_type out(basepoint_.size()); - for (unsigned int i = 0; i < out.size(); i++) - out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1) ; - return out; - } - template - typename Line::point_type Line::push_back(point_type x) const{ - x -= basepoint_; - T t = std::numeric_limits::infinity(); - for (unsigned int i = 0; idirection_.size() > i ? direction_[i] : 1; - t = std::min(t, x[i]/dir); - } - point_type out(basepoint_.size()); - for (unsigned int i = 0; i < out.size(); i++) - out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1) ; - return out; - } - template - int Line::get_dim() const{ - return basepoint_.size(); - } - template - std::pair::point_type, typename Line::point_type> Line::get_bounds(const Box &box) const{ - return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; - } +template +Line::Line(point_type x) { + this->basepoint_.swap(x); + // this->direction_ = {}; // diagonal line +} +template +Line::Line(point_type x, point_type v) { + this->basepoint_.swap(x); + this->direction_.swap(v); +} +template +typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy + x -= basepoint_; + T t = -std::numeric_limits::infinity(); + ; + for (std::size_t i = 0; i < x.size(); i++) { + T dir = this->direction_.size() > i ? direction_[i] : 1; + t = std::max(t, x[i] / dir); + } + point_type out(basepoint_.size()); + for (unsigned int i = 0; i < out.size(); i++) + out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1); + return out; +} +template +typename Line::point_type Line::push_back(point_type x) const { + x -= basepoint_; + T t = std::numeric_limits::infinity(); + for (unsigned int i = 0; i < x.size(); i++) { + T dir = this->direction_.size() > i ? direction_[i] : 1; + t = std::min(t, x[i] / dir); + } + point_type out(basepoint_.size()); + for (unsigned int i = 0; i < out.size(); i++) + out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1); + return out; +} +template +int Line::get_dim() const { + return basepoint_.size(); +} +template +std::pair::point_type, typename Line::point_type> Line::get_bounds(const Box &box) const { + return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; } +} // namespace Gudhi::multiparameter::multi_filtrations -#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED +#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED From 1164e2898cdf7c3e5cb7c3abe2aaa22007d17c79 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 11:05:06 +0200 Subject: [PATCH 09/87] example --- src/Simplex_tree/example/CMakeLists.txt | 7 +++ .../example/simplex_tree_multi.cpp | 56 +++++++++++++++++++ .../gudhi/Simplex_tree/Simplex_tree_multi.h | 4 +- .../Simplex_tree/multi_filtrations/Box.h | 2 +- .../Simplex_tree/multi_filtrations/Line.h | 4 +- 5 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/Simplex_tree/example/simplex_tree_multi.cpp diff --git a/src/Simplex_tree/example/CMakeLists.txt b/src/Simplex_tree/example/CMakeLists.txt index 2bf6f30e5b..19a6b32232 100644 --- a/src/Simplex_tree/example/CMakeLists.txt +++ b/src/Simplex_tree/example/CMakeLists.txt @@ -21,6 +21,13 @@ if(TARGET TBB::tbb) endif() add_test(NAME Simplex_tree_example_mini_simplex_tree COMMAND $) +add_executable ( Simplex_tree_multi_example simplex_tree_multi.cpp ) +if(TARGET TBB::tbb) + target_link_libraries(Simplex_tree_multi_example TBB::tbb) +endif() +add_test(NAME Simplex_tree_multi_example COMMAND $) + + # An example with Simplex-tree using CGAL alpha_shapes_3 if(GMP_FOUND AND NOT CGAL_VERSION VERSION_LESS 4.11.0) add_executable ( Simplex_tree_example_alpha_shapes_3_from_off example_alpha_shapes_3_simplex_tree_from_off_file.cpp ) diff --git a/src/Simplex_tree/example/simplex_tree_multi.cpp b/src/Simplex_tree/example/simplex_tree_multi.cpp new file mode 100644 index 0000000000..2939a01436 --- /dev/null +++ b/src/Simplex_tree/example/simplex_tree_multi.cpp @@ -0,0 +1,56 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Marc Glisse + * + * Copyright (C) 2015 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#include +#include + +#include +#include + +struct ST_MULTI { +public: + typedef Gudhi::linear_indexing_tag Indexing_tag; + typedef int Vertex_handle; + typedef float value_type; + using Filtration_value = Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration; + typedef std::uint32_t Simplex_key; + static const bool store_key = true; + static const bool store_filtration = true; + static const bool contiguous_vertices = false; + static const bool link_nodes_by_label = true; + static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = true; +}; + +using ST = Gudhi::Simplex_tree; + + +int main() { + ST st; + + /* Complex to build. */ + /* 1 */ + /* o */ + /* /X\ */ + /* o---o---o */ + /* 2 0 3 */ + + auto triangle012 = {0, 1, 2}; + auto edge03 = {0, 3}; + st.insert_simplex_and_subfaces(triangle012, {1,2,3}); // {1,2,3} can be any array-like vector-like + st.insert_simplex_and_subfaces(edge03, {4,5,6}); + + auto edge02 = {0, 2}; + ST::Simplex_handle e = st.find(edge02); + // Finitely_critical_multi_filtration as an operator<< + std::cout << st.filtration(e) << std::endl; + assert(st.filtration(st.find(edge03)) == std::vector({4,5,6})); + +} diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 0d14634e25..ad8e124bdb 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h index aaf33842b2..9307bd21ed 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h @@ -22,7 +22,7 @@ #include #include -#include "finitely_critical_filtrations.h" +#include "Finitely_critical_filtrations.h" /** * @brief Simple box in $\mathbb R^n$ . diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h index 7ff3769e77..7c3a994231 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h @@ -11,8 +11,8 @@ #ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED #define LINE_FILTRATION_TRANSLATION_H_INCLUDED -#include "box.h" -#include "finitely_critical_filtrations.h" +#include "Box.h" +#include "Finitely_critical_filtrations.h" namespace Gudhi::multiparameter::multi_filtrations { From 38c60643c74a0e96e007eda9bda7862b834f1b0f Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 11:07:36 +0200 Subject: [PATCH 10/87] typo --- src/Simplex_tree/example/simplex_tree_multi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/example/simplex_tree_multi.cpp b/src/Simplex_tree/example/simplex_tree_multi.cpp index 2939a01436..29b03c80fb 100644 --- a/src/Simplex_tree/example/simplex_tree_multi.cpp +++ b/src/Simplex_tree/example/simplex_tree_multi.cpp @@ -49,7 +49,7 @@ int main() { auto edge02 = {0, 2}; ST::Simplex_handle e = st.find(edge02); - // Finitely_critical_multi_filtration as an operator<< + // Finitely_critical_multi_filtration has an operator<< std::cout << st.filtration(e) << std::endl; assert(st.filtration(st.find(edge03)) == std::vector({4,5,6})); From 40fe370ed2b989362bb35f21d12c76b473bfdfa3 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 11:08:16 +0200 Subject: [PATCH 11/87] Copyrights --- src/Simplex_tree/example/simplex_tree_multi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Simplex_tree/example/simplex_tree_multi.cpp b/src/Simplex_tree/example/simplex_tree_multi.cpp index 29b03c80fb..f397d6263e 100644 --- a/src/Simplex_tree/example/simplex_tree_multi.cpp +++ b/src/Simplex_tree/example/simplex_tree_multi.cpp @@ -1,8 +1,8 @@ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): Marc Glisse + * Author(s): David Loiseaux * - * Copyright (C) 2015 Inria + * Copyright (C) 2023 Inria * * Modification(s): * - YYYY/MM Author: Description of the modification From f7965a80d89d058a8f7c515a975d27729572876f Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 13:40:07 +0200 Subject: [PATCH 12/87] include fix --- src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 4e7f5fa045..33a3593c7e 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -28,7 +28,7 @@ // ^ // /!\ Nothing else from Simplex_tree shall be included to test includes are well defined. #include "gudhi/Simplex_tree/Simplex_tree_multi.h" -#include "gudhi/Simplex_tree/multi_filtrations/finitely_critical_filtrations.h" +#include "gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h" using namespace Gudhi; using namespace Gudhi::multiparameter; From c79fec6da0423fbe442660cdfacc45f2a4c446b4 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 15:57:29 +0200 Subject: [PATCH 13/87] some documentation --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 13 +++- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 76 +++++++++++++++---- .../Finitely_critical_filtrations.h | 9 +++ 3 files changed, 83 insertions(+), 15 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 9164488d97..3f73d05c18 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -2272,12 +2272,21 @@ class Simplex_tree { // MULTIPERS STUFF public: + /** + * \brief Sets the number of parameters of the filtrations if SimplexTreeOptions::is_multi_parameter. + * */ void set_number_of_parameters(int num) { number_of_parameters_ = num; } + /** + * \brief Gets the number of parameters of the filtrations if SimplexTreeOptions::is_multi_parameter. + * */ int get_number_of_parameters() const { return number_of_parameters_; } - inline static Filtration_value inf_ = std::numeric_limits::infinity(); + + inline static Filtration_value inf_ = std::numeric_limits::has_infinity() ? + std::numeric_limits::infinity() + : std::numeric_limits::max(); /**< Default infinite value. */ private: - int number_of_parameters_; + int number_of_parameters_; /**< Number of parameters of the multi-filtrations when SimplexTreeOptions::is_multi_parameter.-*/ }; // Print a Simplex_tree in os. diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index ad8e124bdb..cf2b4ac7f5 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -24,8 +24,6 @@ namespace Gudhi::multiparameter { * * Maximum number of simplices to compute persistence is std::numeric_limits::max() * (about 4 billions of simplices). */ - - struct Simplex_tree_options_multidimensional_filtration { public: typedef linear_indexing_tag Indexing_tag; @@ -51,7 +49,15 @@ using simplextree_multi = Simplex_tree; using multi_filtration_type = std::vector; using multi_filtration_grid = std::vector; -// Turns a 1-parameter simplextree into a multiparameter simplextree, and keeps the 1-filtration in the 1st axis +/** +* \brief Turns a 1-parameter simplextree into a multiparameter simplextree, and keeps the 1-filtration in the 1st axis. Default values can be specified. +* \ingroup multiparameter +* \tparam simplextree_std A non-multi simplextree +* \tparam simplextree_multi A multi simplextree +* \param st Simplextree to copy +* \param st_multi Multiparameter simplextree container to fill. +* \param default_values If given, this vector is assume to be of size `num_parameters-1` and contains the default values of axes `1` to `num_parameters`. +* */ template void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_parameters, const typename simplextree_multi::Options::Filtration_value& default_values={}){ typename simplextree_multi::Options::Filtration_value f(num_parameters); @@ -74,7 +80,15 @@ void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_par -// Turns a multi-parameter simplextree into a 1-parameter simplextree +/** +* \brief Turns a multiparameter-parameter simplextree into a 1-parameter simplextree. +* \ingroup multiparameter +* \tparam simplextree_std A non-multi simplextree +* \tparam simplextree_multi A multi simplextree +* \param st Simplextree to fill. +* \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. +* \param dimension The filtration parameter to put into the 1 parameter simplextree. +* */ template void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimension = 0){ for (const auto &simplex_handle : st_multi.complex_simplex_range()){ @@ -86,7 +100,16 @@ void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimensi } } -// Applies a linear form (i.e. scalar product with Riesz rpz) to the filtration to flatten a simplextree multi +/** +* \brief Applies a linear form (given by a scalar product, via Riesz representation) to the +* filtration values of the multiparameter simplextree to get a 1 parameter simplextree. +* \ingroup multiparameter +* \tparam simplextree_std A non-multi simplextree +* \tparam simplextree_multi A multi simplextree +* \param st Simplextree to fill. +* \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. +* \param linear_form the linear form to apply. +* */ template void linear_projection(simplextree_std &st, simplextree_multi &st_multi, const std::vector& linear_form){ auto sh = st.complex_simplex_range().begin(); @@ -100,6 +123,16 @@ void linear_projection(simplextree_std &st, simplextree_multi &st_multi, const s } } +/** +* \brief Pushes the filtration values of a multiparameter simplextree to a diagonal line, to get a 1 parameter simplextree. +* \ingroup multiparameter +* \tparam simplextree_std A non-multi simplextree +* \tparam simplextree_multi A multi simplextree +* \param st Simplextree to fill. +* \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. +* \param basepoint The basepoint of the diagonal line. +* \param dimension The coordinate of the line to choose as a 1 parameter filtration (they are all equivalent). +* */ template void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, const std::vector basepoint, int dimension){ multi_filtrations::Line l(basepoint); @@ -119,12 +152,15 @@ void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, const std::v -/// @brief turns filtration value x into coordinates in the grid -/// @tparam out_type -/// @param x -/// @param grid -/// @return -template +/** +* \brief Given a point an a multiparameter discrete grid, pushes the point onto this grid. +* Turns the input point as the closest grid point, as coordinates in this grid. +* \ingroup multiparameter +* \tparam vector_like Vector like class +* \param x The point to push on the grid. +* \param grid The multiparameter grid. A vector of size `num_parameters`, whose elements are the elements of the grid for this axis. +* */ +template inline void find_coordinates(vector_like& x, const multi_filtration_grid &grid){ // TODO: optimize with, e.g., dichotomy @@ -157,8 +193,15 @@ inline void find_coordinates(vector_like& x, const multi_filtration_grid &grid){ } -// TODO integer filtrations, does this help with performance ? -// projects filtrations values to the grid. If coordinate_values is set to true, the filtration values are the coordinates of this grid +/** +* \brief Pushes all of the filtration values of a simplextree onto a grid, c.f. \ref find_coordinates. +* \ingroup multiparameter +* \param splxptr Simplextree pointer. +* \param grid The multiparameter grid. A vector of size `num_parameters`, +* whose elements are the elements of the grid for this axis. +* \param coordinate_values If set to true the filtration values will be turned into coordinates in this grid +* instead of points in this grid. +* */ void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bool coordinate_values=true){ Simplex_tree &st_multi = *(Gudhi::Simplex_tree*)(splxptr); @@ -179,6 +222,13 @@ void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bo } // retrieves the filtration values of a simplextree. Useful to generate a grid. +/** +* \brief Retrieves all of the filtration values, for each simplex dimension, of the simplextree. Useful to generate grids. +* \ingroup multiparameter +* \param splxptr Simplextree pointer. +* whose elements are the elements of the grid for this axis. +* \param degrees Only the simpleces of these dimension will be taken into account. Useful for, e.g., Rips filtrations. +* */ std::vector get_filtration_values(const uintptr_t splxptr, const std::vector °rees){ Simplex_tree &st_multi = *(Gudhi::Simplex_tree*)(splxptr); int num_parameters = st_multi.get_number_of_parameters(); diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index d6bed8450a..2db9d6b615 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -17,6 +17,15 @@ namespace Gudhi::multiparameter::multi_filtrations { +/** \class Finitely_critical_multi_filtration Finitely_critical_multi_filtration.h gudhi/Simplex_tree/multi_filtrations/Finitely_critical_multi_filtration.h + * \brief Vector-like filtration value, for multiparameter persistence + * + * \ingroup multiparameter + * + * \details Child of `std::vector` that has numpy-like pointwise operators. + * + * \tparam T value type of the vector-like. + */ template class Finitely_critical_multi_filtration : public std::vector { // Class to prevent doing illegal stuff with the standard library, e.g., compare two vectors From aab5c34bf25702d25ec99a2c0fbc1190b7f9acbc Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:08:26 +0200 Subject: [PATCH 14/87] fix --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 3f73d05c18..38c3090cf4 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -2281,7 +2281,7 @@ class Simplex_tree { * */ int get_number_of_parameters() const { return number_of_parameters_; } - inline static Filtration_value inf_ = std::numeric_limits::has_infinity() ? + inline static Filtration_value inf_ = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); /**< Default infinite value. */ From 6046f8d0bafac15bf589d377641fe1fb8e0b8414 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:15:11 +0200 Subject: [PATCH 15/87] Update src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h Co-authored-by: hschreiber <48448038+hschreiber@users.noreply.github.com> --- .../include/gudhi/Simplex_tree/Simplex_tree_multi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index cf2b4ac7f5..9ebdac023e 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -236,7 +236,7 @@ std::vector get_filtration_values(const uintptr_t splxptr std::vector degree_index(degrees.size()); int count = 0; for (auto degree : degrees){ - degree_index[degree] = count; count++; + degree_index[degree] = count++; out[degree_index[degree]].reserve(st_multi.num_simplices()); } From b1e7b99a0b903975e57d9d58a4bd6b678c950145 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:26:35 +0200 Subject: [PATCH 16/87] doc --- .../multi_filtrations/Finitely_critical_filtrations.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 2db9d6b615..ae958d42f3 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -23,7 +23,13 @@ namespace Gudhi::multiparameter::multi_filtrations { * \ingroup multiparameter * * \details Child of `std::vector` that has numpy-like pointwise operators. - * + * One critical simplicial filtrations are filtrations such that the lifetime each simplex is a positive cone, e.g. + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \f$ is valid, while + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{x \in \mathbb R^2 : x>=(2,1)\} \f$ is not- + * Finitely critical filtrations are filtrations such that the lifetime of each simplex is a union of such cones, e.g., + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{ x \in \mathbb R^2 : x>=(2,1)\} \f$ is finitely critical, and more particularly 2-critical, while + * - \f$ \{ x \in \mathbb R^2 : x>= \mathrm{epigraph}(y\mapsto e^{-y})\} \f$ is not. + * Non 1-critical filtrations are not supported yet. * \tparam T value type of the vector-like. */ template From 3498a8ce74f0a16b977343ff3c78d081363a9607 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:31:03 +0200 Subject: [PATCH 17/87] indentation --- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 414 +++++++++--------- 1 file changed, 197 insertions(+), 217 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 9ebdac023e..a554894069 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -15,32 +15,26 @@ #include #include - - - - namespace Gudhi::multiparameter { /** Model of SimplexTreeOptions. * * Maximum number of simplices to compute persistence is std::numeric_limits::max() * (about 4 billions of simplices). */ struct Simplex_tree_options_multidimensional_filtration { -public: - typedef linear_indexing_tag Indexing_tag; - typedef int Vertex_handle; - typedef float value_type; - using Filtration_value = multi_filtrations::Finitely_critical_multi_filtration; - typedef std::uint32_t Simplex_key; - static const bool store_key = true; - static const bool store_filtration = true; - static const bool contiguous_vertices = false; - static const bool link_nodes_by_label = true; - static const bool stable_simplex_handles = false; - static const bool is_multi_parameter = true; + public: + typedef linear_indexing_tag Indexing_tag; + typedef int Vertex_handle; + typedef float value_type; + using Filtration_value = multi_filtrations::Finitely_critical_multi_filtration; + typedef std::uint32_t Simplex_key; + static const bool store_key = true; + static const bool store_filtration = true; + static const bool contiguous_vertices = false; + static const bool link_nodes_by_label = true; + static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = true; }; - - using options_multi = Simplex_tree_options_multidimensional_filtration; using options_std = Simplex_tree_options_full_featured; using simplextree_std = Simplex_tree; @@ -50,230 +44,216 @@ using multi_filtration_type = std::vector; using multi_filtration_grid = std::vector; /** -* \brief Turns a 1-parameter simplextree into a multiparameter simplextree, and keeps the 1-filtration in the 1st axis. Default values can be specified. -* \ingroup multiparameter -* \tparam simplextree_std A non-multi simplextree -* \tparam simplextree_multi A multi simplextree -* \param st Simplextree to copy -* \param st_multi Multiparameter simplextree container to fill. -* \param default_values If given, this vector is assume to be of size `num_parameters-1` and contains the default values of axes `1` to `num_parameters`. -* */ -template -void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_parameters, const typename simplextree_multi::Options::Filtration_value& default_values={}){ - typename simplextree_multi::Options::Filtration_value f(num_parameters); - for (auto i = 0u; i(default_values.size()), static_cast(num_parameters-1));i++) - f[i+1] = default_values[i]; - std::vector simplex; - simplex.reserve(st.dimension()+1); - for (auto &simplex_handle : st.complex_simplex_range()){ - simplex.clear(); - for (auto vertex : st.simplex_vertex_range(simplex_handle)) - simplex.push_back(vertex); - - if (num_parameters > 0) - f[0] = st.filtration(simplex_handle); - auto filtration_copy = f; - st_multi.insert_simplex(simplex,filtration_copy); - - } + * \brief Turns a 1-parameter simplextree into a multiparameter simplextree, and keeps the 1-filtration in the 1st axis. + * Default values can be specified. \ingroup multiparameter \tparam simplextree_std A non-multi simplextree \tparam + * simplextree_multi A multi simplextree \param st Simplextree to copy \param st_multi Multiparameter simplextree + * container to fill. \param default_values If given, this vector is assume to be of size `num_parameters-1` and + * contains the default values of axes `1` to `num_parameters`. + * */ +template +void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_parameters, + const typename simplextree_multi::Options::Filtration_value &default_values = {}) { + typename simplextree_multi::Options::Filtration_value f(num_parameters); + for (auto i = 0u; + i < std::min(static_cast(default_values.size()), static_cast(num_parameters - 1)); + i++) + f[i + 1] = default_values[i]; + std::vector simplex; + simplex.reserve(st.dimension() + 1); + for (auto &simplex_handle : st.complex_simplex_range()) { + simplex.clear(); + for (auto vertex : st.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); + + if (num_parameters > 0) f[0] = st.filtration(simplex_handle); + auto filtration_copy = f; + st_multi.insert_simplex(simplex, filtration_copy); + } } - - /** -* \brief Turns a multiparameter-parameter simplextree into a 1-parameter simplextree. -* \ingroup multiparameter -* \tparam simplextree_std A non-multi simplextree -* \tparam simplextree_multi A multi simplextree -* \param st Simplextree to fill. -* \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. -* \param dimension The filtration parameter to put into the 1 parameter simplextree. -* */ -template -void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimension = 0){ - for (const auto &simplex_handle : st_multi.complex_simplex_range()){ - std::vector simplex; - for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) - simplex.push_back(vertex); - typename simplextree_multi::Options::value_type f = dimension >= 0 ? st_multi.filtration(simplex_handle)[dimension] : 0; - st.insert_simplex(simplex,f); - } + * \brief Turns a multiparameter-parameter simplextree into a 1-parameter simplextree. + * \ingroup multiparameter + * \tparam simplextree_std A non-multi simplextree + * \tparam simplextree_multi A multi simplextree + * \param st Simplextree to fill. + * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. + * \param dimension The filtration parameter to put into the 1 parameter simplextree. + * */ +template +void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimension = 0) { + for (const auto &simplex_handle : st_multi.complex_simplex_range()) { + std::vector simplex; + for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); + typename simplextree_multi::Options::value_type f = + dimension >= 0 ? st_multi.filtration(simplex_handle)[dimension] : 0; + st.insert_simplex(simplex, f); + } } /** -* \brief Applies a linear form (given by a scalar product, via Riesz representation) to the -* filtration values of the multiparameter simplextree to get a 1 parameter simplextree. -* \ingroup multiparameter -* \tparam simplextree_std A non-multi simplextree -* \tparam simplextree_multi A multi simplextree -* \param st Simplextree to fill. -* \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. -* \param linear_form the linear form to apply. -* */ -template -void linear_projection(simplextree_std &st, simplextree_multi &st_multi, const std::vector& linear_form){ - auto sh = st.complex_simplex_range().begin(); - auto sh_multi = st_multi.complex_simplex_range().begin(); - auto end = st.complex_simplex_range().end(); - typename simplextree_multi::Options::Filtration_value multi_filtration; - for (; sh != end; ++sh, ++sh_multi){ - multi_filtration = st_multi.filtration(*sh_multi); - auto projected_filtration = multi_filtration.linear_projection(linear_form); - st.assign_filtration(*sh, projected_filtration); - } + * \brief Applies a linear form (given by a scalar product, via Riesz representation) to the + * filtration values of the multiparameter simplextree to get a 1 parameter simplextree. + * \ingroup multiparameter + * \tparam simplextree_std A non-multi simplextree + * \tparam simplextree_multi A multi simplextree + * \param st Simplextree to fill. + * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. + * \param linear_form the linear form to apply. + * */ +template +void linear_projection(simplextree_std &st, simplextree_multi &st_multi, + const std::vector &linear_form) { + auto sh = st.complex_simplex_range().begin(); + auto sh_multi = st_multi.complex_simplex_range().begin(); + auto end = st.complex_simplex_range().end(); + typename simplextree_multi::Options::Filtration_value multi_filtration; + for (; sh != end; ++sh, ++sh_multi) { + multi_filtration = st_multi.filtration(*sh_multi); + auto projected_filtration = multi_filtration.linear_projection(linear_form); + st.assign_filtration(*sh, projected_filtration); + } } /** -* \brief Pushes the filtration values of a multiparameter simplextree to a diagonal line, to get a 1 parameter simplextree. -* \ingroup multiparameter -* \tparam simplextree_std A non-multi simplextree -* \tparam simplextree_multi A multi simplextree -* \param st Simplextree to fill. -* \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. -* \param basepoint The basepoint of the diagonal line. -* \param dimension The coordinate of the line to choose as a 1 parameter filtration (they are all equivalent). -* */ -template -void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, const std::vector basepoint, int dimension){ - multi_filtrations::Line l(basepoint); - for (const auto &simplex_handle : st_multi.complex_simplex_range()){ - std::vector simplex; - for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) - simplex.push_back(vertex); - - std::vector f = st_multi.filtration(simplex_handle); - if (dimension <0) dimension = 0; - typename simplextree_multi::Options::value_type new_filtration = l.push_forward(f)[dimension]; - st.insert_simplex(simplex,new_filtration); - } + * \brief Pushes the filtration values of a multiparameter simplextree to a diagonal line, to get a 1 parameter + * simplextree. \ingroup multiparameter \tparam simplextree_std A non-multi simplextree \tparam simplextree_multi A + * multi simplextree \param st Simplextree to fill. \param st_multi Multiparameter simplextree to convert into a 1 + * parameter simplex tree. \param basepoint The basepoint of the diagonal line. \param dimension The coordinate of the + * line to choose as a 1 parameter filtration (they are all equivalent). + * */ +template +void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, + const std::vector basepoint, int dimension) { + multi_filtrations::Line l(basepoint); + for (const auto &simplex_handle : st_multi.complex_simplex_range()) { + std::vector simplex; + for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); + + std::vector f = st_multi.filtration(simplex_handle); + if (dimension < 0) dimension = 0; + typename simplextree_multi::Options::value_type new_filtration = l.push_forward(f)[dimension]; + st.insert_simplex(simplex, new_filtration); + } } - - - - /** -* \brief Given a point an a multiparameter discrete grid, pushes the point onto this grid. -* Turns the input point as the closest grid point, as coordinates in this grid. -* \ingroup multiparameter -* \tparam vector_like Vector like class -* \param x The point to push on the grid. -* \param grid The multiparameter grid. A vector of size `num_parameters`, whose elements are the elements of the grid for this axis. -* */ -template -inline void find_coordinates(vector_like& x, const multi_filtration_grid &grid){ - // TODO: optimize with, e.g., dichotomy - - for (auto parameter = 0u; parameter < grid.size(); parameter++){ - const auto& filtration = grid[parameter]; // assumes its sorted - const auto to_project = x[parameter]; - if constexpr (std::numeric_limits::has_infinity) - if (to_project == std::numeric_limits::infinity()){ - x[parameter] = std::numeric_limits::infinity(); - continue; - } - if (to_project >= filtration.back()){ - x[parameter] = filtration.size()-1; - continue; - } // deals with infinite value at the end of the grid - - unsigned int i = 0; - while (to_project > filtration[i] && i +inline void find_coordinates(vector_like &x, const multi_filtration_grid &grid) { + // TODO: optimize with, e.g., dichotomy + + for (auto parameter = 0u; parameter < grid.size(); parameter++) { + const auto &filtration = grid[parameter]; // assumes its sorted + const auto to_project = x[parameter]; + if constexpr (std::numeric_limits::has_infinity) + if (to_project == std::numeric_limits::infinity()) { + x[parameter] = std::numeric_limits::infinity(); + continue; + } + if (to_project >= filtration.back()) { + x[parameter] = filtration.size() - 1; + continue; + } // deals with infinite value at the end of the grid + + unsigned int i = 0; + while (to_project > filtration[i] && i < filtration.size()) { + i++; + } + if (i == 0) + x[parameter] = 0; + else if (i < filtration.size()) { + typename vector_like::value_type d1, d2; + d1 = std::abs(filtration[i - 1] - to_project); + d2 = std::abs(filtration[i] - to_project); + x[parameter] = d1 < d2 ? i - 1 : i; + } + } } - /** -* \brief Pushes all of the filtration values of a simplextree onto a grid, c.f. \ref find_coordinates. -* \ingroup multiparameter -* \param splxptr Simplextree pointer. -* \param grid The multiparameter grid. A vector of size `num_parameters`, -* whose elements are the elements of the grid for this axis. -* \param coordinate_values If set to true the filtration values will be turned into coordinates in this grid -* instead of points in this grid. -* */ -void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bool coordinate_values=true){ - - Simplex_tree &st_multi = *(Gudhi::Simplex_tree*)(splxptr); - auto num_parameters = static_cast(st_multi.get_number_of_parameters()); - if (grid.size() != num_parameters){ - std::cerr << "Bad grid !" << std::endl; - throw; - } - for (const auto &simplex_handle : st_multi.complex_simplex_range()){ - auto& simplex_filtration = st_multi.filtration_mutable(simplex_handle); - find_coordinates(simplex_filtration, grid); // turns the simplexfiltration into coords in the grid - if (!coordinate_values){ - for (auto parameter = 0u; parameter < num_parameters; parameter++) - simplex_filtration[parameter] = grid[parameter][simplex_filtration[parameter]]; - } - } - return; + * \brief Pushes all of the filtration values of a simplextree onto a grid, c.f. \ref find_coordinates. + * \ingroup multiparameter + * \param splxptr Simplextree pointer. + * \param grid The multiparameter grid. A vector of size `num_parameters`, + * whose elements are the elements of the grid for this axis. + * \param coordinate_values If set to true the filtration values will be turned into coordinates in this grid + * instead of points in this grid. + * */ +void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bool coordinate_values = true) { + Simplex_tree &st_multi = *(Gudhi::Simplex_tree *)(splxptr); + auto num_parameters = static_cast(st_multi.get_number_of_parameters()); + if (grid.size() != num_parameters) { + std::cerr << "Bad grid !" << std::endl; + throw; + } + for (const auto &simplex_handle : st_multi.complex_simplex_range()) { + auto &simplex_filtration = st_multi.filtration_mutable(simplex_handle); + find_coordinates(simplex_filtration, + grid); // turns the simplexfiltration into coords in the grid + if (!coordinate_values) { + for (auto parameter = 0u; parameter < num_parameters; parameter++) + simplex_filtration[parameter] = grid[parameter][simplex_filtration[parameter]]; + } + } + return; } // retrieves the filtration values of a simplextree. Useful to generate a grid. /** -* \brief Retrieves all of the filtration values, for each simplex dimension, of the simplextree. Useful to generate grids. -* \ingroup multiparameter -* \param splxptr Simplextree pointer. -* whose elements are the elements of the grid for this axis. -* \param degrees Only the simpleces of these dimension will be taken into account. Useful for, e.g., Rips filtrations. -* */ -std::vector get_filtration_values(const uintptr_t splxptr, const std::vector °rees){ - Simplex_tree &st_multi = *(Gudhi::Simplex_tree*)(splxptr); - int num_parameters = st_multi.get_number_of_parameters(); - std::vector out(degrees.size(), multi_filtration_grid(num_parameters)); - std::vector degree_index(degrees.size()); - int count = 0; - for (auto degree : degrees){ - degree_index[degree] = count++; - out[degree_index[degree]].reserve(st_multi.num_simplices()); - } - - for (const auto &simplex_handle : st_multi.complex_simplex_range()){ - const auto filtration = st_multi.filtration(simplex_handle); - const auto degree = st_multi.dimension(simplex_handle); - if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end()) continue; - for (int parameter=0; parameter < num_parameters; parameter++){ - out[degree_index[degree]][parameter].push_back(filtration[parameter]); - } - } - return out; - + * \brief Retrieves all of the filtration values, for each simplex dimension, of the simplextree. Useful to generate + * grids. \ingroup multiparameter \param splxptr Simplextree pointer. whose elements are the elements of the grid for + * this axis. \param degrees Only the simpleces of these dimension will be taken into account. Useful for, e.g., Rips + * filtrations. + * */ +std::vector get_filtration_values(const uintptr_t splxptr, const std::vector °rees) { + Simplex_tree &st_multi = *(Gudhi::Simplex_tree *)(splxptr); + int num_parameters = st_multi.get_number_of_parameters(); + std::vector out(degrees.size(), multi_filtration_grid(num_parameters)); + std::vector degree_index(degrees.size()); + int count = 0; + for (auto degree : degrees) { + degree_index[degree] = count++; + out[degree_index[degree]].reserve(st_multi.num_simplices()); + } + + for (const auto &simplex_handle : st_multi.complex_simplex_range()) { + const auto filtration = st_multi.filtration(simplex_handle); + const auto degree = st_multi.dimension(simplex_handle); + if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end()) continue; + for (int parameter = 0; parameter < num_parameters; parameter++) { + out[degree_index[degree]][parameter].push_back(filtration[parameter]); + } + } + return out; } -} // namespace Gudhi - - +} // namespace Gudhi::multiparameter namespace std { -template<> -class numeric_limits -{ -public: - static Gudhi::multiparameter::multi_filtration_type infinity() throw(){ - return Gudhi::multiparameter::multi_filtration_type(1, std::numeric_limits::infinity()); - }; - - - static Gudhi::multiparameter::multi_filtration_type quiet_NaN() throw(){ - return Gudhi::multiparameter::multi_filtration_type(1, numeric_limits::quiet_NaN()); - }; - +template <> +class numeric_limits { + public: + static Gudhi::multiparameter::multi_filtration_type infinity() throw() { + return Gudhi::multiparameter::multi_filtration_type( + 1, std::numeric_limits< + Gudhi::multiparameter::Simplex_tree_options_multidimensional_filtration::value_type>::infinity()); + }; + + static Gudhi::multiparameter::multi_filtration_type quiet_NaN() throw() { + return Gudhi::multiparameter::multi_filtration_type( + 1, numeric_limits< + Gudhi::multiparameter::Simplex_tree_options_multidimensional_filtration::value_type>::quiet_NaN()); + }; }; -} - +} // namespace std #endif // SIMPLEX_TREE_MULTI_H_ From ebdbfdac77a9e6bd44bc759ab76276e29ffe81ec Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:48:59 +0200 Subject: [PATCH 18/87] Filtration_value concept --- src/Simplex_tree/concept/FiltrationValue.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Simplex_tree/concept/FiltrationValue.h b/src/Simplex_tree/concept/FiltrationValue.h index 6cf314fa9d..a2d6abf779 100644 --- a/src/Simplex_tree/concept/FiltrationValue.h +++ b/src/Simplex_tree/concept/FiltrationValue.h @@ -17,7 +17,18 @@ * its subsimplices of same filtration value) provides an indexing scheme * (see IndexingTag). */ - struct FiltrationValue { - /** \brief Operator < is a StrictWeakOrdering. */ - bool operator<(FiltrationValue f1, FiltrationValue f2); - }; +struct FiltrationValue { + /** \brief Operator < is a StrictWeakOrdering. */ + bool operator<(FiltrationValue f1, FiltrationValue f2); + + /** \brief For multiparameter filtrations, this methods pushes a filtration value + * to the first moment, for operator< such that f < this. For instance, for a one critical filtration, with + * - this = (1,2) + * - x = (2,1) + * after calling this method, x should be equal to (2,2). + * This function is called when using, e.g. `make_filtration_non_decreasing`, as the filtration of a simplex + * has to be greater than the filtration of any of its faces. + * */ + void push_to(const FiltrationValue f); + +}; From 1433e8e8bcbb26ba15231481384df20f23f79f74 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:57:26 +0200 Subject: [PATCH 19/87] static assert setter for 1parameter sts --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 38c3090cf4..894148e4b7 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -2275,11 +2275,21 @@ class Simplex_tree { /** * \brief Sets the number of parameters of the filtrations if SimplexTreeOptions::is_multi_parameter. * */ - void set_number_of_parameters(int num) { number_of_parameters_ = num; } + void set_number_of_parameters(int num) { + static_assert(SimplexTreeOptions::is_multi_parameter, + "Cannot set number of parameters of 1-parameter simplextree." + ); + number_of_parameters_ = num; + } /** * \brief Gets the number of parameters of the filtrations if SimplexTreeOptions::is_multi_parameter. * */ - int get_number_of_parameters() const { return number_of_parameters_; } + int get_number_of_parameters() const { + if constexpr (SimplexTreeOptions::is_multi_parameter) + return number_of_parameters_; + else + return 1; + } inline static Filtration_value inf_ = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() From f4cc240cdeb9200a63399a2f788bc58117117c97 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 16:59:05 +0200 Subject: [PATCH 20/87] Update src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h Co-authored-by: hschreiber <48448038+hschreiber@users.noreply.github.com> --- .../multi_filtrations/Finitely_critical_filtrations.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index ae958d42f3..ed1ab32734 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -129,7 +129,6 @@ class Finitely_critical_multi_filtration : public std::vector { static std::vector> from_python(const std::vector>& to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); - ; } void push_to(const Finitely_critical_multi_filtration& x) { if (this->size() != x.size()) { From e9668e583d9e5071370a35144b0cf721cdc190bf Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 29 Sep 2023 17:22:53 +0200 Subject: [PATCH 21/87] find coord fix --- .../include/gudhi/Simplex_tree/Simplex_tree_multi.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index a554894069..61dd241983 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -195,8 +195,7 @@ void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bo } for (const auto &simplex_handle : st_multi.complex_simplex_range()) { auto &simplex_filtration = st_multi.filtration_mutable(simplex_handle); - find_coordinates(simplex_filtration, - grid); // turns the simplexfiltration into coords in the grid + find_coordinates(simplex_filtration,grid); // turns the simplexfiltration into coords in the grid if (!coordinate_values) { for (auto parameter = 0u; parameter < num_parameters; parameter++) simplex_filtration[parameter] = grid[parameter][simplex_filtration[parameter]]; From e4bc012c27b66e9c9ad809e6039caa9ddc00f0c9 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 11:01:41 +0200 Subject: [PATCH 22/87] doc formatting Co-authored-by: Vincent Rouvreau <10407034+VincentRouvreau@users.noreply.github.com> --- src/Simplex_tree/concept/FiltrationValue.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Simplex_tree/concept/FiltrationValue.h b/src/Simplex_tree/concept/FiltrationValue.h index a2d6abf779..86299db2f4 100644 --- a/src/Simplex_tree/concept/FiltrationValue.h +++ b/src/Simplex_tree/concept/FiltrationValue.h @@ -25,6 +25,7 @@ struct FiltrationValue { * to the first moment, for operator< such that f < this. For instance, for a one critical filtration, with * - this = (1,2) * - x = (2,1) + * * after calling this method, x should be equal to (2,2). * This function is called when using, e.g. `make_filtration_non_decreasing`, as the filtration of a simplex * has to be greater than the filtration of any of its faces. From c832b5f2976a1cf89321aa204e64fc1541a83cdb Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 11:03:47 +0200 Subject: [PATCH 23/87] typo (Thanks Vincent) Co-authored-by: Vincent Rouvreau <10407034+VincentRouvreau@users.noreply.github.com> --- .../include/gudhi/Simplex_tree/Simplex_tree_multi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 61dd241983..ea6d83b88b 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -137,7 +137,7 @@ void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, } /** - * \brief Given a point an a multiparameter discrete grid, pushes the point onto this grid. + * \brief Given a point on a multiparameter discrete grid, pushes the point onto this grid. * Turns the input point as the closest grid point, as coordinates in this grid. * \ingroup multiparameter * \tparam vector_like Vector like class From e0ae582925712be8e6c7eb1914d7ecb931aa068e Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 11:25:21 +0200 Subject: [PATCH 24/87] inf and nan limits fix part 1 --- .../Finitely_critical_filtrations.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index ed1ab32734..e846d1e5b8 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -168,4 +168,23 @@ class Finitely_critical_multi_filtration : public std::vector { }; } // namespace Gudhi::multiparameter::multi_filtrations + +namespace std { + +template +class numeric_limits> +{ +public: + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); + }; + + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration quiet_NaN() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, numeric_limits::quiet_NaN()); + }; + +}; + +} + #endif // FINITELY_CRITICAL_FILTRATIONS_H_ From 37fda793f03dde21367c2fd82f25e00596e92a2f Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 11:26:05 +0200 Subject: [PATCH 25/87] part 2 nan + inf limits for multi-filtrations --- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index ea6d83b88b..1e5beb04a8 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -235,24 +235,4 @@ std::vector get_filtration_values(const uintptr_t splxptr } // namespace Gudhi::multiparameter -namespace std { - -template <> -class numeric_limits { - public: - static Gudhi::multiparameter::multi_filtration_type infinity() throw() { - return Gudhi::multiparameter::multi_filtration_type( - 1, std::numeric_limits< - Gudhi::multiparameter::Simplex_tree_options_multidimensional_filtration::value_type>::infinity()); - }; - - static Gudhi::multiparameter::multi_filtration_type quiet_NaN() throw() { - return Gudhi::multiparameter::multi_filtration_type( - 1, numeric_limits< - Gudhi::multiparameter::Simplex_tree_options_multidimensional_filtration::value_type>::quiet_NaN()); - }; -}; - -} // namespace std - #endif // SIMPLEX_TREE_MULTI_H_ From 10f990d937aac2276a359d7468c117c363d3d839 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 11:29:34 +0200 Subject: [PATCH 26/87] missing import --- .../multi_filtrations/Finitely_critical_filtrations.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index e846d1e5b8..19b0804c8f 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -14,6 +14,7 @@ #include #include #include +#include namespace Gudhi::multiparameter::multi_filtrations { From dc2f9129a4e83428787784160cb0f4338e0235cc Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 11:46:10 +0200 Subject: [PATCH 27/87] Fix the auto-breakline breakages + remove python ptr interface --- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 1e5beb04a8..0c45ec772b 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -16,10 +16,7 @@ #include namespace Gudhi::multiparameter { -/** Model of SimplexTreeOptions. - * - * Maximum number of simplices to compute persistence is std::numeric_limits::max() - * (about 4 billions of simplices). */ +/** Model of SimplexTreeOptions, with a multiparameter filtration. */ struct Simplex_tree_options_multidimensional_filtration { public: typedef linear_indexing_tag Indexing_tag; @@ -44,10 +41,15 @@ using multi_filtration_type = std::vector; using multi_filtration_grid = std::vector; /** - * \brief Turns a 1-parameter simplextree into a multiparameter simplextree, and keeps the 1-filtration in the 1st axis. - * Default values can be specified. \ingroup multiparameter \tparam simplextree_std A non-multi simplextree \tparam - * simplextree_multi A multi simplextree \param st Simplextree to copy \param st_multi Multiparameter simplextree - * container to fill. \param default_values If given, this vector is assume to be of size `num_parameters-1` and + * \brief Turns a 1-parameter simplextree into a multiparameter simplextree, + * and keeps the 1-filtration in the 1st axis. + * Default values can be specified. + * \ingroup multiparameter + * \tparam simplextree_std A non-multi simplextree + * \tparam simplextree_multi A multi simplextree + * \param st Simplextree to copy + * \param st_multi Multiparameter simplextree container to fill. + * \param default_values If given, this vector is assume to be of size `num_parameters-1` and * contains the default values of axes `1` to `num_parameters`. * */ template @@ -116,10 +118,14 @@ void linear_projection(simplextree_std &st, simplextree_multi &st_multi, /** * \brief Pushes the filtration values of a multiparameter simplextree to a diagonal line, to get a 1 parameter - * simplextree. \ingroup multiparameter \tparam simplextree_std A non-multi simplextree \tparam simplextree_multi A - * multi simplextree \param st Simplextree to fill. \param st_multi Multiparameter simplextree to convert into a 1 - * parameter simplex tree. \param basepoint The basepoint of the diagonal line. \param dimension The coordinate of the - * line to choose as a 1 parameter filtration (they are all equivalent). + * simplextree. + * \ingroup multiparameter + * \tparam simplextree_std A non-multi simplextree + * \tparam simplextree_multi A multiparameter simplextree + * \param st Simplextree to fill. + * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. + * \param basepoint The basepoint of the diagonal line. + * \param dimension The coordinate of the line to choose as a 1 parameter filtration (they are all equivalent). * */ template void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, @@ -180,14 +186,14 @@ inline void find_coordinates(vector_like &x, const multi_filtration_grid &grid) /** * \brief Pushes all of the filtration values of a simplextree onto a grid, c.f. \ref find_coordinates. * \ingroup multiparameter - * \param splxptr Simplextree pointer. + * \param st_multi Multiparameter simplex tree to squeeze on the grid. * \param grid The multiparameter grid. A vector of size `num_parameters`, * whose elements are the elements of the grid for this axis. * \param coordinate_values If set to true the filtration values will be turned into coordinates in this grid * instead of points in this grid. * */ -void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bool coordinate_values = true) { - Simplex_tree &st_multi = *(Gudhi::Simplex_tree *)(splxptr); +template +void squeeze_filtration(simplextree_multi& st_multi, const multi_filtration_grid &grid, bool coordinate_values = true) { auto num_parameters = static_cast(st_multi.get_number_of_parameters()); if (grid.size() != num_parameters) { std::cerr << "Bad grid !" << std::endl; @@ -206,13 +212,15 @@ void squeeze_filtration(uintptr_t splxptr, const multi_filtration_grid &grid, bo // retrieves the filtration values of a simplextree. Useful to generate a grid. /** - * \brief Retrieves all of the filtration values, for each simplex dimension, of the simplextree. Useful to generate - * grids. \ingroup multiparameter \param splxptr Simplextree pointer. whose elements are the elements of the grid for - * this axis. \param degrees Only the simpleces of these dimension will be taken into account. Useful for, e.g., Rips + * \brief Retrieves all of the filtration values, for each simplex dimension, of the simplextree. + * Useful to generate grids. + * \ingroup multiparameter + * \param st_multi Simplextree on which filtration values are exctracted. + * \param degrees Only the simpleces of these dimension will be taken into account. Useful for, e.g., Rips * filtrations. * */ -std::vector get_filtration_values(const uintptr_t splxptr, const std::vector °rees) { - Simplex_tree &st_multi = *(Gudhi::Simplex_tree *)(splxptr); +template +std::vector get_filtration_values(simplextree_multi& st_multi, const std::vector °rees) { int num_parameters = st_multi.get_number_of_parameters(); std::vector out(degrees.size(), multi_filtration_grid(num_parameters)); std::vector degree_index(degrees.size()); From d61ad0bc268bc0ee3a231c3a34f42c896a785c3d Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 14:26:12 +0200 Subject: [PATCH 28/87] fix numeric_limits with multi filtrations --- .../multi_filtrations/Finitely_critical_filtrations.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 19b0804c8f..9343c9a723 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -176,10 +176,14 @@ template class numeric_limits> { public: +static constexpr bool has_infinity = true; + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); }; - +static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::max()); + }; static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration quiet_NaN() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, numeric_limits::quiet_NaN()); }; From 267dd43e24f69350cc7bf0c28044ebf844ac21c8 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 17:16:25 +0200 Subject: [PATCH 29/87] test fix --- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 2 +- .../test/simplex_tree_multi_unit_test.cpp | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 0c45ec772b..6cdd113ec7 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -27,7 +27,7 @@ struct Simplex_tree_options_multidimensional_filtration { static const bool store_key = true; static const bool store_filtration = true; static const bool contiguous_vertices = false; - static const bool link_nodes_by_label = true; + static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; static const bool is_multi_parameter = true; }; diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 33a3593c7e..0306705d91 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -582,11 +582,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes std::clog << "TEST RESET FILTRATION" << std::endl; typeST st; - st.insert_simplex_and_subfaces({2, 1, 0}, 3.); - st.insert_simplex_and_subfaces({3, 0}, 2.); - st.insert_simplex_and_subfaces({3, 4, 5}, 3.); - st.insert_simplex_and_subfaces({0, 1, 6, 7}, 4.); - + st.insert_simplex_and_subfaces({2, 1, 0}, vec({2.,1.})); + st.insert_simplex_and_subfaces({3, 0}, vec({1.,2.})); + st.insert_simplex_and_subfaces({3, 4, 5}, vec({3.,4.})); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, vec({4.,3.})); + std::cout <<"TRUC "<< st.filtration(st.find({2,1,0})) << std::endl; /* Inserted simplex: */ /* 1 6 */ /* o---o */ @@ -604,13 +604,13 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes 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.); + BOOST_CHECK(st.filtration(f_simplex) >= vec({1.,1.})); } // dimension until 5 even if simplex tree is of dimension 3 to test the limits for(int dimension = 5; dimension >= 0; dimension --) { std::clog << "### reset_filtration - dimension = " << dimension << "\n"; - st.reset_filtration(0., dimension); + st.reset_filtration(st.inf_, dimension); for (auto f_simplex : st.skeleton_simplex_range(3)) { std::clog << "vertex = ("; for (auto vertex : st.simplex_vertex_range(f_simplex)) { @@ -619,7 +619,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes 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.); + BOOST_CHECK(st.filtration(f_simplex) >= vec({1.,1})); else BOOST_CHECK(st.filtration(f_simplex) == st.inf_); } @@ -631,7 +631,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant std::clog << "********************************************************************" << std::endl; std::clog << "TEST SIMPLEX TREE CLEAR" << std::endl; typeST st; - st.insert_simplex_and_subfaces({0, 1}, vec{{1.5}}); + st.insert_simplex_and_subfaces({0, 1}, vec({1.5})); st.initialize_filtration(); st.clear(); BOOST_CHECK(st.num_vertices() == 0); @@ -641,7 +641,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant BOOST_CHECK(boost::size(st.filtration_simplex_range()) == 0); typeST st_empty; BOOST_CHECK(st == st_empty); - st.insert_simplex_and_subfaces({0}, vec{{2.5}}); + st.insert_simplex_and_subfaces({0}, vec({2.5})); BOOST_CHECK(boost::size(st.cofaces_simplex_range(st.find({0}), 1)) == 0); } From b85205f951aa45bad49176045fa9dae849b07aab Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 18:47:40 +0200 Subject: [PATCH 30/87] . --- .../include/gudhi/Simplex_tree/Simplex_tree_multi.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 6cdd113ec7..7252863e2b 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -196,8 +196,7 @@ template void squeeze_filtration(simplextree_multi& st_multi, const multi_filtration_grid &grid, bool coordinate_values = true) { auto num_parameters = static_cast(st_multi.get_number_of_parameters()); if (grid.size() != num_parameters) { - std::cerr << "Bad grid !" << std::endl; - throw; + throw std::invalid_argument("Grid and simplextree do not agree on number of parameters."); } for (const auto &simplex_handle : st_multi.complex_simplex_range()) { auto &simplex_filtration = st_multi.filtration_mutable(simplex_handle); From 114327f83004c1a8253b5995df47cfac2434f0a4 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 3 Oct 2023 19:00:25 +0200 Subject: [PATCH 31/87] answer to some comments --- .../include/gudhi/Simplex_tree/Simplex_tree_multi.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 7252863e2b..3e5f843db5 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -67,8 +67,7 @@ void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_par for (auto vertex : st.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); if (num_parameters > 0) f[0] = st.filtration(simplex_handle); - auto filtration_copy = f; - st_multi.insert_simplex(simplex, filtration_copy); + st_multi.insert_simplex(simplex, f); } } @@ -130,13 +129,13 @@ void linear_projection(simplextree_std &st, simplextree_multi &st_multi, template void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, const std::vector basepoint, int dimension) { - multi_filtrations::Line l(basepoint); - for (const auto &simplex_handle : st_multi.complex_simplex_range()) { + assert(dimension>0); + multi_filtrations::Line l(basepoint); + for (const auto &simplex_handle : st_multi.complex_simplex_range()) { std::vector simplex; for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); std::vector f = st_multi.filtration(simplex_handle); - if (dimension < 0) dimension = 0; typename simplextree_multi::Options::value_type new_filtration = l.push_forward(f)[dimension]; st.insert_simplex(simplex, new_filtration); } From 04ce9e2acdd8dd1c9ffddd43ce81f6ca58bc0d4e Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Wed, 4 Oct 2023 10:14:37 +0200 Subject: [PATCH 32/87] doc improvements Co-authored-by: Vincent Rouvreau <10407034+VincentRouvreau@users.noreply.github.com> --- src/Simplex_tree/concept/SimplexTreeOptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h index 45e5f03bca..fc09a918b2 100644 --- a/src/Simplex_tree/concept/SimplexTreeOptions.h +++ b/src/Simplex_tree/concept/SimplexTreeOptions.h @@ -31,7 +31,7 @@ struct SimplexTreeOptions { static const bool link_nodes_by_label; /// If true, Simplex_handle will not be invalidated after insertions or removals. static const bool stable_simplex_handles; - /// If true, assumes that Filtration_value is vector-like instead of float-like. This also assumes that Filtration_values is a class, which has a push_to method to push a filtration value $x$ onto $this>=0$. + /// If true, assumes that Filtration_value is vector-like instead of float-like. This also assumes that SimplexTreeOptions::Filtration_value is a class, which has a `push_to` method to push a filtration value \f$x\f$ onto \f$this>=0\f$. static const bool is_multi_parameter; }; From 3f4dc4089944fc1504aec1f9702d241a567c0d19 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Wed, 4 Oct 2023 10:15:42 +0200 Subject: [PATCH 33/87] doc improvements --- src/Simplex_tree/concept/SimplexTreeOptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h index fc09a918b2..5625cb4753 100644 --- a/src/Simplex_tree/concept/SimplexTreeOptions.h +++ b/src/Simplex_tree/concept/SimplexTreeOptions.h @@ -31,7 +31,7 @@ struct SimplexTreeOptions { static const bool link_nodes_by_label; /// If true, Simplex_handle will not be invalidated after insertions or removals. static const bool stable_simplex_handles; - /// If true, assumes that Filtration_value is vector-like instead of float-like. This also assumes that SimplexTreeOptions::Filtration_value is a class, which has a `push_to` method to push a filtration value \f$x\f$ onto \f$this>=0\f$. + /// If true, assumes that SimplexTreeOptions::Filtration_value is vector-like instead of float-like. This also assumes that SimplexTreeOptions::Filtration_value is a class, which has a `push_to` method to push a filtration value \f$x\f$ onto \f$\mathrm{this} \geq 0\f$. static const bool is_multi_parameter; }; From d070bf162e19967fd76af637da060261b1f9049c Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Wed, 4 Oct 2023 11:23:38 +0200 Subject: [PATCH 34/87] set number of parameter in multify --- src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 3e5f843db5..a8d8eea2f7 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -69,6 +69,7 @@ void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_par if (num_parameters > 0) f[0] = st.filtration(simplex_handle); st_multi.insert_simplex(simplex, f); } + st_multi.set_number_of_parameters(num_parameters); } /** From 96056a3a6f2b7492b23b115229eaebda35ee8c41 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Wed, 4 Oct 2023 12:12:58 +0200 Subject: [PATCH 35/87] more tests --- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 14 +++++-- .../test/simplex_tree_multi_unit_test.cpp | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index a8d8eea2f7..a60359d74f 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -56,6 +56,7 @@ template void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_parameters, const typename simplextree_multi::Options::Filtration_value &default_values = {}) { typename simplextree_multi::Options::Filtration_value f(num_parameters); + static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert non-multiparameter to multiparameter simplextree."); for (auto i = 0u; i < std::min(static_cast(default_values.size()), static_cast(num_parameters - 1)); i++) @@ -83,6 +84,7 @@ void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_par * */ template void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimension = 0) { + static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert multiparameter to non-multiparameter simplextree."); for (const auto &simplex_handle : st_multi.complex_simplex_range()) { std::vector simplex; for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); @@ -98,13 +100,14 @@ void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimensi * \ingroup multiparameter * \tparam simplextree_std A non-multi simplextree * \tparam simplextree_multi A multi simplextree - * \param st Simplextree to fill. + * \param st Simplextree, with the same simplicial complex as st_multi, whose filtration has to be filled. * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. * \param linear_form the linear form to apply. * */ template void linear_projection(simplextree_std &st, simplextree_multi &st_multi, const std::vector &linear_form) { + static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert multiparameter to non-multiparameter simplextree."); auto sh = st.complex_simplex_range().begin(); auto sh_multi = st_multi.complex_simplex_range().begin(); auto end = st.complex_simplex_range().end(); @@ -130,9 +133,10 @@ void linear_projection(simplextree_std &st, simplextree_multi &st_multi, template void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, const std::vector basepoint, int dimension) { - assert(dimension>0); - multi_filtrations::Line l(basepoint); - for (const auto &simplex_handle : st_multi.complex_simplex_range()) { + static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert multiparameter to non-multiparameter simplextree."); + assert(dimension>=0); + multi_filtrations::Line l(basepoint); + for (const auto &simplex_handle : st_multi.complex_simplex_range()) { std::vector simplex; for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); @@ -194,6 +198,7 @@ inline void find_coordinates(vector_like &x, const multi_filtration_grid &grid) * */ template void squeeze_filtration(simplextree_multi& st_multi, const multi_filtration_grid &grid, bool coordinate_values = true) { + static_assert(simplextree_multi::Options::is_multi_parameter, "Only works for multiparameter simplextrees."); auto num_parameters = static_cast(st_multi.get_number_of_parameters()); if (grid.size() != num_parameters) { throw std::invalid_argument("Grid and simplextree do not agree on number of parameters."); @@ -220,6 +225,7 @@ void squeeze_filtration(simplextree_multi& st_multi, const multi_filtration_grid * */ template std::vector get_filtration_values(simplextree_multi& st_multi, const std::vector °rees) { + static_assert(simplextree_multi::Options::is_multi_parameter, "Only works for multiparameter simplextrees."); int num_parameters = st_multi.get_number_of_parameters(); std::vector out(degrees.size(), multi_filtration_grid(num_parameters)); std::vector degree_index(degrees.size()); diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 0306705d91..b62b8059ef 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -36,6 +36,7 @@ using Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtrati using vec=Finitely_critical_multi_filtration; typedef boost::mpl::list> list_of_tested_variants; +using typeST_STD = Simplex_tree; template void test_empty_simplex_tree(typeST& tst) { @@ -684,3 +685,42 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(for_each_simplex_skip_iteration, typeST, list_of_t BOOST_CHECK(num_simplices_by_dim_until_two[0] == num_simplices_by_dim[0]); BOOST_CHECK(num_simplices_by_dim_until_two[1] == num_simplices_by_dim[1]); } + + +BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_variants) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST MULTIFY" << std::endl; + + typeST_STD st; + typeST st_multi; + st.insert_simplex_and_subfaces({1,2,3}, 1.); + BOOST_CHECK(st.get_number_of_parameters() == 1); + int num_parameters = 3; + Gudhi::multiparameter::multify(st,st_multi,num_parameters,{2.,3.}); //fills st_multi by simplices of filtration [{st.filtration(sh)}, default_values[0],default_values[1], ...] + BOOST_CHECK(st_multi.get_number_of_parameters() == num_parameters); // num parameters is defined by multify + BOOST_CHECK(st_multi.num_simplices() == st.num_simplices()); // simplicial complexes should be the same + for (auto sh : st_multi.complex_simplex_range()){ + const auto& filtration = st_multi.filtration(sh); + BOOST_CHECK(filtration == vec({1,2,3})); // Checks the filtration values + } + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST FLATTEN" << std::endl; + + for (int dimension=0; dimension < 3; dimension++){ + st.clear(); + Gudhi::multiparameter::flatten(st, st_multi, dimension); + for (auto sh : st.complex_simplex_range()){ + BOOST_CHECK(st.filtration(sh) == dimension +1); + } + } + + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST LINEAR PROJECTION" << std::endl; + // st has already the same simplicial complex as st_multi, and the filtration values of st_multi are all {1,2,3} + Gudhi::multiparameter::linear_projection(st,st_multi,{17,37,73}); // sets the filtration values of st to the dot product of st_multi.filtration and {17,37,73}. + for (auto sh : st.complex_simplex_range()){ + BOOST_CHECK(st.filtration(sh) == 1*17 + 2*37 + 3*73); + } +} + + From 6d5ad8b1fd79cca16807e269bff9556972be8c93 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Thu, 5 Oct 2023 14:13:54 +0200 Subject: [PATCH 36/87] Optional num_parameters, vincent's tests of simplextree multi --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 13 +- .../Finitely_critical_filtrations.h | 76 +++- .../test/simplex_tree_multi_unit_test.cpp | 372 +++++++++++++++--- 3 files changed, 383 insertions(+), 78 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 894148e4b7..ddf9b0a7a1 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -400,7 +400,9 @@ class Simplex_tree { : null_vertex_(-1), root_(nullptr, null_vertex_), filtration_vect_(), - dimension_(-1) { } + dimension_(-1) { + if constexpr (Options::is_multi_parameter) number_of_parameters_ = 2; + } /** \brief User-defined copy constructor reproduces the whole tree structure. */ Simplex_tree(const Simplex_tree& complex_source) { @@ -408,12 +410,13 @@ class Simplex_tree { std::clog << "Simplex_tree copy constructor" << std::endl; #endif // DEBUG_TRACES copy_from(complex_source); + if constexpr (Options::is_multi_parameter) number_of_parameters_ = complex_source.number_of_parameters_; } /** \brief User-defined move constructor relocates the whole tree structure. * \exception std::invalid_argument In debug mode, if the complex_source is invalid. */ - Simplex_tree(Simplex_tree && complex_source) { + Simplex_tree(Simplex_tree && complex_source) : number_of_parameters_(std::move(complex_source.number_of_parameters_)) { #ifdef DEBUG_TRACES std::clog << "Simplex_tree move constructor" << std::endl; #endif // DEBUG_TRACES @@ -1627,7 +1630,7 @@ class Simplex_tree { Filtration_value max_filt_border_value; if constexpr (SimplexTreeOptions::is_multi_parameter) { // in that case, we assume that Filtration_value has a `push_to` member to handle this. - max_filt_border_value = Filtration_value(this->number_of_parameters_); + max_filt_border_value = Filtration_value(*number_of_parameters_); // is multiparam for (auto& face_sh : boundary) { max_filt_border_value.push_to( filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration @@ -2286,7 +2289,7 @@ class Simplex_tree { * */ int get_number_of_parameters() const { if constexpr (SimplexTreeOptions::is_multi_parameter) - return number_of_parameters_; + return *number_of_parameters_; else return 1; } @@ -2296,7 +2299,7 @@ class Simplex_tree { : std::numeric_limits::max(); /**< Default infinite value. */ private: - int number_of_parameters_; /**< Number of parameters of the multi-filtrations when SimplexTreeOptions::is_multi_parameter.-*/ + std::optional number_of_parameters_; /**< Number of parameters of the multi-filtrations when SimplexTreeOptions::is_multi_parameter.-*/ }; // Print a Simplex_tree in os. diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 9343c9a723..56fe520fa3 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -15,6 +15,7 @@ #include #include #include +#include namespace Gudhi::multiparameter::multi_filtrations { @@ -53,7 +54,20 @@ class Finitely_critical_multi_filtration : public std::vector { operator std::vector&() const { return *this; } std::vector get_vector() const { return static_cast>(*this); } - friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + inline bool is_inf() const { + if (this->size() != 1) return false; + return *(this->begin()) == std::numeric_limits::infinity(); + } + inline bool is_minus_inf() const { + if (this->size() != 1) return false; + return *(this->begin()) == - std::numeric_limits::infinity(); + } + inline bool is_nan() const { + if (this->size() != 1) return false; + return std::isnan(*(this->begin())); + } + inline friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + if (a.is_inf() || b.is_inf() || a.is_nan() || b.is_nan()) return false; bool isSame = true; int n = std::min(a.size(), b.size()); for (int i = 0; i < n; ++i) { @@ -63,7 +77,9 @@ class Finitely_critical_multi_filtration : public std::vector { if (isSame) return false; return true; } - friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + inline friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + if (a.is_nan() || b.is_nan()) return false; + if (b.is_inf()) return a.is_inf(); int n = std::min(a.size(), b.size()); for (int i = 0; i < n; ++i) { if (a[i] > b[i]) return false; @@ -72,32 +88,32 @@ class Finitely_critical_multi_filtration : public std::vector { } // GREATER THAN OPERATORS - friend bool operator>(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + inline friend bool operator>(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { return b < a; } - friend bool operator>=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + inline friend bool operator>=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { return b <= a; } - Finitely_critical_multi_filtration& operator=(const Finitely_critical_multi_filtration& a) { + inline Finitely_critical_multi_filtration& operator=(const Finitely_critical_multi_filtration& a) { std::vector::operator=(a); return *this; } std::vector& _convert_back() { return *this; } - friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, + inline friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, const Finitely_critical_multi_filtration& to_substract) { std::transform(result.begin(), result.end(), to_substract.begin(), result.begin(), std::minus()); return result; } - friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, + inline friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, const Finitely_critical_multi_filtration& to_add) { std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::plus()); return result; } - friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, + inline friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, const T& to_substract) { // std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); for (auto& truc : result) { @@ -105,7 +121,7 @@ class Finitely_critical_multi_filtration : public std::vector { } return result; } - friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, + inline friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, const T& to_add) { for (auto& truc : result) { truc += to_add; @@ -114,7 +130,7 @@ class Finitely_critical_multi_filtration : public std::vector { } // template - friend bool operator==(Finitely_critical_multi_filtration& self, + inline friend bool operator==(Finitely_critical_multi_filtration& self, const Finitely_critical_multi_filtration& to_compare) { if (self.size() != to_compare.size()) return false; auto it = to_compare.begin(); @@ -124,28 +140,37 @@ class Finitely_critical_multi_filtration : public std::vector { return true; } - static std::vector> to_python(const std::vector>& to_convert) { + inline static std::vector> to_python(const std::vector>& to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); } - static std::vector> from_python(const std::vector>& to_convert) { + inline static std::vector> from_python(const std::vector>& to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); } - void push_to(const Finitely_critical_multi_filtration& x) { + inline void push_to(const Finitely_critical_multi_filtration& x) { + if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) + return; + if (x.is_inf() || this->is_minus_inf()) { + *this = x; + return; + } if (this->size() != x.size()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->size() << " and " << x.size() - << "are different !" << std::endl; + std::cerr << "Does only work with 1-critical filtrations ! Sizes " + << this->size() << " and " << x.size() + << "are different !" << std::endl; + std::cerr << "This : " << *this << std::endl; + std::cerr << "arg : " << x << std::endl; throw std::logic_error("Bad sizes"); } for (unsigned int i = 0; i < x.size(); i++) this->at(i) = this->at(i) > x[i] ? this->at(i) : x[i]; } // Warning, this function assumes that the comparisons checks have already been made ! - void insert_new(Finitely_critical_multi_filtration to_concatenate) { + inline void insert_new(Finitely_critical_multi_filtration to_concatenate) { this->insert(this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end())); } // scalar product of a filtration value with x. - T linear_projection(const std::vector& x) { + inline T linear_projection(const std::vector& x) { T projection = 0; unsigned int size = std::min(x.size(), this->size()); for (auto i = 0u; i < size; i++) projection += x[i] * this->at(i); @@ -153,7 +178,19 @@ class Finitely_critical_multi_filtration : public std::vector { } // easy debug - friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc) { + inline friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc) { + if (truc.is_inf()) { + stream << "[inf, ..., inf]"; + return stream; + } + if (truc.is_minus_inf()) { + stream << "[-inf, ..., -inf]"; + return stream; + } + if (truc.is_nan()) { + stream << "[NaN]"; + return stream; + } if (truc.empty()) { stream << "[]"; return stream; @@ -192,4 +229,7 @@ static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtrat } + + + #endif // FINITELY_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index b62b8059ef..9d003ab729 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -1,6 +1,6 @@ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): David Loiseaux + * Author(s): David Loiseaux, Vincent Rouvreau * * Copyright (C) 2023 Inria * @@ -21,7 +21,7 @@ #include // for std::size_t #define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "simplex_tree" +#define BOOST_TEST_MODULE "simplex_tree_multi" #include #include @@ -33,10 +33,14 @@ using namespace Gudhi; using namespace Gudhi::multiparameter; using Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration; -using vec=Finitely_critical_multi_filtration; +using namespace Gudhi; +using namespace Gudhi::multiparameter; +using Multi_Filtration_values = Finitely_critical_multi_filtration; -typedef boost::mpl::list> list_of_tested_variants; using typeST_STD = Simplex_tree; +using Stree_multi = Simplex_tree; + +typedef boost::mpl::list list_of_tested_variants; template void test_empty_simplex_tree(typeST& tst) { @@ -583,10 +587,10 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes std::clog << "TEST RESET FILTRATION" << std::endl; typeST st; - st.insert_simplex_and_subfaces({2, 1, 0}, vec({2.,1.})); - st.insert_simplex_and_subfaces({3, 0}, vec({1.,2.})); - st.insert_simplex_and_subfaces({3, 4, 5}, vec({3.,4.})); - st.insert_simplex_and_subfaces({0, 1, 6, 7}, vec({4.,3.})); + st.insert_simplex_and_subfaces({2, 1, 0}, Multi_Filtration_values({2.,1.})); + st.insert_simplex_and_subfaces({3, 0}, Multi_Filtration_values({1.,2.})); + st.insert_simplex_and_subfaces({3, 4, 5}, Multi_Filtration_values({3.,4.})); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, Multi_Filtration_values({4.,3.})); std::cout <<"TRUC "<< st.filtration(st.find({2,1,0})) << std::endl; /* Inserted simplex: */ /* 1 6 */ @@ -605,7 +609,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes 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) >= vec({1.,1.})); + BOOST_CHECK(st.filtration(f_simplex) >= Multi_Filtration_values({1.,1.})); } // dimension until 5 even if simplex tree is of dimension 3 to test the limits @@ -620,7 +624,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes 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) >= vec({1.,1})); + BOOST_CHECK(st.filtration(f_simplex) >= Multi_Filtration_values({1.,1})); else BOOST_CHECK(st.filtration(f_simplex) == st.inf_); } @@ -632,7 +636,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant std::clog << "********************************************************************" << std::endl; std::clog << "TEST SIMPLEX TREE CLEAR" << std::endl; typeST st; - st.insert_simplex_and_subfaces({0, 1}, vec({1.5})); + st.insert_simplex_and_subfaces({0, 1}, Multi_Filtration_values({1.5})); st.initialize_filtration(); st.clear(); BOOST_CHECK(st.num_vertices() == 0); @@ -642,54 +646,13 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant BOOST_CHECK(boost::size(st.filtration_simplex_range()) == 0); typeST st_empty; BOOST_CHECK(st == st_empty); - st.insert_simplex_and_subfaces({0}, vec({2.5})); + st.insert_simplex_and_subfaces({0}, Multi_Filtration_values({2.5})); BOOST_CHECK(boost::size(st.cofaces_simplex_range(st.find({0}), 1)) == 0); } -BOOST_AUTO_TEST_CASE_TEMPLATE(for_each_simplex_skip_iteration, typeST, list_of_tested_variants) { - std::clog << "********************************************************************" << std::endl; - std::clog << "TEST FOR_EACH ITERATION SKIP MECHANISM" << std::endl; - typeST st; - - st.insert_simplex_and_subfaces({2, 1, 0}, 3.); - st.insert_simplex_and_subfaces({3, 0}, 2.); - st.insert_simplex_and_subfaces({3, 4, 5}, 3.); - st.insert_simplex_and_subfaces({0, 1, 6, 7}, 4.); - - /* Inserted simplex: */ - /* 1 6 */ - /* o---o */ - /* /X\7/ */ - /* o---o---o---o */ - /* 2 0 3\X/4 */ - /* o */ - /* 5 */ - - std::vector num_simplices_by_dim_until_two(2); - auto lambda_nb_simp_by_dim = [&num_simplices_by_dim_until_two](typename typeST::Simplex_handle, int dim) - { - BOOST_CHECK (dim < 2); - ++num_simplices_by_dim_until_two[dim]; - return dim >= 1; // The iteration will skip the children in this case - }; - st.for_each_simplex(lambda_nb_simp_by_dim); - for (auto num_simplices : num_simplices_by_dim_until_two) - std::cout << num_simplices << ", "; - std::cout << std::endl; - - auto num_simplices_by_dim = st.num_simplices_by_dimension(); - for (auto num_simplices : num_simplices_by_dim) - std::cout << num_simplices << ", "; - std::cout << std::endl; - - BOOST_CHECK(num_simplices_by_dim_until_two[0] == num_simplices_by_dim[0]); - BOOST_CHECK(num_simplices_by_dim_until_two[1] == num_simplices_by_dim[1]); -} - - BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_variants) { std::clog << "********************************************************************" << std::endl; - std::clog << "TEST MULTIFY" << std::endl; + std::clog << "TEST MULTIFY FLATTEN LINEAR PROJECTION" << std::endl; typeST_STD st; typeST st_multi; @@ -701,7 +664,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia BOOST_CHECK(st_multi.num_simplices() == st.num_simplices()); // simplicial complexes should be the same for (auto sh : st_multi.complex_simplex_range()){ const auto& filtration = st_multi.filtration(sh); - BOOST_CHECK(filtration == vec({1,2,3})); // Checks the filtration values + BOOST_CHECK(filtration == Multi_Filtration_values({1,2,3})); // Checks the filtration values } std::clog << "********************************************************************" << std::endl; std::clog << "TEST FLATTEN" << std::endl; @@ -724,3 +687,302 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia } + + +BOOST_AUTO_TEST_CASE(simplex_tree_multi_assign_filtration) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST MULTI FILTRATION INSERT SIMPLEX AND SUBFACES" << std::endl; + Stree_multi st; + + typename Stree_multi::Simplex_handle sh; + bool success = false; + const Multi_Filtration_values multi_filt_1 = {1., 2.}; + std::tie(sh, success) = st.insert_simplex_and_subfaces({0, 1}, multi_filt_1); + BOOST_CHECK(success); + BOOST_CHECK(sh != st.null_simplex()); + // Only [0,1], [0] and [1] are already inserted + const Multi_Filtration_values multi_filt_2 = {3., 2., 1.}; + std::tie(sh, success) = st.insert_simplex_and_subfaces({2, 1, 0}, multi_filt_2); + BOOST_CHECK(success); + BOOST_CHECK(sh != st.null_simplex()); + // Already inserted + std::tie(sh, success) = st.insert_simplex_and_subfaces({0, 2}, {4.}); + BOOST_CHECK(!success); + BOOST_CHECK(sh != st.null_simplex()); + + // Check filtration values of an already inserted simplex + sh = st.find({1, 2}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_2); + // And assign a new value + Multi_Filtration_values const multi_filt_3 = {5.}; + st.assign_filtration(sh, multi_filt_3); + + for (auto f_simplex : st.complex_simplex_range()) { + std::clog << "vertex = ("; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::clog << vertex << ","; + } + std::clog << ") - filtration = " << st.filtration(f_simplex); + std::clog << " - dimension = " << st.dimension(f_simplex) << std::endl; + } + + // Check all filtration values + sh = st.find({2, 1, 0}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_2); + sh = st.find({1, 0}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_1); + sh = st.find({2, 0}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_2); + sh = st.find({0}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_1); + sh = st.find({2, 1}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_3); + sh = st.find({1}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_1); + sh = st.find({2}); + BOOST_CHECK(sh != st.null_simplex()); + BOOST_CHECK(st.filtration(sh) == multi_filt_2); + +} + +BOOST_AUTO_TEST_CASE(simplex_tree_multi_reset_filtration) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST RESET MULTI FILTRATION" << std::endl; + Stree_multi st; + + st.insert_simplex_and_subfaces({2, 1, 0}, {3., 2.}); + st.insert_simplex_and_subfaces({3, 0}, {2., 3.}); + st.insert_simplex_and_subfaces({3, 4, 5}, {3., 2.}); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, {4.}); + + /* Inserted simplex: */ + /* 1 6 */ + /* o---o */ + /* /X\7/ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + + for (auto f_simplex : st.complex_simplex_range()) { + std::clog << "vertex = ("; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::clog << vertex << ","; + } + 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.); + } + + Multi_Filtration_values new_filt = {0., 1., 2.}; + // dimension until 5 even if simplex tree is of dimension 3 to test the limits + for(int dimension = 5; dimension >= 0; dimension --) { + std::clog << "### reset_filtration - dimension = " << dimension << "\n"; + st.reset_filtration(new_filt, dimension); + for (auto f_simplex : st.complex_simplex_range()) { + std::clog << "vertex = ("; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::clog << vertex << ","; + } + 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) == new_filt); + } + } +} + +BOOST_AUTO_TEST_CASE(simplex_tree_multi_filtration_multify) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST MULTI FILTRATION MULTIFY" << std::endl; + + Simplex_tree<> st; + st.insert_simplex_and_subfaces({2, 1, 0}, 3.); + st.insert_simplex_and_subfaces({3, 0}, 2.); + st.insert_simplex_and_subfaces({3, 4, 5}, 3.); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, 4.); + + /* Inserted simplex: */ + /* 1 6 */ + /* o---o */ + /* /X\7/ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + + Stree_multi st_multi; + Multi_Filtration_values default_multi (3, std::numeric_limits::quiet_NaN()); + Gudhi::multiparameter::multify(st, st_multi, 3, default_multi); + + for (auto f_simplex : st_multi.complex_simplex_range()) { + std::clog << "vertex = ("; + for (auto vertex : st_multi.simplex_vertex_range(f_simplex)) { + std::clog << vertex << ","; + } + auto multi_filtration = st_multi.filtration(f_simplex); + std::clog << ") - filtration = " << multi_filtration << std::endl; + BOOST_CHECK(!std::isnan(multi_filtration[0])); + BOOST_CHECK(std::isnan(multi_filtration[1])); + BOOST_CHECK(std::isnan(multi_filtration[2])); + } + + { + Simplex_tree<> copy; + Gudhi::multiparameter::flatten(copy, st_multi, 0); + BOOST_CHECK(st == copy); + } + + { + Simplex_tree<> copy; + Gudhi::multiparameter::flatten(copy, st_multi, 1); + for (auto f_simplex : copy.complex_simplex_range()) { + std::clog << "vertex = ("; + for (auto vertex : copy.simplex_vertex_range(f_simplex)) { + std::clog << vertex << ","; + } + std::clog << ") - filtration = " << copy.filtration(f_simplex) << std::endl; + BOOST_CHECK(std::isnan(copy.filtration(f_simplex))); + } + } + +} + +BOOST_AUTO_TEST_CASE(simplex_tree_multi_filtration_numeric_limits) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST MULTI FILTRATION NUMERIC LIMITS" << std::endl; + + // NaN + auto nan_multi = std::numeric_limits::quiet_NaN(); + BOOST_CHECK(nan_multi.size() == 1); + BOOST_CHECK(std::isnan(nan_multi[0])); + std::clog << nan_multi << std::endl; + + // Inf + auto inf_multi = std::numeric_limits::infinity(); + BOOST_CHECK(inf_multi.size() == 1); + BOOST_CHECK(std::isinf(inf_multi[0])); + std::clog << inf_multi << std::endl; +} + +BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi) { + std::clog << "********************************************************************" << std::endl; + std::clog << "TEST MULTI FILTRATION NON DECREASING" << std::endl; + Stree_multi st; + + st.insert_simplex_and_subfaces({2, 1, 0}, {3., 4.}); + st.insert_simplex_and_subfaces({3, 0}, {2., 3.}); + st.insert_simplex_and_subfaces({3, 4, 5}, {3., 4.}); + + /* Inserted simplex: */ + /* 1 */ + /* o */ + /* /X\ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + + + for (auto f_simplex : st.complex_simplex_range()) { + std::clog << "vertex = ("; + for (auto vertex : st.simplex_vertex_range(f_simplex)) { + std::clog << vertex << ","; + } + std::clog << ") - filtration = " << st.filtration(f_simplex) << std::endl; + } + auto filt = st.filtration(st.find({3, 0})); + std::clog << "filtration([3,0]) = " << filt << std::endl; + BOOST_CHECK(filt == Multi_Filtration_values({2., 3.})); + + st.set_number_of_parameters(2); + st.make_filtration_non_decreasing(); + + filt = st.filtration(st.find({3, 0})); + std::clog << "filtration([3,0]) = " << filt << std::endl; + BOOST_CHECK(filt == Multi_Filtration_values({3., 4.})); + + st.assign_filtration(st.find({3, 0}), Multi_Filtration_values({2.9, 4.})); + filt = st.filtration(st.find({3, 0})); + std::clog << "filtration([3,0]) = " << filt << std::endl; + BOOST_CHECK(filt == Multi_Filtration_values({2.9, 4.})); + + st.make_filtration_non_decreasing(); + + filt = st.filtration(st.find({3, 0})); + std::clog << "filtration([3,0]) = " << filt << std::endl; + BOOST_CHECK(filt == Multi_Filtration_values({3., 4.})); + + st.assign_filtration(st.find({3, 0}), Multi_Filtration_values({5., 3.99})); + filt = st.filtration(st.find({3, 0})); + std::clog << "filtration([3,0]) = " << filt << std::endl; + BOOST_CHECK(filt == Multi_Filtration_values({5., 3.99})); + + st.make_filtration_non_decreasing(); + + filt = st.filtration(st.find({3, 0})); + std::clog << "filtration([3,0]) = " << filt << std::endl; + BOOST_CHECK(filt == Multi_Filtration_values({3., 4.})); +} + +BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi_nan_values) { + Stree_multi st; + + BOOST_CHECK(std::numeric_limits::quiet_NaN().is_nan()); + BOOST_CHECK(std::numeric_limits::infinity().is_inf()); + + st.insert_simplex_and_subfaces({2, 1, 0}, {1.,2.,3.}); + st.insert_simplex_and_subfaces({3, 0}, {1.,2.,3.}); + st.insert_simplex_and_subfaces({3, 4, 5}, {1.,2.,3.}); + + st.assign_filtration(st.find({0}), std::numeric_limits::quiet_NaN()); + st.assign_filtration(st.find({3}), std::numeric_limits::infinity()); + + /* Inserted simplex: */ + /* 1 */ + /* o */ + /* /X\ */ + /* o---o---o---o */ + /* 2 0 3\X/4 */ + /* o */ + /* 5 */ + + // Default number of parameter is 2 + BOOST_CHECK(st.get_number_of_parameters() == 2); + + st.set_number_of_parameters(3); + BOOST_CHECK(st.get_number_of_parameters() == 3); + + std::clog << "SPECIFIC CASE:" << std::endl; + std::clog << "Insertion with NaN values does not ensure the filtration values are non decreasing" << std::endl; + st.make_filtration_non_decreasing(); + + std::clog << "Check that NaN filtrations are ignored, and inf filtrations are propagated." << std::endl; + for (auto f_simplex : st.complex_simplex_range()) { + auto filt = st.filtration(f_simplex); + bool contains3 = false; + bool contains0 = false; + int dim = -1; + std::clog << "Simplex "; + for (auto vertex : st.simplex_vertex_range(f_simplex)){ + std::clog << vertex << " "; + if (vertex == 3) contains3 = true; + else if (vertex == 0) contains0 = true; + dim++; + } + bool is_zero = dim == 0 && contains0; + std::clog << "Filtration: " << filt << std::endl; + if (is_zero) BOOST_CHECK(filt.is_nan()); + else if (contains3) BOOST_CHECK(filt.is_inf()); + else BOOST_CHECK(filt == Multi_Filtration_values({1.,2.,3.})); + } +} + From a89ff98f87eb6614cdfe8f3fcd8560319a008d71 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Thu, 5 Oct 2023 14:35:55 +0200 Subject: [PATCH 37/87] fix make_filtration_non_decreasing --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 10 ++++++++-- src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index ddf9b0a7a1..dad9ee605f 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -1630,7 +1630,7 @@ class Simplex_tree { Filtration_value max_filt_border_value; if constexpr (SimplexTreeOptions::is_multi_parameter) { // in that case, we assume that Filtration_value has a `push_to` member to handle this. - max_filt_border_value = Filtration_value(*number_of_parameters_); // is multiparam + max_filt_border_value = Filtration_value(*number_of_parameters_); for (auto& face_sh : boundary) { max_filt_border_value.push_to( filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration @@ -1647,7 +1647,13 @@ class Simplex_tree { if (!(sh->second.filtration() >= max_filt_border_value)) { // Store the filtration modification information modified = true; - sh->second.assign_filtration(max_filt_border_value); + if constexpr (Options::is_multi_parameter){ + auto& to_increase_filtration = filtration_mutable(sh); + to_increase_filtration.push_to(max_filt_border_value); + } + else{ + sh->second.assign_filtration(max_filt_border_value); + } } }; // Loop must be from the end to the beginning, as higher dimension simplex are always on the left part of the tree diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 9d003ab729..6406130fc5 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -930,7 +930,7 @@ BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi) { filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({3., 4.})); + BOOST_CHECK(filt == Multi_Filtration_values({5., 4.})); } BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi_nan_values) { From a6d756ad9f59aa90ca3f018ece877bca07841778 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Wed, 11 Oct 2023 19:50:07 +0200 Subject: [PATCH 38/87] edge cases comparison fix --- .../Finitely_critical_filtrations.h | 59 ++++++++++++++++--- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 56fe520fa3..0fbdc60789 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -67,10 +67,12 @@ class Finitely_critical_multi_filtration : public std::vector { return std::isnan(*(this->begin())); } inline friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { - if (a.is_inf() || b.is_inf() || a.is_nan() || b.is_nan()) return false; + if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; +if (b.is_inf() || a.is_minus_inf()) return true; bool isSame = true; - int n = std::min(a.size(), b.size()); - for (int i = 0; i < n; ++i) { + auto n = a.size(); + assert(a.size() == b.size()); + for (auto i = 0u; i < n; ++i) { if (a[i] > b[i]) return false; if (isSame && a[i] != b[i]) isSame = false; } @@ -79,9 +81,11 @@ class Finitely_critical_multi_filtration : public std::vector { } inline friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { if (a.is_nan() || b.is_nan()) return false; - if (b.is_inf()) return a.is_inf(); - int n = std::min(a.size(), b.size()); - for (int i = 0; i < n; ++i) { + if (b.is_inf() || a.is_minus_inf()) return true; + if (a.is_inf() || b.is_minus_inf()) return false; + auto n = a.size(); + assert(a.size() == b.size()); + for (auto i = 0u; i < n; ++i) { if (a[i] > b[i]) return false; } return true; @@ -128,9 +132,47 @@ class Finitely_critical_multi_filtration : public std::vector { } return result; } +inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critical_multi_filtration& result, + const T& to_add) { + for (auto& truc : result) { + truc *= to_add; + } + return result; + } + inline friend Finitely_critical_multi_filtration& operator/=(Finitely_critical_multi_filtration& result, + const T& to_add) { + for (auto& truc : result) { + truc /= to_add; + } + return result; + } + inline friend Finitely_critical_multi_filtration operator-(Finitely_critical_multi_filtration result, + const T& to_add) { + for (auto& truc : result) { + truc -= static_cast(to_add); + } + return result; + } + inline friend Finitely_critical_multi_filtration operator-(const T& to_add, + const Finitely_critical_multi_filtration& result + ) { + return result - to_add; + } + inline friend Finitely_critical_multi_filtration operator*(Finitely_critical_multi_filtration result, + const T& to_add) { + for (auto& truc : result) { + truc *= static_cast(to_add); + } + return result; + } + inline friend Finitely_critical_multi_filtration operator*(const T& to_add, + const Finitely_critical_multi_filtration& result + ) { + return result - to_add; + } // template - inline friend bool operator==(Finitely_critical_multi_filtration& self, + inline friend bool operator==(const Finitely_critical_multi_filtration& self, const Finitely_critical_multi_filtration& to_compare) { if (self.size() != to_compare.size()) return false; auto it = to_compare.begin(); @@ -218,6 +260,9 @@ static constexpr bool has_infinity = true; static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); }; +static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration minus_infinity() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, -std::numeric_limits::infinity()); + }; static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::max()); }; From f90cce7cf79ca5b68fabe1cc6a70f8722aae5500 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Fri, 13 Oct 2023 12:09:28 +0200 Subject: [PATCH 39/87] doc update --- src/Simplex_tree/concept/SimplexTreeOptions.h | 7 ++++++- .../Finitely_critical_filtrations.h | 17 +++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h index 5625cb4753..23e4926151 100644 --- a/src/Simplex_tree/concept/SimplexTreeOptions.h +++ b/src/Simplex_tree/concept/SimplexTreeOptions.h @@ -31,7 +31,12 @@ struct SimplexTreeOptions { static const bool link_nodes_by_label; /// If true, Simplex_handle will not be invalidated after insertions or removals. static const bool stable_simplex_handles; - /// If true, assumes that SimplexTreeOptions::Filtration_value is vector-like instead of float-like. This also assumes that SimplexTreeOptions::Filtration_value is a class, which has a `push_to` method to push a filtration value \f$x\f$ onto \f$\mathrm{this} \geq 0\f$. + /// If true, assumes that SimplexTreeOptions::Filtration_value is vector-like instead of float-like. + /// In that case only, this also assumes that SimplexTreeOptions::Filtration_value is a class, + /// which has a `push_to` method that allows to push the filtration value `this` onto the set of points + /// \f$ \{ y\in \mathrm{Filtration_value} : y\geq x\}\f$ + /// that are greater than another filtration value \f$ x \f$. + /// An example of such a class is Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration . static const bool is_multi_parameter; }; diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 0fbdc60789..2877a609e8 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -20,7 +20,7 @@ namespace Gudhi::multiparameter::multi_filtrations { /** \class Finitely_critical_multi_filtration Finitely_critical_multi_filtration.h gudhi/Simplex_tree/multi_filtrations/Finitely_critical_multi_filtration.h - * \brief Vector-like filtration value, for multiparameter persistence + * \brief Vector-like filtration value, for multiparameter persistence, with numpy-like methods. * * \ingroup multiparameter * @@ -36,7 +36,6 @@ namespace Gudhi::multiparameter::multi_filtrations { */ template class Finitely_critical_multi_filtration : public std::vector { - // Class to prevent doing illegal stuff with the standard library, e.g., compare two vectors public: Finitely_critical_multi_filtration() : std::vector(){}; Finitely_critical_multi_filtration(int n) @@ -68,7 +67,7 @@ class Finitely_critical_multi_filtration : public std::vector { } inline friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; -if (b.is_inf() || a.is_minus_inf()) return true; + if (b.is_inf() || a.is_minus_inf()) return true; bool isSame = true; auto n = a.size(); assert(a.size() == b.size()); @@ -189,6 +188,12 @@ inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critica inline static std::vector> from_python(const std::vector>& to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); } + + /** \brief This functions take the filtration value `this` and pushes it to the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. + * After calling this method, the value of this is updated to + * \f$ \mathrm{this} = \min \{ y\in \mathbb R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} + * @param[in] x The target filtration value on which to push `this`. + */ inline void push_to(const Finitely_critical_multi_filtration& x) { if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; @@ -255,15 +260,15 @@ template class numeric_limits> { public: -static constexpr bool has_infinity = true; + static constexpr bool has_infinity = true; static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); }; -static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration minus_infinity() throw(){ + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration minus_infinity() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, -std::numeric_limits::infinity()); }; -static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::max()); }; static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration quiet_NaN() throw(){ From dcdd710f311f26c94e046f27d6111fef67fb7d8c Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Thu, 19 Oct 2023 11:34:35 +0200 Subject: [PATCH 40/87] missing is_multi_parameter in options --- src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp index ed7d08f391..33ffba8bc9 100644 --- a/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp @@ -35,6 +35,7 @@ struct Simplex_tree_options_stable_simplex_handles { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; using Point = std::vector; From 0ef649fe9d63d14dd860903a9e1b78ef8b9bfa40 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 21 Nov 2023 11:31:59 +0100 Subject: [PATCH 41/87] multiparameter flag --- .../include/gudhi/Simplex_tree/simplex_tree_options.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/simplex_tree_options.h b/src/Simplex_tree/include/gudhi/Simplex_tree/simplex_tree_options.h index a828b8f810..5aa0f97daa 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/simplex_tree_options.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/simplex_tree_options.h @@ -38,6 +38,7 @@ struct Simplex_tree_options_default { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; /** Model of SimplexTreeOptions. @@ -54,6 +55,7 @@ struct Simplex_tree_options_full_featured { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = true; + static const bool is_multi_parameter = false; }; /** Model of SimplexTreeOptions. @@ -70,6 +72,7 @@ struct Simplex_tree_options_minimal { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; /** @private @brief Model of SimplexTreeOptions, faster than `Simplex_tree_options_default` but note the unsafe @@ -87,6 +90,7 @@ struct Simplex_tree_options_fast_persistence { static const bool contiguous_vertices = true; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; /** @}*/ // end addtogroup simplex_tree From b448c050d088b0cba10276e612c001f7790091f4 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 21 Nov 2023 11:43:26 +0100 Subject: [PATCH 42/87] multiparameter python flag --- src/python/include/Simplex_tree_interface.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python/include/Simplex_tree_interface.h b/src/python/include/Simplex_tree_interface.h index eb7d9bad2e..77d51846d7 100644 --- a/src/python/include/Simplex_tree_interface.h +++ b/src/python/include/Simplex_tree_interface.h @@ -38,6 +38,7 @@ struct Simplex_tree_options_for_python { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; From 89dfd6ba975ba9913472dead78d5dc6725e798a0 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 21 Nov 2023 12:11:10 +0100 Subject: [PATCH 43/87] multiparameter flags --- src/Persistent_cohomology/example/plain_homology.cpp | 1 + src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp | 1 + .../test/simplex_tree_edge_expansion_unit_test.cpp | 2 +- .../test/simplex_tree_iostream_operator_unit_test.cpp | 1 + src/Simplex_tree/test/simplex_tree_remove_unit_test.cpp | 3 ++- src/Simplex_tree/test/simplex_tree_serialization_unit_test.cpp | 2 ++ 6 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Persistent_cohomology/example/plain_homology.cpp b/src/Persistent_cohomology/example/plain_homology.cpp index 7b09c2013a..887dba8bba 100644 --- a/src/Persistent_cohomology/example/plain_homology.cpp +++ b/src/Persistent_cohomology/example/plain_homology.cpp @@ -24,6 +24,7 @@ struct MyOptions : Gudhi::Simplex_tree_options_minimal { // static const bool store_filtration = false; // However the persistence algorithm needs this static const bool store_key = true; + static const is_multi_parameter = false; // I have few vertices typedef short Vertex_handle; // Maximum number of simplices to compute persistence is 2^8 - 1 = 255. One is reserved for null_key diff --git a/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp b/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp index d370ba93aa..56f21ce776 100644 --- a/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp +++ b/src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp @@ -91,6 +91,7 @@ struct Stree_basic_cofaces_options { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = false; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; struct Stree_fast_cofaces_options : Stree_basic_cofaces_options { diff --git a/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp index 328b04b91e..1be6109474 100644 --- a/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp @@ -35,11 +35,11 @@ struct Simplex_tree_options_fast_cofaces { static const bool contiguous_vertices = false; static const bool link_nodes_by_label = true; static const bool stable_simplex_handles = false; + static const bool is_multi_parameter = false; }; struct Simplex_tree_options_stable_simplex_handles_fast_cofaces : Simplex_tree_options_fast_cofaces { static const bool stable_simplex_handles = true; - static const bool is_multi_parameter = false; }; using Point = std::vector; diff --git a/src/Simplex_tree/test/simplex_tree_iostream_operator_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_iostream_operator_unit_test.cpp index edeb40ca50..8cb3c11798 100644 --- a/src/Simplex_tree/test/simplex_tree_iostream_operator_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_iostream_operator_unit_test.cpp @@ -25,6 +25,7 @@ struct MyOptions : Simplex_tree_options_minimal { // Not doing persistence, so we don't need those static const bool store_key = false; static const bool store_filtration = false; + static const bool is_multi_parameter = false; // I have few vertices typedef short Vertex_handle; }; diff --git a/src/Simplex_tree/test/simplex_tree_remove_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_remove_unit_test.cpp index f2527050bd..a7a4c49f64 100644 --- a/src/Simplex_tree/test/simplex_tree_remove_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_remove_unit_test.cpp @@ -24,6 +24,7 @@ struct MyOptions : Simplex_tree_options_minimal { // Not doing persistence, so we don't need those static const bool store_key = false; static const bool store_filtration = false; + static const bool is_multi_parameter = false; // I have few vertices typedef short Vertex_handle; }; @@ -567,4 +568,4 @@ BOOST_AUTO_TEST_CASE(mini_prune_above_dimension) { BOOST_CHECK(st.num_simplices() == 0); BOOST_CHECK(st.upper_bound_dimension() == -1); BOOST_CHECK(st.dimension() == -1); -} \ No newline at end of file +} diff --git a/src/Simplex_tree/test/simplex_tree_serialization_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_serialization_unit_test.cpp index a8450cfa72..4259333389 100644 --- a/src/Simplex_tree/test/simplex_tree_serialization_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_serialization_unit_test.cpp @@ -38,6 +38,8 @@ struct Low_options : Gudhi::Simplex_tree_options_full_featured { typedef std::uint8_t Vertex_handle; // Maximum number of simplices to compute persistence is 2^8 - 1 = 255. One is reserved for null_key typedef std::uint8_t Simplex_key; + + static const bool is_multi_parameter = false; }; struct Stable_options : Gudhi::Simplex_tree_options_default { From cf415883de8eb827c5c06637399d7d439e19a02a Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 21 Nov 2023 19:15:56 +0100 Subject: [PATCH 44/87] example fix --- src/Persistent_cohomology/example/plain_homology.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Persistent_cohomology/example/plain_homology.cpp b/src/Persistent_cohomology/example/plain_homology.cpp index 887dba8bba..417446e721 100644 --- a/src/Persistent_cohomology/example/plain_homology.cpp +++ b/src/Persistent_cohomology/example/plain_homology.cpp @@ -24,7 +24,7 @@ struct MyOptions : Gudhi::Simplex_tree_options_minimal { // static const bool store_filtration = false; // However the persistence algorithm needs this static const bool store_key = true; - static const is_multi_parameter = false; + static const bool is_multi_parameter = false; // I have few vertices typedef short Vertex_handle; // Maximum number of simplices to compute persistence is 2^8 - 1 = 255. One is reserved for null_key From 4ecdd3289269dda7a1af848ceb14e372926ff453 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 21 Nov 2023 19:25:04 +0100 Subject: [PATCH 45/87] fix test --- .../Finitely_critical_filtrations.h | 97 +++++++++++++------ .../test/simplex_tree_multi_unit_test.cpp | 2 +- 2 files changed, 68 insertions(+), 31 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 2877a609e8..8561f3547a 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -20,7 +20,7 @@ namespace Gudhi::multiparameter::multi_filtrations { /** \class Finitely_critical_multi_filtration Finitely_critical_multi_filtration.h gudhi/Simplex_tree/multi_filtrations/Finitely_critical_multi_filtration.h - * \brief Vector-like filtration value, for multiparameter persistence, with numpy-like methods. + * \brief Vector-like filtration value, for multiparameter persistence, with numpy-like methods. * * \ingroup multiparameter * @@ -36,19 +36,19 @@ namespace Gudhi::multiparameter::multi_filtrations { */ template class Finitely_critical_multi_filtration : public std::vector { - public: + public: Finitely_critical_multi_filtration() : std::vector(){}; Finitely_critical_multi_filtration(int n) - : std::vector(n, -std::numeric_limits::infinity()){}; // minus infinity by default + : std::vector(n, -std::numeric_limits::infinity()){}; // minus infinity by default Finitely_critical_multi_filtration(int n, T value) : std::vector(n, value){}; Finitely_critical_multi_filtration(std::initializer_list init) : std::vector(init){}; Finitely_critical_multi_filtration(const std::vector& v) : std::vector(v){}; Finitely_critical_multi_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) - : std::vector(it_begin, it_end){}; + : std::vector(it_begin, it_end){}; Finitely_critical_multi_filtration(typename std::vector::const_iterator it_begin, typename std::vector::const_iterator it_end) - : std::vector(it_begin, it_end){}; + : std::vector(it_begin, it_end){}; operator std::vector&() const { return *this; } std::vector get_vector() const { return static_cast>(*this); } @@ -65,6 +65,17 @@ class Finitely_critical_multi_filtration : public std::vector { if (this->size() != 1) return false; return std::isnan(*(this->begin())); } + inline bool is_finite() const { + if (this->size() > 1) return true; + if (this->size() == 0) return false; + auto first_value = *(this->begin()); // TODO : Maybe check all entries ? + if (std::isnan(first_value) + || first_value == - std::numeric_limits::infinity() + || first_value == std::numeric_limits::infinity()) + return false; + return true; + } + inline friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; if (b.is_inf() || a.is_minus_inf()) return true; @@ -106,18 +117,18 @@ class Finitely_critical_multi_filtration : public std::vector { std::vector& _convert_back() { return *this; } inline friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, - const Finitely_critical_multi_filtration& to_substract) { + const Finitely_critical_multi_filtration& to_substract) { std::transform(result.begin(), result.end(), to_substract.begin(), result.begin(), std::minus()); return result; } inline friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, - const Finitely_critical_multi_filtration& to_add) { + const Finitely_critical_multi_filtration& to_add) { std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::plus()); return result; } inline friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, - const T& to_substract) { + const T& to_substract) { // std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); for (auto& truc : result) { truc -= to_substract; @@ -125,13 +136,13 @@ class Finitely_critical_multi_filtration : public std::vector { return result; } inline friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, - const T& to_add) { + const T& to_add) { for (auto& truc : result) { truc += to_add; } return result; } -inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critical_multi_filtration& result, + inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critical_multi_filtration& result, const T& to_add) { for (auto& truc : result) { truc *= to_add; @@ -172,7 +183,7 @@ inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critica // template inline friend bool operator==(const Finitely_critical_multi_filtration& self, - const Finitely_critical_multi_filtration& to_compare) { + const Finitely_critical_multi_filtration& to_compare) { if (self.size() != to_compare.size()) return false; auto it = to_compare.begin(); for (auto i = 0u; i < self.size(); i++) { @@ -188,7 +199,7 @@ inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critica inline static std::vector> from_python(const std::vector>& to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); } - + /** \brief This functions take the filtration value `this` and pushes it to the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. * After calling this method, the value of this is updated to * \f$ \mathrm{this} = \min \{ y\in \mathbb R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} @@ -203,13 +214,39 @@ inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critica } if (this->size() != x.size()) { std::cerr << "Does only work with 1-critical filtrations ! Sizes " - << this->size() << " and " << x.size() - << "are different !" << std::endl; + << this->size() << " and " << x.size() + << "are different !" << std::endl; std::cerr << "This : " << *this << std::endl; std::cerr << "arg : " << x << std::endl; throw std::logic_error("Bad sizes"); } - for (unsigned int i = 0; i < x.size(); i++) this->at(i) = this->at(i) > x[i] ? this->at(i) : x[i]; + for (unsigned int i = 0; i < x.size(); i++) + this->operator[](i) = this->operator[](i) > x[i] ? this->operator[](i) : x[i]; +} + + /** \brief This functions take the filtration value `this` and pulls it to the cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. + * After calling this method, the value of this is updated to + * \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} + * @param[in] x The target filtration value on which to push `this`. + */ + inline void pull_to(const Finitely_critical_multi_filtration& x) { + if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) + return; + if (this->is_inf() || x.is_minus_inf()) { + *this = x; + return; + } + if (this->size() != x.size()) { + std::cerr << "Does only work with 1-critical filtrations ! Sizes " + << this->size() << " and " << x.size() + << "are different !" << std::endl; + std::cerr << "This : " << *this << std::endl; + std::cerr << "arg : " << x << std::endl; + throw std::logic_error("Bad sizes"); + } + for (auto i = 0u; i < x.size(); i++) + this->operator[](i) = this->operator[](i) > x[i] ? x[i] : this->operator[](i); + } // Warning, this function assumes that the comparisons checks have already been made ! inline void insert_new(Finitely_critical_multi_filtration to_concatenate) { @@ -220,7 +257,7 @@ inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critica inline T linear_projection(const std::vector& x) { T projection = 0; unsigned int size = std::min(x.size(), this->size()); - for (auto i = 0u; i < size; i++) projection += x[i] * this->at(i); + for (auto i = 0u; i < size; i++) projection += x[i] * this->operator[](i); return projection; } @@ -258,24 +295,24 @@ namespace std { template class numeric_limits> -{ -public: - static constexpr bool has_infinity = true; + { + public: + static constexpr bool has_infinity = true; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); - }; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration minus_infinity() throw(){ + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); + }; + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration minus_infinity() throw(){ return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, -std::numeric_limits::infinity()); }; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::max()); - }; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration quiet_NaN() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, numeric_limits::quiet_NaN()); - }; + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::max()); + }; + static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration quiet_NaN() throw(){ + return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, numeric_limits::quiet_NaN()); + }; -}; + }; } diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 6406130fc5..8a2daaa619 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -760,7 +760,7 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_reset_filtration) { st.insert_simplex_and_subfaces({2, 1, 0}, {3., 2.}); st.insert_simplex_and_subfaces({3, 0}, {2., 3.}); st.insert_simplex_and_subfaces({3, 4, 5}, {3., 2.}); - st.insert_simplex_and_subfaces({0, 1, 6, 7}, {4.}); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, {4.,4.}); /* Inserted simplex: */ /* 1 6 */ From 5b7e27636d0239cead3c8cb9f913bf8f5597345d Mon Sep 17 00:00:00 2001 From: DavidLapous Date: Sun, 23 Jun 2024 15:29:55 +0200 Subject: [PATCH 46/87] update --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 8 +- .../gudhi/Simplex_tree/Simplex_tree_multi.h | 276 ++--- .../Simplex_tree/multi_filtrations/Box.h | 115 +- .../Finitely_critical_filtrations.h | 987 +++++++++++++++--- .../Simplex_tree/multi_filtrations/Line.h | 248 ++++- src/Simplex_tree/test/CMakeLists.txt | 2 +- .../test/simplex_tree_multi_unit_test.cpp | 82 +- 7 files changed, 1222 insertions(+), 496 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index 136c6c6c0d..f570382193 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -410,7 +410,6 @@ class Simplex_tree { std::clog << "Simplex_tree copy constructor" << std::endl; #endif // DEBUG_TRACES copy_from(complex_source); - if constexpr (Options::is_multi_parameter) number_of_parameters_ = complex_source.number_of_parameters_; } /** \brief User-defined move constructor relocates the whole tree structure. @@ -480,6 +479,7 @@ class Simplex_tree { map_el.second.assign_children(&root_); } rec_copy(&root_, &root_source); + if constexpr (Options::is_multi_parameter) number_of_parameters_ = complex_source.number_of_parameters_; } /** \brief depth first search, inserts simplices when reaching a leaf. */ @@ -1918,7 +1918,7 @@ class Simplex_tree { Filtration_value max_filt_border_value; if constexpr (SimplexTreeOptions::is_multi_parameter) { // in that case, we assume that Filtration_value has a `push_to` member to handle this. - max_filt_border_value = Filtration_value(*number_of_parameters_); + max_filt_border_value = Filtration_value(number_of_parameters_); for (auto& face_sh : boundary) { max_filt_border_value.push_to( filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration @@ -2606,7 +2606,7 @@ class Simplex_tree { * */ int get_number_of_parameters() const { if constexpr (SimplexTreeOptions::is_multi_parameter) - return *number_of_parameters_; + return number_of_parameters_; else return 1; } @@ -2616,7 +2616,7 @@ class Simplex_tree { : std::numeric_limits::max(); /**< Default infinite value. */ private: - std::optional number_of_parameters_; /**< Number of parameters of the multi-filtrations when SimplexTreeOptions::is_multi_parameter.-*/ + int number_of_parameters_; /**< Number of parameters of the multi-filtrations when SimplexTreeOptions::is_multi_parameter.-*/ }; // Print a Simplex_tree in os. diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index a60359d74f..0fe2043dc3 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -1,6 +1,7 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. - * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): David Loiseaux, Hannah Schreiber +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which + * is released under MIT. See file LICENSE or go to + * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David + * Loiseaux, Hannah Schreiber * * Copyright (C) 2023 Inria * @@ -12,17 +13,17 @@ #include #include -#include -#include +#include namespace Gudhi::multiparameter { /** Model of SimplexTreeOptions, with a multiparameter filtration. */ +template struct Simplex_tree_options_multidimensional_filtration { - public: +public: typedef linear_indexing_tag Indexing_tag; typedef int Vertex_handle; - typedef float value_type; - using Filtration_value = multi_filtrations::Finitely_critical_multi_filtration; + using Filtration_value = Filtration; + typedef typename Filtration::value_type value_type; typedef std::uint32_t Simplex_key; static const bool store_key = true; static const bool store_filtration = true; @@ -32,220 +33,97 @@ struct Simplex_tree_options_multidimensional_filtration { static const bool is_multi_parameter = true; }; -using options_multi = Simplex_tree_options_multidimensional_filtration; -using options_std = Simplex_tree_options_full_featured; -using simplextree_std = Simplex_tree; -using simplextree_multi = Simplex_tree; - -using multi_filtration_type = std::vector; -using multi_filtration_grid = std::vector; - /** - * \brief Turns a 1-parameter simplextree into a multiparameter simplextree, + * \brief Turns a 1-parameter simplextree into a multiparameter simplextree, * and keeps the 1-filtration in the 1st axis. - * Default values can be specified. - * \ingroup multiparameter - * \tparam simplextree_std A non-multi simplextree - * \tparam simplextree_multi A multi simplextree - * \param st Simplextree to copy - * \param st_multi Multiparameter simplextree container to fill. - * \param default_values If given, this vector is assume to be of size `num_parameters-1` and - * contains the default values of axes `1` to `num_parameters`. + * Default values can be specified. + * \ingroup multiparameter + * \tparam simplextree_std A non-multi simplextree + * \tparam simplextree_multi A multi simplextree + * \param st Simplextree to copy + * \param st_multi Multiparameter simplextree container to fill. + * \param default_values If given, this vector is assume to be of size + * `num_parameters-1` and contains the default values of axes `1` to + * `num_parameters`. * */ template -void multify(simplextree_std &st, simplextree_multi &st_multi, const int num_parameters, - const typename simplextree_multi::Options::Filtration_value &default_values = {}) { +void multify(simplextree_std &st, simplextree_multi &st_multi, + const int num_parameters, + const typename simplextree_multi::Options::Filtration_value + &default_values = {}) { typename simplextree_multi::Options::Filtration_value f(num_parameters); - static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert non-multiparameter to multiparameter simplextree."); - for (auto i = 0u; - i < std::min(static_cast(default_values.size()), static_cast(num_parameters - 1)); + static_assert( + !simplextree_std::Options::is_multi_parameter && + simplextree_multi::Options::is_multi_parameter, + "Can only convert non-multiparameter to multiparameter simplextree."); + unsigned int num_default_values; + if constexpr (simplextree_multi::Options::Filtration_value:: + is_multi_critical) { + num_default_values = default_values[0].size(); + } else { + num_default_values = default_values.size(); + } + for (auto i = 0u; i < std::min(num_default_values, + static_cast(num_parameters - 1)); i++) - f[i + 1] = default_values[i]; + if constexpr (simplextree_multi::Options::Filtration_value:: + is_multi_critical) { + f[0][i + 1] = default_values[0][i]; + } else { + f[i + 1] = default_values[i]; + } + std::vector simplex; simplex.reserve(st.dimension() + 1); for (auto &simplex_handle : st.complex_simplex_range()) { simplex.clear(); - for (auto vertex : st.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); - - if (num_parameters > 0) f[0] = st.filtration(simplex_handle); + for (auto vertex : st.simplex_vertex_range(simplex_handle)) + simplex.push_back(vertex); + + if (num_parameters > 0) { + if constexpr (simplextree_multi::Options::Filtration_value:: + is_multi_critical) { + f[0][0] = st.filtration(simplex_handle); + } else { + f[0] = st.filtration(simplex_handle); + } + } st_multi.insert_simplex(simplex, f); } st_multi.set_number_of_parameters(num_parameters); } /** - * \brief Turns a multiparameter-parameter simplextree into a 1-parameter simplextree. - * \ingroup multiparameter - * \tparam simplextree_std A non-multi simplextree - * \tparam simplextree_multi A multi simplextree - * \param st Simplextree to fill. - * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. - * \param dimension The filtration parameter to put into the 1 parameter simplextree. + * \brief Turns a multiparameter-parameter simplextree into a 1-parameter + * simplextree. \ingroup multiparameter \tparam simplextree_std A non-multi + * simplextree \tparam simplextree_multi A multi simplextree \param st + * Simplextree to fill. \param st_multi Multiparameter simplextree to convert + * into a 1 parameter simplex tree. \param dimension The filtration parameter to + * put into the 1 parameter simplextree. * */ template -void flatten(simplextree_std &st, simplextree_multi &st_multi, const int dimension = 0) { - static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert multiparameter to non-multiparameter simplextree."); +void flatten(simplextree_std &st, simplextree_multi &st_multi, + const int dimension = 0) { + static_assert( + !simplextree_std::Options::is_multi_parameter && + simplextree_multi::Options::is_multi_parameter, + "Can only convert multiparameter to non-multiparameter simplextree."); for (const auto &simplex_handle : st_multi.complex_simplex_range()) { std::vector simplex; - for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); - typename simplextree_multi::Options::value_type f = - dimension >= 0 ? st_multi.filtration(simplex_handle)[dimension] : 0; - st.insert_simplex(simplex, f); - } -} - -/** - * \brief Applies a linear form (given by a scalar product, via Riesz representation) to the - * filtration values of the multiparameter simplextree to get a 1 parameter simplextree. - * \ingroup multiparameter - * \tparam simplextree_std A non-multi simplextree - * \tparam simplextree_multi A multi simplextree - * \param st Simplextree, with the same simplicial complex as st_multi, whose filtration has to be filled. - * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. - * \param linear_form the linear form to apply. - * */ -template -void linear_projection(simplextree_std &st, simplextree_multi &st_multi, - const std::vector &linear_form) { - static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert multiparameter to non-multiparameter simplextree."); - auto sh = st.complex_simplex_range().begin(); - auto sh_multi = st_multi.complex_simplex_range().begin(); - auto end = st.complex_simplex_range().end(); - typename simplextree_multi::Options::Filtration_value multi_filtration; - for (; sh != end; ++sh, ++sh_multi) { - multi_filtration = st_multi.filtration(*sh_multi); - auto projected_filtration = multi_filtration.linear_projection(linear_form); - st.assign_filtration(*sh, projected_filtration); - } -} - -/** - * \brief Pushes the filtration values of a multiparameter simplextree to a diagonal line, to get a 1 parameter - * simplextree. - * \ingroup multiparameter - * \tparam simplextree_std A non-multi simplextree - * \tparam simplextree_multi A multiparameter simplextree - * \param st Simplextree to fill. - * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. - * \param basepoint The basepoint of the diagonal line. - * \param dimension The coordinate of the line to choose as a 1 parameter filtration (they are all equivalent). - * */ -template -void flatten_diag(simplextree_std &st, simplextree_multi &st_multi, - const std::vector basepoint, int dimension) { - static_assert(!simplextree_std::Options::is_multi_parameter && simplextree_multi::Options::is_multi_parameter, "Can only convert multiparameter to non-multiparameter simplextree."); - assert(dimension>=0); - multi_filtrations::Line l(basepoint); - for (const auto &simplex_handle : st_multi.complex_simplex_range()) { - std::vector simplex; - for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) simplex.push_back(vertex); - - std::vector f = st_multi.filtration(simplex_handle); - typename simplextree_multi::Options::value_type new_filtration = l.push_forward(f)[dimension]; - st.insert_simplex(simplex, new_filtration); - } -} - -/** - * \brief Given a point on a multiparameter discrete grid, pushes the point onto this grid. - * Turns the input point as the closest grid point, as coordinates in this grid. - * \ingroup multiparameter - * \tparam vector_like Vector like class - * \param x The point to push on the grid. - * \param grid The multiparameter grid. A vector of size `num_parameters`, whose elements are the elements of the grid - * for this axis. - * */ -template -inline void find_coordinates(vector_like &x, const multi_filtration_grid &grid) { - // TODO: optimize with, e.g., dichotomy - - for (auto parameter = 0u; parameter < grid.size(); parameter++) { - const auto &filtration = grid[parameter]; // assumes its sorted - const auto to_project = x[parameter]; - if constexpr (std::numeric_limits::has_infinity) - if (to_project == std::numeric_limits::infinity()) { - x[parameter] = std::numeric_limits::infinity(); - continue; - } - if (to_project >= filtration.back()) { - x[parameter] = filtration.size() - 1; - continue; - } // deals with infinite value at the end of the grid - - unsigned int i = 0; - while (to_project > filtration[i] && i < filtration.size()) { - i++; - } - if (i == 0) - x[parameter] = 0; - else if (i < filtration.size()) { - typename vector_like::value_type d1, d2; - d1 = std::abs(filtration[i - 1] - to_project); - d2 = std::abs(filtration[i] - to_project); - x[parameter] = d1 < d2 ? i - 1 : i; - } - } -} - -/** - * \brief Pushes all of the filtration values of a simplextree onto a grid, c.f. \ref find_coordinates. - * \ingroup multiparameter - * \param st_multi Multiparameter simplex tree to squeeze on the grid. - * \param grid The multiparameter grid. A vector of size `num_parameters`, - * whose elements are the elements of the grid for this axis. - * \param coordinate_values If set to true the filtration values will be turned into coordinates in this grid - * instead of points in this grid. - * */ -template -void squeeze_filtration(simplextree_multi& st_multi, const multi_filtration_grid &grid, bool coordinate_values = true) { - static_assert(simplextree_multi::Options::is_multi_parameter, "Only works for multiparameter simplextrees."); - auto num_parameters = static_cast(st_multi.get_number_of_parameters()); - if (grid.size() != num_parameters) { - throw std::invalid_argument("Grid and simplextree do not agree on number of parameters."); - } - for (const auto &simplex_handle : st_multi.complex_simplex_range()) { - auto &simplex_filtration = st_multi.filtration_mutable(simplex_handle); - find_coordinates(simplex_filtration,grid); // turns the simplexfiltration into coords in the grid - if (!coordinate_values) { - for (auto parameter = 0u; parameter < num_parameters; parameter++) - simplex_filtration[parameter] = grid[parameter][simplex_filtration[parameter]]; + typename simplextree_multi::Options::value_type f; + for (auto vertex : st_multi.simplex_vertex_range(simplex_handle)) + simplex.push_back(vertex); + if constexpr (simplextree_multi::Filtration_value::is_multi_critical) { + f = dimension >= 0 ? st_multi.filtration(simplex_handle)[0][dimension] + : 0; + } else { + f = dimension >= 0 ? st_multi.filtration(simplex_handle)[dimension] : 0; } + st.insert_simplex(simplex, f); } - return; } -// retrieves the filtration values of a simplextree. Useful to generate a grid. -/** - * \brief Retrieves all of the filtration values, for each simplex dimension, of the simplextree. - * Useful to generate grids. - * \ingroup multiparameter - * \param st_multi Simplextree on which filtration values are exctracted. - * \param degrees Only the simpleces of these dimension will be taken into account. Useful for, e.g., Rips - * filtrations. - * */ -template -std::vector get_filtration_values(simplextree_multi& st_multi, const std::vector °rees) { - static_assert(simplextree_multi::Options::is_multi_parameter, "Only works for multiparameter simplextrees."); - int num_parameters = st_multi.get_number_of_parameters(); - std::vector out(degrees.size(), multi_filtration_grid(num_parameters)); - std::vector degree_index(degrees.size()); - int count = 0; - for (auto degree : degrees) { - degree_index[degree] = count++; - out[degree_index[degree]].reserve(st_multi.num_simplices()); - } - - for (const auto &simplex_handle : st_multi.complex_simplex_range()) { - const auto filtration = st_multi.filtration(simplex_handle); - const auto degree = st_multi.dimension(simplex_handle); - if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end()) continue; - for (int parameter = 0; parameter < num_parameters; parameter++) { - out[degree_index[degree]][parameter].push_back(filtration[parameter]); - } - } - return out; -} -} // namespace Gudhi::multiparameter +} // namespace Gudhi::multiparameter -#endif // SIMPLEX_TREE_MULTI_H_ +#endif // SIMPLEX_TREE_MULTI_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h index 9307bd21ed..89aa44d2a7 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h @@ -1,6 +1,7 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. - * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): David Loiseaux +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which + * is released under MIT. See file LICENSE or go to + * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David + * Loiseaux * * Copyright (C) 2023 Inria * @@ -16,11 +17,9 @@ #ifndef BOX_H_INCLUDED #define BOX_H_INCLUDED -#include +#include #include -#include -#include -#include +#include #include "Finitely_critical_filtrations.h" @@ -30,52 +29,64 @@ namespace Gudhi::multiparameter::multi_filtrations { -template -class Box { - using point_type = Finitely_critical_multi_filtration; +template class Box { + using point_type = One_critical_filtration; - public: +public: Box(); Box(T a, T b, T c, T d) : bottomCorner_({a, b}), upperCorner_({c, d}){}; - Box(const point_type& bottomCorner, const point_type& upperCorner); - Box(const std::pair& box); + Box(const point_type &bottomCorner, const point_type &upperCorner); + Box(const std::pair &box); void inflate(T delta); - const point_type& get_bottom_corner() const; - const point_type& get_upper_corner() const; - point_type& get_bottom_corner(); - point_type& get_upper_corner(); - bool contains(const point_type& point) const; - void infer_from_filters(const std::vector& Filters_list); + const point_type &get_bottom_corner() const; + const point_type &get_upper_corner() const; + point_type &get_bottom_corner(); + point_type &get_upper_corner(); + inline void threshold_up(point_type &x) const; + inline void threshold_down(point_type &x) const; + bool contains(const point_type &point) const; + void infer_from_filters(const std::vector &Filters_list); bool is_trivial() const; - std::pair get_pair() const { return {bottomCorner_, upperCorner_}; } - std::pair get_pair() { return {bottomCorner_, upperCorner_}; } + std::pair get_pair() const { + return {bottomCorner_, upperCorner_}; + } + std::pair get_pair() { + return {bottomCorner_, upperCorner_}; + } + std::size_t dimension() const { return bottomCorner_.size(); } - private: +private: point_type bottomCorner_; point_type upperCorner_; }; -template -inline Box::Box() {} +template inline Box::Box() {} template -inline Box::Box(const point_type& bottomCorner, const point_type& upperCorner) +inline Box::Box(const point_type &bottomCorner, + const point_type &upperCorner) : bottomCorner_(bottomCorner), upperCorner_(upperCorner) { - assert(bottomCorner.size() == upperCorner.size() && bottomCorner <= upperCorner && "This box is trivial !"); + GUDHI_CHECK(bottomCorner.size() == upperCorner.size() && + bottomCorner <= upperCorner, + "This box is trivial !"); } template -inline Box::Box(const std::pair& box) : bottomCorner_(box.first), upperCorner_(box.second) {} +inline Box::Box(const std::pair &box) + : bottomCorner_(box.first), upperCorner_(box.second) {} -template -inline void Box::inflate(T delta) { +template inline void Box::inflate(T delta) { bottomCorner_ -= delta; upperCorner_ += delta; } +/** + * Define a box containing the filtration values. + */ template -inline void Box::infer_from_filters(const std::vector& Filters_list) { +inline void +Box::infer_from_filters(const std::vector &Filters_list) { int dimension = Filters_list.size(); int nsplx = Filters_list[0].size(); std::vector lower(dimension); @@ -93,40 +104,43 @@ inline void Box::infer_from_filters(const std::vector& Filters_li bottomCorner_.swap(lower); upperCorner_.swap(upper); } -template -inline bool Box::is_trivial() const { - return bottomCorner_.empty() || upperCorner_.empty() || bottomCorner_.size() != upperCorner_.size(); +template inline bool Box::is_trivial() const { + return bottomCorner_.empty() || upperCorner_.empty() || + bottomCorner_.size() != upperCorner_.size(); } template -inline const typename Box::point_type& Box::get_bottom_corner() const { +inline const typename Box::point_type &Box::get_bottom_corner() const { return bottomCorner_; } template -inline const typename Box::point_type& Box::get_upper_corner() const { +inline const typename Box::point_type &Box::get_upper_corner() const { return upperCorner_; } template -inline typename Box::point_type& Box::get_bottom_corner() { +inline typename Box::point_type &Box::get_bottom_corner() { return bottomCorner_; } template -inline typename Box::point_type& Box::get_upper_corner() { +inline typename Box::point_type &Box::get_upper_corner() { return upperCorner_; } template -inline bool Box::contains(const point_type& point) const { - if (point.size() != bottomCorner_.size()) return false; +inline bool Box::contains(const point_type &point) const { + if (point.size() != bottomCorner_.size()) { + std::cerr << "Box and point are not of the same size." << std::endl; + return false; + } return bottomCorner_ <= point && point <= upperCorner_; } template -std::ostream& operator<<(std::ostream& os, const Box& box) { +std::ostream &operator<<(std::ostream &os, const Box &box) { os << "Box -- Bottom corner : "; os << box.get_bottom_corner(); os << ", Top corner : "; @@ -134,6 +148,23 @@ std::ostream& operator<<(std::ostream& os, const Box& box) { return os; } -} // namespace Gudhi::multiparameter::multi_filtrations +template inline void Box::threshold_up(point_type &x) const { + for (auto i = 0u; i < x.size(); i++) { + auto t = upperCorner_[i]; + if (x[i] > t) + x[i] = t; + } + return; +} +template inline void Box::threshold_down(point_type &x) const { + for (auto i = 0u; i < x.size(); i++) { + auto t = bottomCorner_[i]; + if (x[i] < t) + x[i] = t; + } + return; +} + +} // namespace Gudhi::multiparameter::multi_filtrations -#endif // BOX_H_INCLUDED +#endif // BOX_H_INCLUDED diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 8561f3547a..df5c8bfdfc 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -1,6 +1,7 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. - * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): David Loiseaux +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which + * is released under MIT. See file LICENSE or go to + * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David + * * Copyright (C) 2023 Inria * @@ -11,258 +12,415 @@ #ifndef FINITELY_CRITICAL_FILTRATIONS_H_ #define FINITELY_CRITICAL_FILTRATIONS_H_ -#include #include +#include +#include +#include +#include +#include #include #include -#include namespace Gudhi::multiparameter::multi_filtrations { -/** \class Finitely_critical_multi_filtration Finitely_critical_multi_filtration.h gudhi/Simplex_tree/multi_filtrations/Finitely_critical_multi_filtration.h - * \brief Vector-like filtration value, for multiparameter persistence, with numpy-like methods. +/** \class Finitely_critical_multi_filtration + * Finitely_critical_multi_filtration.h + * gudhi/Simplex_tree/multi_filtrations/Finitely_critical_multi_filtration.h + * \brief Vector-like filtration value, for multiparameter persistence, with + * numpy-like methods. * * \ingroup multiparameter * * \details Child of `std::vector` that has numpy-like pointwise operators. - * One critical simplicial filtrations are filtrations such that the lifetime each simplex is a positive cone, e.g. - * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \f$ is valid, while - * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{x \in \mathbb R^2 : x>=(2,1)\} \f$ is not- - * Finitely critical filtrations are filtrations such that the lifetime of each simplex is a union of such cones, e.g., - * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{ x \in \mathbb R^2 : x>=(2,1)\} \f$ is finitely critical, and more particularly 2-critical, while - * - \f$ \{ x \in \mathbb R^2 : x>= \mathrm{epigraph}(y\mapsto e^{-y})\} \f$ is not. - * Non 1-critical filtrations are not supported yet. - * \tparam T value type of the vector-like. + * One critical simplicial filtrations are filtrations such that the lifetime + * each simplex is a positive cone, e.g. + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \f$ is valid, while + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{x \in \mathbb R^2 : + * x>=(2,1)\} \f$ is not- Finitely critical filtrations are filtrations such + * that the lifetime of each simplex is a union of such cones, e.g., + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{ x \in \mathbb R^2 : + * x>=(2,1)\} \f$ is finitely critical, and more particularly 2-critical, while + * - \f$ \{ x \in \mathbb R^2 : x>= \mathrm{epigraph}(y\mapsto e^{-y})\} \f$ + * is not. Non 1-critical filtrations are not supported yet. \tparam T value + * type of the vector-like. */ -template -class Finitely_critical_multi_filtration : public std::vector { - public: - Finitely_critical_multi_filtration() : std::vector(){}; - Finitely_critical_multi_filtration(int n) - : std::vector(n, -std::numeric_limits::infinity()){}; // minus infinity by default - Finitely_critical_multi_filtration(int n, T value) : std::vector(n, value){}; - Finitely_critical_multi_filtration(std::initializer_list init) : std::vector(init){}; - Finitely_critical_multi_filtration(const std::vector& v) : std::vector(v){}; - Finitely_critical_multi_filtration(typename std::vector::iterator it_begin, +template +class One_critical_filtration : public std::vector { +public: + One_critical_filtration() : std::vector(){}; + One_critical_filtration(int n) + : std::vector(n, -T_inf){}; // minus infinity by default + One_critical_filtration(int n, T value) + : std::vector(n, value){}; + One_critical_filtration(std::initializer_list init) + : std::vector(init){}; + One_critical_filtration(const std::vector &v) + : std::vector(v){}; + One_critical_filtration(std::vector &&v) + : std::vector(std::move(v)){}; + One_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) - : std::vector(it_begin, it_end){}; - Finitely_critical_multi_filtration(typename std::vector::const_iterator it_begin, - typename std::vector::const_iterator it_end) - : std::vector(it_begin, it_end){}; + : std::vector(it_begin, it_end){}; + One_critical_filtration( + typename std::vector::const_iterator it_begin, + typename std::vector::const_iterator it_end) + : std::vector(it_begin, it_end){}; + + using std::vector::operator[]; + using value_type = T; + using OneCritical = One_critical_filtration; + template + using Base = One_critical_filtration; + operator std::vector &() const { return *this; } + std::vector get_vector() const { + return static_cast>(*this); + } + std::size_t num_parameters() const { return this->size(); } + // TODO : REMOVE SIZE ( confusing when kcritical) + // static std::size_t num_generators() {return 1;} + + operator std::vector() const { return static_cast>(*this); } - operator std::vector&() const { return *this; } - std::vector get_vector() const { return static_cast>(*this); } + inline const std::vector & as_vector() const { return *this; } inline bool is_inf() const { - if (this->size() != 1) return false; - return *(this->begin()) == std::numeric_limits::infinity(); + if (this->size() != 1) + return false; + return (this->operator[](0) == T_inf); } inline bool is_minus_inf() const { - if (this->size() != 1) return false; - return *(this->begin()) == - std::numeric_limits::infinity(); + if constexpr (std::is_same::value) { + return false; // suppresses a warning + } else { + if (this->size() != 1) + return false; + return (this->operator[](0) == -T_inf); + } } inline bool is_nan() const { - if (this->size() != 1) return false; + if (this->size() != 1) + return false; return std::isnan(*(this->begin())); } inline bool is_finite() const { - if (this->size() > 1) return true; - if (this->size() == 0) return false; + if (this->size() > 1) + return true; + if (this->size() == 0) + return false; auto first_value = *(this->begin()); // TODO : Maybe check all entries ? - if (std::isnan(first_value) - || first_value == - std::numeric_limits::infinity() - || first_value == std::numeric_limits::infinity()) - return false; + if (std::isnan(first_value) || first_value == -T_inf || + first_value == T_inf) + return false; return true; } - inline friend bool operator<(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { - if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; - if (b.is_inf() || a.is_minus_inf()) return true; + inline friend bool operator<(const One_critical_filtration &a, + const One_critical_filtration &b) { + if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) + return false; + if (b.is_inf() || a.is_minus_inf()) + return true; bool isSame = true; auto n = a.size(); assert(a.size() == b.size()); for (auto i = 0u; i < n; ++i) { - if (a[i] > b[i]) return false; - if (isSame && a[i] != b[i]) isSame = false; + if (a[i] > b[i]) + return false; + if (isSame && a[i] != b[i]) + isSame = false; } - if (isSame) return false; + if (isSame) + return false; return true; } - inline friend bool operator<=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { - if (a.is_nan() || b.is_nan()) return false; - if (b.is_inf() || a.is_minus_inf()) return true; - if (a.is_inf() || b.is_minus_inf()) return false; + inline friend bool operator<=(const One_critical_filtration &a, + const One_critical_filtration &b) { + if (a.is_nan() || b.is_nan()) + return false; + if (b.is_inf() || a.is_minus_inf()) + return true; + if (a.is_inf() || b.is_minus_inf()) + return false; auto n = a.size(); assert(a.size() == b.size()); - for (auto i = 0u; i < n; ++i) { - if (a[i] > b[i]) return false; + for (std::size_t i = 0u; i < n; ++i) { + if (a[i] > b[i]) + return false; } return true; } // GREATER THAN OPERATORS - inline friend bool operator>(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + inline friend bool operator>(const One_critical_filtration &a, + const One_critical_filtration &b) { return b < a; } - inline friend bool operator>=(const Finitely_critical_multi_filtration& a, const Finitely_critical_multi_filtration& b) { + inline friend bool operator>=(const One_critical_filtration &a, + const One_critical_filtration &b) { return b <= a; } - inline Finitely_critical_multi_filtration& operator=(const Finitely_critical_multi_filtration& a) { + inline One_critical_filtration & + operator=(const One_critical_filtration &a) { std::vector::operator=(a); return *this; } + inline One_critical_filtration& operator-() { + for (auto& truc : *this) { + truc = -truc; + } + } + inline One_critical_filtration copy() const { return *this; } + + std::vector &_convert_back() { return *this; } + constexpr static One_critical_filtration inf() { + return {T_inf}; + } + constexpr static One_critical_filtration minus_inf() { + return {-T_inf}; + } + constexpr static One_critical_filtration nan() { + return {std::numeric_limits::quiet_NaN()}; + } + + // operators *= + inline friend One_critical_filtration & + operator-=(One_critical_filtration &result, + const One_critical_filtration &to_substract) { + if (result.is_nan() || to_substract.is_nan() || + (result.is_inf() && to_substract.is_inf()) || + (result.is_minus_inf() && to_substract.is_minus_inf())) [[unlikely]] { + result = std::numeric_limits::quiet_NaN(); + return result; + } + if (result.is_inf() || to_substract.is_minus_inf()) [[unlikely]] { + result = inf(); + return result; + } + if (result.is_minus_inf() || to_substract.is_inf()) [[unlikely]] { + result = minus_inf(); + return result; + } + std::transform(result.begin(), result.end(), to_substract.begin(), + result.begin(), std::minus()); + return result; + } + inline friend One_critical_filtration & + operator+=(One_critical_filtration &result, + const One_critical_filtration &to_add) { - std::vector& _convert_back() { return *this; } + if (result.is_nan() || to_add.is_nan() || + (result.is_inf() && to_add.is_minus_inf()) || + (result.is_minus_inf() && to_add.is_inf())) [[unlikely]] { + result = nan(); + return result; + } + if (result.is_inf() || to_add.is_inf()) [[unlikely]] { + result = inf(); + return result; + } + if (result.is_minus_inf() || to_add.is_minus_inf()) [[unlikely]] { + result = minus_inf(); + return result; + } - inline friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, - const Finitely_critical_multi_filtration& to_substract) { - std::transform(result.begin(), result.end(), to_substract.begin(), result.begin(), std::minus()); + std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), + std::plus()); return result; } - inline friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, - const Finitely_critical_multi_filtration& to_add) { - std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::plus()); + inline friend One_critical_filtration & + operator*=(One_critical_filtration &result, + const One_critical_filtration &to_add) { + + assert(result.is_finite() || to_add.is_finite()); + std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), + std::multiplies()); return result; } - inline friend Finitely_critical_multi_filtration& operator-=(Finitely_critical_multi_filtration& result, - const T& to_substract) { - // std::transform(result.begin(), result.end(), to_substract.begin(),result.begin(), std::minus()); - for (auto& truc : result) { + inline friend One_critical_filtration & + operator-=(One_critical_filtration &result, + const T &to_substract) { + for (auto &truc : result) { truc -= to_substract; } return result; } - inline friend Finitely_critical_multi_filtration& operator+=(Finitely_critical_multi_filtration& result, - const T& to_add) { - for (auto& truc : result) { + inline friend One_critical_filtration & + operator+=(One_critical_filtration &result, const T &to_add) { + for (auto &truc : result) { truc += to_add; } return result; } - inline friend Finitely_critical_multi_filtration& operator*=(Finitely_critical_multi_filtration& result, - const T& to_add) { - for (auto& truc : result) { + inline friend One_critical_filtration & + operator*=(One_critical_filtration &result, const T &to_add) { + if (to_add == T_inf || to_add == -T_inf) [[unlikely]] { + for (auto &truc : result) { + if (truc > 0) + truc = to_add; + else if (truc < 0) + truc = -to_add; + // 0*inf = 0 + } + return result; + } + for (auto &truc : result) { truc *= to_add; } return result; } - inline friend Finitely_critical_multi_filtration& operator/=(Finitely_critical_multi_filtration& result, - const T& to_add) { - for (auto& truc : result) { + inline friend One_critical_filtration & + operator/=(One_critical_filtration &result, const T &to_add) { + for (auto &truc : result) { truc /= to_add; } return result; } - inline friend Finitely_critical_multi_filtration operator-(Finitely_critical_multi_filtration result, - const T& to_add) { - for (auto& truc : result) { - truc -= static_cast(to_add); - } + + /// OPERATORS * + inline friend One_critical_filtration + operator+(One_critical_filtration result, const T &to_add) { + result += to_add; return result; } - inline friend Finitely_critical_multi_filtration operator-(const T& to_add, - const Finitely_critical_multi_filtration& result - ) { - return result - to_add; + + inline friend One_critical_filtration + operator+(One_critical_filtration result, + const One_critical_filtration &to_add) { + result += to_add; + return result; } - inline friend Finitely_critical_multi_filtration operator*(Finitely_critical_multi_filtration result, - const T& to_add) { - for (auto& truc : result) { - truc *= static_cast(to_add); - } + inline friend One_critical_filtration + operator-(One_critical_filtration result, + const One_critical_filtration &to_add) { + result -= to_add; return result; } - inline friend Finitely_critical_multi_filtration operator*(const T& to_add, - const Finitely_critical_multi_filtration& result - ) { - return result - to_add; + inline friend One_critical_filtration + operator-(One_critical_filtration result, const T &to_add) { + result -= to_add; + return result; + } + inline friend One_critical_filtration + operator*(One_critical_filtration result, const T &to_add) { + result *= to_add; + return result; + } + + inline friend One_critical_filtration + operator+(const T &to_add, + const One_critical_filtration &result) { + return result + to_add; + } + inline friend One_critical_filtration + operator-(const T &to_add, + const One_critical_filtration &result) { + return result - to_add; + } + inline friend One_critical_filtration + operator*(const T &to_add, + const One_critical_filtration &result) { + return result * to_add; } // template - inline friend bool operator==(const Finitely_critical_multi_filtration& self, - const Finitely_critical_multi_filtration& to_compare) { - if (self.size() != to_compare.size()) return false; + inline friend bool + operator==(const One_critical_filtration &self, + const One_critical_filtration &to_compare) { + if (self.num_parameters() != to_compare.num_parameters()) + return false; auto it = to_compare.begin(); - for (auto i = 0u; i < self.size(); i++) { - if (self.at(i) != *(it++)) return false; + for (auto i = 0u; i < self.num_parameters(); i++) { + if (self.at(i) != *(it++)) + return false; } return true; } - inline static std::vector> to_python(const std::vector>& to_convert) { + inline static std::vector> to_python( + const std::vector> &to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); } - inline static std::vector> from_python(const std::vector>& to_convert) { - return std::vector>(to_convert.begin(), to_convert.end()); + inline static std::vector> + from_python(const std::vector> &to_convert) { + return std::vector>( + to_convert.begin(), to_convert.end()); } - /** \brief This functions take the filtration value `this` and pushes it to the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. - * After calling this method, the value of this is updated to - * \f$ \mathrm{this} = \min \{ y\in \mathbb R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} + /** \brief This functions take the filtration value `this` and pushes it to + * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, + * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb + * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} * @param[in] x The target filtration value on which to push `this`. */ - inline void push_to(const Finitely_critical_multi_filtration& x) { - if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) + inline void push_to(const One_critical_filtration &x) { + if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; if (x.is_inf() || this->is_minus_inf()) { *this = x; return; } - if (this->size() != x.size()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " - << this->size() << " and " << x.size() - << "are different !" << std::endl; + if (this->num_parameters() != x.num_parameters()) { + std::cerr << "Does only work with 1-critical filtrations ! Sizes " + << this->num_parameters() << " and " << x.num_parameters() << "are different !" + << std::endl; std::cerr << "This : " << *this << std::endl; std::cerr << "arg : " << x << std::endl; throw std::logic_error("Bad sizes"); } - for (unsigned int i = 0; i < x.size(); i++) - this->operator[](i) = this->operator[](i) > x[i] ? this->operator[](i) : x[i]; -} + for (std::size_t i = 0; i < x.num_parameters(); i++) + this->operator[](i) = + this->operator[](i) > x[i] ? this->operator[](i) : x[i]; + } - /** \brief This functions take the filtration value `this` and pulls it to the cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. - * After calling this method, the value of this is updated to - * \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} + /** \brief This functions take the filtration value `this` and pulls it to the + * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the + * value of this is updated to \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : + * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} * @param[in] x The target filtration value on which to push `this`. */ - inline void pull_to(const Finitely_critical_multi_filtration& x) { - if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) + inline void pull_to(const One_critical_filtration &x) { + if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; if (this->is_inf() || x.is_minus_inf()) { *this = x; return; } - if (this->size() != x.size()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " - << this->size() << " and " << x.size() - << "are different !" << std::endl; + if (this->num_parameters() != x.num_parameters()) { + std::cerr << "Does only work with 1-critical filtrations ! Sizes " + << this->num_parameters() << " and " << x.num_parameters() << "are different !" + << std::endl; std::cerr << "This : " << *this << std::endl; std::cerr << "arg : " << x << std::endl; throw std::logic_error("Bad sizes"); } - for (auto i = 0u; i < x.size(); i++) - this->operator[](i) = this->operator[](i) > x[i] ? x[i] : this->operator[](i); - + for (std::size_t i = 0u; i < x.num_parameters(); i++) + this->operator[](i) = + this->operator[](i) > x[i] ? x[i] : this->operator[](i); } - // Warning, this function assumes that the comparisons checks have already been made ! - inline void insert_new(Finitely_critical_multi_filtration to_concatenate) { - this->insert(this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end())); + // Warning, this function assumes that the comparisons checks have already + // been made ! + inline void insert_new(One_critical_filtration to_concatenate) { + this->insert(this->end(), std::move_iterator(to_concatenate.begin()), + std::move_iterator(to_concatenate.end())); } // scalar product of a filtration value with x. - inline T linear_projection(const std::vector& x) { - T projection = 0; - unsigned int size = std::min(x.size(), this->size()); - for (auto i = 0u; i < size; i++) projection += x[i] * this->operator[](i); + template + inline U linear_projection(const std::vector &x) { + U projection = 0; + std::size_t size = std::min(x.size(), this->size()); + for (std::size_t i = 0u; i < size; i++) + projection += x[i] * static_cast(this->operator[](i)); return projection; } // easy debug - inline friend std::ostream& operator<<(std::ostream& stream, const Finitely_critical_multi_filtration& truc) { + inline friend std::ostream & + operator<<(std::ostream &stream, + const One_critical_filtration &truc) { if (truc.is_inf()) { stream << "[inf, ..., inf]"; return stream; @@ -280,43 +438,552 @@ class Finitely_critical_multi_filtration : public std::vector { return stream; } stream << "["; - for (unsigned int i = 0; i < truc.size() - 1; i++) { + for (std::size_t i = 0; i < truc.size() - 1; i++) { stream << truc[i] << ", "; } - if (!truc.empty()) stream << truc.back(); + if (!truc.empty()) + stream << truc.back(); stream << "]"; return stream; } -}; + inline T norm() const { + T out = 0; + for (auto &stuff : *this) + out += std::pow(stuff, 2); + return sqrt(out); + } + inline T distance(const One_critical_filtration &other) const { + T out = 0; + for (std::size_t i = 0u; i < other.size(); i++) { + out += std::pow((*this)[i] - other[i], 2); + } + return sqrt(out); + } + template + inline One_critical_filtration + coordinates_in_grid(const std::vector>& grid) const { + One_critical_filtration coords(this->size()); + assert(grid.size() >= this->size()); + // U grid_inf = std::numeric_limits::has_infinity + // ? std::numeric_limits::infinity() + // : std::numeric_limits::max(); + for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { + const auto &filtration = grid[parameter]; + auto C = std::distance( + filtration.begin(), + std::lower_bound(filtration.begin(), filtration.end(), + static_cast(this->operator[](parameter)))); + coords[parameter] = static_cast(C); + } + return coords; + } + template + inline One_critical_filtration + evaluate_in_grid(const std::vector>& grid) const { + One_critical_filtration pushed_value(this->size()); + assert(grid.size() == this->size()); + U grid_inf = std::numeric_limits::has_infinity + ? std::numeric_limits::infinity() + : std::numeric_limits::max(); + for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { + const auto &filtration = grid[parameter]; + const auto& c = this->operator[](parameter); + pushed_value[parameter] = c == T_inf ? grid_inf : filtration[c]; + } + return pushed_value; + } -} // namespace Gudhi::multiparameter::multi_filtrations + template + inline void coordinates_in_grid_inplace(const std::vector& grid, + bool coordinate = true) { + One_critical_filtration coords(this->size()); + assert(grid.size() >= this->size()); + for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { + const auto &filtration = grid[parameter]; + auto d = + std::distance(filtration.begin(), + std::lower_bound(filtration.begin(), filtration.end(), + this->operator[](parameter))); + this->operator[](parameter) = + coordinate ? static_cast(d) : static_cast(grid[parameter][d]); + ; + } + } + template inline One_critical_filtration astype() const { + One_critical_filtration out(this->size()); + for (std::size_t i = 0u; i < this->size(); i++) + out[i] = static_cast(this->operator[](i)); + return out; + } -namespace std { +public: + // TODO : maybe add the {inf}, minus inf, nan there as static members? this + // would make comparisons faster (just compare the ptr) + // TODO : I'm not sure why constexpr doens't work anymore + constexpr static const T T_inf = std::numeric_limits::has_infinity + ? std::numeric_limits::infinity() + : std::numeric_limits::max(); + + // for compiler + constexpr static bool is_multi_critical = false; +}; -template -class numeric_limits> +template class Multi_critical_filtration { +public: + using value_type = T; + using OneCritical = One_critical_filtration; + template + using Base = Multi_critical_filtration; + std::size_t num_parameters() const { return multi_filtration_.size() == 0 ? 0 : multi_filtration_[0].size(); } + Multi_critical_filtration() : multi_filtration_(1) { - public: - static constexpr bool has_infinity = true; - - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration infinity() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::infinity()); - }; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration minus_infinity() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, -std::numeric_limits::infinity()); - }; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration max() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, std::numeric_limits::max()); - }; - static Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration quiet_NaN() throw(){ - return Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration(1, numeric_limits::quiet_NaN()); - }; + multi_filtration_[0] = co ? One_critical_filtration::inf() : One_critical_filtration::minus_inf(); + }; // initialize at 1, with 0 parameter (consistent with below) + Multi_critical_filtration(int n) + : multi_filtration_({One_critical_filtration( + n)}){}; // minus infinity by default + Multi_critical_filtration(int n, T value) + : multi_filtration_({One_critical_filtration( + n, value)}){}; // std::vector(n, value){}; + Multi_critical_filtration(std::initializer_list init) + : multi_filtration_({One_critical_filtration( + init)}){}; // : std::vector({std::vector(init)}; + Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}){}; + Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}){}; + Multi_critical_filtration(const std::vector> &v) : multi_filtration_(v){}; + Multi_critical_filtration(std::vector> &&v) : multi_filtration_(std::move(v)){}; + Multi_critical_filtration(typename std::vector::iterator it_begin, + typename std::vector::iterator it_end) + : multi_filtration_( + {One_critical_filtration(it_begin, it_end)}){}; + Multi_critical_filtration(typename std::vector::const_iterator it_begin, + typename std::vector::const_iterator it_end) + : multi_filtration_({One_critical_filtration( + it_begin, it_end)}){}; // : std::vector(it_begin, it_end){}; + Multi_critical_filtration(const Multi_critical_filtration &other) + : multi_filtration_(other.multi_filtration_){}; - }; + Multi_critical_filtration &operator=(const Multi_critical_filtration &other) { + this->multi_filtration_ = other.multi_filtration_; + return *this; + } + inline friend bool + operator==(const Multi_critical_filtration &self, + const Multi_critical_filtration &to_compare) { + if (self.num_generators() != to_compare.num_generators()) + return false; + auto it = to_compare.begin(); + for (auto i = 0u; i < self.num_generators(); i++) { + if (self[i] != *(it++)) + return false; + } + return true; + } + void reserve(std::size_t n) { this->multi_filtration_.reserve(n); } + void set_num_generators(std::size_t n) {this->multi_filtration_.resize(n);} + + inline bool is_inf() const { + return this->multi_filtration_.size() == 1 && + this->multi_filtration_[0].is_inf(); + } + inline bool is_minus_inf() const { + return this->multi_filtration_.size() == 1 && + this->multi_filtration_[0].is_minus_inf(); + } + inline bool is_nan() const { + return this->multi_filtration_.size() == 1 && + this->multi_filtration_[0].is_nan(); + } + inline bool is_finite() const { + if (this->empty()) + return false; + for (auto &stuff : *this) { + if (!stuff.is_finite()) + return false; + } + return true; + } + + operator OneCritical() const { + assert(this->num_generators() == 1); + return this->multi_filtration_[0]; + } + + OneCritical &operator[](std::size_t i) { return this->multi_filtration_[i]; } + inline OneCritical factorize_below() const { + if (this->num_generators() == 0) [[unlikely]] + return OneCritical(); + OneCritical result(multi_filtration_[0].num_parameters(), OneCritical::T_inf); + for (const auto &stuff : this->multi_filtration_) { + if (stuff.is_nan() || stuff.is_minus_inf()) + return stuff; + if (stuff.is_inf()) + continue; + for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { + result[i] = std::min(result[i], stuff[i]); + } + } + return result; + } + + inline OneCritical factorize_above() const { + if (this->num_generators() == 0) [[unlikely]] + return OneCritical(); + OneCritical result(multi_filtration_[0].num_parameters(), -OneCritical::T_inf); + for (auto &stuff : this->multi_filtration_) { + if (stuff.is_nan() || stuff.is_inf()) + return stuff; + if (stuff.is_minus_inf()) + continue; + for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { + result[i] = std::max(result[i], stuff[i]); + } + } + return result; + } + /** \brief This functions take the filtration value `this` and pushes it to + * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, + * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb + * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} + * @param[in] x The target filtration value on which to push `this`. + */ + inline void push_to(const One_critical_filtration &x) { + if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) + return; + if (x.is_inf() || this->is_minus_inf()) { + *this = x; + return; + } + for (auto &stuff : *this) { + stuff.push_to(x); + } + } + // TODO : this is not well defined for kcritical <-> kcritical + + /** \brief This functions take the filtration value `this` and pulls it to the + * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the + * value of this is updated to \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : + * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} + * @param[in] x The target filtration value on which to push `this`. + */ + inline void pull_to(const One_critical_filtration &x) { + if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) + return; + if (this->is_inf() || x.is_minus_inf()) { + *this = x; + return; + } + for (auto &stuff : *this) { + stuff.pull_to(x); + } + } + // cannot be const, as gudhi iterators are not const + template inline U linear_projection(const std::vector &x) { + if constexpr (co) { + U projection = std::numeric_limits::lowest(); + for (const auto &y : *this) { + projection = std::max(projection, y.linear_projection(x)); + } + return projection; + } else { + U projection = std::numeric_limits::max(); + for (auto &y : *this) { // cannot be const (Gudhi) + projection = std::min(projection, y.linear_projection(x)); + } + return projection; + } + } + + /* + * Checks if b is cleanable with respect to a + */ + static inline bool dominates(const OneCritical&a, const OneCritical&b, value_type max_error) { + if constexpr (co) + return a - max_error <= b; + else { + return a + max_error >= b; + } + } -} + static inline bool dominates(const OneCritical&a, const OneCritical&b) { + if constexpr (co) + return a <= b; + else { + return a >= b; + } + } + static inline bool strictly_dominates(const OneCritical&a, const OneCritical&b) { + if constexpr (co) + return a < b; + else { + return a > b; + } + } + + template + inline Multi_critical_filtration + evaluate_in_grid(const std::vector>& grid) const { + Multi_critical_filtration out(this->num_generators()); + for (std::size_t i = 0; i < this->num_generators(); ++i){ + out[i] = this->operator[](i).evaluate_in_grid(grid); + } + return out; + } + + inline void clean(value_type max_error = 0) { + // A bit ugly, todo : erase+removeif ? + for (std::size_t i = 0; i < multi_filtration_.size(); i++) { + for (std::size_t j = 0; j < multi_filtration_.size(); j++) { + if (i == j) + continue; + if (dominates(multi_filtration_[j], multi_filtration_[i], max_error)) { + multi_filtration_[i].clear(); + } + while (j < multi_filtration_.size() && dominates(multi_filtration_[i], multi_filtration_[j], max_error)) { + multi_filtration_[j].clear(); + i--; + } + } + } + multi_filtration_.erase( + std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [](const One_critical_filtration &a) { + return a.empty(); + }), + multi_filtration_.end()); + } + inline void add_point(const One_critical_filtration &x) { + const bool verbose = false; + if (multi_filtration_.empty()) { + if constexpr (verbose) + std::cout << "Adding x=" << x << " (currently empty)" << std::endl; + multi_filtration_.push_back(x); + return; + } + for (const auto &y : multi_filtration_){ + if (dominates(x,y)){ + return; + } + } + if constexpr (verbose) + std::cout << "x: " << x << " is useful, removing unnecessary entries" + << std::endl; + multi_filtration_.erase( + std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [&x](const One_critical_filtration &y) { + if constexpr (verbose) { + if (dominates(y, x)) { + std::cout << "Removing y=" << y << std::endl; + } else { + std::cout << "Keeping y=" << y << std::endl; + } + } + return dominates(y, x); + }), + multi_filtration_.end()); + multi_filtration_.push_back(x); + } + inline void re_clean(){ + // Ensures all points are useful again. Can be useful if points are added manually. + // TODO : maybe optimize + Multi_critical_filtration out; // should be inf + out.multi_filtration_.reserve(this->multi_filtration_.size()); + for (const auto& x : multi_filtration_){ + out.add_point(x); + } + std::swap(multi_filtration_, out); + } + // easy debug + inline friend std::ostream &operator<<(std::ostream &stream, + const Multi_critical_filtration &truc) { + if (truc.is_inf()) { + stream << "[inf, ..., inf]"; + return stream; + } + if (truc.is_minus_inf()) { + stream << "[-inf, ..., -inf]"; + return stream; + } + if (truc.is_nan()) { + stream << "[NaN]"; + return stream; + } + stream << "(k=" << truc.multi_filtration_.size() << ")["; + for (const auto &machin : truc) { + stream << machin << "; "; + } + if (truc.multi_filtration_.size() > 0) { + stream << "\b" + << "\b"; + } + stream << "]"; + return stream; + } + inline void clear() { multi_filtration_.clear(); } + inline bool empty() const { return multi_filtration_.empty(); } + inline const OneCritical& operator[] (std::size_t i) const { return multi_filtration_[i]; } + + inline typename std::vector>::iterator + begin() { + return multi_filtration_.begin(); + } + inline typename std::vector>::iterator + end() { + return multi_filtration_.end(); + } + inline typename std::vector< + One_critical_filtration>::const_iterator + begin() const { + return multi_filtration_.begin(); + } + inline typename std::vector< + One_critical_filtration>::const_iterator + end() const { + return multi_filtration_.end(); + } + template + inline Multi_critical_filtration + coordinates_in_grid(const std::vector& grid) const { + assert(grid.size() >= this->num_generators()); + Multi_critical_filtration out(this->num_generators()); + for (std::size_t i = 0u; i < this->num_generators(); ++i) { + out[i] = this->multi_filtration_[i].coordinates_in_grid(grid); + } + return out; + } + template + inline void coordinates_in_grid_inplace(const std::vector& grid, + bool coordinate = true) { + assert(grid.size() >= this->num_generators()); + for (auto &x : this->multi_filtration_) { + x.coordinates_in_grid_inplace(grid, coordinate); + } + } + template inline Multi_critical_filtration astype() const { + std::vector> out(this->num_generators()); + for (std::size_t i = 0u; i < this->num_generators(); ++i) { + out[i] = this->multi_filtration_[i].template astype(); + } + return Multi_critical_filtration(std::move(out)); + } + inline void push_back(const OneCritical& x){ + multi_filtration_.push_back(x); + } + inline const std::vector>& as_vector() const { + return multi_filtration_; + } + + inline std::vector> as_VECTOR() const { + std::vector> out(this->num_generators(), + std::vector(this->num_parameters())); + for (std::size_t i = 0; i < this->num_generators(); ++i) { + for (std::size_t j = 0; j < this->num_parameters(); ++j) { + out[i][j] = multi_filtration_[i][j]; + } + } + return out; + } + + inline void _clean(bool keep_inf=true) { + multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [keep_inf](const OneCritical &a) { + return a.empty() || + ((!keep_inf) && + (a.is_inf() || a.is_minus_inf())); + }), + multi_filtration_.end()); + } + inline std::size_t num_generators() const { + return multi_filtration_.size(); + } + + + + // TODO : this costs a lot... optimize / cheat in some way for python ? + inline bool operator<(const Multi_critical_filtration &other) const { + //check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him + for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { + for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { + // i(const Multi_critical_filtration &other) const { + return other < *this; + } + + inline bool operator<=(const Multi_critical_filtration &other) const { + //check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him + for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { + for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { + // i <= j + if (dominates(other.multi_filtration_[j], multi_filtration_[i])) + continue; + } + return false; + } + return true; + } + inline bool operator>=(const Multi_critical_filtration &other) const { + return other <= *this; + } + +public: + // for compiler + constexpr static const T T_inf = One_critical_filtration::T_inf; + constexpr static const bool is_multi_critical = true; + +private: + std::vector> multi_filtration_; +}; + +} // namespace Gudhi::multiparameter::multi_filtrations + +namespace std { + +template +class numeric_limits> { +public: + static constexpr bool has_infinity = std::numeric_limits::has_infinity; + + static Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration + infinity() throw() { + return Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration( + 1, std::numeric_limits::infinity()); + }; + static Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration + minus_infinity() throw() { + return Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration( + 1, -std::numeric_limits::infinity()); + }; + static Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration + max() throw() { + return Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration(1, std::numeric_limits::max()); + }; + static Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration + quiet_NaN() throw() { + return Gudhi::multiparameter::multi_filtrations:: + One_critical_filtration(1, + numeric_limits::quiet_NaN()); + }; +}; +} // namespace std -#endif // FINITELY_CRITICAL_FILTRATIONS_H_ +#endif // FINITELY_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h index 7c3a994231..0c4a2506a4 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h @@ -1,8 +1,9 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. - * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. - * Author(s): David Loiseaux +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which + * is released under MIT. See file LICENSE or go to + * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David + * Loiseaux * - * Copyright (C) 2023 Inria + * tCopyright (C) 2023 Inria * * Modification(s): * - YYYY/MM Author: Description of the modification @@ -13,73 +14,220 @@ #include "Box.h" #include "Finitely_critical_filtrations.h" +#include namespace Gudhi::multiparameter::multi_filtrations { -template -class Line { - public: - using point_type = Finitely_critical_multi_filtration; +template class Line { +public: + using point_type = One_critical_filtration; + using kcritical_point_type = Multi_critical_filtration; Line(); - Line(point_type x); - Line(point_type x, point_type v); - point_type push_forward(point_type x) const; - point_type push_back(point_type x) const; - int get_dim() const; + Line(const point_type &x); + Line(point_type &&x); + Line(const point_type &x, const point_type &v); + inline point_type push_forward(point_type x) const; + template + inline U push_forward2(const point_type &x) const; + template + inline U push_forward2(const kcritical_point_type &x) const; + inline point_type push_back(point_type x) const; + template + inline U push_back2(const point_type &x) const; + template + inline U push_back2(const kcritical_point_type &x) const; + inline int get_dim() const; std::pair get_bounds(const Box &box) const; + std::pair get_bounds2(const Box &box) const; + + // translation + inline friend Line &operator+=(Line &to_translate, const point_type &x) { + to_translate.basepoint_ -= x; + return to_translate; + } + + inline point_type &basepoint() { return basepoint_; } + inline point_type &direction() { return direction_; } + inline const point_type &basepoint() const { return basepoint_; } + inline const point_type &direction() const { return direction_; } - private: - point_type basepoint_; // any point on the line - point_type direction_; // direction of the line +private: + point_type basepoint_; // any point on the line + point_type direction_; // direction of the line }; -template -Line::Line() {} +template Line::Line() {} +template Line::Line(const point_type &x) : basepoint_(x) {} +template +Line::Line(point_type &&x) : basepoint_(std::move(x)) {} +template +Line::Line(const point_type &x, const point_type &v) + : basepoint_(x), direction_(v) {} template -Line::Line(point_type x) { - this->basepoint_.swap(x); - // this->direction_ = {}; // diagonal line +inline typename Line::point_type +Line::push_forward(point_type x) const { // TODO remove copy + if (x.is_inf() || x.is_nan() || x.is_minus_inf()) + return x; + T t = this->push_forward2(x); + if (direction_.size() > 0) { + for (std::size_t i = 0; i < x.size(); i++) + x[i] = basepoint_[i] + t * direction_[i]; + } else { + for (std::size_t i = 0; i < x.size(); i++) + x[i] = basepoint_[i] + t; + } + return x; } template -Line::Line(point_type x, point_type v) { - this->basepoint_.swap(x); - this->direction_.swap(v); +template +inline U Line::push_forward2(const point_type &x) const { + constexpr const U inf = std::numeric_limits::infinity(); // This disable it for e.g. + // ints, but that's good + if (x.is_inf() || x.is_nan()) + return inf; + if (x.is_minus_inf()) + return -inf; + // x -= basepoint_; + U t = -inf; + if (direction_.size()) { + for (std::size_t i = 0; i < x.size(); i++) { + if (direction_[i] == 0) [[unlikely]] { + if (x[i] < basepoint_[i]) + continue; + else { + return inf; + } + } else [[likely]] { + // the cast float -> float should not be a overhead (if compiler is not + // stupid) + t = std::max(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast((direction_[i]))); + } + } + } else { + for (std::size_t i = 0; i < x.size(); i++) + t = std::max(t, static_cast(x[i]) - static_cast(basepoint_[i])); + } + + // for (std::size_t i = 0; i < x.size(); i++) { + // T dir = this->direction_.size() > i ? direction_[i] : 1; + // T scaled_coord; + // if (dir == 0) [[unlikely]] { + // scaled_coord = x[i] > basepoint_[i] ? inf : -inf; + // } else [[likely]] { + // scaled_coord = (x[i] - basepoint_[i]) / dir; + // } + // t = std::max(t, scaled_coord); + // } + return t; } template -typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy - x -= basepoint_; - T t = -std::numeric_limits::infinity(); - ; - for (std::size_t i = 0; i < x.size(); i++) { - T dir = this->direction_.size() > i ? direction_[i] : 1; - t = std::max(t, x[i] / dir); +template +inline U Line::push_forward2(const kcritical_point_type &x) const { + constexpr const U inf = std::numeric_limits::infinity(); + if (x.is_inf() || x.is_nan()) + return inf; + if (x.is_minus_inf()) + return -inf; + U t = inf; + for (const auto &y : x) { + t = std::min(t, this->push_forward2(y)); } - point_type out(basepoint_.size()); - for (unsigned int i = 0; i < out.size(); i++) - out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1); - return out; + return t; } + template -typename Line::point_type Line::push_back(point_type x) const { - x -= basepoint_; - T t = std::numeric_limits::infinity(); - for (unsigned int i = 0; i < x.size(); i++) { - T dir = this->direction_.size() > i ? direction_[i] : 1; - t = std::min(t, x[i] / dir); +inline typename Line::point_type Line::push_back(point_type x) const { + if (x.is_inf() || x.is_nan() || x.is_minus_inf()) + return x; + + T t = this->push_back2(x); + if (direction_.size() > 0) { + for (std::size_t i = 0; i < x.size(); i++) + x[i] = basepoint_[i] + t * direction_[i]; + } else + for (std::size_t i = 0; i < x.size(); i++) + x[i] = basepoint_[i] + t; + + // for (std::size_t i = 0; i < x.size(); i++) + // x[i] = + // basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : + // 1); + return x; +} + +template +template inline U Line::push_back2(const point_type &x) const { + constexpr const U inf = std::numeric_limits::infinity(); + if (x.is_inf()) + return inf; + if (x.is_minus_inf() || x.is_nan()) + return -inf; + U t = inf; + // x -= basepoint_; + + if (direction_.size()) { + for (std::size_t i = 0; i < x.size(); i++) { + if (direction_[i] == 0) [[unlikely]] { + if (x[i] > basepoint_[i]) + continue; + else { + return -inf; + } + } else [[likely]] { + t = std::min(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast(direction_[i])); + } + } + } else { + for (std::size_t i = 0; i < x.size(); i++) + t = std::min(t, static_cast(x[i] - basepoint_[i])); } - point_type out(basepoint_.size()); - for (unsigned int i = 0; i < out.size(); i++) - out[i] = basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : 1); - return out; + // for (std::size_t i = 0; i < x.size(); i++) { + // T dir = this->direction_.size() > i ? direction_[i] : 1; + // T scaled_coord; + // if (dir == 0) [[unlikely]] { + // scaled_coord = x[i] > basepoint_[i] ? inf : -inf; + // } else [[likely]] { + // scaled_coord = (x[i] - basepoint_[i]) / dir; + // } + // t = std::min(t, scaled_coord); + // } + return t; } + template -int Line::get_dim() const { + +template +inline U Line::push_back2(const kcritical_point_type &x) const { + constexpr const U inf = std::numeric_limits::infinity(); + if (x.is_inf()) + return inf; + if (x.is_minus_inf() || x.is_nan()) + return -inf; + U t = -inf; + for (const auto &y : x) { + t = std::max(t, this->push_back2(y)); + } + return t; +} + +template inline int Line::get_dim() const { return basepoint_.size(); } + +template +inline std::pair +Line::get_bounds2(const Box &box) const { + return {this->push_forward2(box.get_bottom_corner()), + this->push_back2(box.get_upper_corner())}; +} + + template -std::pair::point_type, typename Line::point_type> Line::get_bounds(const Box &box) const { - return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; +inline std::pair::point_type, typename Line::point_type> +Line::get_bounds(const Box &box) const { + return {this->push_forward(box.get_bottom_corner()), + this->push_back(box.get_upper_corner())}; } -} // namespace Gudhi::multiparameter::multi_filtrations +} // namespace Gudhi::multiparameter::multi_filtrations -#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED +#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED diff --git a/src/Simplex_tree/test/CMakeLists.txt b/src/Simplex_tree/test/CMakeLists.txt index 9688c2606b..7541b882a6 100644 --- a/src/Simplex_tree/test/CMakeLists.txt +++ b/src/Simplex_tree/test/CMakeLists.txt @@ -6,7 +6,7 @@ file(COPY "simplex_tree_for_unit_test.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DI add_executable_with_targets(Simplex_tree_test_unit simplex_tree_unit_test.cpp TBB::tbb) gudhi_add_boost_test(Simplex_tree_test_unit) -add_executable_with_targets(Simplex_tree_multi_test_unit simplex_tree_multi_unit_test.cppm TBB::tbb) +add_executable_with_targets(Simplex_tree_multi_test_unit simplex_tree_multi_unit_test.cpp TBB::tbb) gudhi_add_boost_test(Simplex_tree_multi_test_unit) add_executable_with_targets(Simplex_tree_remove_test_unit simplex_tree_remove_unit_test.cpp TBB::tbb) diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 8a2daaa619..2e9949c750 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -32,13 +32,15 @@ using namespace Gudhi; using namespace Gudhi::multiparameter; -using Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration; +using Gudhi::multiparameter::multi_filtrations::One_critical_filtration; +using Gudhi::multiparameter::multi_filtrations::Multi_critical_filtration; using namespace Gudhi; using namespace Gudhi::multiparameter; -using Multi_Filtration_values = Finitely_critical_multi_filtration; +using OneCriticalFiltration = One_critical_filtration; +using KCriticalFiltration = Multi_critical_filtration; using typeST_STD = Simplex_tree; -using Stree_multi = Simplex_tree; +using Stree_multi = Simplex_tree>; typedef boost::mpl::list list_of_tested_variants; @@ -107,7 +109,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_when_empty, typeST, list_of_tested_va bool AreAlmostTheSame(float a, float b) { return std::fabs(a - b) < std::numeric_limits::epsilon(); } -bool AreAlmostTheSame(Finitely_critical_multi_filtration a, Finitely_critical_multi_filtration b) { +bool AreAlmostTheSame(One_critical_filtration a, One_critical_filtration b) { assert(a.size() == b.size()); for (auto i=0u; i std::numeric_limits::epsilon()) @@ -587,10 +589,10 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes std::clog << "TEST RESET FILTRATION" << std::endl; typeST st; - st.insert_simplex_and_subfaces({2, 1, 0}, Multi_Filtration_values({2.,1.})); - st.insert_simplex_and_subfaces({3, 0}, Multi_Filtration_values({1.,2.})); - st.insert_simplex_and_subfaces({3, 4, 5}, Multi_Filtration_values({3.,4.})); - st.insert_simplex_and_subfaces({0, 1, 6, 7}, Multi_Filtration_values({4.,3.})); + st.insert_simplex_and_subfaces({2, 1, 0}, OneCriticalFiltration({2.,1.})); + st.insert_simplex_and_subfaces({3, 0}, OneCriticalFiltration({1.,2.})); + st.insert_simplex_and_subfaces({3, 4, 5}, OneCriticalFiltration({3.,4.})); + st.insert_simplex_and_subfaces({0, 1, 6, 7}, OneCriticalFiltration({4.,3.})); std::cout <<"TRUC "<< st.filtration(st.find({2,1,0})) << std::endl; /* Inserted simplex: */ /* 1 6 */ @@ -609,7 +611,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes 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) >= Multi_Filtration_values({1.,1.})); + BOOST_CHECK(st.filtration(f_simplex) >= OneCriticalFiltration({1.,1.})); } // dimension until 5 even if simplex tree is of dimension 3 to test the limits @@ -624,7 +626,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_reset_filtration, typeST, list_of_tes 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) >= Multi_Filtration_values({1.,1})); + BOOST_CHECK(st.filtration(f_simplex) >= OneCriticalFiltration({1.,1})); else BOOST_CHECK(st.filtration(f_simplex) == st.inf_); } @@ -636,7 +638,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant std::clog << "********************************************************************" << std::endl; std::clog << "TEST SIMPLEX TREE CLEAR" << std::endl; typeST st; - st.insert_simplex_and_subfaces({0, 1}, Multi_Filtration_values({1.5})); + st.insert_simplex_and_subfaces({0, 1}, OneCriticalFiltration({1.5})); st.initialize_filtration(); st.clear(); BOOST_CHECK(st.num_vertices() == 0); @@ -646,7 +648,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_clear, typeST, list_of_tested_variant BOOST_CHECK(boost::size(st.filtration_simplex_range()) == 0); typeST st_empty; BOOST_CHECK(st == st_empty); - st.insert_simplex_and_subfaces({0}, Multi_Filtration_values({2.5})); + st.insert_simplex_and_subfaces({0}, OneCriticalFiltration({2.5})); BOOST_CHECK(boost::size(st.cofaces_simplex_range(st.find({0}), 1)) == 0); } @@ -664,7 +666,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia BOOST_CHECK(st_multi.num_simplices() == st.num_simplices()); // simplicial complexes should be the same for (auto sh : st_multi.complex_simplex_range()){ const auto& filtration = st_multi.filtration(sh); - BOOST_CHECK(filtration == Multi_Filtration_values({1,2,3})); // Checks the filtration values + BOOST_CHECK(filtration == OneCriticalFiltration({1,2,3})); // Checks the filtration values } std::clog << "********************************************************************" << std::endl; std::clog << "TEST FLATTEN" << std::endl; @@ -677,13 +679,13 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia } } - std::clog << "********************************************************************" << std::endl; - std::clog << "TEST LINEAR PROJECTION" << std::endl; - // st has already the same simplicial complex as st_multi, and the filtration values of st_multi are all {1,2,3} - Gudhi::multiparameter::linear_projection(st,st_multi,{17,37,73}); // sets the filtration values of st to the dot product of st_multi.filtration and {17,37,73}. - for (auto sh : st.complex_simplex_range()){ - BOOST_CHECK(st.filtration(sh) == 1*17 + 2*37 + 3*73); - } + // std::clog << "********************************************************************" << std::endl; + // std::clog << "TEST LINEAR PROJECTION" << std::endl; + // // st has already the same simplicial complex as st_multi, and the filtration values of st_multi are all {1,2,3} + // Gudhi::multiparameter::linear_projection(st,st_multi,{17,37,73}); // sets the filtration values of st to the dot product of st_multi.filtration and {17,37,73}. + // for (auto sh : st.complex_simplex_range()){ + // BOOST_CHECK(st.filtration(sh) == 1*17 + 2*37 + 3*73); + // } } @@ -696,12 +698,12 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_assign_filtration) { typename Stree_multi::Simplex_handle sh; bool success = false; - const Multi_Filtration_values multi_filt_1 = {1., 2.}; + const OneCriticalFiltration multi_filt_1 = {1., 2.}; std::tie(sh, success) = st.insert_simplex_and_subfaces({0, 1}, multi_filt_1); BOOST_CHECK(success); BOOST_CHECK(sh != st.null_simplex()); // Only [0,1], [0] and [1] are already inserted - const Multi_Filtration_values multi_filt_2 = {3., 2., 1.}; + const OneCriticalFiltration multi_filt_2 = {3., 2., 1.}; std::tie(sh, success) = st.insert_simplex_and_subfaces({2, 1, 0}, multi_filt_2); BOOST_CHECK(success); BOOST_CHECK(sh != st.null_simplex()); @@ -715,7 +717,7 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_assign_filtration) { BOOST_CHECK(sh != st.null_simplex()); BOOST_CHECK(st.filtration(sh) == multi_filt_2); // And assign a new value - Multi_Filtration_values const multi_filt_3 = {5.}; + OneCriticalFiltration const multi_filt_3 = {5.}; st.assign_filtration(sh, multi_filt_3); for (auto f_simplex : st.complex_simplex_range()) { @@ -782,7 +784,7 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_reset_filtration) { BOOST_CHECK(st.filtration(f_simplex) >= 2.); } - Multi_Filtration_values new_filt = {0., 1., 2.}; + OneCriticalFiltration new_filt = {0., 1., 2.}; // dimension until 5 even if simplex tree is of dimension 3 to test the limits for(int dimension = 5; dimension >= 0; dimension --) { std::clog << "### reset_filtration - dimension = " << dimension << "\n"; @@ -820,7 +822,7 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_filtration_multify) { /* 5 */ Stree_multi st_multi; - Multi_Filtration_values default_multi (3, std::numeric_limits::quiet_NaN()); + OneCriticalFiltration default_multi (3, std::numeric_limits::quiet_NaN()); Gudhi::multiparameter::multify(st, st_multi, 3, default_multi); for (auto f_simplex : st_multi.complex_simplex_range()) { @@ -861,13 +863,13 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_filtration_numeric_limits) { std::clog << "TEST MULTI FILTRATION NUMERIC LIMITS" << std::endl; // NaN - auto nan_multi = std::numeric_limits::quiet_NaN(); + auto nan_multi = std::numeric_limits::quiet_NaN(); BOOST_CHECK(nan_multi.size() == 1); BOOST_CHECK(std::isnan(nan_multi[0])); std::clog << nan_multi << std::endl; // Inf - auto inf_multi = std::numeric_limits::infinity(); + auto inf_multi = std::numeric_limits::infinity(); BOOST_CHECK(inf_multi.size() == 1); BOOST_CHECK(std::isinf(inf_multi[0])); std::clog << inf_multi << std::endl; @@ -901,50 +903,50 @@ BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi) { } auto filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({2., 3.})); + BOOST_CHECK(filt == OneCriticalFiltration({2., 3.})); st.set_number_of_parameters(2); st.make_filtration_non_decreasing(); filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({3., 4.})); + BOOST_CHECK(filt == OneCriticalFiltration({3., 4.})); - st.assign_filtration(st.find({3, 0}), Multi_Filtration_values({2.9, 4.})); + st.assign_filtration(st.find({3, 0}), OneCriticalFiltration({2.9, 4.})); filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({2.9, 4.})); + BOOST_CHECK(filt == OneCriticalFiltration({2.9, 4.})); st.make_filtration_non_decreasing(); filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({3., 4.})); + BOOST_CHECK(filt == OneCriticalFiltration({3., 4.})); - st.assign_filtration(st.find({3, 0}), Multi_Filtration_values({5., 3.99})); + st.assign_filtration(st.find({3, 0}), OneCriticalFiltration({5., 3.99})); filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({5., 3.99})); + BOOST_CHECK(filt == OneCriticalFiltration({5., 3.99})); st.make_filtration_non_decreasing(); filt = st.filtration(st.find({3, 0})); std::clog << "filtration([3,0]) = " << filt << std::endl; - BOOST_CHECK(filt == Multi_Filtration_values({5., 4.})); + BOOST_CHECK(filt == OneCriticalFiltration({5., 4.})); } BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi_nan_values) { Stree_multi st; - BOOST_CHECK(std::numeric_limits::quiet_NaN().is_nan()); - BOOST_CHECK(std::numeric_limits::infinity().is_inf()); + BOOST_CHECK(std::numeric_limits::quiet_NaN().is_nan()); + BOOST_CHECK(std::numeric_limits::infinity().is_inf()); st.insert_simplex_and_subfaces({2, 1, 0}, {1.,2.,3.}); st.insert_simplex_and_subfaces({3, 0}, {1.,2.,3.}); st.insert_simplex_and_subfaces({3, 4, 5}, {1.,2.,3.}); - st.assign_filtration(st.find({0}), std::numeric_limits::quiet_NaN()); - st.assign_filtration(st.find({3}), std::numeric_limits::infinity()); + st.assign_filtration(st.find({0}), std::numeric_limits::quiet_NaN()); + st.assign_filtration(st.find({3}), std::numeric_limits::infinity()); /* Inserted simplex: */ /* 1 */ @@ -982,7 +984,7 @@ BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi_nan_values) { std::clog << "Filtration: " << filt << std::endl; if (is_zero) BOOST_CHECK(filt.is_nan()); else if (contains3) BOOST_CHECK(filt.is_inf()); - else BOOST_CHECK(filt == Multi_Filtration_values({1.,2.,3.})); + else BOOST_CHECK(filt == OneCriticalFiltration({1.,2.,3.})); } } From 8c797f275f4c62d9d94e77716b2cada933cf0d2c Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 24 Jun 2024 18:23:39 +0200 Subject: [PATCH 47/87] fix: test & tbb --- src/Simplex_tree/example/CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Simplex_tree/example/CMakeLists.txt b/src/Simplex_tree/example/CMakeLists.txt index bf321c18e7..ec24e30c6c 100644 --- a/src/Simplex_tree/example/CMakeLists.txt +++ b/src/Simplex_tree/example/CMakeLists.txt @@ -10,10 +10,7 @@ add_test(NAME Simplex_tree_example_simple_simplex_tree COMMAND $) -add_executable ( Simplex_tree_multi_example simplex_tree_multi.cpp ) -if(TARGET TBB::tbb) - target_link_libraries(Simplex_tree_multi_example TBB::tbb) -endif() +add_executable_with_targets ( Simplex_tree_multi_example simplex_tree_multi.cpp TBB::tbb) add_test(NAME Simplex_tree_multi_example COMMAND $) From 8b303c24ecafc3e634c50acd6a15d4b100da059c Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 25 Jun 2024 10:51:07 +0200 Subject: [PATCH 48/87] fix: include missing in stmulti exemple --- src/Simplex_tree/example/simplex_tree_multi.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Simplex_tree/example/simplex_tree_multi.cpp b/src/Simplex_tree/example/simplex_tree_multi.cpp index f397d6263e..74e343a8e0 100644 --- a/src/Simplex_tree/example/simplex_tree_multi.cpp +++ b/src/Simplex_tree/example/simplex_tree_multi.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -19,7 +20,7 @@ struct ST_MULTI { typedef Gudhi::linear_indexing_tag Indexing_tag; typedef int Vertex_handle; typedef float value_type; - using Filtration_value = Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration; + using Filtration_value = Gudhi::multiparameter::multi_filtrations::One_critical_filtration; typedef std::uint32_t Simplex_key; static const bool store_key = true; static const bool store_filtration = true; From 27ebaf62766858986014747117b60ae20a8c7db9 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 25 Jun 2024 11:01:58 +0200 Subject: [PATCH 49/87] fix: unnecessary tbb include --- src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h index 0fe2043dc3..d43b047143 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h @@ -13,7 +13,6 @@ #include #include -#include namespace Gudhi::multiparameter { /** Model of SimplexTreeOptions, with a multiparameter filtration. */ From afde822d8b646d64e391619f17d5d9b35ccbfd8d Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 18:54:13 +0200 Subject: [PATCH 50/87] Update src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h Co-authored-by: Marc Glisse --- .../include/gudhi/Simplex_tree/multi_filtrations/Box.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h index 89aa44d2a7..e4c0c171c5 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h @@ -24,7 +24,7 @@ #include "Finitely_critical_filtrations.h" /** - * @brief Simple box in $\mathbb R^n$ . + * @brief Simple box in \f$\mathbb R^n\f$ . */ namespace Gudhi::multiparameter::multi_filtrations { From 039415d5f76e7c65b1397f0e592de77ce8581fec Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 19:05:51 +0200 Subject: [PATCH 51/87] fix: remove unnecessary multiparameter flag --- src/Persistent_cohomology/example/plain_homology.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Persistent_cohomology/example/plain_homology.cpp b/src/Persistent_cohomology/example/plain_homology.cpp index 417446e721..7b09c2013a 100644 --- a/src/Persistent_cohomology/example/plain_homology.cpp +++ b/src/Persistent_cohomology/example/plain_homology.cpp @@ -24,7 +24,6 @@ struct MyOptions : Gudhi::Simplex_tree_options_minimal { // static const bool store_filtration = false; // However the persistence algorithm needs this static const bool store_key = true; - static const bool is_multi_parameter = false; // I have few vertices typedef short Vertex_handle; // Maximum number of simplices to compute persistence is 2^8 - 1 = 255. One is reserved for null_key From 6c27892f8ca3cfca2d76de48d55be144ff38c30d Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 19:06:24 +0200 Subject: [PATCH 52/87] fix: inf_ simplextree static member should be const --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index f570382193..e8ce235228 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -2611,7 +2611,7 @@ class Simplex_tree { return 1; } - inline static Filtration_value inf_ = std::numeric_limits::has_infinity ? + inline static const Filtration_value inf_ = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); /**< Default infinite value. */ From 882bf8c080d5d9894cb4bef8b8cb8f86a43c573d Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 19:08:26 +0200 Subject: [PATCH 53/87] feat: Assert in the line constructor that the arguments are correct. --- .../Simplex_tree/multi_filtrations/Line.h | 46 ++++++------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h index 0c4a2506a4..e1405ae72e 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h @@ -15,6 +15,7 @@ #include "Box.h" #include "Finitely_critical_filtrations.h" #include +#include namespace Gudhi::multiparameter::multi_filtrations { @@ -22,6 +23,7 @@ template class Line { public: using point_type = One_critical_filtration; using kcritical_point_type = Multi_critical_filtration; + bool check_direction() const; Line(); Line(const point_type &x); Line(point_type &&x); @@ -55,14 +57,24 @@ template class Line { point_type basepoint_; // any point on the line point_type direction_; // direction of the line }; +template inline bool Line::check_direction() const { + bool is_trivial=true; + for (const auto& stuff : basepoint_){ + if (!stuff){ is_trivial = false;} + if (stuff < 0){ throw std::invalid_argument("Direction should have positive entries.");} + } + if (is_trivial){throw std::invalid_argument("Direction should have at least one non-trivial entry.");} +} template Line::Line() {} -template Line::Line(const point_type &x) : basepoint_(x) {} +template Line::Line(const point_type &x) : basepoint_(x) { check_direction();} template -Line::Line(point_type &&x) : basepoint_(std::move(x)) {} +Line::Line(point_type &&x) : basepoint_(std::move(x)) {check_direction();} template Line::Line(const point_type &x, const point_type &v) - : basepoint_(x), direction_(v) {} + : basepoint_(x), direction_(v) {check_direction();} + + template inline typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy @@ -87,7 +99,6 @@ inline U Line::push_forward2(const point_type &x) const { return inf; if (x.is_minus_inf()) return -inf; - // x -= basepoint_; U t = -inf; if (direction_.size()) { for (std::size_t i = 0; i < x.size(); i++) { @@ -98,8 +109,6 @@ inline U Line::push_forward2(const point_type &x) const { return inf; } } else [[likely]] { - // the cast float -> float should not be a overhead (if compiler is not - // stupid) t = std::max(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast((direction_[i]))); } } @@ -108,16 +117,6 @@ inline U Line::push_forward2(const point_type &x) const { t = std::max(t, static_cast(x[i]) - static_cast(basepoint_[i])); } - // for (std::size_t i = 0; i < x.size(); i++) { - // T dir = this->direction_.size() > i ? direction_[i] : 1; - // T scaled_coord; - // if (dir == 0) [[unlikely]] { - // scaled_coord = x[i] > basepoint_[i] ? inf : -inf; - // } else [[likely]] { - // scaled_coord = (x[i] - basepoint_[i]) / dir; - // } - // t = std::max(t, scaled_coord); - // } return t; } template @@ -148,10 +147,6 @@ inline typename Line::point_type Line::push_back(point_type x) const { for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t; - // for (std::size_t i = 0; i < x.size(); i++) - // x[i] = - // basepoint_[i] + t * (this->direction_.size() > i ? direction_[i] : - // 1); return x; } @@ -163,7 +158,6 @@ template inline U Line::push_back2(const point_type &x) const { if (x.is_minus_inf() || x.is_nan()) return -inf; U t = inf; - // x -= basepoint_; if (direction_.size()) { for (std::size_t i = 0; i < x.size(); i++) { @@ -181,16 +175,6 @@ template inline U Line::push_back2(const point_type &x) const { for (std::size_t i = 0; i < x.size(); i++) t = std::min(t, static_cast(x[i] - basepoint_[i])); } - // for (std::size_t i = 0; i < x.size(); i++) { - // T dir = this->direction_.size() > i ? direction_[i] : 1; - // T scaled_coord; - // if (dir == 0) [[unlikely]] { - // scaled_coord = x[i] > basepoint_[i] ? inf : -inf; - // } else [[likely]] { - // scaled_coord = (x[i] - basepoint_[i]) / dir; - // } - // t = std::min(t, scaled_coord); - // } return t; } From a15d72c2423b2282e560cf5c7e70bf4e82fa22d2 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 19:33:23 +0200 Subject: [PATCH 54/87] fix: doc missing and not correct infinite values. --- .../Simplex_tree/multi_filtrations/Line.h | 55 +++++++++++++++++-- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h index e1405ae72e..3bc69638c5 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h @@ -19,27 +19,63 @@ namespace Gudhi::multiparameter::multi_filtrations { +/* +* A line in \f$\mathbb R^n\f$, with some helpers to project points on it. +* When the direction is not given, it is assumed to be diagonal. +* As the line has a builtin parametrization, points in \f$\mathbb R^n\f$ +* that are on a line are given a time parameter in \f$\mathbb R\f$. +* The method that end with a 2 returns the time t, while the other +* ones return the full coordinates +*/ template class Line { public: using point_type = One_critical_filtration; using kcritical_point_type = Multi_critical_filtration; + /* + * Checks that the argument define a correct, positively slopped line. + */ bool check_direction() const; Line(); Line(const point_type &x); Line(point_type &&x); Line(const point_type &x, const point_type &v); + /* + * Returns the point whose intersection is \f$ \min\{ y\ge x \} \cap \mathrm{this}\f$ + */ inline point_type push_forward(point_type x) const; + /* + * Retuns the time parameter of the coordinate given by push_forward. + */ template inline U push_forward2(const point_type &x) const; + /* + * Retuns the time parameter of the coordinate given by push_forward. + */ template inline U push_forward2(const kcritical_point_type &x) const; + /* + * Returns the point whose intersection is \f$ \max\{ y\le x \} \cap \mathrm{this}\f$ + */ inline point_type push_back(point_type x) const; + /* + * Retuns the time parameter of the coordinate given by push_back. + */ template inline U push_back2(const point_type &x) const; + /* + * Retuns the time parameter of the coordinate given by push_back. + */ template inline U push_back2(const kcritical_point_type &x) const; inline int get_dim() const; + /* + * Given a box, returns the coordinates of the intersection of this box and `this` as a pair of points (low, high) + * in this line, representing this interval. + */ std::pair get_bounds(const Box &box) const; + /* + * Retuns the times parameter of the coordinates in the pair given by get_bounds. + */ std::pair get_bounds2(const Box &box) const; // translation @@ -64,6 +100,8 @@ template inline bool Line::check_direction() const { if (stuff < 0){ throw std::invalid_argument("Direction should have positive entries.");} } if (is_trivial){throw std::invalid_argument("Direction should have at least one non-trivial entry.");} + if (direction_.size() && direction_.size() != basepoint_.size()) + throw std::invalid_argument("The dimensions of basepoint and direction are not equal."); } template Line::Line() {} @@ -93,8 +131,9 @@ Line::push_forward(point_type x) const { // TODO remove copy template template inline U Line::push_forward2(const point_type &x) const { - constexpr const U inf = std::numeric_limits::infinity(); // This disable it for e.g. - // ints, but that's good + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() + : std::numeric_limits::max(); if (x.is_inf() || x.is_nan()) return inf; if (x.is_minus_inf()) @@ -122,7 +161,9 @@ inline U Line::push_forward2(const point_type &x) const { template template inline U Line::push_forward2(const kcritical_point_type &x) const { - constexpr const U inf = std::numeric_limits::infinity(); + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() + : std::numeric_limits::max(); if (x.is_inf() || x.is_nan()) return inf; if (x.is_minus_inf()) @@ -152,7 +193,9 @@ inline typename Line::point_type Line::push_back(point_type x) const { template template inline U Line::push_back2(const point_type &x) const { - constexpr const U inf = std::numeric_limits::infinity(); + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() + : std::numeric_limits::max(); if (x.is_inf()) return inf; if (x.is_minus_inf() || x.is_nan()) @@ -182,7 +225,9 @@ template template inline U Line::push_back2(const kcritical_point_type &x) const { - constexpr const U inf = std::numeric_limits::infinity(); + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() + : std::numeric_limits::max(); if (x.is_inf()) return inf; if (x.is_minus_inf() || x.is_nan()) From 460e1a0b39f055e07407c43ce60062b50c4c1ff9 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 19:37:28 +0200 Subject: [PATCH 55/87] doc: added some doc for the box class --- .../gudhi/Simplex_tree/multi_filtrations/Box.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h index e4c0c171c5..f7ce8ef5d2 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h @@ -38,14 +38,26 @@ template class Box { Box(const point_type &bottomCorner, const point_type &upperCorner); Box(const std::pair &box); + /* + * Inflates the box by delta + */ void inflate(T delta); const point_type &get_bottom_corner() const; const point_type &get_upper_corner() const; point_type &get_bottom_corner(); point_type &get_upper_corner(); + /** + * Thresholds a point x to be lower than the top corner of the box + */ inline void threshold_up(point_type &x) const; + /* + * Thresholds a point x to be upper than the bottom corner of the box + */ inline void threshold_down(point_type &x) const; bool contains(const point_type &point) const; + /** + * Given a list of points, builds the smallest box containing all of them. + */ void infer_from_filters(const std::vector &Filters_list); bool is_trivial() const; std::pair get_pair() const { From 9b7612e169813ba48c2f54bc2f64e42b9aef6132 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 19:59:56 +0200 Subject: [PATCH 56/87] doc: added a bit of doc in the multi-filtrations file --- .../Finitely_critical_filtrations.h | 70 +++++++++++++++++-- 1 file changed, 66 insertions(+), 4 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index df5c8bfdfc..413109b4d3 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -459,14 +459,16 @@ class One_critical_filtration : public std::vector { } return sqrt(out); } + /** + * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), + * projects itself into this grid, and returns the coordinates of this projected points + * in the given grid + */ template inline One_critical_filtration coordinates_in_grid(const std::vector>& grid) const { One_critical_filtration coords(this->size()); assert(grid.size() >= this->size()); - // U grid_inf = std::numeric_limits::has_infinity - // ? std::numeric_limits::infinity() - // : std::numeric_limits::max(); for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { const auto &filtration = grid[parameter]; auto C = std::distance( @@ -477,6 +479,11 @@ class One_critical_filtration : public std::vector { } return coords; } + /** + * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), + * and assuming that `this` correspond to the coordinates in this grid, + * returns the points evaluated in this grid + */ template inline One_critical_filtration evaluate_in_grid(const std::vector>& grid) const { @@ -493,6 +500,9 @@ class One_critical_filtration : public std::vector { return pushed_value; } + /* + * Same as `evaluate_in_grid` but does the operation in-place + */ template inline void coordinates_in_grid_inplace(const std::vector& grid, bool coordinate = true) { @@ -509,6 +519,7 @@ class One_critical_filtration : public std::vector { ; } } + // like numpy template inline One_critical_filtration astype() const { One_critical_filtration out(this->size()); for (std::size_t i = 0u; i < this->size(); i++) @@ -528,6 +539,15 @@ class One_critical_filtration : public std::vector { constexpr static bool is_multi_critical = false; }; +/* + * Multi-critical filtration. If the `co` parameter is set to true, it reverses the poset order, + * i.e., the order \f$\le$\f in \f$\mathbb R^n\f$ becomes \f$\ge$\f. + * + * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, + * then a new point \f$x$\f will be in this filtration if there exists an \f$a_i\f$ such that + * \f$a_i \le x\f$. + * + */ template class Multi_critical_filtration { public: using value_type = T; @@ -625,7 +645,10 @@ template class Multi_critical_filtration { } return result; } - + /* + * returns the smallest value for the poset order that is bigger than all of the values + * in this multi filtration + */ inline OneCritical factorize_above() const { if (this->num_generators() == 0) [[unlikely]] return OneCritical(); @@ -720,6 +743,11 @@ template class Multi_critical_filtration { } } + /* + * Same method as the one in OneCriticalFiltration. + * Given a grid, and assuming that `this` are the coordianates + * in this grid, evaluate `this` into this grid + */ template inline Multi_critical_filtration evaluate_in_grid(const std::vector>& grid) const { @@ -730,6 +758,9 @@ template class Multi_critical_filtration { return out; } + /* + * Remove redundant values + */ inline void clean(value_type max_error = 0) { // A bit ugly, todo : erase+removeif ? for (std::size_t i = 0; i < multi_filtration_.size(); i++) { @@ -752,6 +783,12 @@ template class Multi_critical_filtration { }), multi_filtration_.end()); } + + + /* + * Adds a birth point to the list of births, + * if it is useful (according to the method `dominate`) + */ inline void add_point(const One_critical_filtration &x) { const bool verbose = false; if (multi_filtration_.empty()) { @@ -843,6 +880,14 @@ template class Multi_critical_filtration { end() const { return multi_filtration_.end(); } + + + /* + * Same as its one parameter counterpart. + * If a grid is given, projects multifiltration_ on this grid and returns + * multi critical filtration composed of the coordinates in the given grid + * + */ template inline Multi_critical_filtration coordinates_in_grid(const std::vector& grid) const { @@ -853,6 +898,10 @@ template class Multi_critical_filtration { } return out; } + /* + * Same as `coordinates_in_grid`, but does the operation in-place. + * + */ template inline void coordinates_in_grid_inplace(const std::vector& grid, bool coordinate = true) { @@ -902,6 +951,10 @@ template class Multi_critical_filtration { // TODO : this costs a lot... optimize / cheat in some way for python ? + /* + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + * + */ inline bool operator<(const Multi_critical_filtration &other) const { //check if this curves is below other's curve // ie for each guy in this, check if there is a guy in other that dominates him @@ -915,10 +968,16 @@ template class Multi_critical_filtration { } return true; } + /* + * Checks if `this`, seen as a birth curve is over the `other` birth curve, + */ inline bool operator>(const Multi_critical_filtration &other) const { return other < *this; } + /* + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + */ inline bool operator<=(const Multi_critical_filtration &other) const { //check if this curves is below other's curve // ie for each guy in this, check if there is a guy in other that dominates him @@ -932,6 +991,9 @@ template class Multi_critical_filtration { } return true; } + /* + * Checks if `this`, seen as a birth curve is over the `other` birth curve, + */ inline bool operator>=(const Multi_critical_filtration &other) const { return other <= *this; } From e5eead48d85d83997fcc92ee9ce561e682f788bb Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Mon, 1 Jul 2024 20:02:42 +0200 Subject: [PATCH 57/87] fix: typo in doc --- .../multi_filtrations/Finitely_critical_filtrations.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 413109b4d3..cbd2c4cfc9 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -883,7 +883,7 @@ template class Multi_critical_filtration { /* - * Same as its one parameter counterpart. + * Same as its one critical counterpart. * If a grid is given, projects multifiltration_ on this grid and returns * multi critical filtration composed of the coordinates in the given grid * From 3344c17a8ec439a1f169b617ec8b85b8bb625f50 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 2 Jul 2024 09:34:51 +0200 Subject: [PATCH 58/87] revert: remove the const to inf_ (conflicts with filtration_mutable) --- src/Simplex_tree/include/gudhi/Simplex_tree.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index e8ce235228..44f3bcb484 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -2611,7 +2611,8 @@ class Simplex_tree { return 1; } - inline static const Filtration_value inf_ = std::numeric_limits::has_infinity ? + // cannot be const due to `filtration_mutable`, TODO : find a proper way to make that const + inline static Filtration_value inf_ = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); /**< Default infinite value. */ From 1e8fc4fbe295e873868b945026b0f344be4fd5d2 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 2 Jul 2024 10:09:28 +0200 Subject: [PATCH 59/87] doc: small update --- .../Finitely_critical_filtrations.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index cbd2c4cfc9..43cee83dbc 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -23,9 +23,7 @@ namespace Gudhi::multiparameter::multi_filtrations { -/** \class Finitely_critical_multi_filtration - * Finitely_critical_multi_filtration.h - * gudhi/Simplex_tree/multi_filtrations/Finitely_critical_multi_filtration.h +/** * \brief Vector-like filtration value, for multiparameter persistence, with * numpy-like methods. * @@ -41,8 +39,9 @@ namespace Gudhi::multiparameter::multi_filtrations { * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{ x \in \mathbb R^2 : * x>=(2,1)\} \f$ is finitely critical, and more particularly 2-critical, while * - \f$ \{ x \in \mathbb R^2 : x>= \mathrm{epigraph}(y\mapsto e^{-y})\} \f$ - * is not. Non 1-critical filtrations are not supported yet. \tparam T value - * type of the vector-like. + * is not. + * Use \ref Multi_critical_filtration for multicritical filtrations. + * \tparam T value type of the vector-like. */ template class One_critical_filtration : public std::vector { @@ -540,7 +539,8 @@ class One_critical_filtration : public std::vector { }; /* - * Multi-critical filtration. If the `co` parameter is set to true, it reverses the poset order, + * Multi-critical filtration extension to \ref One_critical_filtration . + * If the `co` parameter is set to true, it reverses the poset order, * i.e., the order \f$\le$\f in \f$\mathbb R^n\f$ becomes \f$\ge$\f. * * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, @@ -551,7 +551,7 @@ class One_critical_filtration : public std::vector { template class Multi_critical_filtration { public: using value_type = T; - using OneCritical = One_critical_filtration; + using OneCritical = One_critical_filtration; // Type of the One critical subtype template using Base = Multi_critical_filtration; std::size_t num_parameters() const { return multi_filtration_.size() == 0 ? 0 : multi_filtration_[0].size(); } From 21d95cba5fa0c1ffa4b3c4081e7d1b454876bbe4 Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 16 Jul 2024 16:01:16 +0200 Subject: [PATCH 60/87] Update src/Simplex_tree/example/simplex_tree_multi.cpp Co-authored-by: hschreiber <48448038+hschreiber@users.noreply.github.com> --- src/Simplex_tree/example/simplex_tree_multi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex_tree/example/simplex_tree_multi.cpp b/src/Simplex_tree/example/simplex_tree_multi.cpp index 74e343a8e0..9ac7448bb0 100644 --- a/src/Simplex_tree/example/simplex_tree_multi.cpp +++ b/src/Simplex_tree/example/simplex_tree_multi.cpp @@ -52,6 +52,6 @@ int main() { ST::Simplex_handle e = st.find(edge02); // Finitely_critical_multi_filtration has an operator<< std::cout << st.filtration(e) << std::endl; - assert(st.filtration(st.find(edge03)) == std::vector({4,5,6})); + GUDHI_CHECK(st.filtration(st.find(edge03)) == ST_MULTI::Filtration_value({4, 5, 6}), "edge03 does not have the right value."); } From 6338fc742e73142b89ac4667825b4fb8c1b3338c Mon Sep 17 00:00:00 2001 From: David Loiseaux Date: Tue, 16 Jul 2024 16:01:37 +0200 Subject: [PATCH 61/87] doc Co-authored-by: hschreiber <48448038+hschreiber@users.noreply.github.com> --- .../multi_filtrations/Finitely_critical_filtrations.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h index 43cee83dbc..17b84a7aee 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h @@ -538,13 +538,13 @@ class One_critical_filtration : public std::vector { constexpr static bool is_multi_critical = false; }; -/* +/** * Multi-critical filtration extension to \ref One_critical_filtration . * If the `co` parameter is set to true, it reverses the poset order, - * i.e., the order \f$\le$\f in \f$\mathbb R^n\f$ becomes \f$\ge$\f. + * i.e., the order \f$\le\f$ in \f$\mathbb R^n\f$ becomes \f$\ge\f$. * * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, - * then a new point \f$x$\f will be in this filtration if there exists an \f$a_i\f$ such that + * then a new point \f$x\f$ will be in this filtration if there exists an \f$a_i\f$ such that * \f$a_i \le x\f$. * */ From 959a3d324deedaa851d0303aaec1a78de3669eb6 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Mon, 19 Aug 2024 18:24:08 +0200 Subject: [PATCH 62/87] Move and rename in 2 new modules Multi_filtration and Multi_persistence --- CMakeLists.txt | 2 + src/CMakeLists.txt | 2 + .../include/gudhi/Multi_critical_filtration.h | 500 +++++++++++++++++ .../include/gudhi/One_critical_filtration.h} | 522 +----------------- .../include/gudhi}/Box.h | 28 +- .../include/gudhi}/Line.h | 45 +- .../include/gudhi}/Simplex_tree_multi.h | 29 +- src/Simplex_tree/concept/SimplexTreeOptions.h | 2 +- .../example/simplex_tree_multi.cpp | 8 +- .../test/simplex_tree_multi_unit_test.cpp | 36 +- 10 files changed, 593 insertions(+), 581 deletions(-) create mode 100644 src/Multi_filtration/include/gudhi/Multi_critical_filtration.h rename src/{Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h => Multi_filtration/include/gudhi/One_critical_filtration.h} (50%) rename src/{Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations => Multi_persistence/include/gudhi}/Box.h (90%) rename src/{Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations => Multi_persistence/include/gudhi}/Line.h (87%) rename src/{Simplex_tree/include/gudhi/Simplex_tree => Multi_persistence/include/gudhi}/Simplex_tree_multi.h (88%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ccd0635dd5..52e2763b41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,8 @@ add_gudhi_module(Toplex_map) add_gudhi_module(Witness_complex) add_gudhi_module(Nerve_GIC) add_gudhi_module(Persistence_matrix) +add_gudhi_module(Multi_persistence) +add_gudhi_module(Multi_filtration) # Include module CMake subdirectories # GUDHI_SUB_DIRECTORIES is managed in CMAKE_MODULE_PATH/GUDHI_modules.cmake diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b7992e03b8..680fcc427e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -45,6 +45,8 @@ add_gudhi_module(Toplex_map) add_gudhi_module(Witness_complex) add_gudhi_module(Nerve_GIC) add_gudhi_module(Persistence_matrix) +add_gudhi_module(Multi_persistence) +add_gudhi_module(Multi_filtration) set(GUDHI_BIBLIO_DIR ${CMAKE_SOURCE_DIR}) # For "make doxygen" - Requires GUDHI_USER_VERSION_DIR to be set diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h new file mode 100644 index 0000000000..8d754ea37a --- /dev/null +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -0,0 +1,500 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): David Loiseaux + * + * Copyright (C) 2023 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#ifndef MULTI_CRITICAL_FILTRATIONS_H_ +#define MULTI_CRITICAL_FILTRATIONS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace Gudhi::multi_filtration { + +/** + * Multi-critical filtration extension to \ref One_critical_filtration . + * If the `co` parameter is set to true, it reverses the poset order, + * i.e., the order \f$\le\f$ in \f$\mathbb R^n\f$ becomes \f$\ge\f$. + * + * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, + * then a new point \f$x\f$ will be in this filtration if there exists an \f$a_i\f$ such that + * \f$a_i \le x\f$. + * + * \ingroup multi_filtration + + */ +template class Multi_critical_filtration { +public: + using value_type = T; + using OneCritical = One_critical_filtration; // Type of the One critical subtype + template + using Base = Multi_critical_filtration; + std::size_t num_parameters() const { return multi_filtration_.size() == 0 ? 0 : multi_filtration_[0].size(); } + Multi_critical_filtration() : multi_filtration_(1) + { + multi_filtration_[0] = co ? One_critical_filtration::inf() : One_critical_filtration::minus_inf(); + }; // initialize at 1, with 0 parameter (consistent with below) + Multi_critical_filtration(int n) + : multi_filtration_({One_critical_filtration( + n)}){}; // minus infinity by default + Multi_critical_filtration(int n, T value) + : multi_filtration_({One_critical_filtration( + n, value)}){}; // std::vector(n, value){}; + Multi_critical_filtration(std::initializer_list init) + : multi_filtration_({One_critical_filtration( + init)}){}; // : std::vector({std::vector(init)}; + Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}){}; + Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}){}; + Multi_critical_filtration(const std::vector> &v) : multi_filtration_(v){}; + Multi_critical_filtration(std::vector> &&v) : multi_filtration_(std::move(v)){}; + Multi_critical_filtration(typename std::vector::iterator it_begin, + typename std::vector::iterator it_end) + : multi_filtration_( + {One_critical_filtration(it_begin, it_end)}){}; + Multi_critical_filtration(typename std::vector::const_iterator it_begin, + typename std::vector::const_iterator it_end) + : multi_filtration_({One_critical_filtration( + it_begin, it_end)}){}; // : std::vector(it_begin, it_end){}; + Multi_critical_filtration(const Multi_critical_filtration &other) + : multi_filtration_(other.multi_filtration_){}; + + Multi_critical_filtration &operator=(const Multi_critical_filtration &other) { + this->multi_filtration_ = other.multi_filtration_; + return *this; + } + inline friend bool + operator==(const Multi_critical_filtration &self, + const Multi_critical_filtration &to_compare) { + if (self.num_generators() != to_compare.num_generators()) + return false; + auto it = to_compare.begin(); + for (auto i = 0u; i < self.num_generators(); i++) { + if (self[i] != *(it++)) + return false; + } + return true; + } + void reserve(std::size_t n) { this->multi_filtration_.reserve(n); } + void set_num_generators(std::size_t n) {this->multi_filtration_.resize(n);} + + inline bool is_inf() const { + return this->multi_filtration_.size() == 1 && + this->multi_filtration_[0].is_inf(); + } + inline bool is_minus_inf() const { + return this->multi_filtration_.size() == 1 && + this->multi_filtration_[0].is_minus_inf(); + } + inline bool is_nan() const { + return this->multi_filtration_.size() == 1 && + this->multi_filtration_[0].is_nan(); + } + inline bool is_finite() const { + if (this->empty()) + return false; + for (auto &stuff : *this) { + if (!stuff.is_finite()) + return false; + } + return true; + } + + operator OneCritical() const { + assert(this->num_generators() == 1); + return this->multi_filtration_[0]; + } + + OneCritical &operator[](std::size_t i) { return this->multi_filtration_[i]; } + inline OneCritical factorize_below() const { + if (this->num_generators() == 0) [[unlikely]] + return OneCritical(); + OneCritical result(multi_filtration_[0].num_parameters(), OneCritical::T_inf); + for (const auto &stuff : this->multi_filtration_) { + if (stuff.is_nan() || stuff.is_minus_inf()) + return stuff; + if (stuff.is_inf()) + continue; + for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { + result[i] = std::min(result[i], stuff[i]); + } + } + return result; + } + /* + * returns the smallest value for the poset order that is bigger than all of the values + * in this multi filtration + */ + inline OneCritical factorize_above() const { + if (this->num_generators() == 0) [[unlikely]] + return OneCritical(); + OneCritical result(multi_filtration_[0].num_parameters(), -OneCritical::T_inf); + for (auto &stuff : this->multi_filtration_) { + if (stuff.is_nan() || stuff.is_inf()) + return stuff; + if (stuff.is_minus_inf()) + continue; + for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { + result[i] = std::max(result[i], stuff[i]); + } + } + return result; + } + /** \brief This functions take the filtration value `this` and pushes it to + * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, + * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb + * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} + * @param[in] x The target filtration value on which to push `this`. + */ + inline void push_to(const One_critical_filtration &x) { + if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) + return; + if (x.is_inf() || this->is_minus_inf()) { + *this = x; + return; + } + for (auto &stuff : *this) { + stuff.push_to(x); + } + } + // TODO : this is not well defined for kcritical <-> kcritical + + /** \brief This functions take the filtration value `this` and pulls it to the + * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the + * value of this is updated to \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : + * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} + * @param[in] x The target filtration value on which to push `this`. + */ + inline void pull_to(const One_critical_filtration &x) { + if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) + return; + if (this->is_inf() || x.is_minus_inf()) { + *this = x; + return; + } + for (auto &stuff : *this) { + stuff.pull_to(x); + } + } + // cannot be const, as gudhi iterators are not const + template inline U linear_projection(const std::vector &x) { + if constexpr (co) { + U projection = std::numeric_limits::lowest(); + for (const auto &y : *this) { + projection = std::max(projection, y.linear_projection(x)); + } + return projection; + } else { + U projection = std::numeric_limits::max(); + for (auto &y : *this) { // cannot be const (Gudhi) + projection = std::min(projection, y.linear_projection(x)); + } + return projection; + } + } + + /* + * Checks if b is cleanable with respect to a + */ + static inline bool dominates(const OneCritical&a, const OneCritical&b, value_type max_error) { + if constexpr (co) + return a - max_error <= b; + else { + return a + max_error >= b; + } + } + + static inline bool dominates(const OneCritical&a, const OneCritical&b) { + if constexpr (co) + return a <= b; + else { + return a >= b; + } + } + static inline bool strictly_dominates(const OneCritical&a, const OneCritical&b) { + if constexpr (co) + return a < b; + else { + return a > b; + } + } + + /* + * Same method as the one in OneCriticalFiltration. + * Given a grid, and assuming that `this` are the coordianates + * in this grid, evaluate `this` into this grid + */ + template + inline Multi_critical_filtration + evaluate_in_grid(const std::vector>& grid) const { + Multi_critical_filtration out(this->num_generators()); + for (std::size_t i = 0; i < this->num_generators(); ++i){ + out[i] = this->operator[](i).evaluate_in_grid(grid); + } + return out; + } + + /* + * Remove redundant values + */ + inline void clean(value_type max_error = 0) { + // A bit ugly, todo : erase+removeif ? + for (std::size_t i = 0; i < multi_filtration_.size(); i++) { + for (std::size_t j = 0; j < multi_filtration_.size(); j++) { + if (i == j) + continue; + if (dominates(multi_filtration_[j], multi_filtration_[i], max_error)) { + multi_filtration_[i].clear(); + } + while (j < multi_filtration_.size() && dominates(multi_filtration_[i], multi_filtration_[j], max_error)) { + multi_filtration_[j].clear(); + i--; + } + } + } + multi_filtration_.erase( + std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [](const One_critical_filtration &a) { + return a.empty(); + }), + multi_filtration_.end()); + } + + + /* + * Adds a birth point to the list of births, + * if it is useful (according to the method `dominate`) + */ + inline void add_point(const One_critical_filtration &x) { + const bool verbose = false; + if (multi_filtration_.empty()) { + if constexpr (verbose) + std::cout << "Adding x=" << x << " (currently empty)" << std::endl; + multi_filtration_.push_back(x); + return; + } + for (const auto &y : multi_filtration_){ + if (dominates(x,y)){ + return; + } + } + if constexpr (verbose) + std::cout << "x: " << x << " is useful, removing unnecessary entries" + << std::endl; + multi_filtration_.erase( + std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [&x](const One_critical_filtration &y) { + if constexpr (verbose) { + if (dominates(y, x)) { + std::cout << "Removing y=" << y << std::endl; + } else { + std::cout << "Keeping y=" << y << std::endl; + } + } + return dominates(y, x); + }), + multi_filtration_.end()); + + multi_filtration_.push_back(x); + } + inline void re_clean(){ + // Ensures all points are useful again. Can be useful if points are added manually. + // TODO : maybe optimize + Multi_critical_filtration out; // should be inf + out.multi_filtration_.reserve(this->multi_filtration_.size()); + for (const auto& x : multi_filtration_){ + out.add_point(x); + } + std::swap(multi_filtration_, out); + } + + // easy debug + inline friend std::ostream &operator<<(std::ostream &stream, + const Multi_critical_filtration &truc) { + if (truc.is_inf()) { + stream << "[inf, ..., inf]"; + return stream; + } + if (truc.is_minus_inf()) { + stream << "[-inf, ..., -inf]"; + return stream; + } + if (truc.is_nan()) { + stream << "[NaN]"; + return stream; + } + stream << "(k=" << truc.multi_filtration_.size() << ")["; + for (const auto &machin : truc) { + stream << machin << "; "; + } + if (truc.multi_filtration_.size() > 0) { + stream << "\b" + << "\b"; + } + stream << "]"; + return stream; + } + inline void clear() { multi_filtration_.clear(); } + inline bool empty() const { return multi_filtration_.empty(); } + inline const OneCritical& operator[] (std::size_t i) const { return multi_filtration_[i]; } + + inline typename std::vector>::iterator + begin() { + return multi_filtration_.begin(); + } + inline typename std::vector>::iterator + end() { + return multi_filtration_.end(); + } + inline typename std::vector< + One_critical_filtration>::const_iterator + begin() const { + return multi_filtration_.begin(); + } + inline typename std::vector< + One_critical_filtration>::const_iterator + end() const { + return multi_filtration_.end(); + } + + + /* + * Same as its one critical counterpart. + * If a grid is given, projects multifiltration_ on this grid and returns + * multi critical filtration composed of the coordinates in the given grid + * + */ + template + inline Multi_critical_filtration + coordinates_in_grid(const std::vector& grid) const { + assert(grid.size() >= this->num_generators()); + Multi_critical_filtration out(this->num_generators()); + for (std::size_t i = 0u; i < this->num_generators(); ++i) { + out[i] = this->multi_filtration_[i].coordinates_in_grid(grid); + } + return out; + } + /* + * Same as `coordinates_in_grid`, but does the operation in-place. + * + */ + template + inline void coordinates_in_grid_inplace(const std::vector& grid, + bool coordinate = true) { + assert(grid.size() >= this->num_generators()); + for (auto &x : this->multi_filtration_) { + x.coordinates_in_grid_inplace(grid, coordinate); + } + } + template inline Multi_critical_filtration astype() const { + std::vector> out(this->num_generators()); + for (std::size_t i = 0u; i < this->num_generators(); ++i) { + out[i] = this->multi_filtration_[i].template astype(); + } + return Multi_critical_filtration(std::move(out)); + } + inline void push_back(const OneCritical& x){ + multi_filtration_.push_back(x); + } + inline const std::vector>& as_vector() const { + return multi_filtration_; + } + + inline std::vector> as_VECTOR() const { + std::vector> out(this->num_generators(), + std::vector(this->num_parameters())); + for (std::size_t i = 0; i < this->num_generators(); ++i) { + for (std::size_t j = 0; j < this->num_parameters(); ++j) { + out[i][j] = multi_filtration_[i][j]; + } + } + return out; + } + + inline void _clean(bool keep_inf=true) { + multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [keep_inf](const OneCritical &a) { + return a.empty() || + ((!keep_inf) && + (a.is_inf() || a.is_minus_inf())); + }), + multi_filtration_.end()); + } + inline std::size_t num_generators() const { + return multi_filtration_.size(); + } + + + + // TODO : this costs a lot... optimize / cheat in some way for python ? + /* + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + * + */ + inline bool operator<(const Multi_critical_filtration &other) const { + //check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him + for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { + for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { + // i(const Multi_critical_filtration &other) const { + return other < *this; + } + + /* + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + */ + inline bool operator<=(const Multi_critical_filtration &other) const { + //check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him + for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { + for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { + // i <= j + if (dominates(other.multi_filtration_[j], multi_filtration_[i])) + continue; + } + return false; + } + return true; + } + /* + * Checks if `this`, seen as a birth curve is over the `other` birth curve, + */ + inline bool operator>=(const Multi_critical_filtration &other) const { + return other <= *this; + } + +public: + // for compiler + constexpr static const T T_inf = One_critical_filtration::T_inf; + constexpr static const bool is_multi_critical = true; + +private: + std::vector> multi_filtration_; +}; + +} // namespace Gudhi::multi_filtration + +#endif // MULTI_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h similarity index 50% rename from src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h rename to src/Multi_filtration/include/gudhi/One_critical_filtration.h index 17b84a7aee..bfc0ae01b4 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -1,7 +1,6 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which - * is released under MIT. See file LICENSE or go to - * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David - +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): David Loiseaux * * Copyright (C) 2023 Inria * @@ -9,8 +8,8 @@ * - YYYY/MM Author: Description of the modification */ -#ifndef FINITELY_CRITICAL_FILTRATIONS_H_ -#define FINITELY_CRITICAL_FILTRATIONS_H_ +#ifndef ONE_CRITICAL_FILTRATIONS_H_ +#define ONE_CRITICAL_FILTRATIONS_H_ #include #include @@ -21,13 +20,13 @@ #include #include -namespace Gudhi::multiparameter::multi_filtrations { +namespace Gudhi::multi_filtration { /** * \brief Vector-like filtration value, for multiparameter persistence, with * numpy-like methods. * - * \ingroup multiparameter + * \ingroup multi_filtration * * \details Child of `std::vector` that has numpy-like pointwise operators. * One critical simplicial filtrations are filtrations such that the lifetime @@ -538,514 +537,29 @@ class One_critical_filtration : public std::vector { constexpr static bool is_multi_critical = false; }; -/** - * Multi-critical filtration extension to \ref One_critical_filtration . - * If the `co` parameter is set to true, it reverses the poset order, - * i.e., the order \f$\le\f$ in \f$\mathbb R^n\f$ becomes \f$\ge\f$. - * - * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, - * then a new point \f$x\f$ will be in this filtration if there exists an \f$a_i\f$ such that - * \f$a_i \le x\f$. - * - */ -template class Multi_critical_filtration { -public: - using value_type = T; - using OneCritical = One_critical_filtration; // Type of the One critical subtype - template - using Base = Multi_critical_filtration; - std::size_t num_parameters() const { return multi_filtration_.size() == 0 ? 0 : multi_filtration_[0].size(); } - Multi_critical_filtration() : multi_filtration_(1) - { - multi_filtration_[0] = co ? One_critical_filtration::inf() : One_critical_filtration::minus_inf(); - }; // initialize at 1, with 0 parameter (consistent with below) - Multi_critical_filtration(int n) - : multi_filtration_({One_critical_filtration( - n)}){}; // minus infinity by default - Multi_critical_filtration(int n, T value) - : multi_filtration_({One_critical_filtration( - n, value)}){}; // std::vector(n, value){}; - Multi_critical_filtration(std::initializer_list init) - : multi_filtration_({One_critical_filtration( - init)}){}; // : std::vector({std::vector(init)}; - Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}){}; - Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}){}; - Multi_critical_filtration(const std::vector> &v) : multi_filtration_(v){}; - Multi_critical_filtration(std::vector> &&v) : multi_filtration_(std::move(v)){}; - Multi_critical_filtration(typename std::vector::iterator it_begin, - typename std::vector::iterator it_end) - : multi_filtration_( - {One_critical_filtration(it_begin, it_end)}){}; - Multi_critical_filtration(typename std::vector::const_iterator it_begin, - typename std::vector::const_iterator it_end) - : multi_filtration_({One_critical_filtration( - it_begin, it_end)}){}; // : std::vector(it_begin, it_end){}; - Multi_critical_filtration(const Multi_critical_filtration &other) - : multi_filtration_(other.multi_filtration_){}; - - Multi_critical_filtration &operator=(const Multi_critical_filtration &other) { - this->multi_filtration_ = other.multi_filtration_; - return *this; - } - inline friend bool - operator==(const Multi_critical_filtration &self, - const Multi_critical_filtration &to_compare) { - if (self.num_generators() != to_compare.num_generators()) - return false; - auto it = to_compare.begin(); - for (auto i = 0u; i < self.num_generators(); i++) { - if (self[i] != *(it++)) - return false; - } - return true; - } - void reserve(std::size_t n) { this->multi_filtration_.reserve(n); } - void set_num_generators(std::size_t n) {this->multi_filtration_.resize(n);} - - inline bool is_inf() const { - return this->multi_filtration_.size() == 1 && - this->multi_filtration_[0].is_inf(); - } - inline bool is_minus_inf() const { - return this->multi_filtration_.size() == 1 && - this->multi_filtration_[0].is_minus_inf(); - } - inline bool is_nan() const { - return this->multi_filtration_.size() == 1 && - this->multi_filtration_[0].is_nan(); - } - inline bool is_finite() const { - if (this->empty()) - return false; - for (auto &stuff : *this) { - if (!stuff.is_finite()) - return false; - } - return true; - } - - operator OneCritical() const { - assert(this->num_generators() == 1); - return this->multi_filtration_[0]; - } - - OneCritical &operator[](std::size_t i) { return this->multi_filtration_[i]; } - inline OneCritical factorize_below() const { - if (this->num_generators() == 0) [[unlikely]] - return OneCritical(); - OneCritical result(multi_filtration_[0].num_parameters(), OneCritical::T_inf); - for (const auto &stuff : this->multi_filtration_) { - if (stuff.is_nan() || stuff.is_minus_inf()) - return stuff; - if (stuff.is_inf()) - continue; - for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { - result[i] = std::min(result[i], stuff[i]); - } - } - return result; - } - /* - * returns the smallest value for the poset order that is bigger than all of the values - * in this multi filtration - */ - inline OneCritical factorize_above() const { - if (this->num_generators() == 0) [[unlikely]] - return OneCritical(); - OneCritical result(multi_filtration_[0].num_parameters(), -OneCritical::T_inf); - for (auto &stuff : this->multi_filtration_) { - if (stuff.is_nan() || stuff.is_inf()) - return stuff; - if (stuff.is_minus_inf()) - continue; - for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { - result[i] = std::max(result[i], stuff[i]); - } - } - return result; - } - /** \brief This functions take the filtration value `this` and pushes it to - * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, - * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb - * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} - * @param[in] x The target filtration value on which to push `this`. - */ - inline void push_to(const One_critical_filtration &x) { - if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) - return; - if (x.is_inf() || this->is_minus_inf()) { - *this = x; - return; - } - for (auto &stuff : *this) { - stuff.push_to(x); - } - } - // TODO : this is not well defined for kcritical <-> kcritical - - /** \brief This functions take the filtration value `this` and pulls it to the - * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the - * value of this is updated to \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : - * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} - * @param[in] x The target filtration value on which to push `this`. - */ - inline void pull_to(const One_critical_filtration &x) { - if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) - return; - if (this->is_inf() || x.is_minus_inf()) { - *this = x; - return; - } - for (auto &stuff : *this) { - stuff.pull_to(x); - } - } - // cannot be const, as gudhi iterators are not const - template inline U linear_projection(const std::vector &x) { - if constexpr (co) { - U projection = std::numeric_limits::lowest(); - for (const auto &y : *this) { - projection = std::max(projection, y.linear_projection(x)); - } - return projection; - } else { - U projection = std::numeric_limits::max(); - for (auto &y : *this) { // cannot be const (Gudhi) - projection = std::min(projection, y.linear_projection(x)); - } - return projection; - } - } - - /* - * Checks if b is cleanable with respect to a - */ - static inline bool dominates(const OneCritical&a, const OneCritical&b, value_type max_error) { - if constexpr (co) - return a - max_error <= b; - else { - return a + max_error >= b; - } - } - - static inline bool dominates(const OneCritical&a, const OneCritical&b) { - if constexpr (co) - return a <= b; - else { - return a >= b; - } - } - static inline bool strictly_dominates(const OneCritical&a, const OneCritical&b) { - if constexpr (co) - return a < b; - else { - return a > b; - } - } - - /* - * Same method as the one in OneCriticalFiltration. - * Given a grid, and assuming that `this` are the coordianates - * in this grid, evaluate `this` into this grid - */ - template - inline Multi_critical_filtration - evaluate_in_grid(const std::vector>& grid) const { - Multi_critical_filtration out(this->num_generators()); - for (std::size_t i = 0; i < this->num_generators(); ++i){ - out[i] = this->operator[](i).evaluate_in_grid(grid); - } - return out; - } - - /* - * Remove redundant values - */ - inline void clean(value_type max_error = 0) { - // A bit ugly, todo : erase+removeif ? - for (std::size_t i = 0; i < multi_filtration_.size(); i++) { - for (std::size_t j = 0; j < multi_filtration_.size(); j++) { - if (i == j) - continue; - if (dominates(multi_filtration_[j], multi_filtration_[i], max_error)) { - multi_filtration_[i].clear(); - } - while (j < multi_filtration_.size() && dominates(multi_filtration_[i], multi_filtration_[j], max_error)) { - multi_filtration_[j].clear(); - i--; - } - } - } - multi_filtration_.erase( - std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [](const One_critical_filtration &a) { - return a.empty(); - }), - multi_filtration_.end()); - } - - - /* - * Adds a birth point to the list of births, - * if it is useful (according to the method `dominate`) - */ - inline void add_point(const One_critical_filtration &x) { - const bool verbose = false; - if (multi_filtration_.empty()) { - if constexpr (verbose) - std::cout << "Adding x=" << x << " (currently empty)" << std::endl; - multi_filtration_.push_back(x); - return; - } - for (const auto &y : multi_filtration_){ - if (dominates(x,y)){ - return; - } - } - if constexpr (verbose) - std::cout << "x: " << x << " is useful, removing unnecessary entries" - << std::endl; - multi_filtration_.erase( - std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [&x](const One_critical_filtration &y) { - if constexpr (verbose) { - if (dominates(y, x)) { - std::cout << "Removing y=" << y << std::endl; - } else { - std::cout << "Keeping y=" << y << std::endl; - } - } - return dominates(y, x); - }), - multi_filtration_.end()); - - multi_filtration_.push_back(x); - } - inline void re_clean(){ - // Ensures all points are useful again. Can be useful if points are added manually. - // TODO : maybe optimize - Multi_critical_filtration out; // should be inf - out.multi_filtration_.reserve(this->multi_filtration_.size()); - for (const auto& x : multi_filtration_){ - out.add_point(x); - } - std::swap(multi_filtration_, out); - } - - // easy debug - inline friend std::ostream &operator<<(std::ostream &stream, - const Multi_critical_filtration &truc) { - if (truc.is_inf()) { - stream << "[inf, ..., inf]"; - return stream; - } - if (truc.is_minus_inf()) { - stream << "[-inf, ..., -inf]"; - return stream; - } - if (truc.is_nan()) { - stream << "[NaN]"; - return stream; - } - stream << "(k=" << truc.multi_filtration_.size() << ")["; - for (const auto &machin : truc) { - stream << machin << "; "; - } - if (truc.multi_filtration_.size() > 0) { - stream << "\b" - << "\b"; - } - stream << "]"; - return stream; - } - inline void clear() { multi_filtration_.clear(); } - inline bool empty() const { return multi_filtration_.empty(); } - inline const OneCritical& operator[] (std::size_t i) const { return multi_filtration_[i]; } - - inline typename std::vector>::iterator - begin() { - return multi_filtration_.begin(); - } - inline typename std::vector>::iterator - end() { - return multi_filtration_.end(); - } - inline typename std::vector< - One_critical_filtration>::const_iterator - begin() const { - return multi_filtration_.begin(); - } - inline typename std::vector< - One_critical_filtration>::const_iterator - end() const { - return multi_filtration_.end(); - } - - - /* - * Same as its one critical counterpart. - * If a grid is given, projects multifiltration_ on this grid and returns - * multi critical filtration composed of the coordinates in the given grid - * - */ - template - inline Multi_critical_filtration - coordinates_in_grid(const std::vector& grid) const { - assert(grid.size() >= this->num_generators()); - Multi_critical_filtration out(this->num_generators()); - for (std::size_t i = 0u; i < this->num_generators(); ++i) { - out[i] = this->multi_filtration_[i].coordinates_in_grid(grid); - } - return out; - } - /* - * Same as `coordinates_in_grid`, but does the operation in-place. - * - */ - template - inline void coordinates_in_grid_inplace(const std::vector& grid, - bool coordinate = true) { - assert(grid.size() >= this->num_generators()); - for (auto &x : this->multi_filtration_) { - x.coordinates_in_grid_inplace(grid, coordinate); - } - } - template inline Multi_critical_filtration astype() const { - std::vector> out(this->num_generators()); - for (std::size_t i = 0u; i < this->num_generators(); ++i) { - out[i] = this->multi_filtration_[i].template astype(); - } - return Multi_critical_filtration(std::move(out)); - } - inline void push_back(const OneCritical& x){ - multi_filtration_.push_back(x); - } - inline const std::vector>& as_vector() const { - return multi_filtration_; - } - - inline std::vector> as_VECTOR() const { - std::vector> out(this->num_generators(), - std::vector(this->num_parameters())); - for (std::size_t i = 0; i < this->num_generators(); ++i) { - for (std::size_t j = 0; j < this->num_parameters(); ++j) { - out[i][j] = multi_filtration_[i][j]; - } - } - return out; - } - - inline void _clean(bool keep_inf=true) { - multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [keep_inf](const OneCritical &a) { - return a.empty() || - ((!keep_inf) && - (a.is_inf() || a.is_minus_inf())); - }), - multi_filtration_.end()); - } - inline std::size_t num_generators() const { - return multi_filtration_.size(); - } - - - - // TODO : this costs a lot... optimize / cheat in some way for python ? - /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - * - */ - inline bool operator<(const Multi_critical_filtration &other) const { - //check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him - for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { - for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { - // i(const Multi_critical_filtration &other) const { - return other < *this; - } - - /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - */ - inline bool operator<=(const Multi_critical_filtration &other) const { - //check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him - for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { - for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { - // i <= j - if (dominates(other.multi_filtration_[j], multi_filtration_[i])) - continue; - } - return false; - } - return true; - } - /* - * Checks if `this`, seen as a birth curve is over the `other` birth curve, - */ - inline bool operator>=(const Multi_critical_filtration &other) const { - return other <= *this; - } - -public: - // for compiler - constexpr static const T T_inf = One_critical_filtration::T_inf; - constexpr static const bool is_multi_critical = true; - -private: - std::vector> multi_filtration_; -}; - -} // namespace Gudhi::multiparameter::multi_filtrations +} // namespace Gudhi::multi_filtration namespace std { template -class numeric_limits> { +class numeric_limits> { public: static constexpr bool has_infinity = std::numeric_limits::has_infinity; - static Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration - infinity() throw() { - return Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration( - 1, std::numeric_limits::infinity()); + static Gudhi::multi_filtration::One_critical_filtration infinity() throw() { + return Gudhi::multi_filtration::One_critical_filtration(1, std::numeric_limits::infinity()); }; - static Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration - minus_infinity() throw() { - return Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration( - 1, -std::numeric_limits::infinity()); + static Gudhi::multi_filtration::One_critical_filtration minus_infinity() throw() { + return Gudhi::multi_filtration::One_critical_filtration(1, -std::numeric_limits::infinity()); }; - static Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration - max() throw() { - return Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration(1, std::numeric_limits::max()); + static Gudhi::multi_filtration::One_critical_filtration max() throw() { + return Gudhi::multi_filtration::One_critical_filtration(1, std::numeric_limits::max()); }; - static Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration - quiet_NaN() throw() { - return Gudhi::multiparameter::multi_filtrations:: - One_critical_filtration(1, - numeric_limits::quiet_NaN()); + static Gudhi::multi_filtration::One_critical_filtrationquiet_NaN() throw() { + return Gudhi::multi_filtration::One_critical_filtration(1, numeric_limits::quiet_NaN()); }; }; } // namespace std -#endif // FINITELY_CRITICAL_FILTRATIONS_H_ +#endif // ONE_CRITICAL_FILTRATIONS_H_ diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h b/src/Multi_persistence/include/gudhi/Box.h similarity index 90% rename from src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h rename to src/Multi_persistence/include/gudhi/Box.h index f7ce8ef5d2..961db27c90 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Box.h +++ b/src/Multi_persistence/include/gudhi/Box.h @@ -1,36 +1,32 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which - * is released under MIT. See file LICENSE or go to - * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David - * Loiseaux +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): David Loiseaux * * Copyright (C) 2023 Inria * * Modification(s): * - YYYY/MM Author: Description of the modification */ -/** - * @file box.h - * @author David Loiseaux - * @brief BOX. - */ + #ifndef BOX_H_INCLUDED #define BOX_H_INCLUDED -#include #include #include -#include "Finitely_critical_filtrations.h" +#include + + +namespace Gudhi::multi_persistence { /** * @brief Simple box in \f$\mathbb R^n\f$ . + * + * @ingroup multi_persistence */ - -namespace Gudhi::multiparameter::multi_filtrations { - template class Box { - using point_type = One_critical_filtration; + using point_type = Gudhi::multi_filtration::One_critical_filtration; public: Box(); @@ -177,6 +173,6 @@ template inline void Box::threshold_down(point_type &x) const { return; } -} // namespace Gudhi::multiparameter::multi_filtrations +} // namespace Gudhi::multi_persistence #endif // BOX_H_INCLUDED diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h b/src/Multi_persistence/include/gudhi/Line.h similarity index 87% rename from src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h rename to src/Multi_persistence/include/gudhi/Line.h index 3bc69638c5..453cb31f05 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/multi_filtrations/Line.h +++ b/src/Multi_persistence/include/gudhi/Line.h @@ -1,36 +1,39 @@ -/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which - * is released under MIT. See file LICENSE or go to - * https://gudhi.inria.fr/licensing/ for full license details. Author(s): David - * Loiseaux +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): David Loiseaux * - * tCopyright (C) 2023 Inria + * Copyright (C) 2023 Inria * * Modification(s): * - YYYY/MM Author: Description of the modification */ + #ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED #define LINE_FILTRATION_TRANSLATION_H_INCLUDED -#include "Box.h" -#include "Finitely_critical_filtrations.h" #include #include -namespace Gudhi::multiparameter::multi_filtrations { +#include +#include +#include + +namespace Gudhi::multi_persistence { -/* -* A line in \f$\mathbb R^n\f$, with some helpers to project points on it. -* When the direction is not given, it is assumed to be diagonal. -* As the line has a builtin parametrization, points in \f$\mathbb R^n\f$ -* that are on a line are given a time parameter in \f$\mathbb R\f$. -* The method that end with a 2 returns the time t, while the other -* ones return the full coordinates -*/ +/* A line in \f$\mathbb R^n\f$, with some helpers to project points on it. + * When the direction is not given, it is assumed to be diagonal. + * As the line has a builtin parametrization, points in \f$\mathbb R^n\f$ + * that are on a line are given a time parameter in \f$\mathbb R\f$. + * The method that end with a 2 returns the time t, while the other + * ones return the full coordinates + * + * @ingroup multi_persistence + */ template class Line { public: - using point_type = One_critical_filtration; - using kcritical_point_type = Multi_critical_filtration; + using point_type = Gudhi::multi_filtration::One_critical_filtration; + using kcritical_point_type = Gudhi::multi_filtration::Multi_critical_filtration; /* * Checks that the argument define a correct, positively slopped line. */ @@ -95,7 +98,7 @@ template class Line { }; template inline bool Line::check_direction() const { bool is_trivial=true; - for (const auto& stuff : basepoint_){ + for (const auto& stuff : basepOne_critical_filtrationoint_){ if (!stuff){ is_trivial = false;} if (stuff < 0){ throw std::invalid_argument("Direction should have positive entries.");} } @@ -113,7 +116,7 @@ Line::Line(const point_type &x, const point_type &v) : basepoint_(x), direction_(v) {check_direction();} -template +template One_critical_filtration inline typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy if (x.is_inf() || x.is_nan() || x.is_minus_inf()) @@ -257,6 +260,6 @@ Line::get_bounds(const Box &box) const { return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; } -} // namespace Gudhi::multiparameter::multi_filtrations +} // namespace Gudhi::multi_persistence #endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h b/src/Multi_persistence/include/gudhi/Simplex_tree_multi.h similarity index 88% rename from src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h rename to src/Multi_persistence/include/gudhi/Simplex_tree_multi.h index d43b047143..fd8a27fa53 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_multi.h +++ b/src/Multi_persistence/include/gudhi/Simplex_tree_multi.h @@ -14,8 +14,11 @@ #include #include -namespace Gudhi::multiparameter { -/** Model of SimplexTreeOptions, with a multiparameter filtration. */ +namespace Gudhi::multi_persistence { + +/** Model of SimplexTreeOptions, with a multiparameter filtration. + * \ingroup multi_persistence + * */ template struct Simplex_tree_options_multidimensional_filtration { public: @@ -36,14 +39,13 @@ struct Simplex_tree_options_multidimensional_filtration { * \brief Turns a 1-parameter simplextree into a multiparameter simplextree, * and keeps the 1-filtration in the 1st axis. * Default values can be specified. - * \ingroup multiparameter + * \ingroup multi_persistence * \tparam simplextree_std A non-multi simplextree * \tparam simplextree_multi A multi simplextree * \param st Simplextree to copy * \param st_multi Multiparameter simplextree container to fill. - * \param default_values If given, this vector is assume to be of size - * `num_parameters-1` and contains the default values of axes `1` to - * `num_parameters`. + * \param default_values If given, this vector is assume to be of size `num_parameters-1` and contains the default + * values of axes `1` to `num_parameters`. * */ template void multify(simplextree_std &st, simplextree_multi &st_multi, @@ -94,11 +96,13 @@ void multify(simplextree_std &st, simplextree_multi &st_multi, /** * \brief Turns a multiparameter-parameter simplextree into a 1-parameter - * simplextree. \ingroup multiparameter \tparam simplextree_std A non-multi - * simplextree \tparam simplextree_multi A multi simplextree \param st - * Simplextree to fill. \param st_multi Multiparameter simplextree to convert - * into a 1 parameter simplex tree. \param dimension The filtration parameter to - * put into the 1 parameter simplextree. + * simplextree. + * \ingroup multi_persistence + * \tparam simplextree_std A non-multi simplextree + * \tparam simplextree_multi A multi simplextree + * \param st Simplextree to fill. + * \param st_multi Multiparameter simplextree to convert into a 1 parameter simplex tree. + * \param dimension The filtration parameter to put into the 1 parameter simplextree. * */ template void flatten(simplextree_std &st, simplextree_multi &st_multi, @@ -122,7 +126,6 @@ void flatten(simplextree_std &st, simplextree_multi &st_multi, } } - -} // namespace Gudhi::multiparameter +} // namespace Gudhi::multi_persistence #endif // SIMPLEX_TREE_MULTI_H_ diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h index d4aad91603..9050211dc7 100644 --- a/src/Simplex_tree/concept/SimplexTreeOptions.h +++ b/src/Simplex_tree/concept/SimplexTreeOptions.h @@ -44,7 +44,7 @@ struct SimplexTreeOptions { /// which has a `push_to` method that allows to push the filtration value `this` onto the set of points /// \f$ \{ y\in \mathrm{Filtration_value} : y\geq x\}\f$ /// that are greater than another filtration value \f$ x \f$. - /// An example of such a class is Gudhi::multiparameter::multi_filtrations::Finitely_critical_multi_filtration . + /// An example of such a class is Gudhi::multi_persistence::Finitely_critical_multi_filtration . static const bool is_multi_parameter; }; diff --git a/src/Simplex_tree/example/simplex_tree_multi.cpp b/src/Simplex_tree/example/simplex_tree_multi.cpp index 9ac7448bb0..aa81150cd2 100644 --- a/src/Simplex_tree/example/simplex_tree_multi.cpp +++ b/src/Simplex_tree/example/simplex_tree_multi.cpp @@ -9,8 +9,7 @@ */ #include -#include -#include +#include #include #include @@ -20,7 +19,7 @@ struct ST_MULTI { typedef Gudhi::linear_indexing_tag Indexing_tag; typedef int Vertex_handle; typedef float value_type; - using Filtration_value = Gudhi::multiparameter::multi_filtrations::One_critical_filtration; + using Filtration_value = Gudhi::multi_filtration::One_critical_filtration; typedef std::uint32_t Simplex_key; static const bool store_key = true; static const bool store_filtration = true; @@ -52,6 +51,7 @@ int main() { ST::Simplex_handle e = st.find(edge02); // Finitely_critical_multi_filtration has an operator<< std::cout << st.filtration(e) << std::endl; - GUDHI_CHECK(st.filtration(st.find(edge03)) == ST_MULTI::Filtration_value({4, 5, 6}), "edge03 does not have the right value."); + GUDHI_CHECK(st.filtration(st.find(edge03)) == ST_MULTI::Filtration_value({4, 5, 6}), + "edge03 does not have the right value."); } diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 2e9949c750..a801124115 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -25,22 +25,16 @@ #include #include -// ^ -// /!\ Nothing else from Simplex_tree shall be included to test includes are well defined. -#include "gudhi/Simplex_tree/Simplex_tree_multi.h" -#include "gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h" +#include +#include +#include using namespace Gudhi; -using namespace Gudhi::multiparameter; -using Gudhi::multiparameter::multi_filtrations::One_critical_filtration; -using Gudhi::multiparameter::multi_filtrations::Multi_critical_filtration; -using namespace Gudhi; -using namespace Gudhi::multiparameter; -using OneCriticalFiltration = One_critical_filtration; -using KCriticalFiltration = Multi_critical_filtration; +using OneCriticalFiltration = Gudhi::multi_filtration::One_critical_filtration; +using Stree_options_multi_filtration = Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration; using typeST_STD = Simplex_tree; -using Stree_multi = Simplex_tree>; +using Stree_multi = Simplex_tree; typedef boost::mpl::list list_of_tested_variants; @@ -106,10 +100,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_when_empty, typeST, list_of_tested_va test_iterators_on_empty_simplex_tree(st); } -bool AreAlmostTheSame(float a, float b) { - return std::fabs(a - b) < std::numeric_limits::epsilon(); -} -bool AreAlmostTheSame(One_critical_filtration a, One_critical_filtration b) { +bool AreAlmostTheSame(Gudhi::multi_filtration::One_critical_filtration a, + Gudhi::multi_filtration::One_critical_filtration b) { assert(a.size() == b.size()); for (auto i=0u; i std::numeric_limits::epsilon()) @@ -661,7 +653,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia st.insert_simplex_and_subfaces({1,2,3}, 1.); BOOST_CHECK(st.get_number_of_parameters() == 1); int num_parameters = 3; - Gudhi::multiparameter::multify(st,st_multi,num_parameters,{2.,3.}); //fills st_multi by simplices of filtration [{st.filtration(sh)}, default_values[0],default_values[1], ...] + Gudhi::multi_persistence::multify(st,st_multi,num_parameters,{2.,3.}); //fills st_multi by simplices of filtration [{st.filtration(sh)}, default_values[0],default_values[1], ...] BOOST_CHECK(st_multi.get_number_of_parameters() == num_parameters); // num parameters is defined by multify BOOST_CHECK(st_multi.num_simplices() == st.num_simplices()); // simplicial complexes should be the same for (auto sh : st_multi.complex_simplex_range()){ @@ -673,7 +665,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia for (int dimension=0; dimension < 3; dimension++){ st.clear(); - Gudhi::multiparameter::flatten(st, st_multi, dimension); + Gudhi::multi_persistence::flatten(st, st_multi, dimension); for (auto sh : st.complex_simplex_range()){ BOOST_CHECK(st.filtration(sh) == dimension +1); } @@ -682,7 +674,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multify_simplex_tree, typeST, list_of_tested_varia // std::clog << "********************************************************************" << std::endl; // std::clog << "TEST LINEAR PROJECTION" << std::endl; // // st has already the same simplicial complex as st_multi, and the filtration values of st_multi are all {1,2,3} - // Gudhi::multiparameter::linear_projection(st,st_multi,{17,37,73}); // sets the filtration values of st to the dot product of st_multi.filtration and {17,37,73}. + // Gudhi::multi_persistence::linear_projection(st,st_multi,{17,37,73}); // sets the filtration values of st to the dot product of st_multi.filtration and {17,37,73}. // for (auto sh : st.complex_simplex_range()){ // BOOST_CHECK(st.filtration(sh) == 1*17 + 2*37 + 3*73); // } @@ -823,7 +815,7 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_filtration_multify) { Stree_multi st_multi; OneCriticalFiltration default_multi (3, std::numeric_limits::quiet_NaN()); - Gudhi::multiparameter::multify(st, st_multi, 3, default_multi); + Gudhi::multi_persistence::multify(st, st_multi, 3, default_multi); for (auto f_simplex : st_multi.complex_simplex_range()) { std::clog << "vertex = ("; @@ -839,13 +831,13 @@ BOOST_AUTO_TEST_CASE(simplex_tree_multi_filtration_multify) { { Simplex_tree<> copy; - Gudhi::multiparameter::flatten(copy, st_multi, 0); + Gudhi::multi_persistence::flatten(copy, st_multi, 0); BOOST_CHECK(st == copy); } { Simplex_tree<> copy; - Gudhi::multiparameter::flatten(copy, st_multi, 1); + Gudhi::multi_persistence::flatten(copy, st_multi, 1); for (auto f_simplex : copy.complex_simplex_range()) { std::clog << "vertex = ("; for (auto vertex : copy.simplex_vertex_range(f_simplex)) { From a42608ece812a62c49dbb145fbfef82cd30d9129 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 20 Aug 2024 11:53:51 +0200 Subject: [PATCH 63/87] Bad copy/paste from editor --- src/Multi_persistence/include/gudhi/Line.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Multi_persistence/include/gudhi/Line.h b/src/Multi_persistence/include/gudhi/Line.h index 453cb31f05..fe98bc860f 100644 --- a/src/Multi_persistence/include/gudhi/Line.h +++ b/src/Multi_persistence/include/gudhi/Line.h @@ -98,7 +98,7 @@ template class Line { }; template inline bool Line::check_direction() const { bool is_trivial=true; - for (const auto& stuff : basepOne_critical_filtrationoint_){ + for (const auto& stuff : basepoint_){ if (!stuff){ is_trivial = false;} if (stuff < 0){ throw std::invalid_argument("Direction should have positive entries.");} } @@ -116,7 +116,7 @@ Line::Line(const point_type &x, const point_type &v) : basepoint_(x), direction_(v) {check_direction();} -template One_critical_filtration +template inline typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy if (x.is_inf() || x.is_nan() || x.is_minus_inf()) @@ -134,8 +134,8 @@ Line::push_forward(point_type x) const { // TODO remove copy template template inline U Line::push_forward2(const point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf() || x.is_nan()) return inf; @@ -164,8 +164,8 @@ inline U Line::push_forward2(const point_type &x) const { template template inline U Line::push_forward2(const kcritical_point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf() || x.is_nan()) return inf; @@ -196,8 +196,8 @@ inline typename Line::point_type Line::push_back(point_type x) const { template template inline U Line::push_back2(const point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf()) return inf; @@ -228,8 +228,8 @@ template template inline U Line::push_back2(const kcritical_point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() + constexpr const U inf = std::numeric_limits::has_infinity ? + std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf()) return inf; From 893fbf66ac3168df482b9d5d73e4f02acd179a09 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 20 Aug 2024 11:59:44 +0200 Subject: [PATCH 64/87] Move Line and Box in a Multi_persistence folder to enhance inclusion of iles --- .../include/gudhi/{ => Multi_persistence}/Box.h | 0 .../include/gudhi/{ => Multi_persistence}/Line.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/Multi_persistence/include/gudhi/{ => Multi_persistence}/Box.h (100%) rename src/Multi_persistence/include/gudhi/{ => Multi_persistence}/Line.h (99%) diff --git a/src/Multi_persistence/include/gudhi/Box.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h similarity index 100% rename from src/Multi_persistence/include/gudhi/Box.h rename to src/Multi_persistence/include/gudhi/Multi_persistence/Box.h diff --git a/src/Multi_persistence/include/gudhi/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h similarity index 99% rename from src/Multi_persistence/include/gudhi/Line.h rename to src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index fe98bc860f..f04879e338 100644 --- a/src/Multi_persistence/include/gudhi/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -17,7 +17,7 @@ #include #include -#include +#include namespace Gudhi::multi_persistence { From ffaf00448f552cb50eacf94422c88b80a9e595f8 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 20 Aug 2024 12:03:05 +0200 Subject: [PATCH 65/87] Add example in doc --- src/common/doc/examples.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/doc/examples.h b/src/common/doc/examples.h index 2fa0c7c007..89d3380f15 100644 --- a/src/common/doc/examples.h +++ b/src/common/doc/examples.h @@ -18,6 +18,7 @@ * @example simple_simplex_tree.cpp * @example simplex_tree_from_cliques_of_graph.cpp * @example example_alpha_shapes_3_simplex_tree_from_off_file.cpp + * @example simplex_tree_multi.cpp * \section Persistent_cohomology_example_section Persistent_cohomology * @example custom_persistence_sort.cpp * @example rips_persistence_step_by_step.cpp @@ -135,4 +136,3 @@ * \section Persistence_fields_example_section Persistence_field * @example example_field_operations.cpp */ - From be3ba489fd9b17557bc43d89a42d70ad8c6b717e Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 20 Aug 2024 13:51:58 +0200 Subject: [PATCH 66/87] clang-format moved files --- .../include/gudhi/Multi_critical_filtration.h | 317 ++++++++---------- .../include/gudhi/One_critical_filtration.h | 315 +++++++---------- .../include/gudhi/Multi_persistence/Box.h | 60 ++-- .../include/gudhi/Multi_persistence/Line.h | 190 +++++------ 4 files changed, 361 insertions(+), 521 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 8d754ea37a..02d34781b6 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -25,89 +25,70 @@ namespace Gudhi::multi_filtration { /** - * Multi-critical filtration extension to \ref One_critical_filtration . + * Multi-critical filtration extension to \ref One_critical_filtration . * If the `co` parameter is set to true, it reverses the poset order, - * i.e., the order \f$\le\f$ in \f$\mathbb R^n\f$ becomes \f$\ge\f$. + * i.e., the order \f$\le\f$ in \f$\mathbb R^n\f$ becomes \f$\ge\f$. * * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, - * then a new point \f$x\f$ will be in this filtration if there exists an \f$a_i\f$ such that + * then a new point \f$x\f$ will be in this filtration if there exists an \f$a_i\f$ such that * \f$a_i \le x\f$. * * \ingroup multi_filtration - + */ -template class Multi_critical_filtration { -public: +template +class Multi_critical_filtration { + public: using value_type = T; - using OneCritical = One_critical_filtration; // Type of the One critical subtype + using OneCritical = One_critical_filtration; // Type of the One critical subtype template using Base = Multi_critical_filtration; std::size_t num_parameters() const { return multi_filtration_.size() == 0 ? 0 : multi_filtration_[0].size(); } - Multi_critical_filtration() : multi_filtration_(1) - { - multi_filtration_[0] = co ? One_critical_filtration::inf() : One_critical_filtration::minus_inf(); - }; // initialize at 1, with 0 parameter (consistent with below) + Multi_critical_filtration() : multi_filtration_(1) { + multi_filtration_[0] = co ? One_critical_filtration::inf() : One_critical_filtration::minus_inf(); + }; // initialize at 1, with 0 parameter (consistent with below) Multi_critical_filtration(int n) - : multi_filtration_({One_critical_filtration( - n)}){}; // minus infinity by default + : multi_filtration_({One_critical_filtration(n)}) {}; // minus infinity by default Multi_critical_filtration(int n, T value) - : multi_filtration_({One_critical_filtration( - n, value)}){}; // std::vector(n, value){}; + : multi_filtration_({One_critical_filtration(n, value)}) {}; // std::vector(n, value){}; Multi_critical_filtration(std::initializer_list init) - : multi_filtration_({One_critical_filtration( - init)}){}; // : std::vector({std::vector(init)}; - Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}){}; - Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}){}; - Multi_critical_filtration(const std::vector> &v) : multi_filtration_(v){}; - Multi_critical_filtration(std::vector> &&v) : multi_filtration_(std::move(v)){}; - Multi_critical_filtration(typename std::vector::iterator it_begin, - typename std::vector::iterator it_end) - : multi_filtration_( - {One_critical_filtration(it_begin, it_end)}){}; + : multi_filtration_({One_critical_filtration(init)}) {}; // : std::vector({std::vector(init)}; + Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}) {}; + Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}) {}; + Multi_critical_filtration(const std::vector> &v) : multi_filtration_(v) {}; + Multi_critical_filtration(std::vector> &&v) : multi_filtration_(std::move(v)) {}; + Multi_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) + : multi_filtration_({One_critical_filtration(it_begin, it_end)}) {}; Multi_critical_filtration(typename std::vector::const_iterator it_begin, - typename std::vector::const_iterator it_end) - : multi_filtration_({One_critical_filtration( - it_begin, it_end)}){}; // : std::vector(it_begin, it_end){}; - Multi_critical_filtration(const Multi_critical_filtration &other) - : multi_filtration_(other.multi_filtration_){}; + typename std::vector::const_iterator it_end) + : multi_filtration_({One_critical_filtration(it_begin, it_end)}) {}; // : std::vector(it_begin, it_end){}; + Multi_critical_filtration(const Multi_critical_filtration &other) : multi_filtration_(other.multi_filtration_) {}; Multi_critical_filtration &operator=(const Multi_critical_filtration &other) { this->multi_filtration_ = other.multi_filtration_; return *this; } - inline friend bool - operator==(const Multi_critical_filtration &self, - const Multi_critical_filtration &to_compare) { - if (self.num_generators() != to_compare.num_generators()) - return false; + inline friend bool operator==(const Multi_critical_filtration &self, + const Multi_critical_filtration &to_compare) { + if (self.num_generators() != to_compare.num_generators()) return false; auto it = to_compare.begin(); for (auto i = 0u; i < self.num_generators(); i++) { - if (self[i] != *(it++)) - return false; + if (self[i] != *(it++)) return false; } return true; } void reserve(std::size_t n) { this->multi_filtration_.reserve(n); } - void set_num_generators(std::size_t n) {this->multi_filtration_.resize(n);} + void set_num_generators(std::size_t n) { this->multi_filtration_.resize(n); } - inline bool is_inf() const { - return this->multi_filtration_.size() == 1 && - this->multi_filtration_[0].is_inf(); - } + inline bool is_inf() const { return this->multi_filtration_.size() == 1 && this->multi_filtration_[0].is_inf(); } inline bool is_minus_inf() const { - return this->multi_filtration_.size() == 1 && - this->multi_filtration_[0].is_minus_inf(); - } - inline bool is_nan() const { - return this->multi_filtration_.size() == 1 && - this->multi_filtration_[0].is_nan(); + return this->multi_filtration_.size() == 1 && this->multi_filtration_[0].is_minus_inf(); } + inline bool is_nan() const { return this->multi_filtration_.size() == 1 && this->multi_filtration_[0].is_nan(); } inline bool is_finite() const { - if (this->empty()) - return false; + if (this->empty()) return false; for (auto &stuff : *this) { - if (!stuff.is_finite()) - return false; + if (!stuff.is_finite()) return false; } return true; } @@ -123,10 +104,8 @@ template class Multi_critical_filtration { return OneCritical(); OneCritical result(multi_filtration_[0].num_parameters(), OneCritical::T_inf); for (const auto &stuff : this->multi_filtration_) { - if (stuff.is_nan() || stuff.is_minus_inf()) - return stuff; - if (stuff.is_inf()) - continue; + if (stuff.is_nan() || stuff.is_minus_inf()) return stuff; + if (stuff.is_inf()) continue; for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { result[i] = std::min(result[i], stuff[i]); } @@ -142,10 +121,8 @@ template class Multi_critical_filtration { return OneCritical(); OneCritical result(multi_filtration_[0].num_parameters(), -OneCritical::T_inf); for (auto &stuff : this->multi_filtration_) { - if (stuff.is_nan() || stuff.is_inf()) - return stuff; - if (stuff.is_minus_inf()) - continue; + if (stuff.is_nan() || stuff.is_inf()) return stuff; + if (stuff.is_minus_inf()) continue; for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { result[i] = std::max(result[i], stuff[i]); } @@ -159,8 +136,7 @@ template class Multi_critical_filtration { * @param[in] x The target filtration value on which to push `this`. */ inline void push_to(const One_critical_filtration &x) { - if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) - return; + if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; if (x.is_inf() || this->is_minus_inf()) { *this = x; return; @@ -178,8 +154,7 @@ template class Multi_critical_filtration { * @param[in] x The target filtration value on which to push `this`. */ inline void pull_to(const One_critical_filtration &x) { - if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) - return; + if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; if (this->is_inf() || x.is_minus_inf()) { *this = x; return; @@ -187,9 +162,10 @@ template class Multi_critical_filtration { for (auto &stuff : *this) { stuff.pull_to(x); } - } + } // cannot be const, as gudhi iterators are not const - template inline U linear_projection(const std::vector &x) { + template + inline U linear_projection(const std::vector &x) { if constexpr (co) { U projection = std::numeric_limits::lowest(); for (const auto &y : *this) { @@ -198,7 +174,7 @@ template class Multi_critical_filtration { return projection; } else { U projection = std::numeric_limits::max(); - for (auto &y : *this) { // cannot be const (Gudhi) + for (auto &y : *this) { // cannot be const (Gudhi) projection = std::min(projection, y.linear_projection(x)); } return projection; @@ -206,9 +182,9 @@ template class Multi_critical_filtration { } /* - * Checks if b is cleanable with respect to a - */ - static inline bool dominates(const OneCritical&a, const OneCritical&b, value_type max_error) { + * Checks if b is cleanable with respect to a + */ + static inline bool dominates(const OneCritical &a, const OneCritical &b, value_type max_error) { if constexpr (co) return a - max_error <= b; else { @@ -216,14 +192,14 @@ template class Multi_critical_filtration { } } - static inline bool dominates(const OneCritical&a, const OneCritical&b) { + static inline bool dominates(const OneCritical &a, const OneCritical &b) { if constexpr (co) return a <= b; else { return a >= b; } } - static inline bool strictly_dominates(const OneCritical&a, const OneCritical&b) { + static inline bool strictly_dominates(const OneCritical &a, const OneCritical &b) { if constexpr (co) return a < b; else { @@ -232,29 +208,27 @@ template class Multi_critical_filtration { } /* - * Same method as the one in OneCriticalFiltration. - * Given a grid, and assuming that `this` are the coordianates - * in this grid, evaluate `this` into this grid - */ + * Same method as the one in OneCriticalFiltration. + * Given a grid, and assuming that `this` are the coordianates + * in this grid, evaluate `this` into this grid + */ template - inline Multi_critical_filtration - evaluate_in_grid(const std::vector>& grid) const { + inline Multi_critical_filtration evaluate_in_grid(const std::vector> &grid) const { Multi_critical_filtration out(this->num_generators()); - for (std::size_t i = 0; i < this->num_generators(); ++i){ + for (std::size_t i = 0; i < this->num_generators(); ++i) { out[i] = this->operator[](i).evaluate_in_grid(grid); } return out; } - + /* - * Remove redundant values - */ + * Remove redundant values + */ inline void clean(value_type max_error = 0) { // A bit ugly, todo : erase+removeif ? for (std::size_t i = 0; i < multi_filtration_.size(); i++) { for (std::size_t j = 0; j < multi_filtration_.size(); j++) { - if (i == j) - continue; + if (i == j) continue; if (dominates(multi_filtration_[j], multi_filtration_[i], max_error)) { multi_filtration_[i].clear(); } @@ -264,65 +238,56 @@ template class Multi_critical_filtration { } } } - multi_filtration_.erase( - std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [](const One_critical_filtration &a) { - return a.empty(); - }), - multi_filtration_.end()); + multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [](const One_critical_filtration &a) { return a.empty(); }), + multi_filtration_.end()); } - /* - * Adds a birth point to the list of births, - * if it is useful (according to the method `dominate`) - */ + * Adds a birth point to the list of births, + * if it is useful (according to the method `dominate`) + */ inline void add_point(const One_critical_filtration &x) { const bool verbose = false; if (multi_filtration_.empty()) { - if constexpr (verbose) - std::cout << "Adding x=" << x << " (currently empty)" << std::endl; + if constexpr (verbose) std::cout << "Adding x=" << x << " (currently empty)" << std::endl; multi_filtration_.push_back(x); return; } - for (const auto &y : multi_filtration_){ - if (dominates(x,y)){ + for (const auto &y : multi_filtration_) { + if (dominates(x, y)) { return; } } - if constexpr (verbose) - std::cout << "x: " << x << " is useful, removing unnecessary entries" - << std::endl; - multi_filtration_.erase( - std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [&x](const One_critical_filtration &y) { - if constexpr (verbose) { - if (dominates(y, x)) { - std::cout << "Removing y=" << y << std::endl; - } else { - std::cout << "Keeping y=" << y << std::endl; - } - } - return dominates(y, x); - }), - multi_filtration_.end()); + if constexpr (verbose) std::cout << "x: " << x << " is useful, removing unnecessary entries" << std::endl; + multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), + [&x](const One_critical_filtration &y) { + if constexpr (verbose) { + if (dominates(y, x)) { + std::cout << "Removing y=" << y << std::endl; + } else { + std::cout << "Keeping y=" << y << std::endl; + } + } + return dominates(y, x); + }), + multi_filtration_.end()); multi_filtration_.push_back(x); } - inline void re_clean(){ + inline void re_clean() { // Ensures all points are useful again. Can be useful if points are added manually. // TODO : maybe optimize - Multi_critical_filtration out; // should be inf + Multi_critical_filtration out; // should be inf out.multi_filtration_.reserve(this->multi_filtration_.size()); - for (const auto& x : multi_filtration_){ + for (const auto &x : multi_filtration_) { out.add_point(x); } std::swap(multi_filtration_, out); } // easy debug - inline friend std::ostream &operator<<(std::ostream &stream, - const Multi_critical_filtration &truc) { + inline friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &truc) { if (truc.is_inf()) { stream << "[inf, ..., inf]"; return stream; @@ -348,14 +313,14 @@ template class Multi_critical_filtration { } inline void clear() { multi_filtration_.clear(); } inline bool empty() const { return multi_filtration_.empty(); } - inline const OneCritical& operator[] (std::size_t i) const { return multi_filtration_[i]; } + inline const OneCritical &operator[](std::size_t i) const { return multi_filtration_[i]; } - inline typename std::vector>::iterator - begin() { + inline typename std::vector>::iterator begin() { return multi_filtration_.begin(); } + inline typename std::vector>::iterator end() { return multi_filtration_.end(); } + inline typename std::vector>::const_iterator begin() const { return multi_filtration_.begin(); } - inline typename std::vector>::iterator - end() { + inline typename std::vector>::const_iterator end() const { return multi_filtration_.end(); } inline typename std::vector< @@ -371,14 +336,13 @@ template class Multi_critical_filtration { /* - * Same as its one critical counterpart. - * If a grid is given, projects multifiltration_ on this grid and returns - * multi critical filtration composed of the coordinates in the given grid - * - */ + * Same as its one critical counterpart. + * If a grid is given, projects multifiltration_ on this grid and returns + * multi critical filtration composed of the coordinates in the given grid + * + */ template - inline Multi_critical_filtration - coordinates_in_grid(const std::vector& grid) const { + inline Multi_critical_filtration coordinates_in_grid(const std::vector &grid) const { assert(grid.size() >= this->num_generators()); Multi_critical_filtration out(this->num_generators()); for (std::size_t i = 0u; i < this->num_generators(); ++i) { @@ -387,34 +351,29 @@ template class Multi_critical_filtration { return out; } /* - * Same as `coordinates_in_grid`, but does the operation in-place. - * - */ + * Same as `coordinates_in_grid`, but does the operation in-place. + * + */ template - inline void coordinates_in_grid_inplace(const std::vector& grid, - bool coordinate = true) { + inline void coordinates_in_grid_inplace(const std::vector &grid, bool coordinate = true) { assert(grid.size() >= this->num_generators()); for (auto &x : this->multi_filtration_) { x.coordinates_in_grid_inplace(grid, coordinate); } } - template inline Multi_critical_filtration astype() const { + template + inline Multi_critical_filtration astype() const { std::vector> out(this->num_generators()); for (std::size_t i = 0u; i < this->num_generators(); ++i) { out[i] = this->multi_filtration_[i].template astype(); } return Multi_critical_filtration(std::move(out)); } - inline void push_back(const OneCritical& x){ - multi_filtration_.push_back(x); - } - inline const std::vector>& as_vector() const { - return multi_filtration_; - } + inline void push_back(const OneCritical &x) { multi_filtration_.push_back(x); } + inline const std::vector> &as_vector() const { return multi_filtration_; } inline std::vector> as_VECTOR() const { - std::vector> out(this->num_generators(), - std::vector(this->num_parameters())); + std::vector> out(this->num_generators(), std::vector(this->num_parameters())); for (std::size_t i = 0; i < this->num_generators(); ++i) { for (std::size_t j = 0; j < this->num_parameters(); ++j) { out[i][j] = multi_filtration_[i][j]; @@ -423,78 +382,66 @@ template class Multi_critical_filtration { return out; } - inline void _clean(bool keep_inf=true) { + inline void _clean(bool keep_inf = true) { multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [keep_inf](const OneCritical &a) { - return a.empty() || - ((!keep_inf) && - (a.is_inf() || a.is_minus_inf())); - }), + [keep_inf](const OneCritical &a) { + return a.empty() || ((!keep_inf) && (a.is_inf() || a.is_minus_inf())); + }), multi_filtration_.end()); } - inline std::size_t num_generators() const { - return multi_filtration_.size(); - } - - + inline std::size_t num_generators() const { return multi_filtration_.size(); } // TODO : this costs a lot... optimize / cheat in some way for python ? /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - * - */ - inline bool operator<(const Multi_critical_filtration &other) const { - //check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + * + */ + inline bool operator<(const Multi_critical_filtration &other) const { + // check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { // i(const Multi_critical_filtration &other) const { - return other < *this; - } + * Checks if `this`, seen as a birth curve is over the `other` birth curve, + */ + inline bool operator>(const Multi_critical_filtration &other) const { return other < *this; } /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - */ - inline bool operator<=(const Multi_critical_filtration &other) const { - //check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + */ + inline bool operator<=(const Multi_critical_filtration &other) const { + // check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { - // i <= j - if (dominates(other.multi_filtration_[j], multi_filtration_[i])) - continue; + // i <= j + if (dominates(other.multi_filtration_[j], multi_filtration_[i])) continue; } return false; } return true; } /* - * Checks if `this`, seen as a birth curve is over the `other` birth curve, - */ - inline bool operator>=(const Multi_critical_filtration &other) const { - return other <= *this; - } + * Checks if `this`, seen as a birth curve is over the `other` birth curve, + */ + inline bool operator>=(const Multi_critical_filtration &other) const { return other <= *this; } -public: + public: // for compiler constexpr static const T T_inf = One_critical_filtration::T_inf; constexpr static const bool is_multi_critical = true; -private: + private: std::vector> multi_filtration_; }; -} // namespace Gudhi::multi_filtration +} // namespace Gudhi::multi_filtration #endif // MULTI_CRITICAL_FILTRATIONS_H_ diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index bfc0ae01b4..ea37484fdf 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -22,7 +22,7 @@ namespace Gudhi::multi_filtration { -/** +/** * \brief Vector-like filtration value, for multiparameter persistence, with * numpy-like methods. * @@ -44,25 +44,18 @@ namespace Gudhi::multi_filtration { */ template class One_critical_filtration : public std::vector { -public: - One_critical_filtration() : std::vector(){}; - One_critical_filtration(int n) - : std::vector(n, -T_inf){}; // minus infinity by default - One_critical_filtration(int n, T value) - : std::vector(n, value){}; - One_critical_filtration(std::initializer_list init) - : std::vector(init){}; - One_critical_filtration(const std::vector &v) - : std::vector(v){}; - One_critical_filtration(std::vector &&v) - : std::vector(std::move(v)){}; - One_critical_filtration(typename std::vector::iterator it_begin, - typename std::vector::iterator it_end) - : std::vector(it_begin, it_end){}; - One_critical_filtration( - typename std::vector::const_iterator it_begin, - typename std::vector::const_iterator it_end) - : std::vector(it_begin, it_end){}; + public: + One_critical_filtration() : std::vector() {}; + One_critical_filtration(int n) : std::vector(n, -T_inf) {}; // minus infinity by default + One_critical_filtration(int n, T value) : std::vector(n, value) {}; + One_critical_filtration(std::initializer_list init) : std::vector(init) {}; + One_critical_filtration(const std::vector &v) : std::vector(v) {}; + One_critical_filtration(std::vector &&v) : std::vector(std::move(v)) {}; + One_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) + : std::vector(it_begin, it_end) {}; + One_critical_filtration(typename std::vector::const_iterator it_begin, + typename std::vector::const_iterator it_end) + : std::vector(it_begin, it_end) {}; using std::vector::operator[]; using value_type = T; @@ -70,123 +63,92 @@ class One_critical_filtration : public std::vector { template using Base = One_critical_filtration; operator std::vector &() const { return *this; } - std::vector get_vector() const { - return static_cast>(*this); - } + std::vector get_vector() const { return static_cast>(*this); } std::size_t num_parameters() const { return this->size(); } - // TODO : REMOVE SIZE ( confusing when kcritical) + // TODO : REMOVE SIZE ( confusing when kcritical) // static std::size_t num_generators() {return 1;} operator std::vector() const { return static_cast>(*this); } - inline const std::vector & as_vector() const { return *this; } + inline const std::vector &as_vector() const { return *this; } inline bool is_inf() const { - if (this->size() != 1) - return false; + if (this->size() != 1) return false; return (this->operator[](0) == T_inf); } inline bool is_minus_inf() const { if constexpr (std::is_same::value) { - return false; // suppresses a warning + return false; // suppresses a warning } else { - if (this->size() != 1) - return false; + if (this->size() != 1) return false; return (this->operator[](0) == -T_inf); } } inline bool is_nan() const { - if (this->size() != 1) - return false; + if (this->size() != 1) return false; return std::isnan(*(this->begin())); } inline bool is_finite() const { - if (this->size() > 1) - return true; - if (this->size() == 0) - return false; - auto first_value = *(this->begin()); // TODO : Maybe check all entries ? - if (std::isnan(first_value) || first_value == -T_inf || - first_value == T_inf) - return false; + if (this->size() > 1) return true; + if (this->size() == 0) return false; + auto first_value = *(this->begin()); // TODO : Maybe check all entries ? + if (std::isnan(first_value) || first_value == -T_inf || first_value == T_inf) return false; return true; } - inline friend bool operator<(const One_critical_filtration &a, - const One_critical_filtration &b) { - if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) - return false; - if (b.is_inf() || a.is_minus_inf()) - return true; + inline friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) { + if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; + if (b.is_inf() || a.is_minus_inf()) return true; bool isSame = true; auto n = a.size(); assert(a.size() == b.size()); for (auto i = 0u; i < n; ++i) { - if (a[i] > b[i]) - return false; - if (isSame && a[i] != b[i]) - isSame = false; + if (a[i] > b[i]) return false; + if (isSame && a[i] != b[i]) isSame = false; } - if (isSame) - return false; + if (isSame) return false; return true; } - inline friend bool operator<=(const One_critical_filtration &a, - const One_critical_filtration &b) { - if (a.is_nan() || b.is_nan()) - return false; - if (b.is_inf() || a.is_minus_inf()) - return true; - if (a.is_inf() || b.is_minus_inf()) - return false; + inline friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) { + if (a.is_nan() || b.is_nan()) return false; + if (b.is_inf() || a.is_minus_inf()) return true; + if (a.is_inf() || b.is_minus_inf()) return false; auto n = a.size(); assert(a.size() == b.size()); for (std::size_t i = 0u; i < n; ++i) { - if (a[i] > b[i]) - return false; + if (a[i] > b[i]) return false; } return true; } // GREATER THAN OPERATORS - inline friend bool operator>(const One_critical_filtration &a, - const One_critical_filtration &b) { + inline friend bool operator>(const One_critical_filtration &a, const One_critical_filtration &b) { return b < a; } - inline friend bool operator>=(const One_critical_filtration &a, - const One_critical_filtration &b) { + inline friend bool operator>=(const One_critical_filtration &a, const One_critical_filtration &b) { return b <= a; } - inline One_critical_filtration & - operator=(const One_critical_filtration &a) { + inline One_critical_filtration &operator=(const One_critical_filtration &a) { std::vector::operator=(a); return *this; } - inline One_critical_filtration& operator-() { - for (auto& truc : *this) { + inline One_critical_filtration &operator-() { + for (auto &truc : *this) { truc = -truc; } } inline One_critical_filtration copy() const { return *this; } std::vector &_convert_back() { return *this; } - constexpr static One_critical_filtration inf() { - return {T_inf}; - } - constexpr static One_critical_filtration minus_inf() { - return {-T_inf}; - } - constexpr static One_critical_filtration nan() { - return {std::numeric_limits::quiet_NaN()}; - } + constexpr static One_critical_filtration inf() { return {T_inf}; } + constexpr static One_critical_filtration minus_inf() { return {-T_inf}; } + constexpr static One_critical_filtration nan() { return {std::numeric_limits::quiet_NaN()}; } // operators *= - inline friend One_critical_filtration & - operator-=(One_critical_filtration &result, - const One_critical_filtration &to_substract) { - if (result.is_nan() || to_substract.is_nan() || - (result.is_inf() && to_substract.is_inf()) || + inline friend One_critical_filtration &operator-=(One_critical_filtration &result, + const One_critical_filtration &to_substract) { + if (result.is_nan() || to_substract.is_nan() || (result.is_inf() && to_substract.is_inf()) || (result.is_minus_inf() && to_substract.is_minus_inf())) [[unlikely]] { result = std::numeric_limits::quiet_NaN(); return result; @@ -199,16 +161,12 @@ class One_critical_filtration : public std::vector { result = minus_inf(); return result; } - std::transform(result.begin(), result.end(), to_substract.begin(), - result.begin(), std::minus()); + std::transform(result.begin(), result.end(), to_substract.begin(), result.begin(), std::minus()); return result; } - inline friend One_critical_filtration & - operator+=(One_critical_filtration &result, - const One_critical_filtration &to_add) { - - if (result.is_nan() || to_add.is_nan() || - (result.is_inf() && to_add.is_minus_inf()) || + inline friend One_critical_filtration &operator+=(One_critical_filtration &result, + const One_critical_filtration &to_add) { + if (result.is_nan() || to_add.is_nan() || (result.is_inf() && to_add.is_minus_inf()) || (result.is_minus_inf() && to_add.is_inf())) [[unlikely]] { result = nan(); return result; @@ -222,37 +180,29 @@ class One_critical_filtration : public std::vector { return result; } - std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), - std::plus()); + std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::plus()); return result; } - inline friend One_critical_filtration & - operator*=(One_critical_filtration &result, - const One_critical_filtration &to_add) { - + inline friend One_critical_filtration &operator*=(One_critical_filtration &result, + const One_critical_filtration &to_add) { assert(result.is_finite() || to_add.is_finite()); - std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), - std::multiplies()); + std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::multiplies()); return result; } - inline friend One_critical_filtration & - operator-=(One_critical_filtration &result, - const T &to_substract) { + inline friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_substract) { for (auto &truc : result) { truc -= to_substract; } return result; } - inline friend One_critical_filtration & - operator+=(One_critical_filtration &result, const T &to_add) { + inline friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) { for (auto &truc : result) { truc += to_add; } return result; } - inline friend One_critical_filtration & - operator*=(One_critical_filtration &result, const T &to_add) { + inline friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_add) { if (to_add == T_inf || to_add == -T_inf) [[unlikely]] { for (auto &truc : result) { if (truc > 0) @@ -268,8 +218,7 @@ class One_critical_filtration : public std::vector { } return result; } - inline friend One_critical_filtration & - operator/=(One_critical_filtration &result, const T &to_add) { + inline friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_add) { for (auto &truc : result) { truc /= to_add; } @@ -277,74 +226,56 @@ class One_critical_filtration : public std::vector { } /// OPERATORS * - inline friend One_critical_filtration - operator+(One_critical_filtration result, const T &to_add) { + inline friend One_critical_filtration operator+(One_critical_filtration result, const T &to_add) { result += to_add; return result; } - inline friend One_critical_filtration - operator+(One_critical_filtration result, - const One_critical_filtration &to_add) { + inline friend One_critical_filtration operator+(One_critical_filtration result, + const One_critical_filtration &to_add) { result += to_add; return result; } - inline friend One_critical_filtration - operator-(One_critical_filtration result, - const One_critical_filtration &to_add) { + inline friend One_critical_filtration operator-(One_critical_filtration result, + const One_critical_filtration &to_add) { result -= to_add; return result; } - inline friend One_critical_filtration - operator-(One_critical_filtration result, const T &to_add) { + inline friend One_critical_filtration operator-(One_critical_filtration result, const T &to_add) { result -= to_add; return result; } - inline friend One_critical_filtration - operator*(One_critical_filtration result, const T &to_add) { + inline friend One_critical_filtration operator*(One_critical_filtration result, const T &to_add) { result *= to_add; return result; } - inline friend One_critical_filtration - operator+(const T &to_add, - const One_critical_filtration &result) { + inline friend One_critical_filtration operator+(const T &to_add, const One_critical_filtration &result) { return result + to_add; } - inline friend One_critical_filtration - operator-(const T &to_add, - const One_critical_filtration &result) { + inline friend One_critical_filtration operator-(const T &to_add, const One_critical_filtration &result) { return result - to_add; } - inline friend One_critical_filtration - operator*(const T &to_add, - const One_critical_filtration &result) { + inline friend One_critical_filtration operator*(const T &to_add, const One_critical_filtration &result) { return result * to_add; } // template - inline friend bool - operator==(const One_critical_filtration &self, - const One_critical_filtration &to_compare) { - if (self.num_parameters() != to_compare.num_parameters()) - return false; + inline friend bool operator==(const One_critical_filtration &self, const One_critical_filtration &to_compare) { + if (self.num_parameters() != to_compare.num_parameters()) return false; auto it = to_compare.begin(); for (auto i = 0u; i < self.num_parameters(); i++) { - if (self.at(i) != *(it++)) - return false; + if (self.at(i) != *(it++)) return false; } return true; } - inline static std::vector> to_python( - const std::vector> &to_convert) { + inline static std::vector> to_python(const std::vector> &to_convert) { return std::vector>(to_convert.begin(), to_convert.end()); } - inline static std::vector> - from_python(const std::vector> &to_convert) { - return std::vector>( - to_convert.begin(), to_convert.end()); + inline static std::vector> from_python(const std::vector> &to_convert) { + return std::vector>(to_convert.begin(), to_convert.end()); } /** \brief This functions take the filtration value `this` and pushes it to @@ -354,23 +285,20 @@ class One_critical_filtration : public std::vector { * @param[in] x The target filtration value on which to push `this`. */ inline void push_to(const One_critical_filtration &x) { - if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) - return; + if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; if (x.is_inf() || this->is_minus_inf()) { *this = x; return; } if (this->num_parameters() != x.num_parameters()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " - << this->num_parameters() << " and " << x.num_parameters() << "are different !" - << std::endl; + std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->num_parameters() << " and " + << x.num_parameters() << "are different !" << std::endl; std::cerr << "This : " << *this << std::endl; std::cerr << "arg : " << x << std::endl; throw std::logic_error("Bad sizes"); } for (std::size_t i = 0; i < x.num_parameters(); i++) - this->operator[](i) = - this->operator[](i) > x[i] ? this->operator[](i) : x[i]; + this->operator[](i) = this->operator[](i) > x[i] ? this->operator[](i) : x[i]; } /** \brief This functions take the filtration value `this` and pulls it to the @@ -380,45 +308,38 @@ class One_critical_filtration : public std::vector { * @param[in] x The target filtration value on which to push `this`. */ inline void pull_to(const One_critical_filtration &x) { - if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) - return; + if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; if (this->is_inf() || x.is_minus_inf()) { *this = x; return; } if (this->num_parameters() != x.num_parameters()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " - << this->num_parameters() << " and " << x.num_parameters() << "are different !" - << std::endl; + std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->num_parameters() << " and " + << x.num_parameters() << "are different !" << std::endl; std::cerr << "This : " << *this << std::endl; std::cerr << "arg : " << x << std::endl; throw std::logic_error("Bad sizes"); } for (std::size_t i = 0u; i < x.num_parameters(); i++) - this->operator[](i) = - this->operator[](i) > x[i] ? x[i] : this->operator[](i); + this->operator[](i) = this->operator[](i) > x[i] ? x[i] : this->operator[](i); } // Warning, this function assumes that the comparisons checks have already // been made ! inline void insert_new(One_critical_filtration to_concatenate) { - this->insert(this->end(), std::move_iterator(to_concatenate.begin()), - std::move_iterator(to_concatenate.end())); + this->insert(this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end())); } // scalar product of a filtration value with x. - template + template inline U linear_projection(const std::vector &x) { U projection = 0; std::size_t size = std::min(x.size(), this->size()); - for (std::size_t i = 0u; i < size; i++) - projection += x[i] * static_cast(this->operator[](i)); + for (std::size_t i = 0u; i < size; i++) projection += x[i] * static_cast(this->operator[](i)); return projection; } // easy debug - inline friend std::ostream & - operator<<(std::ostream &stream, - const One_critical_filtration &truc) { + inline friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &truc) { if (truc.is_inf()) { stream << "[inf, ..., inf]"; return stream; @@ -439,15 +360,13 @@ class One_critical_filtration : public std::vector { for (std::size_t i = 0; i < truc.size() - 1; i++) { stream << truc[i] << ", "; } - if (!truc.empty()) - stream << truc.back(); + if (!truc.empty()) stream << truc.back(); stream << "]"; return stream; } inline T norm() const { T out = 0; - for (auto &stuff : *this) - out += std::pow(stuff, 2); + for (auto &stuff : *this) out += std::pow(stuff, 2); return sqrt(out); } inline T distance(const One_critical_filtration &other) const { @@ -462,37 +381,32 @@ class One_critical_filtration : public std::vector { * projects itself into this grid, and returns the coordinates of this projected points * in the given grid */ - template - inline One_critical_filtration - coordinates_in_grid(const std::vector>& grid) const { + template + inline One_critical_filtration coordinates_in_grid(const std::vector> &grid) const { One_critical_filtration coords(this->size()); assert(grid.size() >= this->size()); for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { const auto &filtration = grid[parameter]; - auto C = std::distance( - filtration.begin(), - std::lower_bound(filtration.begin(), filtration.end(), - static_cast(this->operator[](parameter)))); + auto C = std::distance(filtration.begin(), std::lower_bound(filtration.begin(), filtration.end(), + static_cast(this->operator[](parameter)))); coords[parameter] = static_cast(C); } return coords; } /** * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), - * and assuming that `this` correspond to the coordinates in this grid, + * and assuming that `this` correspond to the coordinates in this grid, * returns the points evaluated in this grid */ template - inline One_critical_filtration - evaluate_in_grid(const std::vector>& grid) const { + inline One_critical_filtration evaluate_in_grid(const std::vector> &grid) const { One_critical_filtration pushed_value(this->size()); assert(grid.size() == this->size()); - U grid_inf = std::numeric_limits::has_infinity - ? std::numeric_limits::infinity() - : std::numeric_limits::max(); + U grid_inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { const auto &filtration = grid[parameter]; - const auto& c = this->operator[](parameter); + const auto &c = this->operator[](parameter); pushed_value[parameter] = c == T_inf ? grid_inf : filtration[c]; } return pushed_value; @@ -502,48 +416,43 @@ class One_critical_filtration : public std::vector { * Same as `evaluate_in_grid` but does the operation in-place */ template - inline void coordinates_in_grid_inplace(const std::vector& grid, - bool coordinate = true) { + inline void coordinates_in_grid_inplace(const std::vector &grid, bool coordinate = true) { One_critical_filtration coords(this->size()); assert(grid.size() >= this->size()); for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { const auto &filtration = grid[parameter]; - auto d = - std::distance(filtration.begin(), - std::lower_bound(filtration.begin(), filtration.end(), - this->operator[](parameter))); - this->operator[](parameter) = - coordinate ? static_cast(d) : static_cast(grid[parameter][d]); + auto d = std::distance(filtration.begin(), + std::lower_bound(filtration.begin(), filtration.end(), this->operator[](parameter))); + this->operator[](parameter) = coordinate ? static_cast(d) : static_cast(grid[parameter][d]); ; } } // like numpy - template inline One_critical_filtration astype() const { + template + inline One_critical_filtration astype() const { One_critical_filtration out(this->size()); - for (std::size_t i = 0u; i < this->size(); i++) - out[i] = static_cast(this->operator[](i)); + for (std::size_t i = 0u; i < this->size(); i++) out[i] = static_cast(this->operator[](i)); return out; } -public: + public: // TODO : maybe add the {inf}, minus inf, nan there as static members? this // would make comparisons faster (just compare the ptr) // TODO : I'm not sure why constexpr doens't work anymore - constexpr static const T T_inf = std::numeric_limits::has_infinity - ? std::numeric_limits::infinity() - : std::numeric_limits::max(); + constexpr static const T T_inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); // for compiler constexpr static bool is_multi_critical = false; }; -} // namespace Gudhi::multi_filtration +} // namespace Gudhi::multi_filtration namespace std { template class numeric_limits> { -public: + public: static constexpr bool has_infinity = std::numeric_limits::has_infinity; static Gudhi::multi_filtration::One_critical_filtration infinity() throw() { @@ -555,11 +464,11 @@ class numeric_limits> { static Gudhi::multi_filtration::One_critical_filtration max() throw() { return Gudhi::multi_filtration::One_critical_filtration(1, std::numeric_limits::max()); }; - static Gudhi::multi_filtration::One_critical_filtrationquiet_NaN() throw() { + static Gudhi::multi_filtration::One_critical_filtration quiet_NaN() throw() { return Gudhi::multi_filtration::One_critical_filtration(1, numeric_limits::quiet_NaN()); }; }; -} // namespace std +} // namespace std -#endif // ONE_CRITICAL_FILTRATIONS_H_ +#endif // ONE_CRITICAL_FILTRATIONS_H_ diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h index 961db27c90..4dc100621c 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h @@ -8,7 +8,6 @@ * - YYYY/MM Author: Description of the modification */ - #ifndef BOX_H_INCLUDED #define BOX_H_INCLUDED @@ -17,7 +16,6 @@ #include - namespace Gudhi::multi_persistence { /** @@ -25,12 +23,13 @@ namespace Gudhi::multi_persistence { * * @ingroup multi_persistence */ -template class Box { +template +class Box { using point_type = Gudhi::multi_filtration::One_critical_filtration; -public: + public: Box(); - Box(T a, T b, T c, T d) : bottomCorner_({a, b}), upperCorner_({c, d}){}; + Box(T a, T b, T c, T d) : bottomCorner_({a, b}), upperCorner_({c, d}) {}; Box(const point_type &bottomCorner, const point_type &upperCorner); Box(const std::pair &box); @@ -56,35 +55,29 @@ template class Box { */ void infer_from_filters(const std::vector &Filters_list); bool is_trivial() const; - std::pair get_pair() const { - return {bottomCorner_, upperCorner_}; - } - std::pair get_pair() { - return {bottomCorner_, upperCorner_}; - } + std::pair get_pair() const { return {bottomCorner_, upperCorner_}; } + std::pair get_pair() { return {bottomCorner_, upperCorner_}; } std::size_t dimension() const { return bottomCorner_.size(); } -private: + private: point_type bottomCorner_; point_type upperCorner_; }; -template inline Box::Box() {} +template +inline Box::Box() {} template -inline Box::Box(const point_type &bottomCorner, - const point_type &upperCorner) +inline Box::Box(const point_type &bottomCorner, const point_type &upperCorner) : bottomCorner_(bottomCorner), upperCorner_(upperCorner) { - GUDHI_CHECK(bottomCorner.size() == upperCorner.size() && - bottomCorner <= upperCorner, - "This box is trivial !"); + GUDHI_CHECK(bottomCorner.size() == upperCorner.size() && bottomCorner <= upperCorner, "This box is trivial !"); } template -inline Box::Box(const std::pair &box) - : bottomCorner_(box.first), upperCorner_(box.second) {} +inline Box::Box(const std::pair &box) : bottomCorner_(box.first), upperCorner_(box.second) {} -template inline void Box::inflate(T delta) { +template +inline void Box::inflate(T delta) { bottomCorner_ -= delta; upperCorner_ += delta; } @@ -93,8 +86,7 @@ template inline void Box::inflate(T delta) { * Define a box containing the filtration values. */ template -inline void -Box::infer_from_filters(const std::vector &Filters_list) { +inline void Box::infer_from_filters(const std::vector &Filters_list) { int dimension = Filters_list.size(); int nsplx = Filters_list[0].size(); std::vector lower(dimension); @@ -112,9 +104,9 @@ Box::infer_from_filters(const std::vector &Filters_list) { bottomCorner_.swap(lower); upperCorner_.swap(upper); } -template inline bool Box::is_trivial() const { - return bottomCorner_.empty() || upperCorner_.empty() || - bottomCorner_.size() != upperCorner_.size(); +template +inline bool Box::is_trivial() const { + return bottomCorner_.empty() || upperCorner_.empty() || bottomCorner_.size() != upperCorner_.size(); } template @@ -156,23 +148,23 @@ std::ostream &operator<<(std::ostream &os, const Box &box) { return os; } -template inline void Box::threshold_up(point_type &x) const { +template +inline void Box::threshold_up(point_type &x) const { for (auto i = 0u; i < x.size(); i++) { auto t = upperCorner_[i]; - if (x[i] > t) - x[i] = t; + if (x[i] > t) x[i] = t; } return; } -template inline void Box::threshold_down(point_type &x) const { +template +inline void Box::threshold_down(point_type &x) const { for (auto i = 0u; i < x.size(); i++) { auto t = bottomCorner_[i]; - if (x[i] < t) - x[i] = t; + if (x[i] < t) x[i] = t; } return; } -} // namespace Gudhi::multi_persistence +} // namespace Gudhi::multi_persistence -#endif // BOX_H_INCLUDED +#endif // BOX_H_INCLUDED diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index f04879e338..efd077b3b6 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -8,7 +8,6 @@ * - YYYY/MM Author: Description of the modification */ - #ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED #define LINE_FILTRATION_TRANSLATION_H_INCLUDED @@ -30,8 +29,9 @@ namespace Gudhi::multi_persistence { * * @ingroup multi_persistence */ -template class Line { -public: +template +class Line { + public: using point_type = Gudhi::multi_filtration::One_critical_filtration; using kcritical_point_type = Gudhi::multi_filtration::Multi_critical_filtration; /* @@ -43,43 +43,43 @@ template class Line { Line(point_type &&x); Line(const point_type &x, const point_type &v); /* - * Returns the point whose intersection is \f$ \min\{ y\ge x \} \cap \mathrm{this}\f$ - */ + * Returns the point whose intersection is \f$ \min\{ y\ge x \} \cap \mathrm{this}\f$ + */ inline point_type push_forward(point_type x) const; /* - * Retuns the time parameter of the coordinate given by push_forward. - */ - template + * Retuns the time parameter of the coordinate given by push_forward. + */ + template inline U push_forward2(const point_type &x) const; /* - * Retuns the time parameter of the coordinate given by push_forward. - */ - template + * Retuns the time parameter of the coordinate given by push_forward. + */ + template inline U push_forward2(const kcritical_point_type &x) const; /* - * Returns the point whose intersection is \f$ \max\{ y\le x \} \cap \mathrm{this}\f$ - */ + * Returns the point whose intersection is \f$ \max\{ y\le x \} \cap \mathrm{this}\f$ + */ inline point_type push_back(point_type x) const; /* - * Retuns the time parameter of the coordinate given by push_back. - */ - template + * Retuns the time parameter of the coordinate given by push_back. + */ + template inline U push_back2(const point_type &x) const; /* - * Retuns the time parameter of the coordinate given by push_back. - */ - template + * Retuns the time parameter of the coordinate given by push_back. + */ + template inline U push_back2(const kcritical_point_type &x) const; inline int get_dim() const; /* - * Given a box, returns the coordinates of the intersection of this box and `this` as a pair of points (low, high) - * in this line, representing this interval. - */ + * Given a box, returns the coordinates of the intersection of this box and `this` as a pair of points (low, high) + * in this line, representing this interval. + */ std::pair get_bounds(const Box &box) const; /* - * Retuns the times parameter of the coordinates in the pair given by get_bounds. - */ - std::pair get_bounds2(const Box &box) const; + * Retuns the times parameter of the coordinates in the pair given by get_bounds. + */ + std::pair get_bounds2(const Box &box) const; // translation inline friend Line &operator+=(Line &to_translate, const point_type &x) { @@ -92,55 +92,63 @@ template class Line { inline const point_type &basepoint() const { return basepoint_; } inline const point_type &direction() const { return direction_; } -private: - point_type basepoint_; // any point on the line - point_type direction_; // direction of the line + private: + point_type basepoint_; // any point on the line + point_type direction_; // direction of the line }; -template inline bool Line::check_direction() const { - bool is_trivial=true; - for (const auto& stuff : basepoint_){ - if (!stuff){ is_trivial = false;} - if (stuff < 0){ throw std::invalid_argument("Direction should have positive entries.");} +template +inline bool Line::check_direction() const { + bool is_trivial = true; + for (const auto &stuff : basepoint_) { + if (!stuff) { + is_trivial = false; + } + if (stuff < 0) { + throw std::invalid_argument("Direction should have positive entries."); + } + } + if (is_trivial) { + throw std::invalid_argument("Direction should have at least one non-trivial entry."); } - if (is_trivial){throw std::invalid_argument("Direction should have at least one non-trivial entry.");} if (direction_.size() && direction_.size() != basepoint_.size()) throw std::invalid_argument("The dimensions of basepoint and direction are not equal."); } -template Line::Line() {} +template +Line::Line() {} template Line::Line(const point_type &x) : basepoint_(x) { check_direction();} + template -Line::Line(point_type &&x) : basepoint_(std::move(x)) {check_direction();} +Line::Line(const point_type &x) : basepoint_(x) { + check_direction(); +} template -Line::Line(const point_type &x, const point_type &v) - : basepoint_(x), direction_(v) {check_direction();} - +Line::Line(point_type &&x) : basepoint_(std::move(x)) { + check_direction(); +} +template +Line::Line(const point_type &x, const point_type &v) : basepoint_(x), direction_(v) { + check_direction(); +} template -inline typename Line::point_type -Line::push_forward(point_type x) const { // TODO remove copy - if (x.is_inf() || x.is_nan() || x.is_minus_inf()) - return x; +inline typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy + if (x.is_inf() || x.is_nan() || x.is_minus_inf()) return x; T t = this->push_forward2(x); if (direction_.size() > 0) { - for (std::size_t i = 0; i < x.size(); i++) - x[i] = basepoint_[i] + t * direction_[i]; + for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t * direction_[i]; } else { - for (std::size_t i = 0; i < x.size(); i++) - x[i] = basepoint_[i] + t; + for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t; } return x; } template template inline U Line::push_forward2(const point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() - : std::numeric_limits::max(); - if (x.is_inf() || x.is_nan()) - return inf; - if (x.is_minus_inf()) - return -inf; + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf() || x.is_nan()) return inf; + if (x.is_minus_inf()) return -inf; U t = -inf; if (direction_.size()) { for (std::size_t i = 0; i < x.size(); i++) { @@ -155,8 +163,7 @@ inline U Line::push_forward2(const point_type &x) const { } } } else { - for (std::size_t i = 0; i < x.size(); i++) - t = std::max(t, static_cast(x[i]) - static_cast(basepoint_[i])); + for (std::size_t i = 0; i < x.size(); i++) t = std::max(t, static_cast(x[i]) - static_cast(basepoint_[i])); } return t; @@ -164,13 +171,10 @@ inline U Line::push_forward2(const point_type &x) const { template template inline U Line::push_forward2(const kcritical_point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() - : std::numeric_limits::max(); - if (x.is_inf() || x.is_nan()) - return inf; - if (x.is_minus_inf()) - return -inf; + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf() || x.is_nan()) return inf; + if (x.is_minus_inf()) return -inf; U t = inf; for (const auto &y : x) { t = std::min(t, this->push_forward2(y)); @@ -180,29 +184,24 @@ inline U Line::push_forward2(const kcritical_point_type &x) const { template inline typename Line::point_type Line::push_back(point_type x) const { - if (x.is_inf() || x.is_nan() || x.is_minus_inf()) - return x; + if (x.is_inf() || x.is_nan() || x.is_minus_inf()) return x; T t = this->push_back2(x); if (direction_.size() > 0) { - for (std::size_t i = 0; i < x.size(); i++) - x[i] = basepoint_[i] + t * direction_[i]; + for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t * direction_[i]; } else - for (std::size_t i = 0; i < x.size(); i++) - x[i] = basepoint_[i] + t; + for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t; return x; } template -template inline U Line::push_back2(const point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() - : std::numeric_limits::max(); - if (x.is_inf()) - return inf; - if (x.is_minus_inf() || x.is_nan()) - return -inf; +template +inline U Line::push_back2(const point_type &x) const { + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf()) return inf; + if (x.is_minus_inf() || x.is_nan()) return -inf; U t = inf; if (direction_.size()) { @@ -214,12 +213,11 @@ template inline U Line::push_back2(const point_type &x) const { return -inf; } } else [[likely]] { - t = std::min(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast(direction_[i])); + t = std::min(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast(direction_[i])); } } } else { - for (std::size_t i = 0; i < x.size(); i++) - t = std::min(t, static_cast(x[i] - basepoint_[i])); + for (std::size_t i = 0; i < x.size(); i++) t = std::min(t, static_cast(x[i] - basepoint_[i])); } return t; } @@ -228,13 +226,10 @@ template template inline U Line::push_back2(const kcritical_point_type &x) const { - constexpr const U inf = std::numeric_limits::has_infinity ? - std::numeric_limits::infinity() - : std::numeric_limits::max(); - if (x.is_inf()) - return inf; - if (x.is_minus_inf() || x.is_nan()) - return -inf; + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf()) return inf; + if (x.is_minus_inf() || x.is_nan()) return -inf; U t = -inf; for (const auto &y : x) { t = std::max(t, this->push_back2(y)); @@ -242,24 +237,21 @@ inline U Line::push_back2(const kcritical_point_type &x) const { return t; } -template inline int Line::get_dim() const { +template +inline int Line::get_dim() const { return basepoint_.size(); } template -inline std::pair -Line::get_bounds2(const Box &box) const { - return {this->push_forward2(box.get_bottom_corner()), - this->push_back2(box.get_upper_corner())}; +inline std::pair Line::get_bounds2(const Box &box) const { + return {this->push_forward2(box.get_bottom_corner()), this->push_back2(box.get_upper_corner())}; } - template -inline std::pair::point_type, typename Line::point_type> -Line::get_bounds(const Box &box) const { - return {this->push_forward(box.get_bottom_corner()), - this->push_back(box.get_upper_corner())}; +inline std::pair::point_type, typename Line::point_type> Line::get_bounds( + const Box &box) const { + return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; } -} // namespace Gudhi::multi_persistence +} // namespace Gudhi::multi_persistence -#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED +#endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED From 30397ba0f07b5245a0010256cd10895783f1cfb9 Mon Sep 17 00:00:00 2001 From: Vincent Rouvreau Date: Tue, 20 Aug 2024 14:30:03 +0200 Subject: [PATCH 67/87] Failed clang-format --- .../include/gudhi/Multi_critical_filtration.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 02d34781b6..97ec4430ff 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -323,17 +323,6 @@ class Multi_critical_filtration { inline typename std::vector>::const_iterator end() const { return multi_filtration_.end(); } - inline typename std::vector< - One_critical_filtration>::const_iterator - begin() const { - return multi_filtration_.begin(); - } - inline typename std::vector< - One_critical_filtration>::const_iterator - end() const { - return multi_filtration_.end(); - } - /* * Same as its one critical counterpart. From 62bd4724a9f5e92976cc1e4b54eec00d491945e0 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Fri, 23 Aug 2024 17:32:50 +0200 Subject: [PATCH 68/87] one_critical_filtration --- .../include/gudhi/One_critical_filtration.h | 885 +++++++++++++----- src/Multi_filtration/test/CMakeLists.txt | 4 + .../multifiltration_onecritical_unit_test.cpp | 509 ++++++++++ 3 files changed, 1151 insertions(+), 247 deletions(-) create mode 100644 src/Multi_filtration/test/CMakeLists.txt create mode 100644 src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index ea37484fdf..e30e80b691 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -5,21 +5,24 @@ * Copyright (C) 2023 Inria * * Modification(s): + * - 2024/08 Hannah Schreiber: Generalization to all arithmetic types for T * - YYYY/MM Author: Description of the modification */ #ifndef ONE_CRITICAL_FILTRATIONS_H_ #define ONE_CRITICAL_FILTRATIONS_H_ -#include -#include -#include -#include -#include -#include -#include +#include //std::lower_bound +#include //std::isnan +#include //std::size_t +#include //std::int32_t +#include //std::ostream +#include //std::numerical_limits +#include //std::logic_error #include +#include + namespace Gudhi::multi_filtration { /** @@ -39,266 +42,477 @@ namespace Gudhi::multi_filtration { * x>=(2,1)\} \f$ is finitely critical, and more particularly 2-critical, while * - \f$ \{ x \in \mathbb R^2 : x>= \mathrm{epigraph}(y\mapsto e^{-y})\} \f$ * is not. - * Use \ref Multi_critical_filtration for multicritical filtrations. - * \tparam T value type of the vector-like. + * Use \ref Multi_critical_filtration for multi-critical filtrations. + * \tparam T value type of the vector-like. Has to implement std::isnan(), std::numeric_limits::has_quiet_NaN, + * std::numeric_limits::quiet_NaN(), std::numeric_limits::has_infinity, std::numeric_limits::infinity(), + * std::numeric_limits::max(). */ template -class One_critical_filtration : public std::vector { +class One_critical_filtration : public std::vector +{ + private: + using Base = std::vector; + public: - One_critical_filtration() : std::vector() {}; - One_critical_filtration(int n) : std::vector(n, -T_inf) {}; // minus infinity by default - One_critical_filtration(int n, T value) : std::vector(n, value) {}; - One_critical_filtration(std::initializer_list init) : std::vector(init) {}; - One_critical_filtration(const std::vector &v) : std::vector(v) {}; - One_critical_filtration(std::vector &&v) : std::vector(std::move(v)) {}; + template + using Single_point = One_critical_filtration; + + // CONSTRUCTORS + + One_critical_filtration() : Base() {}; + // warning: can be problematic if the user never updates the values and let it like that, {-inf, -inf, ...} is not + // considered as -inf. + One_critical_filtration(int n) : Base(n, -T_inf) {}; // minus infinity by default + One_critical_filtration(int n, T value) : Base(n, value) {}; + One_critical_filtration(std::initializer_list init) : Base(init) {}; + One_critical_filtration(const std::vector &v) : Base(v) {}; + One_critical_filtration(std::vector &&v) : Base(std::move(v)) {}; One_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) - : std::vector(it_begin, it_end) {}; + : Base(it_begin, it_end) {}; One_critical_filtration(typename std::vector::const_iterator it_begin, typename std::vector::const_iterator it_end) - : std::vector(it_begin, it_end) {}; + : Base(it_begin, it_end) {}; + + One_critical_filtration &operator=(const One_critical_filtration &a) + { + Base::operator=(a); + return *this; + } + + // HERITAGE using std::vector::operator[]; using value_type = T; - using OneCritical = One_critical_filtration; - template - using Base = One_critical_filtration; + + // CONVERTERS + operator std::vector &() const { return *this; } - std::vector get_vector() const { return static_cast>(*this); } - std::size_t num_parameters() const { return this->size(); } - // TODO : REMOVE SIZE ( confusing when kcritical) - // static std::size_t num_generators() {return 1;} - operator std::vector() const { return static_cast>(*this); } + operator std::vector() const { return static_cast >(*this); } + + // needed in python + friend One_critical_filtration get_copy(const One_critical_filtration &f) { return f; } + + // like numpy + template + One_critical_filtration as_type() const + { + One_critical_filtration out; + out.reserve(Base::size()); + for (std::size_t i = 0u; i < Base::size(); i++) out.push_back(static_cast(Base::operator[](i))); + return out; + } + + // ACCESS + + std::size_t num_parameters() const { return Base::size(); } - inline const std::vector &as_vector() const { return *this; } + constexpr static One_critical_filtration inf() { return {T_inf}; } - inline bool is_inf() const { - if (this->size() != 1) return false; - return (this->operator[](0) == T_inf); + constexpr static One_critical_filtration minus_inf() { return {-T_inf}; } + + constexpr static One_critical_filtration nan() + { + if constexpr (std::numeric_limits::has_quiet_NaN) { + return {std::numeric_limits::quiet_NaN()}; + } else { + return {}; // to differentiate it from 0, an empty filtration value can't do much anyway. + } } - inline bool is_minus_inf() const { + + // DESCRIPTORS + + bool is_inf() const + { + if (Base::size() != 1) return false; + return (Base::operator[](0) == T_inf); + } + + bool is_minus_inf() const + { if constexpr (std::is_same::value) { return false; // suppresses a warning } else { - if (this->size() != 1) return false; - return (this->operator[](0) == -T_inf); + if (Base::size() != 1) return false; + return (Base::operator[](0) == -T_inf); } } - inline bool is_nan() const { - if (this->size() != 1) return false; - return std::isnan(*(this->begin())); + + bool is_nan() const + { + if constexpr (std::numeric_limits::has_quiet_NaN) { + if (Base::size() != 1) return false; + return std::isnan(Base::operator[](0)); + } else { + return Base::empty(); + } } - inline bool is_finite() const { - if (this->size() > 1) return true; - if (this->size() == 0) return false; - auto first_value = *(this->begin()); // TODO : Maybe check all entries ? + + bool is_finite() const + { + if (Base::size() > 1) return true; + if (Base::size() == 0) return false; + auto first_value = Base::operator[](0); // TODO : Maybe check all entries ? if (std::isnan(first_value) || first_value == -T_inf || first_value == T_inf) return false; return true; } - inline friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) { + // COMPARAISON OPERATORS + + friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) + { if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; if (b.is_inf() || a.is_minus_inf()) return true; bool isSame = true; auto n = a.size(); - assert(a.size() == b.size()); + GUDHI_CHECK(a.size() == b.size(), "Two filtration points with different number of parameters are not comparable."); for (auto i = 0u; i < n; ++i) { if (a[i] > b[i]) return false; if (isSame && a[i] != b[i]) isSame = false; } - if (isSame) return false; - return true; + return !isSame; } - inline friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) { + + friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) + { if (a.is_nan() || b.is_nan()) return false; if (b.is_inf() || a.is_minus_inf()) return true; if (a.is_inf() || b.is_minus_inf()) return false; auto n = a.size(); - assert(a.size() == b.size()); + GUDHI_CHECK(a.size() == b.size(), "Two filtration points with different number of parameters are not comparable."); for (std::size_t i = 0u; i < n; ++i) { if (a[i] > b[i]) return false; } return true; } - // GREATER THAN OPERATORS - inline friend bool operator>(const One_critical_filtration &a, const One_critical_filtration &b) { - return b < a; + friend bool operator>(const One_critical_filtration &a, const One_critical_filtration &b) { return b < a; } + + friend bool operator>=(const One_critical_filtration &a, const One_critical_filtration &b) { return b <= a; } + + friend bool operator==(const One_critical_filtration &a, const One_critical_filtration &b) + { + if (a.num_parameters() != b.num_parameters()) return false; + for (auto i = 0u; i < a.num_parameters(); i++) { + if (a[i] != b[i]) return false; + } + return true; + } + + friend bool operator!=(const One_critical_filtration &a, const One_critical_filtration &b) { return !(a == b); } + + // ARITHMETIC OPERATORS + + // opposite + friend One_critical_filtration operator-(const One_critical_filtration &f) + { + One_critical_filtration result; + result.reserve(f.size()); + for (auto val : f) { + result.push_back(-val); + } + return result; } - inline friend bool operator>=(const One_critical_filtration &a, const One_critical_filtration &b) { - return b <= a; + + // One_critical_filtration &operator-() + // { + // for (auto &val : *this) { + // val = -val; + // } + // } + + // subtraction + friend One_critical_filtration operator-(One_critical_filtration result, const One_critical_filtration &to_subtract) + { + result -= to_subtract; + return result; } - inline One_critical_filtration &operator=(const One_critical_filtration &a) { - std::vector::operator=(a); - return *this; + friend One_critical_filtration operator-(One_critical_filtration result, const T &to_subtract) + { + result -= to_subtract; + return result; } - inline One_critical_filtration &operator-() { - for (auto &truc : *this) { - truc = -truc; - } + + friend One_critical_filtration operator-(const T &value, One_critical_filtration result) + { + // TODO: in one go + result = -result; + result += value; + return result; } - inline One_critical_filtration copy() const { return *this; } - std::vector &_convert_back() { return *this; } - constexpr static One_critical_filtration inf() { return {T_inf}; } - constexpr static One_critical_filtration minus_inf() { return {-T_inf}; } - constexpr static One_critical_filtration nan() { return {std::numeric_limits::quiet_NaN()}; } + friend One_critical_filtration &operator-=(One_critical_filtration &result, + const One_critical_filtration &to_subtract) + { + if (result.empty()) return result; - // operators *= - inline friend One_critical_filtration &operator-=(One_critical_filtration &result, - const One_critical_filtration &to_substract) { - if (result.is_nan() || to_substract.is_nan() || (result.is_inf() && to_substract.is_inf()) || - (result.is_minus_inf() && to_substract.is_minus_inf())) [[unlikely]] { - result = std::numeric_limits::quiet_NaN(); + if (result.is_nan() || to_subtract.is_nan() || (result.is_inf() && to_subtract.is_inf()) || + (result.is_minus_inf() && to_subtract.is_minus_inf())) { + result = nan(); return result; } - if (result.is_inf() || to_substract.is_minus_inf()) [[unlikely]] { + if (result.is_inf() || to_subtract.is_minus_inf()) { result = inf(); return result; } - if (result.is_minus_inf() || to_substract.is_inf()) [[unlikely]] { + if (result.is_minus_inf() || to_subtract.is_inf()) { result = minus_inf(); return result; } - std::transform(result.begin(), result.end(), to_substract.begin(), result.begin(), std::minus()); - return result; + + GUDHI_CHECK(result.size() == to_subtract.size(), + "Two filtration points with different number of parameters cannot be subtracted."); + + return apply_operation_with_finite_values_(result, to_subtract, subtract_); } - inline friend One_critical_filtration &operator+=(One_critical_filtration &result, - const One_critical_filtration &to_add) { - if (result.is_nan() || to_add.is_nan() || (result.is_inf() && to_add.is_minus_inf()) || - (result.is_minus_inf() && to_add.is_inf())) [[unlikely]] { + + friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_subtract) + { + if (result.empty()) return result; + + if (result.is_nan() || std::isnan(to_subtract) || (result.is_inf() && to_subtract == T_inf) || + (result.is_minus_inf() && to_subtract == -T_inf)) { result = nan(); return result; } - if (result.is_inf() || to_add.is_inf()) [[unlikely]] { + if (result.is_inf() || to_subtract == -T_inf) { result = inf(); return result; } - if (result.is_minus_inf() || to_add.is_minus_inf()) [[unlikely]] { + if (result.is_minus_inf() || to_subtract == T_inf) { result = minus_inf(); return result; } - std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::plus()); - return result; + return apply_scalar_operation_on_finite_value_(result, to_subtract, subtract_); } - inline friend One_critical_filtration &operator*=(One_critical_filtration &result, - const One_critical_filtration &to_add) { - assert(result.is_finite() || to_add.is_finite()); - std::transform(result.begin(), result.end(), to_add.begin(), result.begin(), std::multiplies()); + + // addition + friend One_critical_filtration operator+(One_critical_filtration result, const One_critical_filtration &to_add) + { + result += to_add; return result; } - inline friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_substract) { - for (auto &truc : result) { - truc -= to_substract; - } + friend One_critical_filtration operator+(One_critical_filtration result, const T &to_add) + { + result += to_add; return result; } - inline friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) { - for (auto &truc : result) { - truc += to_add; - } + + friend One_critical_filtration operator+(const T &to_add, One_critical_filtration result) + { + result += to_add; return result; } - inline friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_add) { - if (to_add == T_inf || to_add == -T_inf) [[unlikely]] { - for (auto &truc : result) { - if (truc > 0) - truc = to_add; - else if (truc < 0) - truc = -to_add; - // 0*inf = 0 - } + + friend One_critical_filtration &operator+=(One_critical_filtration &result, const One_critical_filtration &to_add) + { + if (result.empty()) return result; + + if (result.is_nan() || to_add.is_nan() || (result.is_inf() && to_add.is_minus_inf()) || + (result.is_minus_inf() && to_add.is_inf())) { + result = nan(); return result; } - for (auto &truc : result) { - truc *= to_add; + if (result.is_inf() || to_add.is_inf()) { + result = inf(); + return result; } - return result; + if (result.is_minus_inf() || to_add.is_minus_inf()) { + result = minus_inf(); + return result; + } + + GUDHI_CHECK(result.size() == to_add.size(), + "Two filtration points with different number of parameters cannot be added."); + + return apply_operation_with_finite_values_(result, to_add, add_); } - inline friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_add) { - for (auto &truc : result) { - truc /= to_add; + + friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) + { + if (result.empty()) return result; + + if (result.is_nan() || std::isnan(to_add) || (result.is_inf() && to_add == -T_inf) || + (result.is_minus_inf() && to_add == T_inf)) { + result = nan(); + return result; } - return result; + if (result.is_inf() || to_add == T_inf) { + result = inf(); + return result; + } + if (result.is_minus_inf() || to_add == -T_inf) { + result = minus_inf(); + return result; + } + + return apply_scalar_operation_on_finite_value_(result, to_add, add_); } - /// OPERATORS * - inline friend One_critical_filtration operator+(One_critical_filtration result, const T &to_add) { - result += to_add; + // multiplication + friend One_critical_filtration operator*(One_critical_filtration result, const One_critical_filtration &to_mul) + { + result *= to_mul; return result; } - inline friend One_critical_filtration operator+(One_critical_filtration result, - const One_critical_filtration &to_add) { - result += to_add; + friend One_critical_filtration operator*(One_critical_filtration result, const T &to_mul) + { + result *= to_mul; return result; } - inline friend One_critical_filtration operator-(One_critical_filtration result, - const One_critical_filtration &to_add) { - result -= to_add; + + friend One_critical_filtration operator*(const T &to_mul, One_critical_filtration result) + { + result *= to_mul; return result; } - inline friend One_critical_filtration operator-(One_critical_filtration result, const T &to_add) { - result -= to_add; - return result; + + friend One_critical_filtration &operator*=(One_critical_filtration &result, const One_critical_filtration &to_mul) + { + if (result.empty()) return result; + + if (result.is_nan() || to_mul.is_nan()) { + result = nan(); + return result; + } + + bool res_is_infinite = result.is_inf() || result.is_minus_inf(); + bool to_mul_is_infinite = to_mul.is_inf() || to_mul.is_minus_inf(); + + if (res_is_infinite && to_mul_is_infinite) { + if (to_mul.is_minus_inf()) { + result[0] = -result[0]; + } + return result; + } + + if (res_is_infinite || to_mul_is_infinite) { + const One_critical_filtration &finite = res_is_infinite ? to_mul : result; + const T infinite = res_is_infinite ? result[0] : to_mul[0]; + result = finite; + return apply_scalar_operation_on_finite_value_(result, infinite, multiply_); + } + + GUDHI_CHECK(result.size() == to_mul.size(), + "Two filtration points with different number of parameters cannot be multiplied."); + + return apply_operation_with_finite_values_(result, to_mul, multiply_); } - inline friend One_critical_filtration operator*(One_critical_filtration result, const T &to_add) { - result *= to_add; - return result; + + friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_mul) + { + if (result.empty()) return result; + + if (result.is_nan() || std::isnan(to_mul)) { + result = nan(); + return result; + } + + if (result.is_inf() || result.is_minus_inf()) { + if (to_mul == 0) + result = nan(); + else if (to_mul < 0) + result[0] = -result[0]; + return result; + } + + return apply_scalar_operation_on_finite_value_(result, to_mul, multiply_); } - inline friend One_critical_filtration operator+(const T &to_add, const One_critical_filtration &result) { - return result + to_add; + // division + friend One_critical_filtration operator/(One_critical_filtration result, const One_critical_filtration &to_div) + { + result /= to_div; + return result; } - inline friend One_critical_filtration operator-(const T &to_add, const One_critical_filtration &result) { - return result - to_add; + + friend One_critical_filtration operator/(One_critical_filtration result, const T &to_div) + { + result /= to_div; + return result; } - inline friend One_critical_filtration operator*(const T &to_add, const One_critical_filtration &result) { - return result * to_add; + + friend One_critical_filtration operator/(const T &value, const One_critical_filtration &f) + { + if (f.empty()) return f; + if (std::isnan(value) || f.is_nan()) return nan(); + + One_critical_filtration result(f.size(), value); + result /= f; + return result; } - // template - inline friend bool operator==(const One_critical_filtration &self, const One_critical_filtration &to_compare) { - if (self.num_parameters() != to_compare.num_parameters()) return false; - auto it = to_compare.begin(); - for (auto i = 0u; i < self.num_parameters(); i++) { - if (self.at(i) != *(it++)) return false; + friend One_critical_filtration &operator/=(One_critical_filtration &result, const One_critical_filtration &to_div) + { + if (result.empty()) return result; + + bool res_is_infinite = result.is_inf() || result.is_minus_inf(); + bool to_div_is_infinite = to_div.is_inf() || to_div.is_minus_inf(); + + if (result.is_nan() || to_div.is_nan() || (res_is_infinite && to_div_is_infinite)) { + result = nan(); + return result; + } + + if (to_div_is_infinite) { + return apply_scalar_operation_on_finite_value_with_all_nan_possible_(result, to_div[0], divide_); } - return true; - } - inline static std::vector> to_python(const std::vector> &to_convert) { - return std::vector>(to_convert.begin(), to_convert.end()); + GUDHI_CHECK(res_is_infinite || result.size() == to_div.size(), + "Two filtration points with different number of parameters cannot be divided."); + + if (res_is_infinite) { + result.resize(to_div.size(), result[0]); + } + + return apply_operation_with_finite_values_(result, to_div, divide_); } - inline static std::vector> from_python(const std::vector> &to_convert) { - return std::vector>(to_convert.begin(), to_convert.end()); + friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_div) + { + if (result.empty()) return result; + + bool res_is_infinite = result.is_inf() || result.is_minus_inf(); + bool to_div_is_infinite = to_div == T_inf || to_div == -T_inf; + + if (to_div == 0 || std::isnan(to_div) || result.is_nan() || (res_is_infinite && to_div_is_infinite)) { + result = nan(); + return result; + } + + if (res_is_infinite) { + if (to_div < 0) result[0] = -result[0]; + return result; + } + + return apply_scalar_operation_on_finite_value_with_all_nan_possible_(result, to_div, divide_); } + // MODIFIERS + /** \brief This functions take the filtration value `this` and pushes it to * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} * @param[in] x The target filtration value on which to push `this`. */ - inline void push_to(const One_critical_filtration &x) { + void push_to(const One_critical_filtration &x) + { if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; if (x.is_inf() || this->is_minus_inf()) { *this = x; return; } - if (this->num_parameters() != x.num_parameters()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->num_parameters() << " and " - << x.num_parameters() << "are different !" << std::endl; - std::cerr << "This : " << *this << std::endl; - std::cerr << "arg : " << x << std::endl; - throw std::logic_error("Bad sizes"); - } + + GUDHI_CHECK(this->num_parameters() == x.num_parameters(), + "A filtration value cannot be pushed to another one with different numbers of parameters."); + for (std::size_t i = 0; i < x.num_parameters(); i++) - this->operator[](i) = this->operator[](i) > x[i] ? this->operator[](i) : x[i]; + Base::operator[](i) = Base::operator[](i) > x[i] ? Base::operator[](i) : x[i]; } /** \brief This functions take the filtration value `this` and pulls it to the @@ -307,143 +521,303 @@ class One_critical_filtration : public std::vector { * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} * @param[in] x The target filtration value on which to push `this`. */ - inline void pull_to(const One_critical_filtration &x) { + void pull_to(const One_critical_filtration &x) + { if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; if (this->is_inf() || x.is_minus_inf()) { *this = x; return; } - if (this->num_parameters() != x.num_parameters()) { - std::cerr << "Does only work with 1-critical filtrations ! Sizes " << this->num_parameters() << " and " - << x.num_parameters() << "are different !" << std::endl; - std::cerr << "This : " << *this << std::endl; - std::cerr << "arg : " << x << std::endl; - throw std::logic_error("Bad sizes"); - } + + GUDHI_CHECK(this->num_parameters() == x.num_parameters(), + "A filtration value cannot be pulled to another one with different numbers of parameters."); + for (std::size_t i = 0u; i < x.num_parameters(); i++) - this->operator[](i) = this->operator[](i) > x[i] ? x[i] : this->operator[](i); + Base::operator[](i) = Base::operator[](i) > x[i] ? x[i] : Base::operator[](i); } - // Warning, this function assumes that the comparisons checks have already - // been made ! - inline void insert_new(One_critical_filtration to_concatenate) { - this->insert(this->end(), std::move_iterator(to_concatenate.begin()), std::move_iterator(to_concatenate.end())); + + /* + * Same as `compute_coordinates_in_grid` but does the operation in-place + */ + template + void project_onto_grid(const std::vector &grid, bool coordinate = true) + { + GUDHI_CHECK(grid.size() >= Base::size(), + "The grid should not be smaller than the number of parameters in the filtration value."); + for (std::size_t parameter = 0u; parameter < Base::size(); ++parameter) { + const auto &filtration = grid[parameter]; + auto d = + std::distance(filtration.begin(), + std::lower_bound(filtration.begin(), + filtration.end(), + static_cast(Base::operator[](parameter)))); + Base::operator[](parameter) = coordinate ? static_cast(d) : static_cast(filtration[d]); + } } + // FONCTIONNALITIES + // scalar product of a filtration value with x. template - inline U linear_projection(const std::vector &x) { + friend U compute_linear_projection(const One_critical_filtration &f, const std::vector &x) + { U projection = 0; - std::size_t size = std::min(x.size(), this->size()); - for (std::size_t i = 0u; i < size; i++) projection += x[i] * static_cast(this->operator[](i)); + std::size_t size = std::min(x.size(), f.size()); + for (std::size_t i = 0u; i < size; i++) projection += x[i] * static_cast(f[i]); return projection; } - // easy debug - inline friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &truc) { - if (truc.is_inf()) { - stream << "[inf, ..., inf]"; - return stream; - } - if (truc.is_minus_inf()) { - stream << "[-inf, ..., -inf]"; - return stream; - } - if (truc.is_nan()) { - stream << "[NaN]"; - return stream; - } - if (truc.empty()) { - stream << "[]"; - return stream; - } - stream << "["; - for (std::size_t i = 0; i < truc.size() - 1; i++) { - stream << truc[i] << ", "; - } - if (!truc.empty()) stream << truc.back(); - stream << "]"; - return stream; - } - inline T norm() const { + friend T compute_norm(const One_critical_filtration &f) + { T out = 0; - for (auto &stuff : *this) out += std::pow(stuff, 2); - return sqrt(out); + for (auto &val : f) out += (val * val); + return std::sqrt(out); } - inline T distance(const One_critical_filtration &other) const { + + friend T compute_euclidean_distance_to(const One_critical_filtration &f, const One_critical_filtration &other) + { T out = 0; for (std::size_t i = 0u; i < other.size(); i++) { - out += std::pow((*this)[i] - other[i], 2); + out += (f[i] - other[i]) * (f[i] - other[i]); } - return sqrt(out); + return std::sqrt(out); } + /** * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), * projects itself into this grid, and returns the coordinates of this projected points * in the given grid */ - template - inline One_critical_filtration coordinates_in_grid(const std::vector> &grid) const { - One_critical_filtration coords(this->size()); - assert(grid.size() >= this->size()); - for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { - const auto &filtration = grid[parameter]; - auto C = std::distance(filtration.begin(), std::lower_bound(filtration.begin(), filtration.end(), - static_cast(this->operator[](parameter)))); - coords[parameter] = static_cast(C); - } + template + friend One_critical_filtration compute_coordinates_in_grid(const One_critical_filtration &f, + const std::vector > &grid) + { + One_critical_filtration coords = f.as_type(); + coords.project_onto_grid(grid); return coords; } + /** * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), * and assuming that `this` correspond to the coordinates in this grid, * returns the points evaluated in this grid */ template - inline One_critical_filtration evaluate_in_grid(const std::vector> &grid) const { - One_critical_filtration pushed_value(this->size()); - assert(grid.size() == this->size()); - U grid_inf = - std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + friend One_critical_filtration evaluate_coordinates_in_grid(const One_critical_filtration &f, + const std::vector > &grid) + { + One_critical_filtration pushed_value(f.size()); + + GUDHI_CHECK(grid.size() == f.size(), + "The size of the grid should correspond to the number of parameters in the filtration value."); + + U grid_inf = One_critical_filtration::T_inf; + for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { const auto &filtration = grid[parameter]; - const auto &c = this->operator[](parameter); - pushed_value[parameter] = c == T_inf ? grid_inf : filtration[c]; + const auto &c = f[parameter]; + pushed_value[parameter] = c == f.T_inf ? grid_inf : filtration[c]; } return pushed_value; } - /* - * Same as `evaluate_in_grid` but does the operation in-place - */ - template - inline void coordinates_in_grid_inplace(const std::vector &grid, bool coordinate = true) { - One_critical_filtration coords(this->size()); - assert(grid.size() >= this->size()); - for (std::size_t parameter = 0u; parameter < grid.size(); ++parameter) { - const auto &filtration = grid[parameter]; - auto d = std::distance(filtration.begin(), - std::lower_bound(filtration.begin(), filtration.end(), this->operator[](parameter))); - this->operator[](parameter) = coordinate ? static_cast(d) : static_cast(grid[parameter][d]); - ; + // UTILITIES + + // easy debug + friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &f) + { + if (f.is_inf()) { + stream << "[inf, ..., inf]"; + return stream; } - } - // like numpy - template - inline One_critical_filtration astype() const { - One_critical_filtration out(this->size()); - for (std::size_t i = 0u; i < this->size(); i++) out[i] = static_cast(this->operator[](i)); - return out; + if (f.is_minus_inf()) { + stream << "[-inf, ..., -inf]"; + return stream; + } + if (f.is_nan()) { + stream << "[NaN]"; + return stream; + } + if (f.empty()) { + stream << "[]"; + return stream; + } + stream << "["; + for (std::size_t i = 0; i < f.size() - 1; i++) { + stream << f[i] << ", "; + } + if (!f.empty()) stream << f.back(); + stream << "]"; + return stream; } public: // TODO : maybe add the {inf}, minus inf, nan there as static members? this // would make comparisons faster (just compare the ptr) - // TODO : I'm not sure why constexpr doens't work anymore + // TODO : I'm not sure why constexpr doesn't work anymore constexpr static const T T_inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); // for compiler constexpr static bool is_multi_critical = false; + + private: + constexpr static bool subtract_(T &v1, T v2) { return add_(v1, -v2); } + + constexpr static bool add_(T &v1, T v2) + { + if (std::isnan(v1) || std::isnan(v2) || (v1 == T_inf && v2 == -T_inf) || (v1 == -T_inf && v2 == T_inf)) { + v1 = std::numeric_limits::quiet_NaN(); + return false; + } + if (v1 == T_inf || v1 == -T_inf) { + return true; + } + if (v2 == T_inf || v2 == -T_inf) { + v1 = v2; + return true; + } + + v1 += v2; + return true; + } + + constexpr static bool multiply_(T &v1, T v2) + { + bool v1_is_infinite = v1 == T_inf || v1 == -T_inf; + bool v2_is_infinite = v2 == T_inf || v2 == -T_inf; + + if (std::isnan(v1) || std::isnan(v2) || (v1_is_infinite && v2 == 0) || (v1 == 0 && v2_is_infinite)) { + v1 = std::numeric_limits::quiet_NaN(); + return false; + } + + if ((v1 == T_inf && v2 > 0) || (v1 == -T_inf && v2 < 0) || (v1 < 0 && v2 == -T_inf) || (v1 > 0 && v2 == T_inf)) { + v1 = T_inf; + return true; + } + + if ((v1 == T_inf && v2 < 0) || (v1 == -T_inf && v2 > 0) || (v1 > 0 && v2 == -T_inf) || (v1 < 0 && v2 == T_inf)) { + v1 = -T_inf; + return true; + } + + v1 *= v2; + return true; + } + + constexpr static bool divide_(T &v1, T v2) + { + bool v1_is_infinite = v1 == T_inf || v1 == -T_inf; + bool v2_is_infinite = v2 == T_inf || v2 == -T_inf; + + if (std::isnan(v1) || std::isnan(v2) || v2 == 0 || (v1_is_infinite && v2_is_infinite)) { + v1 = std::numeric_limits::quiet_NaN(); + return false; + } + + if (v1 == 0 || (v1_is_infinite && v2 > 0)) return true; + + if (v1_is_infinite && v2 < 0) { + v1 = -v1; + return true; + } + + if (v2_is_infinite) { + v1 = 0; + return true; + } + + v1 /= v2; + return true; + } + + constexpr static bool update_sign_(T toComp, int &sign) + { + if (toComp == T_inf) { + if (sign == 0) + sign = 1; + else if (sign == -1) + return false; + } else if (toComp == -T_inf) { + if (sign == 0) + sign = -1; + else if (sign == 1) + return false; + } else { + return false; + } + + return true; + } + + template + static One_critical_filtration &apply_operation_with_finite_values_(One_critical_filtration &result, + const One_critical_filtration &to_operate, + F &&operate) + { + bool allSameInf = true; + bool allNaN = true; + int sign = 0; + for (auto i = 0u; i < result.size(); ++i) { + if (operate(result[i], to_operate[i])) { + allNaN = false; + } else { + if constexpr (!std::numeric_limits::has_quiet_NaN) { + result = nan(); + return result; + } + } + if (allSameInf) allSameInf = update_sign_(result[i], sign); + } + + if (allSameInf) result = (sign == 1 ? inf() : minus_inf()); + if (allNaN) result = nan(); + + return result; + } + + template + static One_critical_filtration &apply_scalar_operation_on_finite_value_(One_critical_filtration &result, + const T &to_operate, + F &&operate) + { + for (auto &val : result) { + if constexpr (std::numeric_limits::has_quiet_NaN) { + operate(val, to_operate); + } else { + if (!operate(val, to_operate)) { + result = nan(); + return result; + } + } + } + + return result; + } + + template + static One_critical_filtration &apply_scalar_operation_on_finite_value_with_all_nan_possible_( + One_critical_filtration &result, + const T &to_operate, + F &&operate) + { + bool allNaN = true; + + for (auto &val : result) { + if (operate(val, to_operate)) { + allNaN = false; + } else { + if constexpr (!std::numeric_limits::has_quiet_NaN) { + result = nan(); + return result; + } + } + } + if (allNaN) result = nan(); + + return result; + } }; } // namespace Gudhi::multi_filtration @@ -451,21 +825,38 @@ class One_critical_filtration : public std::vector { namespace std { template -class numeric_limits> { +class numeric_limits > +{ public: - static constexpr bool has_infinity = std::numeric_limits::has_infinity; + static constexpr bool has_infinity = true; + + static constexpr Gudhi::multi_filtration::One_critical_filtration infinity() noexcept + { + return Gudhi::multi_filtration::One_critical_filtration::inf(); + }; - static Gudhi::multi_filtration::One_critical_filtration infinity() throw() { - return Gudhi::multi_filtration::One_critical_filtration(1, std::numeric_limits::infinity()); + // non-standard + static constexpr Gudhi::multi_filtration::One_critical_filtration minus_infinity() noexcept + { + return Gudhi::multi_filtration::One_critical_filtration::minus_inf(); }; - static Gudhi::multi_filtration::One_critical_filtration minus_infinity() throw() { - return Gudhi::multi_filtration::One_critical_filtration(1, -std::numeric_limits::infinity()); + + static constexpr Gudhi::multi_filtration::One_critical_filtration max() noexcept(false) + { + throw std::logic_error( + "The maximal value cannot be represented with no finite numbers of parameters." + "Use `max(number_of_parameters)` instead"); }; - static Gudhi::multi_filtration::One_critical_filtration max() throw() { - return Gudhi::multi_filtration::One_critical_filtration(1, std::numeric_limits::max()); + + // non-standard, so I don't want to define a default value. + static constexpr Gudhi::multi_filtration::One_critical_filtration max(unsigned int n) noexcept + { + return Gudhi::multi_filtration::One_critical_filtration(n, std::numeric_limits::max()); }; - static Gudhi::multi_filtration::One_critical_filtration quiet_NaN() throw() { - return Gudhi::multi_filtration::One_critical_filtration(1, numeric_limits::quiet_NaN()); + + static constexpr Gudhi::multi_filtration::One_critical_filtration quiet_NaN() noexcept + { + return Gudhi::multi_filtration::One_critical_filtration::nan(); }; }; diff --git a/src/Multi_filtration/test/CMakeLists.txt b/src/Multi_filtration/test/CMakeLists.txt new file mode 100644 index 0000000000..13b1811050 --- /dev/null +++ b/src/Multi_filtration/test/CMakeLists.txt @@ -0,0 +1,4 @@ +include(GUDHI_boost_test) + +add_executable_with_targets(Multi_filtration_onecritical_unit_test multifiltration_onecritical_unit_test.cpp TBB::tbb) +gudhi_add_boost_test(Multi_filtration_onecritical_unit_test) diff --git a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp new file mode 100644 index 0000000000..684dbe5e5a --- /dev/null +++ b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp @@ -0,0 +1,509 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2024 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#include +#include +#include + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "multi_filtration" +#include +#include + +#include + +using Gudhi::multi_filtration::One_critical_filtration; + +typedef boost::mpl::list list_of_tested_variants; + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_constructors, T, list_of_tested_variants) +{ + One_critical_filtration f; + BOOST_CHECK(f.empty()); + BOOST_CHECK(f.num_parameters() == 0); + + One_critical_filtration f1(3); + BOOST_CHECK(f1.size() == 3); + BOOST_CHECK(f1.num_parameters() == 3); + BOOST_CHECK(f1[0] == -One_critical_filtration::T_inf); + + One_critical_filtration f2(3, 0); + BOOST_CHECK(f2.size() == 3); + BOOST_CHECK(f2.num_parameters() == 3); + BOOST_CHECK(f2[0] == 0); + + One_critical_filtration f3({0, 1, 2}); + BOOST_CHECK(f3.size() == 3); + BOOST_CHECK(f3.num_parameters() == 3); + BOOST_CHECK(f3[0] == 0); + BOOST_CHECK(f3[1] == 1); + BOOST_CHECK(f3[2] == 2); + + std::vector v{0, 1, 2}; + One_critical_filtration f4(v); + BOOST_CHECK(f4.size() == 3); + BOOST_CHECK(f4.num_parameters() == 3); + BOOST_CHECK(f4[0] == 0); + BOOST_CHECK(f4[1] == 1); + BOOST_CHECK(f4[2] == 2); + + One_critical_filtration f5(v.begin(), v.end()); + BOOST_CHECK(f5.size() == 3); + BOOST_CHECK(f5.num_parameters() == 3); + BOOST_CHECK(f5[0] == 0); + BOOST_CHECK(f5[1] == 1); + BOOST_CHECK(f5[2] == 2); + + f = f5; + BOOST_CHECK(f.size() == 3); + BOOST_CHECK(f.num_parameters() == 3); + BOOST_CHECK(f[0] == 0); + BOOST_CHECK(f[1] == 1); + BOOST_CHECK(f[2] == 2); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_utilities, T, list_of_tested_variants) +{ + One_critical_filtration f({0, 1, 2}); + bool test = std::is_same_v; + BOOST_CHECK(test); + + One_critical_filtration f2 = f.template as_type(); + test = std::is_same_v; + BOOST_CHECK(test); + BOOST_CHECK(f2.size() == 3); + BOOST_CHECK(f2.num_parameters() == 3); + BOOST_CHECK(f2[0] == 0.); + BOOST_CHECK(f2[1] == 1.); + BOOST_CHECK(f2[2] == 2.); + + BOOST_CHECK(!f.is_inf()); + BOOST_CHECK(!f.is_minus_inf()); + BOOST_CHECK(!f.is_nan()); + BOOST_CHECK(f.is_finite()); + + One_critical_filtration f3; + BOOST_CHECK(!f3.is_inf()); + BOOST_CHECK(!f3.is_minus_inf()); + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK(!f3.is_nan()); + } else { + BOOST_CHECK(f3.is_nan()); //by default nan if T has no nan + } + BOOST_CHECK(!f3.is_finite()); + + //{-inf, -inf, -inf} is considered finite as the user is supposed to updates the values to something else + //the idea is just to reserve space and to give the possibility to use `f4[i] =` + //if the value should really be -inf, use `f4(1)` or `f4 = minus_inf()` instead. + One_critical_filtration f4(3); + BOOST_CHECK(!f4.is_inf()); + BOOST_CHECK(!f4.is_minus_inf()); + BOOST_CHECK(!f4.is_nan()); + BOOST_CHECK(f4.is_finite()); + + One_critical_filtration f5(1); + BOOST_CHECK(!f5.is_inf()); + BOOST_CHECK(f5.is_minus_inf()); + BOOST_CHECK(!f5.is_nan()); + BOOST_CHECK(!f5.is_finite()); + + auto f6 = One_critical_filtration::nan(); + BOOST_CHECK(!f6.is_inf()); + BOOST_CHECK(!f6.is_minus_inf()); + BOOST_CHECK(f6.is_nan()); + BOOST_CHECK(!f6.is_finite()); + + auto f7 = One_critical_filtration::inf(); + BOOST_CHECK(f7.is_inf()); + BOOST_CHECK(!f7.is_minus_inf()); + BOOST_CHECK(!f7.is_nan()); + BOOST_CHECK(!f7.is_finite()); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_comparators, T, list_of_tested_variants) +{ + One_critical_filtration f1({0, 1, 2}); + One_critical_filtration f2({-1, 0, 1}); + One_critical_filtration f3({1, 2, 3}); + One_critical_filtration f4({5, -1, 2}); + + BOOST_CHECK(!(f1 < f1)); + BOOST_CHECK(!(f1 < f2)); + BOOST_CHECK(f1 < f3); + BOOST_CHECK(!(f1 < f4)); + BOOST_CHECK(!(f1 < One_critical_filtration::nan())); + BOOST_CHECK(f1 < One_critical_filtration::inf()); + BOOST_CHECK(!(f1 < One_critical_filtration::minus_inf())); + + BOOST_CHECK(f1 <= f1); + BOOST_CHECK(!(f1 <= f2)); + BOOST_CHECK(f1 <= f3); + BOOST_CHECK(!(f1 <= f4)); + BOOST_CHECK(!(f1 <= One_critical_filtration::nan())); + BOOST_CHECK(f1 <= One_critical_filtration::inf()); + BOOST_CHECK(!(f1 <= One_critical_filtration::minus_inf())); + + BOOST_CHECK(!(f1 > f1)); + BOOST_CHECK(f1 > f2); + BOOST_CHECK(!(f1 > f3)); + BOOST_CHECK(!(f1 > f4)); + BOOST_CHECK(!(f1 > One_critical_filtration::nan())); + BOOST_CHECK(!(f1 > One_critical_filtration::inf())); + BOOST_CHECK(f1 > One_critical_filtration::minus_inf()); + + BOOST_CHECK(f1 >= f1); + BOOST_CHECK(f1 >= f2); + BOOST_CHECK(!(f1 >= f3)); + BOOST_CHECK(!(f1 >= f4)); + BOOST_CHECK(!(f1 >= One_critical_filtration::nan())); + BOOST_CHECK(!(f1 >= One_critical_filtration::inf())); + BOOST_CHECK(f1 >= One_critical_filtration::minus_inf()); + + BOOST_CHECK(f1 == f1); + BOOST_CHECK(!(f1 == f2)); + BOOST_CHECK(!(f1 == f3)); + BOOST_CHECK(!(f1 == f4)); + BOOST_CHECK(!(f1 == One_critical_filtration::nan())); + BOOST_CHECK(!(f1 == One_critical_filtration::inf())); + BOOST_CHECK(!(f1 == One_critical_filtration::minus_inf())); + + BOOST_CHECK(!(f1 != f1)); + BOOST_CHECK(f1 != f2); + BOOST_CHECK(f1 != f3); + BOOST_CHECK(f1 != f4); + BOOST_CHECK(f1 != One_critical_filtration::nan()); + BOOST_CHECK(f1 != One_critical_filtration::inf()); + BOOST_CHECK(f1 != One_critical_filtration::minus_inf()); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_operators, T, list_of_tested_variants) +{; + One_critical_filtration f({-10, 0, 1}); + One_critical_filtration f2({5, 2, -1}); + One_critical_filtration f3( + {-One_critical_filtration::T_inf, One_critical_filtration::T_inf, -One_critical_filtration::T_inf}); + One_critical_filtration f4( + {One_critical_filtration::T_inf, -One_critical_filtration::T_inf, One_critical_filtration::T_inf}); + + auto res = -f; + BOOST_CHECK_EQUAL(res[0], 10); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], -1); + BOOST_CHECK((-One_critical_filtration::inf()).is_minus_inf()); + BOOST_CHECK((-One_critical_filtration::minus_inf()).is_inf()); + BOOST_CHECK((-One_critical_filtration::nan()).is_nan()); + + res = f - f2; + BOOST_CHECK_EQUAL(res[0], -15); + BOOST_CHECK_EQUAL(res[1], -2); + BOOST_CHECK_EQUAL(res[2], 2); + + res = f - f3; + BOOST_CHECK_EQUAL(res[0], f4[0]); + BOOST_CHECK_EQUAL(res[1], f4[1]); + BOOST_CHECK_EQUAL(res[2], f4[2]); + + res = f3 - f; + BOOST_CHECK_EQUAL(res[0], f3[0]); + BOOST_CHECK_EQUAL(res[1], f3[1]); + BOOST_CHECK_EQUAL(res[2], f3[2]); + + res = 5 - f; + BOOST_CHECK_EQUAL(res[0], 15); + BOOST_CHECK_EQUAL(res[1], 5); + BOOST_CHECK_EQUAL(res[2], 4); + + res = f - 5; + BOOST_CHECK_EQUAL(res[0], -15); + BOOST_CHECK_EQUAL(res[1], -5); + BOOST_CHECK_EQUAL(res[2], -4); + + BOOST_CHECK((f - One_critical_filtration::inf()).is_minus_inf()); + BOOST_CHECK((One_critical_filtration::inf() - f).is_inf()); + BOOST_CHECK((f - One_critical_filtration::minus_inf()).is_inf()); + BOOST_CHECK((One_critical_filtration::minus_inf() - f).is_minus_inf()); + BOOST_CHECK((f - One_critical_filtration::nan()).is_nan()); + BOOST_CHECK((One_critical_filtration::nan() - f).is_nan()); + + res = f3 - f3; + BOOST_CHECK(res.is_nan()); + res = f3 - f4; + BOOST_CHECK_EQUAL(res[0], f3[0]); + BOOST_CHECK_EQUAL(res[1], f3[1]); + BOOST_CHECK_EQUAL(res[2], f3[2]); + + res = f + f2; + BOOST_CHECK_EQUAL(res[0], -5); + BOOST_CHECK_EQUAL(res[1], 2); + BOOST_CHECK_EQUAL(res[2], 0); + + res = f + f3; + BOOST_CHECK_EQUAL(res[0], f3[0]); + BOOST_CHECK_EQUAL(res[1], f3[1]); + BOOST_CHECK_EQUAL(res[2], f3[2]); + + res = 5 + f; + BOOST_CHECK_EQUAL(res[0], -5); + BOOST_CHECK_EQUAL(res[1], 5); + BOOST_CHECK_EQUAL(res[2], 6); + + res = f + 5; + BOOST_CHECK_EQUAL(res[0], -5); + BOOST_CHECK_EQUAL(res[1], 5); + BOOST_CHECK_EQUAL(res[2], 6); + + BOOST_CHECK((f + One_critical_filtration::inf()).is_inf()); + BOOST_CHECK((One_critical_filtration::inf() + f).is_inf()); + BOOST_CHECK((f + One_critical_filtration::minus_inf()).is_minus_inf()); + BOOST_CHECK((One_critical_filtration::minus_inf() + f).is_minus_inf()); + BOOST_CHECK((f + One_critical_filtration::nan()).is_nan()); + BOOST_CHECK((One_critical_filtration::nan() + f).is_nan()); + + res = f3 + f4; + BOOST_CHECK(res.is_nan()); + res = f3 + f3; + BOOST_CHECK_EQUAL(res[0], f3[0]); + BOOST_CHECK_EQUAL(res[1], f3[1]); + BOOST_CHECK_EQUAL(res[2], f3[2]); + + res = f * f2; + BOOST_CHECK_EQUAL(res[0], -50); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], -1); + + res = f * f3; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], f4[0]); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], f3[2]); + } else { + BOOST_CHECK(res.is_nan()); + } + + res = 5 * f; + BOOST_CHECK_EQUAL(res[0], -50); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], 5); + + res = f * 5; + BOOST_CHECK_EQUAL(res[0], -50); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], 5); + + res = f * One_critical_filtration::inf(); + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], -One_critical_filtration::T_inf); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], One_critical_filtration::T_inf); + } else { + BOOST_CHECK(res.is_nan()); + } + res = One_critical_filtration::inf() * f; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], -One_critical_filtration::T_inf); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], One_critical_filtration::T_inf); + } else { + BOOST_CHECK(res.is_nan()); + } + res = f * One_critical_filtration::minus_inf(); + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], One_critical_filtration::T_inf); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], -One_critical_filtration::T_inf); + } else { + BOOST_CHECK(res.is_nan()); + } + res = One_critical_filtration::minus_inf() * f; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], One_critical_filtration::T_inf); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], -One_critical_filtration::T_inf); + } else { + BOOST_CHECK(res.is_nan()); + } + res = f * One_critical_filtration::nan(); + BOOST_CHECK(res.is_nan()); + res = One_critical_filtration::nan() * f; + BOOST_CHECK(res.is_nan()); + + res = f3 * f3; + BOOST_CHECK(res.is_inf()); + res = f3 * f4; + BOOST_CHECK(res.is_minus_inf()); + + res = f / f2; + BOOST_CHECK_EQUAL(res[0], -2); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], -1); + + res = f / f3; + BOOST_CHECK_EQUAL(res[0], 0); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], 0); + + res = f3 / f; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], f4[0]); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], f3[2]); + } else { + BOOST_CHECK(res.is_nan()); + } + + res = 5 / f; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], -0.5); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], 5); + } else { + BOOST_CHECK(res.is_nan()); + } + + res = f / 5; + BOOST_CHECK_EQUAL(res[0], -2); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], static_cast(1) / static_cast(5)); //to avoid precision error + + res = f / One_critical_filtration::inf(); + BOOST_CHECK_EQUAL(res[0], 0); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], 0); + res = One_critical_filtration::inf() / f; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], -One_critical_filtration::T_inf); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], One_critical_filtration::T_inf); + } else { + BOOST_CHECK(res.is_nan()); + } + res = f / One_critical_filtration::minus_inf(); + BOOST_CHECK_EQUAL(res[0], 0); + BOOST_CHECK_EQUAL(res[1], 0); + BOOST_CHECK_EQUAL(res[2], 0); + res = One_critical_filtration::minus_inf() / f; + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(res[0], One_critical_filtration::T_inf); + BOOST_CHECK(std::isnan(res[1])); + BOOST_CHECK_EQUAL(res[2], -One_critical_filtration::T_inf); + } else { + BOOST_CHECK(res.is_nan()); + } + res = f / One_critical_filtration::nan(); + BOOST_CHECK(res.is_nan()); + res = One_critical_filtration::nan() / f; + BOOST_CHECK(res.is_nan()); + + res = f3 / f3; + BOOST_CHECK(res.is_nan()); + res = f3 / f4; + BOOST_CHECK(res.is_nan()); + res = f / One_critical_filtration({0, 0, 0}); + BOOST_CHECK(res.is_nan()); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_modifiers, T, list_of_tested_variants) +{ + One_critical_filtration f({0, 1, 2}); + BOOST_CHECK_EQUAL(f[0], 0); + BOOST_CHECK_EQUAL(f[1], 1); + BOOST_CHECK_EQUAL(f[2], 2); + + f.push_to({-1, 5, 6}); + BOOST_CHECK_EQUAL(f[0], 0); + BOOST_CHECK_EQUAL(f[1], 5); + BOOST_CHECK_EQUAL(f[2], 6); + + f.push_to({-1, -5, -6}); + BOOST_CHECK_EQUAL(f[0], 0); + BOOST_CHECK_EQUAL(f[1], 5); + BOOST_CHECK_EQUAL(f[2], 6); + + f.push_to(One_critical_filtration::minus_inf()); + BOOST_CHECK_EQUAL(f[0], 0); + BOOST_CHECK_EQUAL(f[1], 5); + BOOST_CHECK_EQUAL(f[2], 6); + + f.push_to(One_critical_filtration::inf()); + BOOST_CHECK(f.is_inf()); + + f.push_to(One_critical_filtration::nan()); + BOOST_CHECK(f.is_inf()); + + f.pull_to({-1, 5, 6}); + BOOST_CHECK_EQUAL(f[0], -1); + BOOST_CHECK_EQUAL(f[1], 5); + BOOST_CHECK_EQUAL(f[2], 6); + + f.pull_to({1, 8, 9}); + BOOST_CHECK_EQUAL(f[0], -1); + BOOST_CHECK_EQUAL(f[1], 5); + BOOST_CHECK_EQUAL(f[2], 6); + + f.pull_to(One_critical_filtration::inf()); + BOOST_CHECK_EQUAL(f[0], -1); + BOOST_CHECK_EQUAL(f[1], 5); + BOOST_CHECK_EQUAL(f[2], 6); + + f.pull_to(One_critical_filtration::minus_inf()); + BOOST_CHECK(f.is_minus_inf()); + + f.pull_to(One_critical_filtration::nan()); + BOOST_CHECK(f.is_minus_inf()); + + std::vector > grid = {{0, 2, 4, 8}, {0, 3, 6, 9}, {0, 4, 8, 16}}; + + f.push_to({1, 7, 5}); + f.project_onto_grid(grid, true); + BOOST_CHECK_EQUAL(f[0], 1); + BOOST_CHECK_EQUAL(f[1], 3); + BOOST_CHECK_EQUAL(f[2], 2); + + f.push_to({1, 7, 5}); + f.project_onto_grid(grid, false); + BOOST_CHECK_EQUAL(f[0], 2); + BOOST_CHECK_EQUAL(f[1], 9); + BOOST_CHECK_EQUAL(f[2], 8); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_friends, T, list_of_tested_variants) +{ + One_critical_filtration f({0, 1, 2}); + + BOOST_CHECK_EQUAL(compute_linear_projection(f, {2,3,5,9}), 13); + BOOST_CHECK_EQUAL(compute_norm(f), static_cast(std::sqrt(T(5)))); + BOOST_CHECK_EQUAL(compute_euclidean_distance_to(f, {2,3,5}), static_cast(std::sqrt(T(17)))); + + f = {1, 7, 5}; + + std::vector > grid = {{0, 2, 4, 8}, {0, 3, 6, 9}, {0, 4, 8, 16}}; + auto res = compute_coordinates_in_grid(f, grid); + BOOST_CHECK_EQUAL(res[0], 1); + BOOST_CHECK_EQUAL(res[1], 3); + BOOST_CHECK_EQUAL(res[2], 2); + + res = evaluate_coordinates_in_grid(res, grid); + BOOST_CHECK_EQUAL(res[0], 2); + BOOST_CHECK_EQUAL(res[1], 9); + BOOST_CHECK_EQUAL(res[2], 8); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_numerical_limits, T, list_of_tested_variants) +{ + BOOST_CHECK(std::numeric_limits >::has_infinity); + BOOST_CHECK(std::numeric_limits >::infinity().is_inf()); + BOOST_CHECK(std::numeric_limits >::quiet_NaN().is_nan()); + BOOST_CHECK_THROW(std::numeric_limits >::max(), std::logic_error); + auto max = std::numeric_limits >::max(3); + BOOST_CHECK_EQUAL(max[0], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[1], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[2], std::numeric_limits::max()); +} + From a8821943699c009554b7cc1a0ac944ca7f724395 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Tue, 27 Aug 2024 17:24:31 +0200 Subject: [PATCH 69/87] multi_critical_filtration --- .../include/gudhi/Multi_critical_filtration.h | 730 +++++++++++------- .../include/gudhi/One_critical_filtration.h | 2 +- src/Multi_filtration/test/CMakeLists.txt | 3 + ...ultifiltration_multicritical_unit_test.cpp | 472 +++++++++++ .../multifiltration_onecritical_unit_test.cpp | 2 +- 5 files changed, 930 insertions(+), 279 deletions(-) create mode 100644 src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 97ec4430ff..be15bea6b2 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -5,6 +5,7 @@ * Copyright (C) 2023 Inria * * Modification(s): + * - 2024/08 Hannah Schreiber: Optimization and correction + numeric_limits * - YYYY/MM Author: Description of the modification */ @@ -15,10 +16,12 @@ #include #include #include -#include #include #include +#include +#include #include +#include "gudhi/Debug_utils.h" #include @@ -37,115 +40,230 @@ namespace Gudhi::multi_filtration { */ template -class Multi_critical_filtration { +class Multi_critical_filtration +{ public: - using value_type = T; - using OneCritical = One_critical_filtration; // Type of the One critical subtype - template - using Base = Multi_critical_filtration; - std::size_t num_parameters() const { return multi_filtration_.size() == 0 ? 0 : multi_filtration_[0].size(); } - Multi_critical_filtration() : multi_filtration_(1) { - multi_filtration_[0] = co ? One_critical_filtration::inf() : One_critical_filtration::minus_inf(); - }; // initialize at 1, with 0 parameter (consistent with below) - Multi_critical_filtration(int n) - : multi_filtration_({One_critical_filtration(n)}) {}; // minus infinity by default - Multi_critical_filtration(int n, T value) - : multi_filtration_({One_critical_filtration(n, value)}) {}; // std::vector(n, value){}; - Multi_critical_filtration(std::initializer_list init) - : multi_filtration_({One_critical_filtration(init)}) {}; // : std::vector({std::vector(init)}; + using Single_point = One_critical_filtration; // Type of the One critical subtype + // TODO: not the best name... + using Points = std::vector; + using iterator = typename Points::iterator; + using const_iterator = typename Points::const_iterator; + + // CONSTRUCTORS + + // initialize at 1, with 1 parameter (consistent with below) + Multi_critical_filtration() : multi_filtration_(1, co ? Single_point::inf() : Single_point::minus_inf()) {}; + // warning: can be problematic if the user never updates the values and let it like that, {-inf, -inf, ...} is not + // considered as -inf. + Multi_critical_filtration(int n) : multi_filtration_({Single_point(n)}) {}; + // std::vector(n, value){}; + Multi_critical_filtration(int n, T value) : multi_filtration_({Single_point(n, value)}) {}; + // : std::vector({std::vector(init)}; + Multi_critical_filtration(std::initializer_list init) : multi_filtration_({Single_point(init)}) {}; Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}) {}; Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}) {}; - Multi_critical_filtration(const std::vector> &v) : multi_filtration_(v) {}; - Multi_critical_filtration(std::vector> &&v) : multi_filtration_(std::move(v)) {}; + // assumes all of the same size and that v is minimal (add simplify?) + Multi_critical_filtration(const std::vector &v) : multi_filtration_(v) {}; + // assumes all of the same size and that v is minimal (add simplify?) + Multi_critical_filtration(std::vector &&v) : multi_filtration_(std::move(v)) {}; Multi_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) - : multi_filtration_({One_critical_filtration(it_begin, it_end)}) {}; + : multi_filtration_({Single_point(it_begin, it_end)}) {}; + // : std::vector(it_begin, it_end){}; Multi_critical_filtration(typename std::vector::const_iterator it_begin, typename std::vector::const_iterator it_end) - : multi_filtration_({One_critical_filtration(it_begin, it_end)}) {}; // : std::vector(it_begin, it_end){}; + : multi_filtration_({Single_point(it_begin, it_end)}) {}; Multi_critical_filtration(const Multi_critical_filtration &other) : multi_filtration_(other.multi_filtration_) {}; - Multi_critical_filtration &operator=(const Multi_critical_filtration &other) { - this->multi_filtration_ = other.multi_filtration_; + Multi_critical_filtration &operator=(const Multi_critical_filtration &other) + { + multi_filtration_ = other.multi_filtration_; return *this; } - inline friend bool operator==(const Multi_critical_filtration &self, - const Multi_critical_filtration &to_compare) { - if (self.num_generators() != to_compare.num_generators()) return false; - auto it = to_compare.begin(); - for (auto i = 0u; i < self.num_generators(); i++) { - if (self[i] != *(it++)) return false; - } - return true; + + // VECTOR-LIKE + + using value_type = T; + + Single_point &operator[](std::size_t i) { return multi_filtration_[i]; } + + const Single_point &operator[](std::size_t i) const { return multi_filtration_[i]; } + + iterator begin() { return multi_filtration_.begin(); } + + iterator end() { return multi_filtration_.end(); } + + const_iterator begin() const { return multi_filtration_.begin(); } + + const_iterator end() const { return multi_filtration_.end(); } + + bool empty() const { return multi_filtration_.empty(); } + + void reserve(std::size_t n) { multi_filtration_.reserve(n); } + + void clear() { multi_filtration_.clear(); } + + // CONVERTERS + + operator Single_point() const + { + GUDHI_CHECK(num_generators() == 1, + "Casting a " + std::to_string(num_generators()) + + "-critical filtration value into an 1-critical filtration value."); + return multi_filtration_[0]; } - void reserve(std::size_t n) { this->multi_filtration_.reserve(n); } - void set_num_generators(std::size_t n) { this->multi_filtration_.resize(n); } - inline bool is_inf() const { return this->multi_filtration_.size() == 1 && this->multi_filtration_[0].is_inf(); } - inline bool is_minus_inf() const { - return this->multi_filtration_.size() == 1 && this->multi_filtration_[0].is_minus_inf(); + // like numpy + template + Multi_critical_filtration as_type() const + { + std::vector> out(num_generators()); + for (std::size_t i = 0u; i < num_generators(); ++i) { + out[i] = multi_filtration_[i].template as_type(); + } + return Multi_critical_filtration(std::move(out)); } - inline bool is_nan() const { return this->multi_filtration_.size() == 1 && this->multi_filtration_[0].is_nan(); } - inline bool is_finite() const { - if (this->empty()) return false; - for (auto &stuff : *this) { - if (!stuff.is_finite()) return false; + + // only needed once in multipers and does not need to be a friend, so could just be defined + // at the place it is needed and removed from here. + friend std::vector> get_content(const Multi_critical_filtration &f) + { + std::vector> out(f.num_generators(), std::vector(f.num_parameters())); + const auto &cont = f.get_underlying_container(); + for (std::size_t i = 0; i < f.num_generators(); ++i) { + for (std::size_t j = 0; j < f.num_parameters(); ++j) { + out[i][j] = cont[i][j]; + } } - return true; + return out; } - operator OneCritical() const { - assert(this->num_generators() == 1); - return this->multi_filtration_[0]; + // ACCESS + + const Points &get_underlying_container() const { return multi_filtration_; } + + std::size_t num_parameters() const { return multi_filtration_.empty() ? 0 : multi_filtration_[0].num_parameters(); } + + std::size_t num_generators() const { return multi_filtration_.size(); } + + constexpr static Multi_critical_filtration inf() { return Multi_critical_filtration(Single_point::inf()); } + + constexpr static Multi_critical_filtration minus_inf() + { + return Multi_critical_filtration(Single_point::minus_inf()); + } + + constexpr static Multi_critical_filtration nan() { return Multi_critical_filtration(Single_point::nan()); } + + // DESCRIPTORS + + bool is_inf() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_inf(); } + + bool is_minus_inf() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_minus_inf(); } + + bool is_nan() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_nan(); } + + bool is_finite() const + { + if (empty()) return false; + if (multi_filtration_.size() > 1) return true; + return multi_filtration_[0].is_finite(); } - OneCritical &operator[](std::size_t i) { return this->multi_filtration_[i]; } - inline OneCritical factorize_below() const { - if (this->num_generators() == 0) [[unlikely]] - return OneCritical(); - OneCritical result(multi_filtration_[0].num_parameters(), OneCritical::T_inf); - for (const auto &stuff : this->multi_filtration_) { - if (stuff.is_nan() || stuff.is_minus_inf()) return stuff; - if (stuff.is_inf()) continue; - for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { - result[i] = std::min(result[i], stuff[i]); + // COMPARAISON OPERATORS + + // TODO : this costs a lot... optimize / cheat in some way for python ? + /* + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + * + */ + bool operator<(const Multi_critical_filtration &other) const + { + // check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him + for (std::size_t i = 0u; i < other.multi_filtration_.size(); ++i) { + //for each point in other, verify if it is strictly in the cone of at least one point of this + bool isContained = false; + for (std::size_t j = 0u; j < multi_filtration_.size() && !isContained; ++j) { + // inum_generators() == 0) [[unlikely]] - return OneCritical(); - OneCritical result(multi_filtration_[0].num_parameters(), -OneCritical::T_inf); - for (auto &stuff : this->multi_filtration_) { - if (stuff.is_nan() || stuff.is_inf()) return stuff; - if (stuff.is_minus_inf()) continue; - for (std::size_t i = 0; i < stuff.num_parameters(); ++i) { - result[i] = std::max(result[i], stuff[i]); + bool operator>(const Multi_critical_filtration &other) const { return other < *this; } + + /* + * Checks if `this`, seen as a birth curve is under the `other` birth curve, + */ + bool operator<=(const Multi_critical_filtration &other) const + { + // check if this curves is below other's curve + // ie for each guy in this, check if there is a guy in other that dominates him + for (std::size_t i = 0u; i < other.multi_filtration_.size(); ++i) { + //for each point in other, verify if it is in the cone of at least one point of this + bool isContained = false; + for (std::size_t j = 0u; j < multi_filtration_.size() && !isContained; ++j) { + // i=(const Multi_critical_filtration &other) const { return other <= *this; } + + friend bool operator==(const Multi_critical_filtration &self, const Multi_critical_filtration &to_compare) + { + if (self.num_generators() != to_compare.num_generators()) return false; + for (auto i = 0u; i < self.num_generators(); i++) { + if (self[i] != to_compare[i]) return false; + } + return true; + } + + friend bool operator!=(const Multi_critical_filtration &self, const Multi_critical_filtration &to_compare) + { + return !(self == to_compare); } + + // MODIFIERS + + void set_num_generators(std::size_t n) { multi_filtration_.resize(n); } + /** \brief This functions take the filtration value `this` and pushes it to * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} * @param[in] x The target filtration value on which to push `this`. */ - inline void push_to(const One_critical_filtration &x) { + void push_to(const Single_point &x) + { if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; + + GUDHI_CHECK(x.is_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), + "Pushing to a filtration value with different number of parameters."); + if (x.is_inf() || this->is_minus_inf()) { - *this = x; + multi_filtration_ = {x}; return; } - for (auto &stuff : *this) { - stuff.push_to(x); + for (auto &fil : *this) { + fil.push_to(x); } + + simplify(); } - // TODO : this is not well defined for kcritical <-> kcritical + + // TODO: this is not well defined for k-critical <-> k-critical /** \brief This functions take the filtration value `this` and pulls it to the * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the @@ -153,284 +271,342 @@ class Multi_critical_filtration { * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} * @param[in] x The target filtration value on which to push `this`. */ - inline void pull_to(const One_critical_filtration &x) { + void pull_to(const Single_point &x) + { if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; + + GUDHI_CHECK(x.is_minus_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), + "Pulling to a filtration value with different number of parameters."); + if (this->is_inf() || x.is_minus_inf()) { - *this = x; + multi_filtration_ = {x}; return; } - for (auto &stuff : *this) { - stuff.pull_to(x); + for (auto &fil : *this) { + fil.pull_to(x); } + + simplify(); } - // cannot be const, as gudhi iterators are not const - template - inline U linear_projection(const std::vector &x) { - if constexpr (co) { - U projection = std::numeric_limits::lowest(); - for (const auto &y : *this) { - projection = std::max(projection, y.linear_projection(x)); - } - return projection; - } else { - U projection = std::numeric_limits::max(); - for (auto &y : *this) { // cannot be const (Gudhi) - projection = std::min(projection, y.linear_projection(x)); - } - return projection; + + /* + * Adds a birth point to the list of births, + * if it is useful (according to the method `dominate`) + */ + bool add_point(const Single_point &x) + { + if (multi_filtration_.empty()) { + multi_filtration_.push_back(x); + return true; } + + GUDHI_CHECK(x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite() || !x.is_finite(), + "Cannot add a point with different number of parameters."); + + std::size_t end = multi_filtration_.size(); + + if (_point_can_be_added(x, 0, end)) { + multi_filtration_.resize(end); + multi_filtration_.push_back(x); + return true; + } + + return false; } + // No security + void add_guaranteed_point(const Single_point &x) { multi_filtration_.push_back(x); } + /* - * Checks if b is cleanable with respect to a + * Same as `compute_coordinates_in_grid`, but does the operation in-place. */ - static inline bool dominates(const OneCritical &a, const OneCritical &b, value_type max_error) { - if constexpr (co) - return a - max_error <= b; - else { - return a + max_error >= b; + template + void project_onto_grid(const std::vector &grid, bool coordinate = true) + { + // not sure why this is needed? Are the tests with the numbers of parameters not enough? + GUDHI_CHECK(grid.size() >= num_generators(), + "The grid should not be smaller than the number of generators in the filtration value."); + + for (auto &x : multi_filtration_) { + x.project_onto_grid(grid, coordinate); } + + if (!coordinate) simplify(); } - static inline bool dominates(const OneCritical &a, const OneCritical &b) { - if constexpr (co) - return a <= b; - else { - return a >= b; - } + // no NaN? + void remove_empty_points(bool include_infinities = false) + { + multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), + multi_filtration_.end(), + [include_infinities](const Single_point &a) { + return a.empty() || + ((include_infinities) && (a.is_inf() || a.is_minus_inf())); + }), + multi_filtration_.end()); } - static inline bool strictly_dominates(const OneCritical &a, const OneCritical &b) { - if constexpr (co) - return a < b; - else { - return a > b; + + void simplify() + { + std::size_t end = 0; + + for (std::size_t curr = 0; curr < multi_filtration_.size(); ++curr) { + if (_point_can_be_added(multi_filtration_[curr], 0, end)) { + std::swap(multi_filtration_[end], multi_filtration_[curr]); + ++end; + } } + + multi_filtration_.resize(end); } - /* - * Same method as the one in OneCriticalFiltration. - * Given a grid, and assuming that `this` are the coordianates - * in this grid, evaluate `this` into this grid - */ - template - inline Multi_critical_filtration evaluate_in_grid(const std::vector> &grid) const { - Multi_critical_filtration out(this->num_generators()); - for (std::size_t i = 0; i < this->num_generators(); ++i) { - out[i] = this->operator[](i).evaluate_in_grid(grid); + // FONCTIONNALITIES + + friend Single_point factorize_below(const Multi_critical_filtration &f) + { + if (f.num_generators() == 0) return Single_point(); + Single_point result(f.num_parameters(), Single_point::T_inf); + for (const auto &fil : f) { + if (fil.is_nan() || fil.is_minus_inf()) return fil; + if (fil.is_inf()) continue; + for (std::size_t i = 0; i < f.num_parameters(); ++i) { + result[i] = std::min(result[i], fil[i]); + } } - return out; + return result; } /* - * Remove redundant values + * returns the smallest value for the poset order that is bigger than all of the values + * in this multi filtration */ - inline void clean(value_type max_error = 0) { - // A bit ugly, todo : erase+removeif ? - for (std::size_t i = 0; i < multi_filtration_.size(); i++) { - for (std::size_t j = 0; j < multi_filtration_.size(); j++) { - if (i == j) continue; - if (dominates(multi_filtration_[j], multi_filtration_[i], max_error)) { - multi_filtration_[i].clear(); - } - while (j < multi_filtration_.size() && dominates(multi_filtration_[i], multi_filtration_[j], max_error)) { - multi_filtration_[j].clear(); - i--; - } + friend Single_point factorize_above(const Multi_critical_filtration &f) + { + if (f.num_generators() == 0) return Single_point(); + Single_point result(f.num_parameters(), -Single_point::T_inf); + for (auto &fil : f) { + if (fil.is_nan() || fil.is_inf()) return fil; + if (fil.is_minus_inf()) continue; + for (std::size_t i = 0; i < fil.num_parameters(); ++i) { + result[i] = std::max(result[i], fil[i]); } } - multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [](const One_critical_filtration &a) { return a.empty(); }), - multi_filtration_.end()); + return result; } - /* - * Adds a birth point to the list of births, - * if it is useful (according to the method `dominate`) - */ - inline void add_point(const One_critical_filtration &x) { - const bool verbose = false; - if (multi_filtration_.empty()) { - if constexpr (verbose) std::cout << "Adding x=" << x << " (currently empty)" << std::endl; - multi_filtration_.push_back(x); - return; - } - for (const auto &y : multi_filtration_) { - if (dominates(x, y)) { - return; + template + friend U compute_linear_projection(const Multi_critical_filtration &f, const std::vector &x) + { + if constexpr (co) { + U projection = std::numeric_limits::lowest(); + for (const auto &y : f) { + projection = std::max(projection, compute_linear_projection(y, x)); + } + return projection; + } else { + U projection = std::numeric_limits::max(); + for (const auto &y : f) { + projection = std::min(projection, compute_linear_projection(y, x)); } + return projection; } - if constexpr (verbose) std::cout << "x: " << x << " is useful, removing unnecessary entries" << std::endl; - multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [&x](const One_critical_filtration &y) { - if constexpr (verbose) { - if (dominates(y, x)) { - std::cout << "Removing y=" << y << std::endl; - } else { - std::cout << "Keeping y=" << y << std::endl; - } - } - return dominates(y, x); - }), - multi_filtration_.end()); + } - multi_filtration_.push_back(x); + /* + * Same as its one critical counterpart. + * If a grid is given, projects multi_filtration_ on this grid and returns + * multi critical filtration composed of the coordinates in the given grid + * + */ + template + friend Multi_critical_filtration compute_coordinates_in_grid(const Multi_critical_filtration &f, + const std::vector> &grid) + { + Multi_critical_filtration coords = f.as_type(); + coords.project_onto_grid(grid); + return coords; } - inline void re_clean() { - // Ensures all points are useful again. Can be useful if points are added manually. - // TODO : maybe optimize - Multi_critical_filtration out; // should be inf - out.multi_filtration_.reserve(this->multi_filtration_.size()); - for (const auto &x : multi_filtration_) { - out.add_point(x); + + /* + * Same method as the one in OneCriticalFiltration. + * Given a grid, and assuming that `this` are the coordinates + * in this grid, evaluate `this` into this grid + */ + template + friend Multi_critical_filtration evaluate_coordinates_in_grid(const Multi_critical_filtration &f, + const std::vector> &grid) + { + Multi_critical_filtration out; + out.set_num_generators(f.num_generators()); + for (std::size_t i = 0; i < f.num_generators(); ++i) { + out[i] = evaluate_coordinates_in_grid(f[i], grid); } - std::swap(multi_filtration_, out); + out.simplify(); + return out; } + // UTILITIES + // easy debug - inline friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &truc) { - if (truc.is_inf()) { + friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &f) + { + if (f.is_inf()) { stream << "[inf, ..., inf]"; return stream; } - if (truc.is_minus_inf()) { + if (f.is_minus_inf()) { stream << "[-inf, ..., -inf]"; return stream; } - if (truc.is_nan()) { + if (f.is_nan()) { stream << "[NaN]"; return stream; } - stream << "(k=" << truc.multi_filtration_.size() << ")["; - for (const auto &machin : truc) { - stream << machin << "; "; + stream << "(k=" << f.multi_filtration_.size() << ")["; + for (const auto &val : f) { + stream << val << "; "; } - if (truc.multi_filtration_.size() > 0) { + if (f.multi_filtration_.size() > 0) { stream << "\b" << "\b"; } stream << "]"; return stream; } - inline void clear() { multi_filtration_.clear(); } - inline bool empty() const { return multi_filtration_.empty(); } - inline const OneCritical &operator[](std::size_t i) const { return multi_filtration_[i]; } - - inline typename std::vector>::iterator begin() { return multi_filtration_.begin(); } - inline typename std::vector>::iterator end() { return multi_filtration_.end(); } - inline typename std::vector>::const_iterator begin() const { - return multi_filtration_.begin(); - } - inline typename std::vector>::const_iterator end() const { - return multi_filtration_.end(); - } + + public: + // for compiler + constexpr static const bool is_multi_critical = true; + + private: + Points multi_filtration_; /* - * Same as its one critical counterpart. - * If a grid is given, projects multifiltration_ on this grid and returns - * multi critical filtration composed of the coordinates in the given grid - * - */ - template - inline Multi_critical_filtration coordinates_in_grid(const std::vector &grid) const { - assert(grid.size() >= this->num_generators()); - Multi_critical_filtration out(this->num_generators()); - for (std::size_t i = 0u; i < this->num_generators(); ++i) { - out[i] = this->multi_filtration_[i].coordinates_in_grid(grid); - } - return out; - } - /* - * Same as `coordinates_in_grid`, but does the operation in-place. - * + * Checks if b is cleanable with respect to a */ - template - inline void coordinates_in_grid_inplace(const std::vector &grid, bool coordinate = true) { - assert(grid.size() >= this->num_generators()); - for (auto &x : this->multi_filtration_) { - x.coordinates_in_grid_inplace(grid, coordinate); + static bool _strictly_contains(const Single_point &a, const Single_point &b) + { + if constexpr (co) + return a > b; + else { + return a < b; } } - template - inline Multi_critical_filtration astype() const { - std::vector> out(this->num_generators()); - for (std::size_t i = 0u; i < this->num_generators(); ++i) { - out[i] = this->multi_filtration_[i].template astype(); + static bool _contains(const Single_point &a, const Single_point &b) + { + if constexpr (co) + return a >= b; + else { + return a <= b; } - return Multi_critical_filtration(std::move(out)); } - inline void push_back(const OneCritical &x) { multi_filtration_.push_back(x); } - inline const std::vector> &as_vector() const { return multi_filtration_; } - - inline std::vector> as_VECTOR() const { - std::vector> out(this->num_generators(), std::vector(this->num_parameters())); - for (std::size_t i = 0; i < this->num_generators(); ++i) { - for (std::size_t j = 0; j < this->num_parameters(); ++j) { - out[i][j] = multi_filtration_[i][j]; + + // 0 == equal + // 1 == a dom b + // 2 == b dom a + // 3 == none + static int _get_domination_relation(const Single_point &a, const Single_point &b) + { + if (a.is_nan() || b.is_nan()) return 3; + + GUDHI_CHECK(a.size() == b.size(), + "Two points in the same k-critical value have to have the same numbers of parameters."); + + bool equal = true; + bool allGreater = true; + bool allSmaller = true; + for (unsigned int i = 0; i < a.size(); ++i) { + if (a[i] < b[i]) { + if (!allSmaller) return 3; + equal = false; + allGreater = false; + } else if (a[i] > b[i]) { + if (!allGreater) return 3; + equal = false; + allSmaller = false; } } - return out; - } + if (equal) return 0; - inline void _clean(bool keep_inf = true) { - multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [keep_inf](const OneCritical &a) { - return a.empty() || ((!keep_inf) && (a.is_inf() || a.is_minus_inf())); - }), - multi_filtration_.end()); + if constexpr (co) { + if (allSmaller) return 1; + return 2; + } else { + if (allGreater) return 1; + return 2; + } } - inline std::size_t num_generators() const { return multi_filtration_.size(); } - // TODO : this costs a lot... optimize / cheat in some way for python ? - /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - * - */ - inline bool operator<(const Multi_critical_filtration &other) const { - // check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him - for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { - for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { - // i(const Multi_critical_filtration &other) const { return other < *this; } - /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - */ - inline bool operator<=(const Multi_critical_filtration &other) const { - // check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him - for (std::size_t i = 0u; i < multi_filtration_.size(); ++i) { - for (std::size_t j = 0u; j < other.multi_filtration_.size(); ++j) { - // i <= j - if (dominates(other.multi_filtration_[j], multi_filtration_[i])) continue; + while (curr != end) { + int res = _get_domination_relation(multi_filtration_[curr], x); + if (res == 2 || res == 0) return false; // x dominates or is equal + if (res == 1) { // x is dominated + --end; + std::swap(multi_filtration_[curr], multi_filtration_[end]); + } else { + ++curr; } - return false; } return true; } - /* - * Checks if `this`, seen as a birth curve is over the `other` birth curve, - */ - inline bool operator>=(const Multi_critical_filtration &other) const { return other <= *this; } +}; +} // namespace Gudhi::multi_filtration + +namespace std { + +template +class numeric_limits> +{ public: - // for compiler - constexpr static const T T_inf = One_critical_filtration::T_inf; - constexpr static const bool is_multi_critical = true; + static constexpr bool has_infinity = true; - private: - std::vector> multi_filtration_; + static constexpr Gudhi::multi_filtration::Multi_critical_filtration infinity() noexcept + { + return Gudhi::multi_filtration::Multi_critical_filtration::inf(); + }; + + // non-standard + static constexpr Gudhi::multi_filtration::Multi_critical_filtration minus_infinity() noexcept + { + return Gudhi::multi_filtration::Multi_critical_filtration::minus_inf(); + }; + + static constexpr Gudhi::multi_filtration::Multi_critical_filtration max() noexcept(false) + { + throw std::logic_error( + "The maximal value cannot be represented with no finite numbers of generators." + "Use `max(number_of_generators, number_of_parameters)` instead"); + }; + + // non-standard, so I don't want to define default values. + static constexpr Gudhi::multi_filtration::Multi_critical_filtration max(unsigned int g, unsigned int n) noexcept + { + std::vector::Single_point> v( + g, std::vector(n, std::numeric_limits::max())); + return Gudhi::multi_filtration::Multi_critical_filtration(std::move(v)); + }; + + static constexpr Gudhi::multi_filtration::Multi_critical_filtration quiet_NaN() noexcept + { + return Gudhi::multi_filtration::Multi_critical_filtration::nan(); + }; }; -} // namespace Gudhi::multi_filtration +} // namespace std #endif // MULTI_CRITICAL_FILTRATIONS_H_ diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index e30e80b691..42a3ca653f 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -5,7 +5,7 @@ * Copyright (C) 2023 Inria * * Modification(s): - * - 2024/08 Hannah Schreiber: Generalization to all arithmetic types for T + * - 2024/08 Hannah Schreiber: Generalization to all signed arithmetic types for T * - YYYY/MM Author: Description of the modification */ diff --git a/src/Multi_filtration/test/CMakeLists.txt b/src/Multi_filtration/test/CMakeLists.txt index 13b1811050..2167fa080b 100644 --- a/src/Multi_filtration/test/CMakeLists.txt +++ b/src/Multi_filtration/test/CMakeLists.txt @@ -2,3 +2,6 @@ include(GUDHI_boost_test) add_executable_with_targets(Multi_filtration_onecritical_unit_test multifiltration_onecritical_unit_test.cpp TBB::tbb) gudhi_add_boost_test(Multi_filtration_onecritical_unit_test) + +add_executable_with_targets(Multi_filtration_multicritical_unit_test multifiltration_multicritical_unit_test.cpp TBB::tbb) +gudhi_add_boost_test(Multi_filtration_multicritical_unit_test) diff --git a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp new file mode 100644 index 0000000000..ab6abe18bf --- /dev/null +++ b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp @@ -0,0 +1,472 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2024 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#include +#include +#include +#include + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "multi_filtration" +#include +#include + +#include + +using Gudhi::multi_filtration::Multi_critical_filtration; + +typedef boost::mpl::list list_of_tested_variants; + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_constructors, T, list_of_tested_variants) +{ + Multi_critical_filtration f01; + BOOST_CHECK(!f01.empty()); + BOOST_CHECK(f01.num_parameters() == 1); + BOOST_CHECK(f01.num_generators() == 1); + BOOST_CHECK(f01[0][0] == -Multi_critical_filtration::Single_point::T_inf); + Multi_critical_filtration f02; + BOOST_CHECK(!f02.empty()); + BOOST_CHECK(f02.num_parameters() == 1); + BOOST_CHECK(f02.num_generators() == 1); + BOOST_CHECK(f02[0][0] == Multi_critical_filtration::Single_point::T_inf); + + Multi_critical_filtration f1(3); + BOOST_CHECK(f1.num_parameters() == 3); + BOOST_CHECK(f1.num_generators() == 1); + BOOST_CHECK(f1[0][0] == -Multi_critical_filtration::Single_point::T_inf); + BOOST_CHECK(f1[0][1] == -Multi_critical_filtration::Single_point::T_inf); + BOOST_CHECK(f1[0][2] == -Multi_critical_filtration::Single_point::T_inf); + + Multi_critical_filtration f2(3, 0); + BOOST_CHECK(f2.num_parameters() == 3); + BOOST_CHECK(f2.num_generators() == 1); + BOOST_CHECK(f2[0][0] == 0); + BOOST_CHECK(f2[0][1] == 0); + BOOST_CHECK(f2[0][2] == 0); + + Multi_critical_filtration f3({0, 1, 2}); + BOOST_CHECK(f3.num_parameters() == 3); + BOOST_CHECK(f3.num_generators() == 1); + BOOST_CHECK(f3[0][0] == 0); + BOOST_CHECK(f3[0][1] == 1); + BOOST_CHECK(f3[0][2] == 2); + + std::vector v{0, 1, 2}; + Multi_critical_filtration f41(v); + BOOST_CHECK(f41.num_parameters() == 3); + BOOST_CHECK(f41.num_generators() == 1); + BOOST_CHECK(f41[0][0] == 0); + BOOST_CHECK(f41[0][1] == 1); + BOOST_CHECK(f41[0][2] == 2); + + Multi_critical_filtration f5(v.begin(), v.end()); + BOOST_CHECK(f5.num_generators() == 1); + BOOST_CHECK(f5.num_parameters() == 3); + BOOST_CHECK(f5[0][0] == 0); + BOOST_CHECK(f5[0][1] == 1); + BOOST_CHECK(f5[0][2] == 2); + + Multi_critical_filtration f42(std::move(v)); + BOOST_CHECK(f42.num_parameters() == 3); + BOOST_CHECK(f42.num_generators() == 1); + BOOST_CHECK(f42[0][0] == 0); + BOOST_CHECK(f42[0][1] == 1); + BOOST_CHECK(f42[0][2] == 2); + + std::vector::Single_point> v2{{0, 1, 2}, {3, 4, 5}}; + Multi_critical_filtration f6(std::move(v2)); + BOOST_CHECK(f6.num_parameters() == 3); + BOOST_CHECK(f6.num_generators() == 2); + BOOST_CHECK(f6[0][0] == 0); + BOOST_CHECK(f6[0][1] == 1); + BOOST_CHECK(f6[0][2] == 2); + BOOST_CHECK(f6[1][0] == 3); + BOOST_CHECK(f6[1][1] == 4); + BOOST_CHECK(f6[1][2] == 5); + + Multi_critical_filtration f7(f6); + BOOST_CHECK(f7.num_parameters() == 3); + BOOST_CHECK(f7.num_generators() == 2); + BOOST_CHECK(f7[0][0] == 0); + BOOST_CHECK(f7[0][1] == 1); + BOOST_CHECK(f7[0][2] == 2); + BOOST_CHECK(f7[1][0] == 3); + BOOST_CHECK(f7[1][1] == 4); + BOOST_CHECK(f7[1][2] == 5); + + f01 = f5; + BOOST_CHECK(f01.num_generators() == 1); + BOOST_CHECK(f01.num_parameters() == 3); + BOOST_CHECK(f01[0][0] == 0); + BOOST_CHECK(f01[0][1] == 1); + BOOST_CHECK(f01[0][2] == 2); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_utilities, T, list_of_tested_variants) +{ + Multi_critical_filtration f({0, 1, 2}); + bool test = std::is_same_v; + BOOST_CHECK(test); + + Multi_critical_filtration f2 = f.template as_type(); + test = std::is_same_v; + BOOST_CHECK(test); + BOOST_CHECK(f2.num_generators() == 1); + BOOST_CHECK(f2.num_parameters() == 3); + BOOST_CHECK(f2[0][0] == 0.); + BOOST_CHECK(f2[0][1] == 1.); + BOOST_CHECK(f2[0][2] == 2.); + + BOOST_CHECK(!f.is_inf()); + BOOST_CHECK(!f.is_minus_inf()); + BOOST_CHECK(!f.is_nan()); + BOOST_CHECK(f.is_finite()); + + Multi_critical_filtration f31; + BOOST_CHECK(!f31.is_inf()); + BOOST_CHECK(f31.is_minus_inf()); + BOOST_CHECK(!f31.is_nan()); + BOOST_CHECK(!f31.is_finite()); + + Multi_critical_filtration f32; + BOOST_CHECK(f32.is_inf()); + BOOST_CHECK(!f32.is_minus_inf()); + BOOST_CHECK(!f32.is_nan()); + BOOST_CHECK(!f32.is_finite()); + + //{-inf, -inf, -inf} is considered finite as the user is supposed to updates the values to something else + //the idea is just to reserve space and to give the possibility to use `f4[i] =` + //if the value should really be -inf, use `f4(1)` or `f4 = minus_inf()` instead. + Multi_critical_filtration f4(3); + BOOST_CHECK(!f4.is_inf()); + BOOST_CHECK(!f4.is_minus_inf()); + BOOST_CHECK(!f4.is_nan()); + BOOST_CHECK(f4.is_finite()); + + Multi_critical_filtration f5(1); + BOOST_CHECK(!f5.is_inf()); + BOOST_CHECK(f5.is_minus_inf()); + BOOST_CHECK(!f5.is_nan()); + BOOST_CHECK(!f5.is_finite()); + + auto f6 = Multi_critical_filtration::nan(); + BOOST_CHECK(!f6.is_inf()); + BOOST_CHECK(!f6.is_minus_inf()); + BOOST_CHECK(f6.is_nan()); + BOOST_CHECK(!f6.is_finite()); + + auto f7 = Multi_critical_filtration::inf(); + BOOST_CHECK(f7.is_inf()); + BOOST_CHECK(!f7.is_minus_inf()); + BOOST_CHECK(!f7.is_nan()); + BOOST_CHECK(!f7.is_finite()); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_comparators, T, list_of_tested_variants) +{ + Multi_critical_filtration f1({{0, 1, 2}, {-1, 4, 5}}); + Multi_critical_filtration f2({{-2, 0, 1}, {-5, 0, 0}, {-2, -5, -1}}); + Multi_critical_filtration f3({4, 5, 6}); + Multi_critical_filtration f4({{0, 0, 1}, {-4, 5, 6}}); + + BOOST_CHECK(!(f1 < f1)); + BOOST_CHECK(!(f1 < f2)); + BOOST_CHECK(f1 < f3); + BOOST_CHECK(!(f1 < f4)); + BOOST_CHECK(!(f1 < Multi_critical_filtration::nan())); + BOOST_CHECK(f1 < Multi_critical_filtration::inf()); + BOOST_CHECK(!(f1 < Multi_critical_filtration::minus_inf())); + + BOOST_CHECK(f1 <= f1); + BOOST_CHECK(!(f1 <= f2)); + BOOST_CHECK(f1 <= f3); + BOOST_CHECK(!(f1 <= f4)); + BOOST_CHECK(!(f1 <= Multi_critical_filtration::nan())); + BOOST_CHECK(f1 <= Multi_critical_filtration::inf()); + BOOST_CHECK(!(f1 <= Multi_critical_filtration::minus_inf())); + + BOOST_CHECK(!(f1 > f1)); + BOOST_CHECK(f1 > f2); + BOOST_CHECK(!(f1 > f3)); + BOOST_CHECK(!(f1 > f4)); + BOOST_CHECK(!(f1 > Multi_critical_filtration::nan())); + BOOST_CHECK(!(f1 > Multi_critical_filtration::inf())); + BOOST_CHECK(f1 > Multi_critical_filtration::minus_inf()); + + BOOST_CHECK(f1 >= f1); + BOOST_CHECK(f1 >= f2); + BOOST_CHECK(!(f1 >= f3)); + BOOST_CHECK(!(f1 >= f4)); + BOOST_CHECK(!(f1 >= Multi_critical_filtration::nan())); + BOOST_CHECK(!(f1 >= Multi_critical_filtration::inf())); + BOOST_CHECK(f1 >= Multi_critical_filtration::minus_inf()); + + BOOST_CHECK(f1 == f1); + BOOST_CHECK(!(f1 == f2)); + BOOST_CHECK(!(f1 == f3)); + BOOST_CHECK(!(f1 == f4)); + BOOST_CHECK(!(f1 == Multi_critical_filtration::nan())); + BOOST_CHECK(!(f1 == Multi_critical_filtration::inf())); + BOOST_CHECK(!(f1 == Multi_critical_filtration::minus_inf())); + + BOOST_CHECK(!(f1 != f1)); + BOOST_CHECK(f1 != f2); + BOOST_CHECK(f1 != f3); + BOOST_CHECK(f1 != f4); + BOOST_CHECK(f1 != Multi_critical_filtration::nan()); + BOOST_CHECK(f1 != Multi_critical_filtration::inf()); + BOOST_CHECK(f1 != Multi_critical_filtration::minus_inf()); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_modifiers, T, list_of_tested_variants) +{ + Multi_critical_filtration f({{0, 1, 2}, {-3, 1, 7}}); + BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 2); + BOOST_CHECK_EQUAL(f[1][0], -3); + BOOST_CHECK_EQUAL(f[1][1], 1); + BOOST_CHECK_EQUAL(f[1][2], 7); + + f.push_to({-1, 5, 6}); + BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][1], 5); + BOOST_CHECK_EQUAL(f[0][2], 6); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], 5); + BOOST_CHECK_EQUAL(f[1][2], 7); + + f.push_to({-1, -5, -6}); + BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][1], 5); + BOOST_CHECK_EQUAL(f[0][2], 6); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], 5); + BOOST_CHECK_EQUAL(f[1][2], 7); + + f.push_to(Multi_critical_filtration::Single_point::minus_inf()); + BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][1], 5); + BOOST_CHECK_EQUAL(f[0][2], 6); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], 5); + BOOST_CHECK_EQUAL(f[1][2], 7); + + f.push_to(Multi_critical_filtration::Single_point::inf()); + BOOST_CHECK(f.is_inf()); + + f.push_to(Multi_critical_filtration::Single_point::nan()); + BOOST_CHECK(f.is_inf()); + + f.pull_to({-1, 5, 6}); + BOOST_CHECK_EQUAL(f[0][0], -1); + BOOST_CHECK_EQUAL(f[0][1], 5); + BOOST_CHECK_EQUAL(f[0][2], 6); + + f.pull_to({1, 8, 9}); + BOOST_CHECK_EQUAL(f[0][0], -1); + BOOST_CHECK_EQUAL(f[0][1], 5); + BOOST_CHECK_EQUAL(f[0][2], 6); + + f.pull_to(Multi_critical_filtration::Single_point::inf()); + BOOST_CHECK_EQUAL(f[0][0], -1); + BOOST_CHECK_EQUAL(f[0][1], 5); + BOOST_CHECK_EQUAL(f[0][2], 6); + + f.pull_to(Multi_critical_filtration::Single_point::minus_inf()); + BOOST_CHECK(f.is_minus_inf()); + + f.pull_to(Multi_critical_filtration::Single_point::nan()); + BOOST_CHECK(f.is_minus_inf()); + + std::vector > grid = {{0, 2, 4, 8}, {0, 3, 6, 9}, {0, 4, 8, 16}}; + + f.push_to({1, 7, 5}); + f.project_onto_grid(grid, true); + BOOST_CHECK_EQUAL(f[0][0], 1); + BOOST_CHECK_EQUAL(f[0][1], 3); + BOOST_CHECK_EQUAL(f[0][2], 2); + + f.push_to({1, 7, 5}); + f.project_onto_grid(grid, false); + BOOST_CHECK_EQUAL(f[0][0], 2); + BOOST_CHECK_EQUAL(f[0][1], 9); + BOOST_CHECK_EQUAL(f[0][2], 8); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_variants) +{ + Multi_critical_filtration f({0, 1, 2}); + BOOST_CHECK_EQUAL(f.num_generators(), 1); + BOOST_CHECK_EQUAL(f.num_parameters(), 3); + BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 2); + + bool res = f.add_point({-3, 1, 7}); + BOOST_CHECK(res); + BOOST_CHECK_EQUAL(f.num_generators(), 2); + BOOST_CHECK_EQUAL(f.num_parameters(), 3); + BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 2); + BOOST_CHECK_EQUAL(f[1][0], -3); + BOOST_CHECK_EQUAL(f[1][1], 1); + BOOST_CHECK_EQUAL(f[1][2], 7); + + res = f.add_point({-1, -2, -3}); + BOOST_CHECK(res); + BOOST_CHECK_EQUAL(f.num_generators(), 2); + BOOST_CHECK_EQUAL(f.num_parameters(), 3); + BOOST_CHECK_EQUAL(f[0][0], -3); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], -2); + BOOST_CHECK_EQUAL(f[1][2], -3); + + res = f.add_point({8, 9, 10}); + BOOST_CHECK(!res); + BOOST_CHECK_EQUAL(f.num_generators(), 2); + BOOST_CHECK_EQUAL(f.num_parameters(), 3); + BOOST_CHECK_EQUAL(f[0][0], -3); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], -2); + BOOST_CHECK_EQUAL(f[1][2], -3); + + res = f.add_point(Multi_critical_filtration::Single_point::inf()); + BOOST_CHECK(!res); + BOOST_CHECK_EQUAL(f.num_generators(), 2); + BOOST_CHECK_EQUAL(f.num_parameters(), 3); + BOOST_CHECK_EQUAL(f[0][0], -3); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], -2); + BOOST_CHECK_EQUAL(f[1][2], -3); + + res = f.add_point(Multi_critical_filtration::Single_point::nan()); + BOOST_CHECK(!res); + BOOST_CHECK_EQUAL(f.num_generators(), 2); + BOOST_CHECK_EQUAL(f.num_parameters(), 3); + BOOST_CHECK_EQUAL(f[0][0], -3); + BOOST_CHECK_EQUAL(f[0][1], 1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[1][1], -2); + BOOST_CHECK_EQUAL(f[1][2], -3); + + res = f.add_point(Multi_critical_filtration::Single_point::minus_inf()); + BOOST_CHECK(res); + BOOST_CHECK_EQUAL(f.num_generators(), 1); + BOOST_CHECK_EQUAL(f.num_parameters(), 1); + BOOST_CHECK_EQUAL(f[0][0], -Multi_critical_filtration::Single_point::T_inf); + + std::vector::Single_point> v{ + {0, 1, 2}, + {}, + Multi_critical_filtration::Single_point::inf(), + {0, 1, 2}, + Multi_critical_filtration::Single_point::nan(), + {}, + Multi_critical_filtration::Single_point::minus_inf()}; + + Multi_critical_filtration f2(v); + f2.remove_empty_points(false); + BOOST_CHECK_EQUAL(f2[0][0], 0); + BOOST_CHECK_EQUAL(f2[0][1], 1); + BOOST_CHECK_EQUAL(f2[0][2], 2); + BOOST_CHECK(f2[1].is_inf()); + BOOST_CHECK_EQUAL(f2[2][0], 0); + BOOST_CHECK_EQUAL(f2[2][1], 1); + BOOST_CHECK_EQUAL(f2[2][2], 2); + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(f2.num_generators(), 5); + BOOST_CHECK(f2[3].is_nan()); + BOOST_CHECK(f2[4].is_minus_inf()); + } else { + BOOST_CHECK_EQUAL(f2.num_generators(), 4); + BOOST_CHECK(f2[3].is_minus_inf()); + } + + Multi_critical_filtration f3(v); + f3.remove_empty_points(true); + BOOST_CHECK_EQUAL(f3[0][0], 0); + BOOST_CHECK_EQUAL(f3[0][1], 1); + BOOST_CHECK_EQUAL(f3[0][2], 2); + BOOST_CHECK_EQUAL(f3[1][0], 0); + BOOST_CHECK_EQUAL(f3[1][1], 1); + BOOST_CHECK_EQUAL(f3[1][2], 2); + if constexpr (std::numeric_limits::has_quiet_NaN){ + BOOST_CHECK_EQUAL(f3.num_generators(), 3); + BOOST_CHECK(f3[2].is_nan()); + } else { + BOOST_CHECK_EQUAL(f3.num_generators(), 2); + } + + Multi_critical_filtration f4(v); + f4.simplify(); + BOOST_CHECK_EQUAL(f4.num_generators(), 1); + BOOST_CHECK(f4[0].is_minus_inf()); + + v.pop_back(); + Multi_critical_filtration f5(v); + f5.simplify(); + BOOST_CHECK_EQUAL(f5.num_generators(), 1); + BOOST_CHECK_EQUAL(f5[0][0], 0); + BOOST_CHECK_EQUAL(f5[0][1], 1); + BOOST_CHECK_EQUAL(f5[0][2], 2); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_friends, T, list_of_tested_variants) +{ + Multi_critical_filtration f({{0, 1, 2}, {2, 0, 4}}); + + BOOST_CHECK_EQUAL(compute_linear_projection(f, {2,3,5,9}), 13); + BOOST_CHECK(factorize_below(f) == typename Multi_critical_filtration::Single_point({0, 0, 2})); + BOOST_CHECK(factorize_above(f) == typename Multi_critical_filtration::Single_point({2, 1, 4})); + + Multi_critical_filtration f2({{0, 1, 2}, {2, 0, 4}}); + BOOST_CHECK_EQUAL(compute_linear_projection(f2, {2,3,5,9}), 24); + + f[0] = {1, 7, 5}; + + std::vector > grid = {{0, 2, 4, 8}, {0, 3, 6, 9}, {0, 4, 8, 16}}; + auto res = compute_coordinates_in_grid(f, grid); + BOOST_CHECK_EQUAL(res[0][0], 1); + BOOST_CHECK_EQUAL(res[0][1], 3); + BOOST_CHECK_EQUAL(res[0][2], 2); + BOOST_CHECK_EQUAL(res[1][0], 1); + BOOST_CHECK_EQUAL(res[1][1], 0); + BOOST_CHECK_EQUAL(res[1][2], 1); + + res = evaluate_coordinates_in_grid(res, grid); + BOOST_CHECK_EQUAL(res[0][0], 2); + BOOST_CHECK_EQUAL(res[0][1], 0); + BOOST_CHECK_EQUAL(res[0][2], 4); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_numerical_limits, T, list_of_tested_variants) +{ + BOOST_CHECK(std::numeric_limits >::has_infinity); + BOOST_CHECK(std::numeric_limits >::infinity().is_inf()); + BOOST_CHECK(std::numeric_limits >::quiet_NaN().is_nan()); + BOOST_CHECK_THROW(std::numeric_limits >::max(), std::logic_error); + auto max = std::numeric_limits >::max(2, 3); + BOOST_CHECK_EQUAL(max[0][0], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[0][1], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[0][2], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[1][0], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[1][1], std::numeric_limits::max()); + BOOST_CHECK_EQUAL(max[1][2], std::numeric_limits::max()); +} + diff --git a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp index 684dbe5e5a..ddcc53534c 100644 --- a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp @@ -131,7 +131,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_comparators, T, list_of_te { One_critical_filtration f1({0, 1, 2}); One_critical_filtration f2({-1, 0, 1}); - One_critical_filtration f3({1, 2, 3}); + One_critical_filtration f3({0, 2, 3}); One_critical_filtration f4({5, -1, 2}); BOOST_CHECK(!(f1 < f1)); From 3ae53122a73d77df36fac627114110fd7c548ac1 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Tue, 27 Aug 2024 17:42:50 +0200 Subject: [PATCH 70/87] removal of get_copy --- src/Multi_filtration/include/gudhi/One_critical_filtration.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index 42a3ca653f..781c121bab 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -90,9 +90,6 @@ class One_critical_filtration : public std::vector operator std::vector() const { return static_cast >(*this); } - // needed in python - friend One_critical_filtration get_copy(const One_critical_filtration &f) { return f; } - // like numpy template One_critical_filtration as_type() const From 92ce37cd58438bb4cbcd1f74f82d3d4cb2c3b1b8 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 29 Aug 2024 14:25:06 +0200 Subject: [PATCH 71/87] removal of get-content and renaming of fil --- .../include/gudhi/Multi_critical_filtration.h | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index be15bea6b2..0edeaef236 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -123,20 +123,6 @@ class Multi_critical_filtration return Multi_critical_filtration(std::move(out)); } - // only needed once in multipers and does not need to be a friend, so could just be defined - // at the place it is needed and removed from here. - friend std::vector> get_content(const Multi_critical_filtration &f) - { - std::vector> out(f.num_generators(), std::vector(f.num_parameters())); - const auto &cont = f.get_underlying_container(); - for (std::size_t i = 0; i < f.num_generators(); ++i) { - for (std::size_t j = 0; j < f.num_parameters(); ++j) { - out[i][j] = cont[i][j]; - } - } - return out; - } - // ACCESS const Points &get_underlying_container() const { return multi_filtration_; } @@ -256,8 +242,8 @@ class Multi_critical_filtration multi_filtration_ = {x}; return; } - for (auto &fil : *this) { - fil.push_to(x); + for (auto &g : *this) { + g.push_to(x); } simplify(); @@ -282,8 +268,8 @@ class Multi_critical_filtration multi_filtration_ = {x}; return; } - for (auto &fil : *this) { - fil.pull_to(x); + for (auto &g : *this) { + g.pull_to(x); } simplify(); @@ -366,11 +352,11 @@ class Multi_critical_filtration { if (f.num_generators() == 0) return Single_point(); Single_point result(f.num_parameters(), Single_point::T_inf); - for (const auto &fil : f) { - if (fil.is_nan() || fil.is_minus_inf()) return fil; - if (fil.is_inf()) continue; + for (const auto &g : f) { + if (g.is_nan() || g.is_minus_inf()) return g; + if (g.is_inf()) continue; for (std::size_t i = 0; i < f.num_parameters(); ++i) { - result[i] = std::min(result[i], fil[i]); + result[i] = std::min(result[i], g[i]); } } return result; @@ -384,11 +370,11 @@ class Multi_critical_filtration { if (f.num_generators() == 0) return Single_point(); Single_point result(f.num_parameters(), -Single_point::T_inf); - for (auto &fil : f) { - if (fil.is_nan() || fil.is_inf()) return fil; - if (fil.is_minus_inf()) continue; - for (std::size_t i = 0; i < fil.num_parameters(); ++i) { - result[i] = std::max(result[i], fil[i]); + for (auto &g : f) { + if (g.is_nan() || g.is_inf()) return g; + if (g.is_minus_inf()) continue; + for (std::size_t i = 0; i < g.num_parameters(); ++i) { + result[i] = std::max(result[i], g[i]); } } return result; From 925839052fdab922c50335fcded9b901df004178 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 29 Aug 2024 17:55:41 +0200 Subject: [PATCH 72/87] doc + renaming --- src/Multi_filtration/doc/COPYRIGHT | 12 + .../doc/Intro_multi_filtration_values.h | 36 + ...adius_density_complex_without_interval.png | Bin 0 -> 922269 bytes .../include/gudhi/Multi_critical_filtration.h | 550 ++++++++++--- .../include/gudhi/One_critical_filtration.h | 770 +++++++++++++++--- ...ultifiltration_multicritical_unit_test.cpp | 66 +- .../multifiltration_onecritical_unit_test.cpp | 24 +- src/Simplex_tree/concept/FiltrationValue.h | 2 +- src/Simplex_tree/concept/SimplexTreeOptions.h | 2 +- src/Simplex_tree/include/gudhi/Simplex_tree.h | 6 +- 10 files changed, 1186 insertions(+), 282 deletions(-) create mode 100644 src/Multi_filtration/doc/COPYRIGHT create mode 100644 src/Multi_filtration/doc/Intro_multi_filtration_values.h create mode 100644 src/Multi_filtration/doc/radius_density_complex_without_interval.png diff --git a/src/Multi_filtration/doc/COPYRIGHT b/src/Multi_filtration/doc/COPYRIGHT new file mode 100644 index 0000000000..70cac8b762 --- /dev/null +++ b/src/Multi_filtration/doc/COPYRIGHT @@ -0,0 +1,12 @@ +The files of this directory are part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. +See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + +Author(s): Hannah Schreiber, David Loiseaux + +Copyright (C) 2024 Inria + +This gives everyone the freedoms to use openFrameworks in any context: +commercial or non-commercial, public or private, open or closed source. + +You should have received a copy of the MIT License along with this program. +If not, see https://opensource.org/licenses/MIT. diff --git a/src/Multi_filtration/doc/Intro_multi_filtration_values.h b/src/Multi_filtration/doc/Intro_multi_filtration_values.h new file mode 100644 index 0000000000..b2c1d6e562 --- /dev/null +++ b/src/Multi_filtration/doc/Intro_multi_filtration_values.h @@ -0,0 +1,36 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2024 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#ifndef DOC_MULTI_FILTRATION_INTRO_H_ +#define DOC_MULTI_FILTRATION_INTRO_H_ + +// needs namespace for Doxygen to link on classes +namespace Gudhi { +namespace multi_filtration { + +/** \defgroup multi_filtration Multi-parameter Filtration Values + * @{ + * \author David Loiseaux + * + * \section multifiltrationintro Multi-parameter Filtration Values + * + * TODO: introduction to @ref One_critical_filtration and @ref Multi_critical_filtration + * + * \subsection multifiltrationexamples Examples + * + * Here is a list of examples using the module: + * \li TODO?. + * + * @} + */ +} // namespace persistence_fields +} // namespace Gudhi + +#endif // DOC_MULTI_FILTRATION_INTRO_H_ diff --git a/src/Multi_filtration/doc/radius_density_complex_without_interval.png b/src/Multi_filtration/doc/radius_density_complex_without_interval.png new file mode 100644 index 0000000000000000000000000000000000000000..c371900441c470f9930bb8f900ce39ef61b0dcdf GIT binary patch literal 922269 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 z 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%0D9g}n260P8r@dcH)X?90- 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
WO6H5AmT}7yPeRp>62->GQwd`7b_W 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�D-FLn67*HJ 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ð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%0DhmO#V2}pN1Y+A-wuT%Rl{bj}B-! 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%0DO-G5RPhX{cgI85&VFvr= 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

J9E^@9eIn~t5K$7AewKD{>d>M{i8nu| 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≷}Prm@)7R4llYe2 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�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 #include #include -#include "gudhi/Debug_utils.h" +#include #include namespace Gudhi::multi_filtration { /** - * Multi-critical filtration extension to \ref One_critical_filtration . - * If the `co` parameter is set to true, it reverses the poset order, - * i.e., the order \f$\le\f$ in \f$\mathbb R^n\f$ becomes \f$\ge\f$. + * @class Multi_critical_filtration multi_critical_filtration.h gudhi/multi_critical_filtration.h + * @ingroup multi_filtration * - * if `multi_filtration_` contains the points \f$(a_1, a_2, \ldots, a_k) \in (\mathbb R^n)^k\f$, - * then a new point \f$x\f$ will be in this filtration if there exists an \f$a_i\f$ such that - * \f$a_i \le x\f$. + * @brief Class representing all apparition values of a same simplex for several parameters, that is, the filtration + * values of a simplex in the setting of a k-critical multi-parameter filtration. The class can be used as a vector + * whose indices correspond each to one filtration value. Then, the indices of each filtration value correspond to one + * particular parameter. E.g., \f$ f[g][p] \f$ will be the apparition value at the \f$ p^{th} \f$ parameter of the + * \f$ g^{th} \f$ generator of the simplex with @ref Multi_critical_filtration \f$ f \f$. * - * \ingroup multi_filtration - + * @details Overloads `std::numeric_limits` such that: + * - `std::numeric_limits >::has_infinity` returns `true`, + * - `std::numeric_limits >::infinity()` returns + * @ref Multi_critical_filtration::inf() "", + * - `std::numeric_limits >::minus_infinity()` returns + * @ref Multi_critical_filtration::minus_inf() "", + * - `std::numeric_limits >::max()` throws, + * - `std::numeric_limits >::max(g,n)` returns a @ref Multi_critical_filtration + * with `g` generators of `n` parameters evaluated at value `std::numeric_limits::max()`, + * - `std::numeric_limits >::quiet_NaN()` returns + * @ref Multi_critical_filtration::nan() "". + * + * Multi-critical filtrations are filtrations such that the lifetime of each simplex is a union of positive cones, e.g., + * - \f$ \{ x \in \mathbb R^2 : x \ge (1,2)\} \cap \{ x \in \mathbb R^2 : x \ge (2,1)\} \f$ is finitely critical, + * and more particularly 2-critical, while + * - \f$ \{ x \in \mathbb R^2 : x \ge \mathrm{epigraph}(y \mapsto e^{-y})\} \f$ is not. + * + * The particular case of 1-critical filtrations is handled by @ref One_critical_filtration "". + * + * @tparam T Arithmetic type of an entry for one parameter of a filtration value. Has to be **signed** and + * to implement `std::isnan(T)`, `std::numeric_limits::has_quiet_NaN`, `std::numeric_limits::quiet_NaN()`, + * `std::numeric_limits::has_infinity`, `std::numeric_limits::infinity()` and `std::numeric_limits::max()`. + * If `std::numeric_limits::has_infinity` returns `false`, a call to `std::numeric_limits::infinity()` + * can simply throw. Examples are the native types `double`, `float` and `int`. + * @tparam co If `true`, reverses the poset order, i.e., the order \f$ \le \f$ in \f$ \mathbb R^n \f$ becomes + * \f$ \ge \f$. */ template class Multi_critical_filtration { public: - using Single_point = One_critical_filtration; // Type of the One critical subtype + /** + * @brief Type of the origin of a "simplex lifetime cone". Common with @ref One_critical_filtration "". + */ + using Generator = One_critical_filtration; // TODO: not the best name... - using Points = std::vector; - using iterator = typename Points::iterator; - using const_iterator = typename Points::const_iterator; + using Generators = std::vector; /**< Container type for the filtration values. */ + using iterator = typename Generators::iterator; /**< Iterator type for the generator container. */ + using const_iterator = typename Generators::const_iterator; /**< Const iterator type for the generator container. */ // CONSTRUCTORS - // initialize at 1, with 1 parameter (consistent with below) - Multi_critical_filtration() : multi_filtration_(1, co ? Single_point::inf() : Single_point::minus_inf()) {}; - // warning: can be problematic if the user never updates the values and let it like that, {-inf, -inf, ...} is not - // considered as -inf. - Multi_critical_filtration(int n) : multi_filtration_({Single_point(n)}) {}; - // std::vector(n, value){}; - Multi_critical_filtration(int n, T value) : multi_filtration_({Single_point(n, value)}) {}; - // : std::vector({std::vector(init)}; - Multi_critical_filtration(std::initializer_list init) : multi_filtration_({Single_point(init)}) {}; + /** + * @brief Default constructor. The constructed value will be either at infinity if `co` is true or at minus infinity + * if `co` is false. + */ + Multi_critical_filtration() : multi_filtration_(1, co ? Generator::inf() : Generator::minus_inf()) {}; + /** + * @brief Constructs a filtration value with one generator and @p n parameters. All parameters will be initialized + * at -inf. + * + * @warning The generator `{-inf, -inf, ...}` with \f$ n > 1 \f$ entries is not considered as "minus infinity" (the + * method @ref is_minus_inf() "", as well as the one of the generator, will not return true). The `-inf` are just + * meant as placeholders, at least one entry should be modified by the user. + * Otherwise, either use the static method @ref minus_inf() or set @p n to 1 instead. + * + * @param n Number of parameters. + */ + Multi_critical_filtration(int n) : multi_filtration_({Generator(n)}) {}; + /** + * @brief Constructs a filtration value with one generator and @p n parameters. All parameters will be initialized + * with @p value. + * + * @warning If @p value is `inf`, `-inf`, or `NaN`, the generator `{value, value, ...}` with \f$ n > 1 \f$ entries + * is not wrong but will not be considered as respectively "infinity", "minus infinity" or "NaN" (the corresponding + * methods @ref is_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use + * the static methods @ref inf(), @ref minus_inf() and @ref nan() instead. + * + * @param n Number of parameters. + * @param value Value which will be used for each entry. + */ + Multi_critical_filtration(int n, T value) : multi_filtration_({Generator(n, value)}) {}; + /** + * @brief Constructs a filtration value with one generator which will be initialzed by the given initializer list. + * + * @param init Initializer list with values for each parameter. + */ + Multi_critical_filtration(std::initializer_list init) : multi_filtration_({Generator(init)}) {}; + /** + * @brief Constructs a filtration value with one generator which will be initialzed by the given vector. + * + * @param v Vector with values for each parameter. + */ Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}) {}; + /** + * @brief Constructs a filtration value with one generator to which the given vector is moved to. + * + * @param v Vector with values for each parameter. + */ Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}) {}; - // assumes all of the same size and that v is minimal (add simplify?) - Multi_critical_filtration(const std::vector &v) : multi_filtration_(v) {}; - // assumes all of the same size and that v is minimal (add simplify?) - Multi_critical_filtration(std::vector &&v) : multi_filtration_(std::move(v)) {}; + /** + * @brief Constructs filtration value with as many generators than elements in the given vector and initialize + * them with them. + * @pre All generators in the vector have to have the same number of parameters, i.e., size. + * Furthermore, the generators have to be a minimal generating set. + * + * @warning If the set of generators is not minimal, the behaviour of most methods is undefined. It is possible + * to call @ref simplify() after construction if there is a doubt to ensure this property. + * + * @param v Vector of generators. + */ + Multi_critical_filtration(const std::vector &v) : multi_filtration_(v) {}; + /** + * @brief Constructs filtration value with as many generators than elements in the given vector and moves those + * elements to initialize the generators. + * @pre All generators in the vector have to have the same number of parameters, i.e., size. + * Furthermore, the generators have to be a minimal generating set. + * + * @warning If the set of generators is not minimal, the behaviour of most methods is undefined. It is possible + * to call @ref simplify() after construction if there is a doubt to ensure this property. + * + * @param v Vector of generators. + */ + Multi_critical_filtration(std::vector &&v) : multi_filtration_(std::move(v)) {}; + /** + * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end + * iterators. + * + * @param it_begin Start of the range. + * @param it_end End of the range. + */ Multi_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) - : multi_filtration_({Single_point(it_begin, it_end)}) {}; - // : std::vector(it_begin, it_end){}; + : multi_filtration_({Generator(it_begin, it_end)}) {}; + /** + * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end + * const iterators. + * + * @param it_begin Start of the range. + * @param it_end End of the range. + */ Multi_critical_filtration(typename std::vector::const_iterator it_begin, typename std::vector::const_iterator it_end) - : multi_filtration_({Single_point(it_begin, it_end)}) {}; - Multi_critical_filtration(const Multi_critical_filtration &other) : multi_filtration_(other.multi_filtration_) {}; - - Multi_critical_filtration &operator=(const Multi_critical_filtration &other) - { - multi_filtration_ = other.multi_filtration_; - return *this; - } + : multi_filtration_({Generator(it_begin, it_end)}) {}; // VECTOR-LIKE - using value_type = T; - - Single_point &operator[](std::size_t i) { return multi_filtration_[i]; } + using value_type = T; /**< Entry type. */ - const Single_point &operator[](std::size_t i) const { return multi_filtration_[i]; } + /** + * @brief Standard operator[]. + */ + Generator &operator[](std::size_t i) { return multi_filtration_[i]; } + /** + * @brief Standard operator[] const. + */ + const Generator &operator[](std::size_t i) const { return multi_filtration_[i]; } + /** + * @brief Returns begin iterator of the generator range. + */ iterator begin() { return multi_filtration_.begin(); } + /** + * @brief Returns end iterator of the generator range. + */ iterator end() { return multi_filtration_.end(); } + /** + * @brief Returns begin const iterator of the generator range. + */ const_iterator begin() const { return multi_filtration_.begin(); } + /** + * @brief Returns end const iterator of the generator range. + */ const_iterator end() const { return multi_filtration_.end(); } + /** + * @brief Returns true if and only if the number of generators is zero. + */ bool empty() const { return multi_filtration_.empty(); } + /** + * @brief Reserves space for the given number of generators in the underlying container. + * + * @param n Number of generators. + */ void reserve(std::size_t n) { multi_filtration_.reserve(n); } + /** + * @brief Removes all generators. + */ void clear() { multi_filtration_.clear(); } // CONVERTERS - operator Single_point() const + /** + * @brief Casts the object into the type of a generator. + * @pre The filtration value is 1-critical. If there are more than one generator, only the first will be preserved + * and if there is no generator, the method will segfault. + */ + operator Generator() const { GUDHI_CHECK(num_generators() == 1, "Casting a " + std::to_string(num_generators()) + @@ -113,6 +237,12 @@ class Multi_critical_filtration } // like numpy + /** + * @brief Returns a copy with entries casted into the type given as template parameter. + * + * @tparam U New type for the entries. + * @return Copy with new entry type. + */ template Multi_critical_filtration as_type() const { @@ -125,29 +255,68 @@ class Multi_critical_filtration // ACCESS - const Points &get_underlying_container() const { return multi_filtration_; } + /** + * @brief Returns a reference to the underlying container storing the generators. + */ + const Generators &get_underlying_container() const { return multi_filtration_; } + /** + * @brief Returns the number of parameters. + */ std::size_t num_parameters() const { return multi_filtration_.empty() ? 0 : multi_filtration_[0].num_parameters(); } + /** + * @brief Returns the number of generators. + */ std::size_t num_generators() const { return multi_filtration_.size(); } - constexpr static Multi_critical_filtration inf() { return Multi_critical_filtration(Single_point::inf()); } + /** + * @brief Returns a filtration value for which @ref is_inf() returns `true`. + * + * @return Infinity. + */ + constexpr static Multi_critical_filtration inf() { return Multi_critical_filtration(Generator::inf()); } + /** + * @brief Returns a filtration value for which @ref is_minus_inf() returns `true`. + * + * @return Minus infinity. + */ constexpr static Multi_critical_filtration minus_inf() { - return Multi_critical_filtration(Single_point::minus_inf()); + return Multi_critical_filtration(Generator::minus_inf()); } - constexpr static Multi_critical_filtration nan() { return Multi_critical_filtration(Single_point::nan()); } + /** + * @brief Returns a filtration value for which @ref is_nan() returns `true`. + * + * @return NaN. + */ + constexpr static Multi_critical_filtration nan() { return Multi_critical_filtration(Generator::nan()); } // DESCRIPTORS + //TODO: Accept {{-inf, -inf, ...},...} / {{inf, inf, ...},...} / {{NaN, NaN, ...},...} as resp. -inf / inf / NaN. + + /** + * @brief Returns `true` if and only if the filtration value is considered as infinity. + */ bool is_inf() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_inf(); } + /** + * @brief Returns `true` if and only if the filtration value is considered as minus infinity. + */ bool is_minus_inf() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_minus_inf(); } + /** + * @brief Returns `true` if and only if the filtration value is considered as NaN. + */ bool is_nan() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_nan(); } + /** + * @brief Returns `true` if and only if the filtration value is non-empty and is not considered as infinity, + * minus infinity or NaN. + */ bool is_finite() const { if (empty()) return false; @@ -162,76 +331,118 @@ class Multi_critical_filtration * Checks if `this`, seen as a birth curve is under the `other` birth curve, * */ - bool operator<(const Multi_critical_filtration &other) const + + /** + * @brief Returns `true` if and only if the positive cones generated by @p b are strictly contained in the + * positive cones generated by @p a. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Note that not all filtration values are comparable. That is, \f$ a > b \f$ and \f$ b > a \f$ returning both false + * does **not** imply \f$ a == b \f$. + */ + friend bool operator<(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { - // check if this curves is below other's curve - // ie for each guy in this, check if there is a guy in other that dominates him - for (std::size_t i = 0u; i < other.multi_filtration_.size(); ++i) { - //for each point in other, verify if it is strictly in the cone of at least one point of this + for (std::size_t i = 0u; i < b.multi_filtration_.size(); ++i) { + //for each generator in b, verify if it is strictly in the cone of at least one generator of a bool isContained = false; - for (std::size_t j = 0u; j < multi_filtration_.size() && !isContained; ++j) { + for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { // i b \f$ and \f$ b > a \f$ returning both false + * does **not** imply \f$ a == b \f$. */ - bool operator>(const Multi_critical_filtration &other) const { return other < *this; } + friend bool operator>(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { return b < a; } - /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, + /** + * @brief Returns `true` if and only if the positive cones generated by @p b are contained in or are (partially) + * equal to the positive cones generated by @p a. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Note that not all filtration values are comparable. That is, \f$ a \le b \f$ and \f$ b \le a \f$ can both return + * `false`. */ - bool operator<=(const Multi_critical_filtration &other) const + friend bool operator<=(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { // check if this curves is below other's curve // ie for each guy in this, check if there is a guy in other that dominates him - for (std::size_t i = 0u; i < other.multi_filtration_.size(); ++i) { - //for each point in other, verify if it is in the cone of at least one point of this + for (std::size_t i = 0u; i < b.multi_filtration_.size(); ++i) { + //for each generator in other, verify if it is in the cone of at least one generator of this bool isContained = false; - for (std::size_t j = 0u; j < multi_filtration_.size() && !isContained; ++j) { + for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { // i=(const Multi_critical_filtration &other) const { return other <= *this; } + friend bool operator>=(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { return b <= a; } - friend bool operator==(const Multi_critical_filtration &self, const Multi_critical_filtration &to_compare) + /** + * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is equal to \f$ b[i] \f$. + */ + friend bool operator==(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { - if (self.num_generators() != to_compare.num_generators()) return false; - for (auto i = 0u; i < self.num_generators(); i++) { - if (self[i] != to_compare[i]) return false; + if (a.num_generators() != b.num_generators()) return false; + for (auto i = 0u; i < a.num_generators(); i++) { + if (a[i] != b[i]) return false; } return true; } - friend bool operator!=(const Multi_critical_filtration &self, const Multi_critical_filtration &to_compare) + /** + * @brief Returns `true` if and only if \f$ a == b \f$ returns `false`. + */ + friend bool operator!=(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { - return !(self == to_compare); + return !(a == b); } // MODIFIERS + /** + * @brief Sets the number of generators. If there were less generators before, new empty generators are constructed. + * If there were more generators before, the exceed of generators is destroyed (any generator with index higher or + * equal than @p n to be more precise). + * + * @warning All empty generators have 0 parameters. This can be problematic for some methods if there are also + * non empty generators in the container. Make sure to fill them with real generators or to remove them before + * using those methods. + * + * @param n New number of generators. + */ void set_num_generators(std::size_t n) { multi_filtration_.resize(n); } - /** \brief This functions take the filtration value `this` and pushes it to - * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, - * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb - * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} - * @param[in] x The target filtration value on which to push `this`. + /** + * @brief Sets all generators to the least common upper bound between the current generator value and the given value. + * + * More formally, it pushes the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \ge x \} \f$ + * originating in \f$ x \f$. The resulting values corresponds to the generators of the intersection of this cone + * with the union of positive cones generated by the old generators. + * + * @param x The target filtration value towards which to push. */ - void push_to(const Single_point &x) + void push_to_least_common_upper_bound(const Generator &x) { if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; @@ -243,21 +454,25 @@ class Multi_critical_filtration return; } for (auto &g : *this) { - g.push_to(x); + g.push_to_least_common_upper_bound(x); } simplify(); } - // TODO: this is not well defined for k-critical <-> k-critical + // TODO: this is not well defined for k-critical <-> k-critical ? - /** \brief This functions take the filtration value `this` and pulls it to the - * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the - * value of this is updated to \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : - * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} - * @param[in] x The target filtration value on which to push `this`. + /** + * @brief Sets all generators to the greatest common lower bound between the current generator value and the given + * value. + * + * More formally, it pulls the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \le x \} \f$ + * originating in \f$ x \f$. The resulting values corresponds to the generators of the intersection of this cone + * with the union of negative cones generated by the old generators. + * + * @param x The target filtration value towards which to pull. */ - void pull_to(const Single_point &x) + void pull_to_greatest_common_lower_bound(const Generator &x) { if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; @@ -269,17 +484,23 @@ class Multi_critical_filtration return; } for (auto &g : *this) { - g.pull_to(x); + g.pull_to_greatest_common_lower_bound(x); } simplify(); } - /* - * Adds a birth point to the list of births, - * if it is useful (according to the method `dominate`) + /** + * @brief Adds the given generator to the filtration value such that the sets remains minimal. + * It is therefore possible that the generator is ignored if it does not generated any new lifetime or that + * old generators disappear if they are overshadowed by the new one. + * @pre If all are finite, the new generator has to have the same number of parameters than the others. + * + * @param x New generator to add. + * @return true If and only if the generator is actually added to the set of generators. + * @return false Otherwise. */ - bool add_point(const Single_point &x) + bool add_generator(const Generator &x) { if (multi_filtration_.empty()) { multi_filtration_.push_back(x); @@ -287,11 +508,11 @@ class Multi_critical_filtration } GUDHI_CHECK(x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite() || !x.is_finite(), - "Cannot add a point with different number of parameters."); + "Cannot add a generator with different number of parameters."); std::size_t end = multi_filtration_.size(); - if (_point_can_be_added(x, 0, end)) { + if (_generator_can_be_added(x, 0, end)) { multi_filtration_.resize(end); multi_filtration_.push_back(x); return true; @@ -300,18 +521,40 @@ class Multi_critical_filtration return false; } - // No security - void add_guaranteed_point(const Single_point &x) { multi_filtration_.push_back(x); } + /** + * @brief Adds the given generator to the filtration value without any verifications or simplifications. + * + * @warning If the resulting set of generators is not minimal after modification, some methods will have an + * undefined behaviour. Be sure to call @ref simplify() before using them. + * + * @param x + */ + void add_guaranteed_generator(const Generator &x) { multi_filtration_.push_back(x); } /* * Same as `compute_coordinates_in_grid`, but does the operation in-place. */ + + /** + * @brief Projects the filtration value into the given grid. If @p coordinate is false, the entries are set to + * the nearest upper bound value with the same parameter in the grid. Otherwise, the entries are set to the indices + * of those nearest upper bound values. + * The grid has to be represented as a vector of ordered ranges of values convertible into `T`. An index + * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in a generator. + * The ranges correspond to the possible values of the parameters, ordered by increasing value, forming therefore + * all together a 2D grid. + * + * @tparam oned_array A range of values convertible into `T` ordered by increasing value. Has to implement + * a begin, end and operator[] method. + * @param grid Vector of @p oned_array with size at least number of filtration parameters. + * @param coordinate If true, the values are set to the coordinates of the projection in the grid. If false, + * the values are set to the values at the coordinates of the projection. + */ template void project_onto_grid(const std::vector &grid, bool coordinate = true) { - // not sure why this is needed? Are the tests with the numbers of parameters not enough? - GUDHI_CHECK(grid.size() >= num_generators(), - "The grid should not be smaller than the number of generators in the filtration value."); + GUDHI_CHECK(grid.size() >= num_parameters(), + "The grid should not be smaller than the number of parameters in the filtration value."); for (auto &x : multi_filtration_) { x.project_onto_grid(grid, coordinate); @@ -320,24 +563,33 @@ class Multi_critical_filtration if (!coordinate) simplify(); } - // no NaN? - void remove_empty_points(bool include_infinities = false) + /** + * @brief Removes all empty generators from the filtration value. If @p include_infinities is true, it also + * removes the generators at infinity or minus infinity. + * + * @param include_infinities If true, removes also infinity values. + */ + void remove_empty_generators(bool include_infinities = false) { multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), - [include_infinities](const Single_point &a) { + [include_infinities](const Generator &a) { return a.empty() || ((include_infinities) && (a.is_inf() || a.is_minus_inf())); }), multi_filtration_.end()); } + /** + * @brief Simplifies the current set of generators such that it becomes minimal. Only necessary if generators were + * added "by hand" either trough the constructor or with @ref add_guaranteed_generator "". + */ void simplify() { std::size_t end = 0; for (std::size_t curr = 0; curr < multi_filtration_.size(); ++curr) { - if (_point_can_be_added(multi_filtration_[curr], 0, end)) { + if (_generator_can_be_added(multi_filtration_[curr], 0, end)) { std::swap(multi_filtration_[end], multi_filtration_[curr]); ++end; } @@ -348,10 +600,14 @@ class Multi_critical_filtration // FONCTIONNALITIES - friend Single_point factorize_below(const Multi_critical_filtration &f) + /** + * @brief Returns a generator with the minimal values of all parameters in any generator of the given filtration + * value. That is, the greatest lower bound of all generators. + */ + friend Generator factorize_below(const Multi_critical_filtration &f) { - if (f.num_generators() == 0) return Single_point(); - Single_point result(f.num_parameters(), Single_point::T_inf); + if (f.num_generators() == 0) return Generator(); + Generator result(f.num_parameters(), Generator::T_inf); for (const auto &g : f) { if (g.is_nan() || g.is_minus_inf()) return g; if (g.is_inf()) continue; @@ -362,14 +618,14 @@ class Multi_critical_filtration return result; } - /* - * returns the smallest value for the poset order that is bigger than all of the values - * in this multi filtration + /** + * @brief Returns a generator with the maximal values of all parameters in any generator of the given filtration + * value. That is, the least upper bound of all generators. */ - friend Single_point factorize_above(const Multi_critical_filtration &f) + friend Generator factorize_above(const Multi_critical_filtration &f) { - if (f.num_generators() == 0) return Single_point(); - Single_point result(f.num_parameters(), -Single_point::T_inf); + if (f.num_generators() == 0) return Generator(); + Generator result(f.num_parameters(), -Generator::T_inf); for (auto &g : f) { if (g.is_nan() || g.is_inf()) return g; if (g.is_minus_inf()) continue; @@ -380,6 +636,15 @@ class Multi_critical_filtration return result; } + /** + * @brief Computes the smallest (resp. the greatest if `co` is true) scalar product of the all generators with the + * given vector. + * + * @tparam U Arithmetic type of the result. Default value: `T`. + * @param f Filtration value. + * @param x Vector of coefficients. + * @return Scalar product of @p f with @p x. + */ template friend U compute_linear_projection(const Multi_critical_filtration &f, const std::vector &x) { @@ -398,11 +663,21 @@ class Multi_critical_filtration } } - /* - * Same as its one critical counterpart. - * If a grid is given, projects multi_filtration_ on this grid and returns - * multi critical filtration composed of the coordinates in the given grid - * + /** + * @brief Computes the coordinates in the given grid, corresponding to the nearest upper bounds of the entries + * in the given filtration value. + * The grid has to be represented as a vector of vectors of ordered values convertible into `out_type`. An index + * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in a generator. + * The inner vectors correspond to the possible values of the parameters, ordered by increasing value, + * forming therefore all together a 2D grid. + * + * @tparam out_type Signed arithmetic type. Default value: std::int32_t. + * @tparam U Type which is convertible into `out_type`. + * @param f Filtration value to project. + * @param grid Vector of vectors to project into. + * @return Filtration value \f$ out \f$ whose entry correspond to the indices of the projected values. That is, + * the projection of \f$ f[i] \f$ is \f$ grid[i][out[i]] \f$ before simplification (if two generators were + * projected to the same point, the doubles are removed in the output). */ template friend Multi_critical_filtration compute_coordinates_in_grid(const Multi_critical_filtration &f, @@ -413,10 +688,16 @@ class Multi_critical_filtration return coords; } - /* - * Same method as the one in OneCriticalFiltration. - * Given a grid, and assuming that `this` are the coordinates - * in this grid, evaluate `this` into this grid + /** + * @brief Computes the values in the given grid corresponding to the coordinates given by the given filtration + * value. That is, if \f$ out \f$ is the result, \f$ out[i] = grid[i][f[i]] \f$. Assumes therefore, that the + * values stored in the filtration value corresponds to indices existing in the given grid. + * + * @tparam U Signed arithmetic type. + * @param f Filtration value storing coordinates compatible with `grid`. + * @param grid Vector of vector. + * @return Filtration value \f$ out \f$ whose entry correspond to \f$ out[i] = grid[i][f[i]] \f$ before + * simplification (the output is simplified). */ template friend Multi_critical_filtration evaluate_coordinates_in_grid(const Multi_critical_filtration &f, @@ -433,7 +714,9 @@ class Multi_critical_filtration // UTILITIES - // easy debug + /** + * @brief Outstream operator. + */ friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &f) { if (f.is_inf()) { @@ -461,16 +744,18 @@ class Multi_critical_filtration } public: - // for compiler + /** + * @brief Indicates if the class manages multi-critical filtration values. + */ constexpr static const bool is_multi_critical = true; private: - Points multi_filtration_; + Generators multi_filtration_; /**< Container for generators. */ - /* - * Checks if b is cleanable with respect to a + /** + * @brief Verifies if @p b is strictly contained in the positive cone originating in `a`. */ - static bool _strictly_contains(const Single_point &a, const Single_point &b) + static bool _strictly_contains(const Generator &a, const Generator &b) { if constexpr (co) return a > b; @@ -478,7 +763,10 @@ class Multi_critical_filtration return a < b; } } - static bool _contains(const Single_point &a, const Single_point &b) + /** + * @brief Verifies if @p b is contained in the positive cone originating in `a`. + */ + static bool _contains(const Generator &a, const Generator &b) { if constexpr (co) return a >= b; @@ -491,12 +779,12 @@ class Multi_critical_filtration // 1 == a dom b // 2 == b dom a // 3 == none - static int _get_domination_relation(const Single_point &a, const Single_point &b) + static int _get_domination_relation(const Generator &a, const Generator &b) { if (a.is_nan() || b.is_nan()) return 3; GUDHI_CHECK(a.size() == b.size(), - "Two points in the same k-critical value have to have the same numbers of parameters."); + "Two generators in the same k-critical value have to have the same numbers of parameters."); bool equal = true; bool allGreater = true; @@ -525,7 +813,7 @@ class Multi_critical_filtration // assumes between 'curr' and 'end' everything is simplified: // no nan values and if there is an inf/-inf, then 'end - curr == 1' - bool _point_can_be_added(const Single_point &x, std::size_t curr, std::size_t &end) + bool _generator_can_be_added(const Generator &x, std::size_t curr, std::size_t &end) { if (x.empty() || x.is_nan() || (x.is_inf() && end - curr != 0)) return false; @@ -582,7 +870,7 @@ class numeric_limits> // non-standard, so I don't want to define default values. static constexpr Gudhi::multi_filtration::Multi_critical_filtration max(unsigned int g, unsigned int n) noexcept { - std::vector::Single_point> v( + std::vector::Generator> v( g, std::vector(n, std::numeric_limits::max())); return Gudhi::multi_filtration::Multi_critical_filtration(std::move(v)); }; diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index 781c121bab..520ba22691 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -5,7 +5,7 @@ * Copyright (C) 2023 Inria * * Modification(s): - * - 2024/08 Hannah Schreiber: Generalization to all signed arithmetic types for T + * - 2024/08 Hannah Schreiber: Generalization to all signed arithmetic types for T + doc * - YYYY/MM Author: Description of the modification */ @@ -26,26 +26,35 @@ namespace Gudhi::multi_filtration { /** - * \brief Vector-like filtration value, for multiparameter persistence, with - * numpy-like methods. + * @class One_critical_filtration one_critical_filtration.h gudhi/one_critical_filtration.h + * @ingroup multi_filtration * - * \ingroup multi_filtration + * @brief Class representing the apparition values of a same simplex for several parameters, that is, the filtration + * value of a simplex in the setting of a 1-critical multi-parameter filtration. The class can be used as a vector + * whose indices correspond to one parameter each. It also has several numpy-like arithmetic operators. * - * \details Child of `std::vector` that has numpy-like pointwise operators. - * One critical simplicial filtrations are filtrations such that the lifetime - * each simplex is a positive cone, e.g. + * @details Inherits of `std::vector`. Overloads `std::numeric_limits` such that: + * - `std::numeric_limits >::has_infinity` returns `true`, + * - `std::numeric_limits >::infinity()` returns @ref One_critical_filtration::inf() "", + * - `std::numeric_limits >::minus_infinity()` returns + * @ref One_critical_filtration::minus_inf() "", + * - `std::numeric_limits >::max()` throws, + * - `std::numeric_limits >::max(n)` returns a @ref One_critical_filtration with `n` + * parameters evaluated at value `std::numeric_limits::max()`, + * - `std::numeric_limits >::quiet_NaN()` returns @ref One_critical_filtration::nan() "". + * + * One critical simplicial filtrations are filtrations such that the lifetime of each simplex is a positive cone, e.g. * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \f$ is valid, while - * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{x \in \mathbb R^2 : - * x>=(2,1)\} \f$ is not- Finitely critical filtrations are filtrations such - * that the lifetime of each simplex is a union of such cones, e.g., - * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{ x \in \mathbb R^2 : - * x>=(2,1)\} \f$ is finitely critical, and more particularly 2-critical, while - * - \f$ \{ x \in \mathbb R^2 : x>= \mathrm{epigraph}(y\mapsto e^{-y})\} \f$ - * is not. - * Use \ref Multi_critical_filtration for multi-critical filtrations. - * \tparam T value type of the vector-like. Has to implement std::isnan(), std::numeric_limits::has_quiet_NaN, - * std::numeric_limits::quiet_NaN(), std::numeric_limits::has_infinity, std::numeric_limits::infinity(), - * std::numeric_limits::max(). + * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{x \in \mathbb R^2 : x>=(2,1)\} \f$ is not. + * + * If the lifetime corresponds to a union of such positive cones, the filtration is called a multi-critical filtration. + * For those cases, use @ref Multi_critical_filtration instead. + * + * @tparam T Arithmetic type of an entry for one parameter of the filtration value. Has to be **signed** and + * to implement `std::isnan(T)`, `std::numeric_limits::has_quiet_NaN`, `std::numeric_limits::quiet_NaN()`, + * `std::numeric_limits::has_infinity`, `std::numeric_limits::infinity()` and `std::numeric_limits::max()`. + * If `std::numeric_limits::has_infinity` returns `false`, a call to `std::numeric_limits::infinity()` + * can simply throw. Examples are the native types `double`, `float` and `int`. */ template class One_critical_filtration : public std::vector @@ -54,25 +63,82 @@ class One_critical_filtration : public std::vector using Base = std::vector; public: + /** + * @brief Type of the origin of a "simplex lifetime cone". Common with @ref Multi_critical_filtration "". + * In the 1-critical case, simply the class it-self. + * + * @tparam U Type of a value for one parameter within the filtration value. Default value: `T`. + */ template - using Single_point = One_critical_filtration; + using Generator = One_critical_filtration; // CONSTRUCTORS + /** + * @brief Default constructor. Constructs an empty vector with 0 parameters. + */ One_critical_filtration() : Base() {}; - // warning: can be problematic if the user never updates the values and let it like that, {-inf, -inf, ...} is not - // considered as -inf. - One_critical_filtration(int n) : Base(n, -T_inf) {}; // minus infinity by default + /** + * @brief Constructs a vector of the size of the given number of parameters with -inf as value for each entry. + * + * @warning The vector `{-inf, -inf, ...}` with \f$ n > 1 \f$ entries is not considered as "minus infinity" (the + * method @ref is_minus_inf() will not return true). The `-inf` are just meant as placeholders, at least one entry + * should be modified by the user. Otherwise, either use the static method @ref minus_inf() or set @p n to 1 instead. + * + * @param n Number of parameters. + */ + One_critical_filtration(int n) : Base(n, -T_inf) {}; + /** + * @brief Constructs a vector of the size of the given number of parameters and the given value for each entry. + * + * @warning If @p value is `inf`, `-inf`, or `NaN`, the vector `{value, value, ...}` with \f$ n > 1 \f$ entries + * is not wrong but will not be considered as respectively "infinity", "minus infinity" or "NaN" (the corresponding + * methods @ref is_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use + * the static methods @ref inf(), @ref minus_inf() and @ref nan() instead. + * + * @param n Number of parameters. + * @param value Value which will be used for each entry. + */ One_critical_filtration(int n, T value) : Base(n, value) {}; + /** + * @brief Construct a vector from the given initializer list. + * + * @param init Initializer list with values for each parameter. + */ One_critical_filtration(std::initializer_list init) : Base(init) {}; + /** + * @brief Construct a vector from the given vector. + * + * @param v Vector with values for each parameter. + */ One_critical_filtration(const std::vector &v) : Base(v) {}; + /** + * @brief Construct a vector from the given vector by moving it to the new vector. + * + * @param v Vector with values for each parameter. + */ One_critical_filtration(std::vector &&v) : Base(std::move(v)) {}; + /** + * @brief Construct a vector from the range given by the begin and end iterators. + * + * @param it_begin Start of the range. + * @param it_end End of the range. + */ One_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) : Base(it_begin, it_end) {}; + /** + * @brief Construct a vector from the range given by the begin and end const iterators. + * + * @param it_begin Start of the range. + * @param it_end End of the range. + */ One_critical_filtration(typename std::vector::const_iterator it_begin, typename std::vector::const_iterator it_end) : Base(it_begin, it_end) {}; + /** + * @brief Assign operator. + */ One_critical_filtration &operator=(const One_critical_filtration &a) { Base::operator=(a); @@ -81,16 +147,28 @@ class One_critical_filtration : public std::vector // HERITAGE - using std::vector::operator[]; - using value_type = T; + using std::vector::operator[]; /**< Inheritance of entry access. */ + using value_type = T; /**< Entry type. */ // CONVERTERS + /** + * @brief Cast into `std::vector &`. + */ operator std::vector &() const { return *this; } + /** + * @brief Cast into `std::vector`. + */ operator std::vector() const { return static_cast >(*this); } // like numpy + /** + * @brief Returns a copy with entries casted into the type given as template parameter. + * + * @tparam U New type for the entries. + * @return Copy with new entry type. + */ template One_critical_filtration as_type() const { @@ -102,12 +180,33 @@ class One_critical_filtration : public std::vector // ACCESS + /** + * @brief Returns the number of parameters of the finite filtration value. If the value is "inf", "-inf" or "NaN", + * returns 1. + * + * @return Number of parameters. + */ std::size_t num_parameters() const { return Base::size(); } + /** + * @brief Returns a filtration value for which @ref is_inf() returns `true`. + * + * @return Infinity. + */ constexpr static One_critical_filtration inf() { return {T_inf}; } + /** + * @brief Returns a filtration value for which @ref is_minus_inf() returns `true`. + * + * @return Minus infinity. + */ constexpr static One_critical_filtration minus_inf() { return {-T_inf}; } + /** + * @brief Returns a filtration value for which @ref is_nan() returns `true`. + * + * @return NaN. + */ constexpr static One_critical_filtration nan() { if constexpr (std::numeric_limits::has_quiet_NaN) { @@ -119,12 +218,20 @@ class One_critical_filtration : public std::vector // DESCRIPTORS + //TODO: Accept {-inf, -inf, ...} / {inf, inf, ...} / {NaN, NaN, ...} as resp. -inf / inf / NaN. + + /** + * @brief Returns `true` if and only if the filtration value is considered as infinity. + */ bool is_inf() const { if (Base::size() != 1) return false; return (Base::operator[](0) == T_inf); } + /** + * @brief Returns `true` if and only if the filtration value is considered as minus infinity. + */ bool is_minus_inf() const { if constexpr (std::is_same::value) { @@ -135,6 +242,9 @@ class One_critical_filtration : public std::vector } } + /** + * @brief Returns `true` if and only if the filtration value is considered as NaN. + */ bool is_nan() const { if constexpr (std::numeric_limits::has_quiet_NaN) { @@ -145,6 +255,10 @@ class One_critical_filtration : public std::vector } } + /** + * @brief Returns `true` if and only if the filtration value is non-empty and is not considered as infinity, + * minus infinity or NaN. + */ bool is_finite() const { if (Base::size() > 1) return true; @@ -156,13 +270,20 @@ class One_critical_filtration : public std::vector // COMPARAISON OPERATORS + /** + * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is strictly smaller than \f$ b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Note that not all filtration values are comparable. That is, \f$ a < b \f$ and \f$ b < a \f$ returning both false + * does **not** imply \f$ a == b \f$. + */ friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; if (b.is_inf() || a.is_minus_inf()) return true; bool isSame = true; auto n = a.size(); - GUDHI_CHECK(a.size() == b.size(), "Two filtration points with different number of parameters are not comparable."); + GUDHI_CHECK(a.size() == b.size(), "Two filtration values with different number of parameters are not comparable."); for (auto i = 0u; i < n; ++i) { if (a[i] > b[i]) return false; if (isSame && a[i] != b[i]) isSame = false; @@ -170,23 +291,47 @@ class One_critical_filtration : public std::vector return !isSame; } + /** + * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is smaller or equal than \f$ b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Note that not all filtration values are comparable. That is, \f$ a \le b \f$ and \f$ b \le a \f$ can both return + * `false`. + */ friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.is_nan() || b.is_nan()) return false; if (b.is_inf() || a.is_minus_inf()) return true; if (a.is_inf() || b.is_minus_inf()) return false; auto n = a.size(); - GUDHI_CHECK(a.size() == b.size(), "Two filtration points with different number of parameters are not comparable."); + GUDHI_CHECK(a.size() == b.size(), "Two filtration values with different number of parameters are not comparable."); for (std::size_t i = 0u; i < n; ++i) { if (a[i] > b[i]) return false; } return true; } + /** + * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is strictly greater than \f$ b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Note that not all filtration values are comparable. That is, \f$ a > b \f$ and \f$ b > a \f$ returning both false + * does **not** imply \f$ a == b \f$. + */ friend bool operator>(const One_critical_filtration &a, const One_critical_filtration &b) { return b < a; } + /** + * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is greater or equal than \f$ b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Note that not all filtration values are comparable. That is, \f$ a \ge b \f$ and \f$ b \ge a \f$ can both return + * `false`. + */ friend bool operator>=(const One_critical_filtration &a, const One_critical_filtration &b) { return b <= a; } + /** + * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is equal to \f$ b[i] \f$. + */ friend bool operator==(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.num_parameters() != b.num_parameters()) return false; @@ -196,11 +341,23 @@ class One_critical_filtration : public std::vector return true; } + /** + * @brief Returns `true` if and only if \f$ a == b \f$ returns `false`. + */ friend bool operator!=(const One_critical_filtration &a, const One_critical_filtration &b) { return !(a == b); } // ARITHMETIC OPERATORS // opposite + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ -f[i] \f$. + * + * Used conventions: + * - \f$ -NaN = NaN \f$. + * + * @param f Value to opposite. + * @return The opposite of @p f. + */ friend One_critical_filtration operator-(const One_critical_filtration &f) { One_critical_filtration result; @@ -211,34 +368,94 @@ class One_critical_filtration : public std::vector return result; } - // One_critical_filtration &operator-() - // { - // for (auto &val : *this) { - // val = -val; - // } - // } - // subtraction - friend One_critical_filtration operator-(One_critical_filtration result, const One_critical_filtration &to_subtract) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ a[i] - b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ inf - inf = NaN \f$, + * - \f$ -inf - (-inf) = NaN \f$, + * - \f$ NaN - b = NaN \f$, + * - \f$ a - NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param a First element of the subtraction. + * @param b Second element of the subtraction. + * @return Entry-wise \f$ a - b \f$. + */ + friend One_critical_filtration operator-(One_critical_filtration a, const One_critical_filtration &b) { - result -= to_subtract; - return result; + a -= b; + return a; } - friend One_critical_filtration operator-(One_critical_filtration result, const T &to_subtract) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ f[i] - val \f$. + * + * Used conventions: + * - \f$ inf - inf = NaN \f$, + * - \f$ -inf - (-inf) = NaN \f$, + * - \f$ NaN - b = NaN \f$, + * - \f$ a - NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param f First element of the subtraction. + * @param val Second element of the subtraction. + * @return Entry-wise \f$ f - val \f$. + */ + friend One_critical_filtration operator-(One_critical_filtration f, const T &val) { - result -= to_subtract; - return result; + f -= val; + return f; } - friend One_critical_filtration operator-(const T &value, One_critical_filtration result) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ val - f[i] \f$. + * + * Used conventions: + * - \f$ inf - inf = NaN \f$, + * - \f$ -inf - (-inf) = NaN \f$, + * - \f$ NaN - b = NaN \f$, + * - \f$ a - NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param val First element of the subtraction. + * @param f Second element of the subtraction. + * @return Entry-wise \f$ val - f \f$. + */ + friend One_critical_filtration operator-(const T &val, One_critical_filtration f) { // TODO: in one go - result = -result; - result += value; - return result; + f = -f; + f += val; + return f; } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] - to\_subtract[i] \f$. + * If @p result and @p to_subtract are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ inf - inf = NaN \f$, + * - \f$ -inf - (-inf) = NaN \f$, + * - \f$ NaN - b = NaN \f$, + * - \f$ a - NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the subtraction. + * @param to_subtract Second element of the subtraction. + * @return Entry-wise \f$ result - to\_subtract \f$. + */ friend One_critical_filtration &operator-=(One_critical_filtration &result, const One_critical_filtration &to_subtract) { @@ -259,11 +476,28 @@ class One_critical_filtration : public std::vector } GUDHI_CHECK(result.size() == to_subtract.size(), - "Two filtration points with different number of parameters cannot be subtracted."); + "Two filtration values with different number of parameters cannot be subtracted."); return apply_operation_with_finite_values_(result, to_subtract, subtract_); } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] - to\_subtract \f$. + * + * Used conventions: + * - \f$ inf - inf = NaN \f$, + * - \f$ -inf - (-inf) = NaN \f$, + * - \f$ NaN - b = NaN \f$, + * - \f$ a - NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the subtraction. + * @param to_subtract Second element of the subtraction. + * @return Entry-wise \f$ result - to\_subtract \f$. + */ friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_subtract) { if (result.empty()) return result; @@ -286,24 +520,83 @@ class One_critical_filtration : public std::vector } // addition - friend One_critical_filtration operator+(One_critical_filtration result, const One_critical_filtration &to_add) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ a[i] + b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ NaN + b = NaN \f$, + * - \f$ a + NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param a First element of the addition. + * @param b Second element of the addition. + * @return Entry-wise \f$ a + b \f$. + */ + friend One_critical_filtration operator+(One_critical_filtration a, const One_critical_filtration &b) { - result += to_add; - return result; + a += b; + return a; } - friend One_critical_filtration operator+(One_critical_filtration result, const T &to_add) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ f[i] + val \f$. + * + * Used conventions: + * - \f$ NaN + b = NaN \f$, + * - \f$ a + NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param f First element of the addition. + * @param val Second element of the addition. + * @return Entry-wise \f$ f + val \f$. + */ + friend One_critical_filtration operator+(One_critical_filtration f, const T &val) { - result += to_add; - return result; + f += val; + return f; } - friend One_critical_filtration operator+(const T &to_add, One_critical_filtration result) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ val + f[i] \f$. + * + * Used conventions: + * - \f$ NaN + b = NaN \f$, + * - \f$ a + NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param val First element of the addition. + * @param f Second element of the addition. + * @return Entry-wise \f$ val + f \f$. + */ + friend One_critical_filtration operator+(const T &val, One_critical_filtration f) { - result += to_add; - return result; + f += val; + return f; } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] + to\_add[i] \f$. + * If @p result and @p to_add are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ NaN + b = NaN \f$, + * - \f$ a + NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the addition. + * @param to_add Second element of the addition. + * @return Entry-wise \f$ result + to\_add \f$. + */ friend One_critical_filtration &operator+=(One_critical_filtration &result, const One_critical_filtration &to_add) { if (result.empty()) return result; @@ -323,11 +616,26 @@ class One_critical_filtration : public std::vector } GUDHI_CHECK(result.size() == to_add.size(), - "Two filtration points with different number of parameters cannot be added."); + "Two filtration values with different number of parameters cannot be added."); return apply_operation_with_finite_values_(result, to_add, add_); } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] + to\_add \f$. + * + * Used conventions: + * - \f$ NaN + b = NaN \f$, + * - \f$ a + NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the addition. + * @param to_add Second element of the addition. + * @return Entry-wise \f$ result + to\_add \f$. + */ friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) { if (result.empty()) return result; @@ -350,24 +658,99 @@ class One_critical_filtration : public std::vector } // multiplication - friend One_critical_filtration operator*(One_critical_filtration result, const One_critical_filtration &to_mul) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ a[i] * b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ inf * 0 = NaN \f$, + * - \f$ 0 * inf = NaN \f$, + * - \f$ -inf * 0 = NaN \f$, + * - \f$ 0 * -inf = NaN \f$, + * - \f$ NaN * b = NaN \f$, + * - \f$ a * NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param a First element of the multiplication. + * @param b Second element of the multiplication. + * @return Entry-wise \f$ a * b \f$. + */ + friend One_critical_filtration operator*(One_critical_filtration a, const One_critical_filtration &b) { - result *= to_mul; - return result; + a *= b; + return a; } - friend One_critical_filtration operator*(One_critical_filtration result, const T &to_mul) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ f[i] * val \f$. + * + * Used conventions: + * - \f$ inf * 0 = NaN \f$, + * - \f$ 0 * inf = NaN \f$, + * - \f$ -inf * 0 = NaN \f$, + * - \f$ 0 * -inf = NaN \f$, + * - \f$ NaN * b = NaN \f$, + * - \f$ a * NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param f First element of the multiplication. + * @param val Second element of the multiplication. + * @return Entry-wise \f$ f * val \f$. + */ + friend One_critical_filtration operator*(One_critical_filtration f, const T &val) { - result *= to_mul; - return result; + f *= val; + return f; } - friend One_critical_filtration operator*(const T &to_mul, One_critical_filtration result) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ val * f[i] \f$. + * + * Used conventions: + * - \f$ inf * 0 = NaN \f$, + * - \f$ 0 * inf = NaN \f$, + * - \f$ -inf * 0 = NaN \f$, + * - \f$ 0 * -inf = NaN \f$, + * - \f$ NaN * b = NaN \f$, + * - \f$ a * NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param val First element of the multiplication. + * @param f Second element of the multiplication. + * @return Entry-wise \f$ val * f \f$. + */ + friend One_critical_filtration operator*(const T &val, One_critical_filtration f) { - result *= to_mul; - return result; + f *= val; + return f; } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] * to\_mul[i] \f$. + * If @p result and @p to_mul are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ inf * 0 = NaN \f$, + * - \f$ 0 * inf = NaN \f$, + * - \f$ -inf * 0 = NaN \f$, + * - \f$ 0 * -inf = NaN \f$, + * - \f$ NaN * b = NaN \f$, + * - \f$ a * NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the multiplication. + * @param to_mul Second element of the multiplication. + * @return Entry-wise \f$ result * to\_mul \f$. + */ friend One_critical_filtration &operator*=(One_critical_filtration &result, const One_critical_filtration &to_mul) { if (result.empty()) return result; @@ -395,11 +778,30 @@ class One_critical_filtration : public std::vector } GUDHI_CHECK(result.size() == to_mul.size(), - "Two filtration points with different number of parameters cannot be multiplied."); + "Two filtration values with different number of parameters cannot be multiplied."); return apply_operation_with_finite_values_(result, to_mul, multiply_); } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] * to\_mul \f$. + * + * Used conventions: + * - \f$ inf * 0 = NaN \f$, + * - \f$ 0 * inf = NaN \f$, + * - \f$ -inf * 0 = NaN \f$, + * - \f$ 0 * -inf = NaN \f$, + * - \f$ NaN * b = NaN \f$, + * - \f$ a * NaN = NaN \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the multiplication. + * @param to_mul Second element of the multiplication. + * @return Entry-wise \f$ result * to\_mul \f$. + */ friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_mul) { if (result.empty()) return result; @@ -421,28 +823,115 @@ class One_critical_filtration : public std::vector } // division - friend One_critical_filtration operator/(One_critical_filtration result, const One_critical_filtration &to_div) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ a[i] / b[i] \f$. + * If @p a and @p b are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ a / 0 = NaN \f$, + * - \f$ inf / inf = NaN \f$, + * - \f$ -inf / inf = NaN \f$, + * - \f$ inf / -inf = NaN \f$, + * - \f$ -inf / -inf = NaN \f$, + * - \f$ NaN / b = NaN \f$, + * - \f$ a / NaN = NaN \f$, + * - \f$ a / inf = 0 \f$, + * - \f$ a / -inf = 0 \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param a First element of the division. + * @param b Second element of the division. + * @return Entry-wise \f$ a / b \f$. + */ + friend One_critical_filtration operator/(One_critical_filtration a, const One_critical_filtration &b) { - result /= to_div; - return result; + a /= b; + return a; } - friend One_critical_filtration operator/(One_critical_filtration result, const T &to_div) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ f[i] / val \f$. + * + * Used conventions: + * - \f$ a / 0 = NaN \f$, + * - \f$ inf / inf = NaN \f$, + * - \f$ -inf / inf = NaN \f$, + * - \f$ inf / -inf = NaN \f$, + * - \f$ -inf / -inf = NaN \f$, + * - \f$ NaN / b = NaN \f$, + * - \f$ a / NaN = NaN \f$, + * - \f$ a / inf = 0 \f$, + * - \f$ a / -inf = 0 \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param f First element of the division. + * @param val Second element of the division. + * @return Entry-wise \f$ f / val \f$. + */ + friend One_critical_filtration operator/(One_critical_filtration f, const T &val) { - result /= to_div; - return result; + f /= val; + return f; } - friend One_critical_filtration operator/(const T &value, const One_critical_filtration &f) + /** + * @brief Returns a filtration value such that an entry at index \f$ i \f$ is equal to \f$ val / f[i] \f$. + * + * Used conventions: + * - \f$ a / 0 = NaN \f$, + * - \f$ inf / inf = NaN \f$, + * - \f$ -inf / inf = NaN \f$, + * - \f$ inf / -inf = NaN \f$, + * - \f$ -inf / -inf = NaN \f$, + * - \f$ NaN / b = NaN \f$, + * - \f$ a / NaN = NaN \f$, + * - \f$ a / inf = 0 \f$, + * - \f$ a / -inf = 0 \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param val First element of the division. + * @param f Second element of the division. + * @return Entry-wise \f$ val / f \f$. + */ + friend One_critical_filtration operator/(const T &val, const One_critical_filtration &f) { if (f.empty()) return f; - if (std::isnan(value) || f.is_nan()) return nan(); + if (std::isnan(val) || f.is_nan()) return nan(); - One_critical_filtration result(f.size(), value); + One_critical_filtration result(f.size(), val); result /= f; return result; } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] / to\_div[i] \f$. + * If @p result and @p to_div are both not infinite or NaN, they have to have the same number of parameters. + * + * Used conventions: + * - \f$ a / 0 = NaN \f$, + * - \f$ inf / inf = NaN \f$, + * - \f$ -inf / inf = NaN \f$, + * - \f$ inf / -inf = NaN \f$, + * - \f$ -inf / -inf = NaN \f$, + * - \f$ NaN / b = NaN \f$, + * - \f$ a / NaN = NaN \f$, + * - \f$ a / inf = 0 \f$, + * - \f$ a / -inf = 0 \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the division. + * @param to_div Second element of the division. + * @return Entry-wise \f$ result / to\_div \f$. + */ friend One_critical_filtration &operator/=(One_critical_filtration &result, const One_critical_filtration &to_div) { if (result.empty()) return result; @@ -460,7 +949,7 @@ class One_critical_filtration : public std::vector } GUDHI_CHECK(res_is_infinite || result.size() == to_div.size(), - "Two filtration points with different number of parameters cannot be divided."); + "Two filtration values with different number of parameters cannot be divided."); if (res_is_infinite) { result.resize(to_div.size(), result[0]); @@ -469,6 +958,28 @@ class One_critical_filtration : public std::vector return apply_operation_with_finite_values_(result, to_div, divide_); } + /** + * @brief Modifies the first parameters such that an entry at index \f$ i \f$ is equal to + * \f$ result[i] / to\_div \f$. + * + * Used conventions: + * - \f$ a / 0 = NaN \f$, + * - \f$ inf / inf = NaN \f$, + * - \f$ -inf / inf = NaN \f$, + * - \f$ inf / -inf = NaN \f$, + * - \f$ -inf / -inf = NaN \f$, + * - \f$ NaN / b = NaN \f$, + * - \f$ a / NaN = NaN \f$, + * - \f$ a / inf = 0 \f$, + * - \f$ a / -inf = 0 \f$. + * + * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() + * if any operation results in NaN, not only if all operations result in NaN. + * + * @param result First element of the division. + * @param to_div Second element of the division. + * @return Entry-wise \f$ result / to\_div \f$. + */ friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_div) { if (result.empty()) return result; @@ -491,13 +1002,16 @@ class One_critical_filtration : public std::vector // MODIFIERS - /** \brief This functions take the filtration value `this` and pushes it to - * the cone \f$ \{ y\in \mathbb R^n : y>=x \} \f$. After calling this method, - * the value of this is updated to \f$ \mathrm{this} = \min \{ y\in \mathbb - * R^n : y>=this \}\cap \{ y\in \mathbb R^n : y>=x \} - * @param[in] x The target filtration value on which to push `this`. + /** + * @brief Sets the filtration value to the least common upper bound between the current value and the given value. + * + * More formally, it pushes the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \ge x \} \f$ + * originating in the given filtration value \f$ x \f$. The resulting value corresponds to the intersection of both + * cones: \f$ \mathrm{this} = \min \{ y \in \mathbb R^n : y \ge this \} \cap \{ y \in \mathbb R^n : y \ge x \} \f$. + * + * @param x The target filtration value towards which to push. */ - void push_to(const One_critical_filtration &x) + void push_to_least_common_upper_bound(const One_critical_filtration &x) { if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; if (x.is_inf() || this->is_minus_inf()) { @@ -512,13 +1026,16 @@ class One_critical_filtration : public std::vector Base::operator[](i) = Base::operator[](i) > x[i] ? Base::operator[](i) : x[i]; } - /** \brief This functions take the filtration value `this` and pulls it to the - * cone \f$ \{ y\in \mathbb R^n : y<=x \} \f$. After calling this method, the - * value of this is updated to \f$ \mathrm{this} = \max \{ y\in \mathbb R^n : - * y<=this \}\cap \{ y\in \mathbb R^n : y<=x \} - * @param[in] x The target filtration value on which to push `this`. + /** + * @brief Sets the filtration value to the greatest common lower bound between the current value and the given value. + * + * More formally, it pulls the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \le x \} \f$ + * originating in the given filtration value \f$ x \f$. The resulting value corresponds to the intersection of both + * cones: \f$ \mathrm{this} = \min \{ y \in \mathbb R^n : y \le this \} \cap \{ y \in \mathbb R^n : y \le x \} \f$. + * + * @param x The target filtration value towards which to pull. */ - void pull_to(const One_critical_filtration &x) + void pull_to_greatest_common_lower_bound(const One_critical_filtration &x) { if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; if (this->is_inf() || x.is_minus_inf()) { @@ -533,8 +1050,20 @@ class One_critical_filtration : public std::vector Base::operator[](i) = Base::operator[](i) > x[i] ? x[i] : Base::operator[](i); } - /* - * Same as `compute_coordinates_in_grid` but does the operation in-place + /** + * @brief Projects the filtration value into the given grid. If @p coordinate is false, the entries are set to + * the nearest upper bound value with the same parameter in the grid. Otherwise, the entries are set to the indices + * of those nearest upper bound values. + * The grid has to be represented as a vector of ordered ranges of values convertible into `T`. An index + * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in the filtration value. + * The ranges correspond to the possible values of the parameters, ordered by increasing value, forming therefore + * all together a 2D grid. + * + * @tparam oned_array A range of values convertible into `T` ordered by increasing value. Has to implement + * a begin, end and operator[] method. + * @param grid Vector of @p oned_array with size at least number of filtration parameters. + * @param coordinate If true, the values are set to the coordinates of the projection in the grid. If false, + * the values are set to the values at the coordinates of the projection. */ template void project_onto_grid(const std::vector &grid, bool coordinate = true) @@ -554,7 +1083,14 @@ class One_critical_filtration : public std::vector // FONCTIONNALITIES - // scalar product of a filtration value with x. + /** + * @brief Computes the scalar product of the given filtration value with the given vector. + * + * @tparam U Arithmetic type of the result. Default value: `T`. + * @param f Filtration value. + * @param x Vector of coefficients. + * @return Scalar product of @p f with @p x. + */ template friend U compute_linear_projection(const One_critical_filtration &f, const std::vector &x) { @@ -564,6 +1100,12 @@ class One_critical_filtration : public std::vector return projection; } + /** + * @brief Computes the norm of the given filtration value. + * + * @param f Filtration value. + * @return The norm of @p f. + */ friend T compute_norm(const One_critical_filtration &f) { T out = 0; @@ -571,6 +1113,13 @@ class One_critical_filtration : public std::vector return std::sqrt(out); } + /** + * @brief Computes the euclidean distance from the first parameter to the second parameter. + * + * @param f Start filtration value. + * @param other End filtration value. + * @return Euclidean distance between @p f and @p other. + */ friend T compute_euclidean_distance_to(const One_critical_filtration &f, const One_critical_filtration &other) { T out = 0; @@ -581,9 +1130,19 @@ class One_critical_filtration : public std::vector } /** - * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), - * projects itself into this grid, and returns the coordinates of this projected points - * in the given grid + * @brief Computes the coordinates in the given grid, corresponding to the nearest upper bounds of the entries + * in the given filtration value. + * The grid has to be represented as a vector of vectors of ordered values convertible into `out_type`. An index + * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in the filtration value. + * The inner vectors correspond to the possible values of the parameters, ordered by increasing value, + * forming therefore all together a 2D grid. + * + * @tparam out_type Signed arithmetic type. Default value: std::int32_t. + * @tparam U Type which is convertible into `out_type`. + * @param f Filtration value to project. + * @param grid Vector of vectors to project into. + * @return Filtration value \f$ out \f$ whose entry correspond to the indices of the projected values. That is, + * the projection of \f$ f[i] \f$ is \f$ grid[i][out[i]] \f$. */ template friend One_critical_filtration compute_coordinates_in_grid(const One_critical_filtration &f, @@ -593,11 +1152,16 @@ class One_critical_filtration : public std::vector coords.project_onto_grid(grid); return coords; } - + /** - * Given a grid in an array of shape (num_parameters, filtration_values of this parameter), - * and assuming that `this` correspond to the coordinates in this grid, - * returns the points evaluated in this grid + * @brief Computes the values in the given grid corresponding to the coordinates given by the given filtration + * value. That is, if \f$ out \f$ is the result, \f$ out[i] = grid[i][f[i]] \f$. Assumes therefore, that the + * values stored in the filtration value corresponds to indices existing in the given grid. + * + * @tparam U Signed arithmetic type. + * @param f Filtration value storing coordinates compatible with `grid`. + * @param grid Vector of vector. + * @return Filtration value \f$ out \f$ whose entry correspond to \f$ out[i] = grid[i][f[i]] \f$. */ template friend One_critical_filtration evaluate_coordinates_in_grid(const One_critical_filtration &f, @@ -620,7 +1184,9 @@ class One_critical_filtration : public std::vector // UTILITIES - // easy debug + /** + * @brief Outstream operator. + */ friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &f) { if (f.is_inf()) { @@ -649,13 +1215,15 @@ class One_critical_filtration : public std::vector } public: - // TODO : maybe add the {inf}, minus inf, nan there as static members? this - // would make comparisons faster (just compare the ptr) - // TODO : I'm not sure why constexpr doesn't work anymore + /** + * @brief Infinity value of an entry of the filtration value. + */ constexpr static const T T_inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - // for compiler + /** + * @brief Indicates if the class manages multi-critical filtration values. + */ constexpr static bool is_multi_critical = false; private: diff --git a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp index ab6abe18bf..345c130d59 100644 --- a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp @@ -30,19 +30,19 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_constructors, T, list_of BOOST_CHECK(!f01.empty()); BOOST_CHECK(f01.num_parameters() == 1); BOOST_CHECK(f01.num_generators() == 1); - BOOST_CHECK(f01[0][0] == -Multi_critical_filtration::Single_point::T_inf); + BOOST_CHECK(f01[0][0] == -Multi_critical_filtration::Generator::T_inf); Multi_critical_filtration f02; BOOST_CHECK(!f02.empty()); BOOST_CHECK(f02.num_parameters() == 1); BOOST_CHECK(f02.num_generators() == 1); - BOOST_CHECK(f02[0][0] == Multi_critical_filtration::Single_point::T_inf); + BOOST_CHECK(f02[0][0] == Multi_critical_filtration::Generator::T_inf); Multi_critical_filtration f1(3); BOOST_CHECK(f1.num_parameters() == 3); BOOST_CHECK(f1.num_generators() == 1); - BOOST_CHECK(f1[0][0] == -Multi_critical_filtration::Single_point::T_inf); - BOOST_CHECK(f1[0][1] == -Multi_critical_filtration::Single_point::T_inf); - BOOST_CHECK(f1[0][2] == -Multi_critical_filtration::Single_point::T_inf); + BOOST_CHECK(f1[0][0] == -Multi_critical_filtration::Generator::T_inf); + BOOST_CHECK(f1[0][1] == -Multi_critical_filtration::Generator::T_inf); + BOOST_CHECK(f1[0][2] == -Multi_critical_filtration::Generator::T_inf); Multi_critical_filtration f2(3, 0); BOOST_CHECK(f2.num_parameters() == 3); @@ -80,7 +80,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_constructors, T, list_of BOOST_CHECK(f42[0][1] == 1); BOOST_CHECK(f42[0][2] == 2); - std::vector::Single_point> v2{{0, 1, 2}, {3, 4, 5}}; + std::vector::Generator> v2{{0, 1, 2}, {3, 4, 5}}; Multi_critical_filtration f6(std::move(v2)); BOOST_CHECK(f6.num_parameters() == 3); BOOST_CHECK(f6.num_generators() == 2); @@ -235,7 +235,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_modifiers, T, list_of_te BOOST_CHECK_EQUAL(f[1][1], 1); BOOST_CHECK_EQUAL(f[1][2], 7); - f.push_to({-1, 5, 6}); + f.push_to_least_common_upper_bound({-1, 5, 6}); BOOST_CHECK_EQUAL(f[0][0], 0); BOOST_CHECK_EQUAL(f[0][1], 5); BOOST_CHECK_EQUAL(f[0][2], 6); @@ -243,7 +243,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_modifiers, T, list_of_te BOOST_CHECK_EQUAL(f[1][1], 5); BOOST_CHECK_EQUAL(f[1][2], 7); - f.push_to({-1, -5, -6}); + f.push_to_least_common_upper_bound({-1, -5, -6}); BOOST_CHECK_EQUAL(f[0][0], 0); BOOST_CHECK_EQUAL(f[0][1], 5); BOOST_CHECK_EQUAL(f[0][2], 6); @@ -251,7 +251,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_modifiers, T, list_of_te BOOST_CHECK_EQUAL(f[1][1], 5); BOOST_CHECK_EQUAL(f[1][2], 7); - f.push_to(Multi_critical_filtration::Single_point::minus_inf()); + f.push_to_least_common_upper_bound(Multi_critical_filtration::Generator::minus_inf()); BOOST_CHECK_EQUAL(f[0][0], 0); BOOST_CHECK_EQUAL(f[0][1], 5); BOOST_CHECK_EQUAL(f[0][2], 6); @@ -259,42 +259,42 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_modifiers, T, list_of_te BOOST_CHECK_EQUAL(f[1][1], 5); BOOST_CHECK_EQUAL(f[1][2], 7); - f.push_to(Multi_critical_filtration::Single_point::inf()); + f.push_to_least_common_upper_bound(Multi_critical_filtration::Generator::inf()); BOOST_CHECK(f.is_inf()); - f.push_to(Multi_critical_filtration::Single_point::nan()); + f.push_to_least_common_upper_bound(Multi_critical_filtration::Generator::nan()); BOOST_CHECK(f.is_inf()); - f.pull_to({-1, 5, 6}); + f.pull_to_greatest_common_lower_bound({-1, 5, 6}); BOOST_CHECK_EQUAL(f[0][0], -1); BOOST_CHECK_EQUAL(f[0][1], 5); BOOST_CHECK_EQUAL(f[0][2], 6); - f.pull_to({1, 8, 9}); + f.pull_to_greatest_common_lower_bound({1, 8, 9}); BOOST_CHECK_EQUAL(f[0][0], -1); BOOST_CHECK_EQUAL(f[0][1], 5); BOOST_CHECK_EQUAL(f[0][2], 6); - f.pull_to(Multi_critical_filtration::Single_point::inf()); + f.pull_to_greatest_common_lower_bound(Multi_critical_filtration::Generator::inf()); BOOST_CHECK_EQUAL(f[0][0], -1); BOOST_CHECK_EQUAL(f[0][1], 5); BOOST_CHECK_EQUAL(f[0][2], 6); - f.pull_to(Multi_critical_filtration::Single_point::minus_inf()); + f.pull_to_greatest_common_lower_bound(Multi_critical_filtration::Generator::minus_inf()); BOOST_CHECK(f.is_minus_inf()); - f.pull_to(Multi_critical_filtration::Single_point::nan()); + f.pull_to_greatest_common_lower_bound(Multi_critical_filtration::Generator::nan()); BOOST_CHECK(f.is_minus_inf()); std::vector > grid = {{0, 2, 4, 8}, {0, 3, 6, 9}, {0, 4, 8, 16}}; - f.push_to({1, 7, 5}); + f.push_to_least_common_upper_bound({1, 7, 5}); f.project_onto_grid(grid, true); BOOST_CHECK_EQUAL(f[0][0], 1); BOOST_CHECK_EQUAL(f[0][1], 3); BOOST_CHECK_EQUAL(f[0][2], 2); - f.push_to({1, 7, 5}); + f.push_to_least_common_upper_bound({1, 7, 5}); f.project_onto_grid(grid, false); BOOST_CHECK_EQUAL(f[0][0], 2); BOOST_CHECK_EQUAL(f[0][1], 9); @@ -310,7 +310,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f[0][1], 1); BOOST_CHECK_EQUAL(f[0][2], 2); - bool res = f.add_point({-3, 1, 7}); + bool res = f.add_generator({-3, 1, 7}); BOOST_CHECK(res); BOOST_CHECK_EQUAL(f.num_generators(), 2); BOOST_CHECK_EQUAL(f.num_parameters(), 3); @@ -321,7 +321,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f[1][1], 1); BOOST_CHECK_EQUAL(f[1][2], 7); - res = f.add_point({-1, -2, -3}); + res = f.add_generator({-1, -2, -3}); BOOST_CHECK(res); BOOST_CHECK_EQUAL(f.num_generators(), 2); BOOST_CHECK_EQUAL(f.num_parameters(), 3); @@ -332,7 +332,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f[1][1], -2); BOOST_CHECK_EQUAL(f[1][2], -3); - res = f.add_point({8, 9, 10}); + res = f.add_generator({8, 9, 10}); BOOST_CHECK(!res); BOOST_CHECK_EQUAL(f.num_generators(), 2); BOOST_CHECK_EQUAL(f.num_parameters(), 3); @@ -343,7 +343,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f[1][1], -2); BOOST_CHECK_EQUAL(f[1][2], -3); - res = f.add_point(Multi_critical_filtration::Single_point::inf()); + res = f.add_generator(Multi_critical_filtration::Generator::inf()); BOOST_CHECK(!res); BOOST_CHECK_EQUAL(f.num_generators(), 2); BOOST_CHECK_EQUAL(f.num_parameters(), 3); @@ -354,7 +354,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f[1][1], -2); BOOST_CHECK_EQUAL(f[1][2], -3); - res = f.add_point(Multi_critical_filtration::Single_point::nan()); + res = f.add_generator(Multi_critical_filtration::Generator::nan()); BOOST_CHECK(!res); BOOST_CHECK_EQUAL(f.num_generators(), 2); BOOST_CHECK_EQUAL(f.num_parameters(), 3); @@ -365,23 +365,23 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f[1][1], -2); BOOST_CHECK_EQUAL(f[1][2], -3); - res = f.add_point(Multi_critical_filtration::Single_point::minus_inf()); + res = f.add_generator(Multi_critical_filtration::Generator::minus_inf()); BOOST_CHECK(res); BOOST_CHECK_EQUAL(f.num_generators(), 1); BOOST_CHECK_EQUAL(f.num_parameters(), 1); - BOOST_CHECK_EQUAL(f[0][0], -Multi_critical_filtration::Single_point::T_inf); + BOOST_CHECK_EQUAL(f[0][0], -Multi_critical_filtration::Generator::T_inf); - std::vector::Single_point> v{ + std::vector::Generator> v{ {0, 1, 2}, {}, - Multi_critical_filtration::Single_point::inf(), + Multi_critical_filtration::Generator::inf(), {0, 1, 2}, - Multi_critical_filtration::Single_point::nan(), + Multi_critical_filtration::Generator::nan(), {}, - Multi_critical_filtration::Single_point::minus_inf()}; + Multi_critical_filtration::Generator::minus_inf()}; Multi_critical_filtration f2(v); - f2.remove_empty_points(false); + f2.remove_empty_generators(false); BOOST_CHECK_EQUAL(f2[0][0], 0); BOOST_CHECK_EQUAL(f2[0][1], 1); BOOST_CHECK_EQUAL(f2[0][2], 2); @@ -399,7 +399,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v } Multi_critical_filtration f3(v); - f3.remove_empty_points(true); + f3.remove_empty_generators(true); BOOST_CHECK_EQUAL(f3[0][0], 0); BOOST_CHECK_EQUAL(f3[0][1], 1); BOOST_CHECK_EQUAL(f3[0][2], 2); @@ -432,8 +432,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_friends, T, list_of_test Multi_critical_filtration f({{0, 1, 2}, {2, 0, 4}}); BOOST_CHECK_EQUAL(compute_linear_projection(f, {2,3,5,9}), 13); - BOOST_CHECK(factorize_below(f) == typename Multi_critical_filtration::Single_point({0, 0, 2})); - BOOST_CHECK(factorize_above(f) == typename Multi_critical_filtration::Single_point({2, 1, 4})); + BOOST_CHECK(factorize_below(f) == typename Multi_critical_filtration::Generator({0, 0, 2})); + BOOST_CHECK(factorize_above(f) == typename Multi_critical_filtration::Generator({2, 1, 4})); Multi_critical_filtration f2({{0, 1, 2}, {2, 0, 4}}); BOOST_CHECK_EQUAL(compute_linear_projection(f2, {2,3,5,9}), 24); diff --git a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp index ddcc53534c..42bfdccc68 100644 --- a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp @@ -416,57 +416,57 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_modifiers, T, list_of_test BOOST_CHECK_EQUAL(f[1], 1); BOOST_CHECK_EQUAL(f[2], 2); - f.push_to({-1, 5, 6}); + f.push_to_least_common_upper_bound({-1, 5, 6}); BOOST_CHECK_EQUAL(f[0], 0); BOOST_CHECK_EQUAL(f[1], 5); BOOST_CHECK_EQUAL(f[2], 6); - f.push_to({-1, -5, -6}); + f.push_to_least_common_upper_bound({-1, -5, -6}); BOOST_CHECK_EQUAL(f[0], 0); BOOST_CHECK_EQUAL(f[1], 5); BOOST_CHECK_EQUAL(f[2], 6); - f.push_to(One_critical_filtration::minus_inf()); + f.push_to_least_common_upper_bound(One_critical_filtration::minus_inf()); BOOST_CHECK_EQUAL(f[0], 0); BOOST_CHECK_EQUAL(f[1], 5); BOOST_CHECK_EQUAL(f[2], 6); - f.push_to(One_critical_filtration::inf()); + f.push_to_least_common_upper_bound(One_critical_filtration::inf()); BOOST_CHECK(f.is_inf()); - f.push_to(One_critical_filtration::nan()); + f.push_to_least_common_upper_bound(One_critical_filtration::nan()); BOOST_CHECK(f.is_inf()); - f.pull_to({-1, 5, 6}); + f.pull_to_greatest_common_lower_bound({-1, 5, 6}); BOOST_CHECK_EQUAL(f[0], -1); BOOST_CHECK_EQUAL(f[1], 5); BOOST_CHECK_EQUAL(f[2], 6); - f.pull_to({1, 8, 9}); + f.pull_to_greatest_common_lower_bound({1, 8, 9}); BOOST_CHECK_EQUAL(f[0], -1); BOOST_CHECK_EQUAL(f[1], 5); BOOST_CHECK_EQUAL(f[2], 6); - f.pull_to(One_critical_filtration::inf()); + f.pull_to_greatest_common_lower_bound(One_critical_filtration::inf()); BOOST_CHECK_EQUAL(f[0], -1); BOOST_CHECK_EQUAL(f[1], 5); BOOST_CHECK_EQUAL(f[2], 6); - f.pull_to(One_critical_filtration::minus_inf()); + f.pull_to_greatest_common_lower_bound(One_critical_filtration::minus_inf()); BOOST_CHECK(f.is_minus_inf()); - f.pull_to(One_critical_filtration::nan()); + f.pull_to_greatest_common_lower_bound(One_critical_filtration::nan()); BOOST_CHECK(f.is_minus_inf()); std::vector > grid = {{0, 2, 4, 8}, {0, 3, 6, 9}, {0, 4, 8, 16}}; - f.push_to({1, 7, 5}); + f.push_to_least_common_upper_bound({1, 7, 5}); f.project_onto_grid(grid, true); BOOST_CHECK_EQUAL(f[0], 1); BOOST_CHECK_EQUAL(f[1], 3); BOOST_CHECK_EQUAL(f[2], 2); - f.push_to({1, 7, 5}); + f.push_to_least_common_upper_bound({1, 7, 5}); f.project_onto_grid(grid, false); BOOST_CHECK_EQUAL(f[0], 2); BOOST_CHECK_EQUAL(f[1], 9); diff --git a/src/Simplex_tree/concept/FiltrationValue.h b/src/Simplex_tree/concept/FiltrationValue.h index 86299db2f4..44ff6bc3b2 100644 --- a/src/Simplex_tree/concept/FiltrationValue.h +++ b/src/Simplex_tree/concept/FiltrationValue.h @@ -30,6 +30,6 @@ struct FiltrationValue { * This function is called when using, e.g. `make_filtration_non_decreasing`, as the filtration of a simplex * has to be greater than the filtration of any of its faces. * */ - void push_to(const FiltrationValue f); + void push_to_least_common_upper_bound(const FiltrationValue f); }; diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h index 9050211dc7..18ad08a3e6 100644 --- a/src/Simplex_tree/concept/SimplexTreeOptions.h +++ b/src/Simplex_tree/concept/SimplexTreeOptions.h @@ -41,7 +41,7 @@ struct SimplexTreeOptions { static const bool stable_simplex_handles; /// If true, assumes that SimplexTreeOptions::Filtration_value is vector-like instead of float-like. /// In that case only, this also assumes that SimplexTreeOptions::Filtration_value is a class, - /// which has a `push_to` method that allows to push the filtration value `this` onto the set of points + /// which has a `push_to_least_common_upper_bound` method that allows to push the filtration value `this` onto the set of points /// \f$ \{ y\in \mathrm{Filtration_value} : y\geq x\}\f$ /// that are greater than another filtration value \f$ x \f$. /// An example of such a class is Gudhi::multi_persistence::Finitely_critical_multi_filtration . diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h index fe5ef7ade8..7e5a538121 100644 --- a/src/Simplex_tree/include/gudhi/Simplex_tree.h +++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h @@ -1927,10 +1927,10 @@ class Simplex_tree { Boundary_simplex_range&& boundary = boundary_simplex_range(sh); Filtration_value max_filt_border_value; if constexpr (SimplexTreeOptions::is_multi_parameter) { - // in that case, we assume that Filtration_value has a `push_to` member to handle this. + // in that case, we assume that Filtration_value has a `push_to_least_common_upper_bound` member to handle this. max_filt_border_value = Filtration_value(number_of_parameters_); for (auto& face_sh : boundary) { - max_filt_border_value.push_to( + max_filt_border_value.push_to_least_common_upper_bound( filtration(face_sh)); // pushes the value of max_filt_border_value to reach simplex' filtration } } else { @@ -1947,7 +1947,7 @@ class Simplex_tree { modified = true; if constexpr (Options::is_multi_parameter){ auto& to_increase_filtration = filtration_mutable(sh); - to_increase_filtration.push_to(max_filt_border_value); + to_increase_filtration.push_to_least_common_upper_bound(max_filt_border_value); } else{ sh->second.assign_filtration(max_filt_border_value); From 7d66c005b9f9210664df0e749283914c51dc3dd0 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 29 Aug 2024 17:58:16 +0200 Subject: [PATCH 73/87] re-format --- .../include/gudhi/Multi_critical_filtration.h | 171 +++++------ .../include/gudhi/One_critical_filtration.h | 272 +++++++----------- 2 files changed, 174 insertions(+), 269 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 681acb24c7..369e92e7f8 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -55,7 +55,7 @@ namespace Gudhi::multi_filtration { * - \f$ \{ x \in \mathbb R^2 : x \ge \mathrm{epigraph}(y \mapsto e^{-y})\} \f$ is not. * * The particular case of 1-critical filtrations is handled by @ref One_critical_filtration "". - * + * * @tparam T Arithmetic type of an entry for one parameter of a filtration value. Has to be **signed** and * to implement `std::isnan(T)`, `std::numeric_limits::has_quiet_NaN`, `std::numeric_limits::quiet_NaN()`, * `std::numeric_limits::has_infinity`, `std::numeric_limits::infinity()` and `std::numeric_limits::max()`. @@ -65,8 +65,7 @@ namespace Gudhi::multi_filtration { * \f$ \ge \f$. */ template -class Multi_critical_filtration -{ +class Multi_critical_filtration { public: /** * @brief Type of the origin of a "simplex lifetime cone". Common with @ref One_critical_filtration "". @@ -92,7 +91,7 @@ class Multi_critical_filtration * method @ref is_minus_inf() "", as well as the one of the generator, will not return true). The `-inf` are just * meant as placeholders, at least one entry should be modified by the user. * Otherwise, either use the static method @ref minus_inf() or set @p n to 1 instead. - * + * * @param n Number of parameters. */ Multi_critical_filtration(int n) : multi_filtration_({Generator(n)}) {}; @@ -104,26 +103,26 @@ class Multi_critical_filtration * is not wrong but will not be considered as respectively "infinity", "minus infinity" or "NaN" (the corresponding * methods @ref is_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use * the static methods @ref inf(), @ref minus_inf() and @ref nan() instead. - * + * * @param n Number of parameters. * @param value Value which will be used for each entry. */ Multi_critical_filtration(int n, T value) : multi_filtration_({Generator(n, value)}) {}; /** * @brief Constructs a filtration value with one generator which will be initialzed by the given initializer list. - * + * * @param init Initializer list with values for each parameter. */ Multi_critical_filtration(std::initializer_list init) : multi_filtration_({Generator(init)}) {}; /** * @brief Constructs a filtration value with one generator which will be initialzed by the given vector. - * + * * @param v Vector with values for each parameter. */ Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}) {}; /** * @brief Constructs a filtration value with one generator to which the given vector is moved to. - * + * * @param v Vector with values for each parameter. */ Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}) {}; @@ -135,7 +134,7 @@ class Multi_critical_filtration * * @warning If the set of generators is not minimal, the behaviour of most methods is undefined. It is possible * to call @ref simplify() after construction if there is a doubt to ensure this property. - * + * * @param v Vector of generators. */ Multi_critical_filtration(const std::vector &v) : multi_filtration_(v) {}; @@ -147,14 +146,14 @@ class Multi_critical_filtration * * @warning If the set of generators is not minimal, the behaviour of most methods is undefined. It is possible * to call @ref simplify() after construction if there is a doubt to ensure this property. - * + * * @param v Vector of generators. */ Multi_critical_filtration(std::vector &&v) : multi_filtration_(std::move(v)) {}; /** * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end * iterators. - * + * * @param it_begin Start of the range. * @param it_end End of the range. */ @@ -163,7 +162,7 @@ class Multi_critical_filtration /** * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end * const iterators. - * + * * @param it_begin Start of the range. * @param it_end End of the range. */ @@ -173,7 +172,7 @@ class Multi_critical_filtration // VECTOR-LIKE - using value_type = T; /**< Entry type. */ + using value_type = T; /**< Entry type. */ /** * @brief Standard operator[]. @@ -211,7 +210,7 @@ class Multi_critical_filtration /** * @brief Reserves space for the given number of generators in the underlying container. - * + * * @param n Number of generators. */ void reserve(std::size_t n) { multi_filtration_.reserve(n); } @@ -228,24 +227,21 @@ class Multi_critical_filtration * @pre The filtration value is 1-critical. If there are more than one generator, only the first will be preserved * and if there is no generator, the method will segfault. */ - operator Generator() const - { - GUDHI_CHECK(num_generators() == 1, - "Casting a " + std::to_string(num_generators()) + - "-critical filtration value into an 1-critical filtration value."); + operator Generator() const { + GUDHI_CHECK(num_generators() == 1, "Casting a " + std::to_string(num_generators()) + + "-critical filtration value into an 1-critical filtration value."); return multi_filtration_[0]; } // like numpy /** * @brief Returns a copy with entries casted into the type given as template parameter. - * + * * @tparam U New type for the entries. * @return Copy with new entry type. */ template - Multi_critical_filtration as_type() const - { + Multi_critical_filtration as_type() const { std::vector> out(num_generators()); for (std::size_t i = 0u; i < num_generators(); ++i) { out[i] = multi_filtration_[i].template as_type(); @@ -272,31 +268,28 @@ class Multi_critical_filtration /** * @brief Returns a filtration value for which @ref is_inf() returns `true`. - * + * * @return Infinity. */ constexpr static Multi_critical_filtration inf() { return Multi_critical_filtration(Generator::inf()); } /** * @brief Returns a filtration value for which @ref is_minus_inf() returns `true`. - * + * * @return Minus infinity. */ - constexpr static Multi_critical_filtration minus_inf() - { - return Multi_critical_filtration(Generator::minus_inf()); - } + constexpr static Multi_critical_filtration minus_inf() { return Multi_critical_filtration(Generator::minus_inf()); } /** * @brief Returns a filtration value for which @ref is_nan() returns `true`. - * + * * @return NaN. */ constexpr static Multi_critical_filtration nan() { return Multi_critical_filtration(Generator::nan()); } // DESCRIPTORS - //TODO: Accept {{-inf, -inf, ...},...} / {{inf, inf, ...},...} / {{NaN, NaN, ...},...} as resp. -inf / inf / NaN. + // TODO: Accept {{-inf, -inf, ...},...} / {{inf, inf, ...},...} / {{NaN, NaN, ...},...} as resp. -inf / inf / NaN. /** * @brief Returns `true` if and only if the filtration value is considered as infinity. @@ -317,8 +310,7 @@ class Multi_critical_filtration * @brief Returns `true` if and only if the filtration value is non-empty and is not considered as infinity, * minus infinity or NaN. */ - bool is_finite() const - { + bool is_finite() const { if (empty()) return false; if (multi_filtration_.size() > 1) return true; return multi_filtration_[0].is_finite(); @@ -340,10 +332,9 @@ class Multi_critical_filtration * Note that not all filtration values are comparable. That is, \f$ a > b \f$ and \f$ b > a \f$ returning both false * does **not** imply \f$ a == b \f$. */ - friend bool operator<(const Multi_critical_filtration &a, const Multi_critical_filtration &b) - { + friend bool operator<(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { for (std::size_t i = 0u; i < b.multi_filtration_.size(); ++i) { - //for each generator in b, verify if it is strictly in the cone of at least one generator of a + // for each generator in b, verify if it is strictly in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { // iis_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; GUDHI_CHECK(x.is_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), @@ -469,11 +454,10 @@ class Multi_critical_filtration * More formally, it pulls the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \le x \} \f$ * originating in \f$ x \f$. The resulting values corresponds to the generators of the intersection of this cone * with the union of negative cones generated by the old generators. - * + * * @param x The target filtration value towards which to pull. */ - void pull_to_greatest_common_lower_bound(const Generator &x) - { + void pull_to_greatest_common_lower_bound(const Generator &x) { if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; GUDHI_CHECK(x.is_minus_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), @@ -495,13 +479,12 @@ class Multi_critical_filtration * It is therefore possible that the generator is ignored if it does not generated any new lifetime or that * old generators disappear if they are overshadowed by the new one. * @pre If all are finite, the new generator has to have the same number of parameters than the others. - * + * * @param x New generator to add. * @return true If and only if the generator is actually added to the set of generators. * @return false Otherwise. */ - bool add_generator(const Generator &x) - { + bool add_generator(const Generator &x) { if (multi_filtration_.empty()) { multi_filtration_.push_back(x); return true; @@ -526,8 +509,8 @@ class Multi_critical_filtration * * @warning If the resulting set of generators is not minimal after modification, some methods will have an * undefined behaviour. Be sure to call @ref simplify() before using them. - * - * @param x + * + * @param x */ void add_guaranteed_generator(const Generator &x) { multi_filtration_.push_back(x); } @@ -543,7 +526,7 @@ class Multi_critical_filtration * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in a generator. * The ranges correspond to the possible values of the parameters, ordered by increasing value, forming therefore * all together a 2D grid. - * + * * @tparam oned_array A range of values convertible into `T` ordered by increasing value. Has to implement * a begin, end and operator[] method. * @param grid Vector of @p oned_array with size at least number of filtration parameters. @@ -551,8 +534,7 @@ class Multi_critical_filtration * the values are set to the values at the coordinates of the projection. */ template - void project_onto_grid(const std::vector &grid, bool coordinate = true) - { + void project_onto_grid(const std::vector &grid, bool coordinate = true) { GUDHI_CHECK(grid.size() >= num_parameters(), "The grid should not be smaller than the number of parameters in the filtration value."); @@ -564,15 +546,13 @@ class Multi_critical_filtration } /** - * @brief Removes all empty generators from the filtration value. If @p include_infinities is true, it also + * @brief Removes all empty generators from the filtration value. If @p include_infinities is true, it also * removes the generators at infinity or minus infinity. - * + * * @param include_infinities If true, removes also infinity values. */ - void remove_empty_generators(bool include_infinities = false) - { - multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), - multi_filtration_.end(), + void remove_empty_generators(bool include_infinities = false) { + multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), [include_infinities](const Generator &a) { return a.empty() || ((include_infinities) && (a.is_inf() || a.is_minus_inf())); @@ -584,8 +564,7 @@ class Multi_critical_filtration * @brief Simplifies the current set of generators such that it becomes minimal. Only necessary if generators were * added "by hand" either trough the constructor or with @ref add_guaranteed_generator "". */ - void simplify() - { + void simplify() { std::size_t end = 0; for (std::size_t curr = 0; curr < multi_filtration_.size(); ++curr) { @@ -604,8 +583,7 @@ class Multi_critical_filtration * @brief Returns a generator with the minimal values of all parameters in any generator of the given filtration * value. That is, the greatest lower bound of all generators. */ - friend Generator factorize_below(const Multi_critical_filtration &f) - { + friend Generator factorize_below(const Multi_critical_filtration &f) { if (f.num_generators() == 0) return Generator(); Generator result(f.num_parameters(), Generator::T_inf); for (const auto &g : f) { @@ -622,8 +600,7 @@ class Multi_critical_filtration * @brief Returns a generator with the maximal values of all parameters in any generator of the given filtration * value. That is, the least upper bound of all generators. */ - friend Generator factorize_above(const Multi_critical_filtration &f) - { + friend Generator factorize_above(const Multi_critical_filtration &f) { if (f.num_generators() == 0) return Generator(); Generator result(f.num_parameters(), -Generator::T_inf); for (auto &g : f) { @@ -639,15 +616,14 @@ class Multi_critical_filtration /** * @brief Computes the smallest (resp. the greatest if `co` is true) scalar product of the all generators with the * given vector. - * + * * @tparam U Arithmetic type of the result. Default value: `T`. * @param f Filtration value. * @param x Vector of coefficients. * @return Scalar product of @p f with @p x. */ template - friend U compute_linear_projection(const Multi_critical_filtration &f, const std::vector &x) - { + friend U compute_linear_projection(const Multi_critical_filtration &f, const std::vector &x) { if constexpr (co) { U projection = std::numeric_limits::lowest(); for (const auto &y : f) { @@ -670,7 +646,7 @@ class Multi_critical_filtration * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in a generator. * The inner vectors correspond to the possible values of the parameters, ordered by increasing value, * forming therefore all together a 2D grid. - * + * * @tparam out_type Signed arithmetic type. Default value: std::int32_t. * @tparam U Type which is convertible into `out_type`. * @param f Filtration value to project. @@ -681,18 +657,17 @@ class Multi_critical_filtration */ template friend Multi_critical_filtration compute_coordinates_in_grid(const Multi_critical_filtration &f, - const std::vector> &grid) - { + const std::vector> &grid) { Multi_critical_filtration coords = f.as_type(); coords.project_onto_grid(grid); return coords; } /** - * @brief Computes the values in the given grid corresponding to the coordinates given by the given filtration - * value. That is, if \f$ out \f$ is the result, \f$ out[i] = grid[i][f[i]] \f$. Assumes therefore, that the + * @brief Computes the values in the given grid corresponding to the coordinates given by the given filtration + * value. That is, if \f$ out \f$ is the result, \f$ out[i] = grid[i][f[i]] \f$. Assumes therefore, that the * values stored in the filtration value corresponds to indices existing in the given grid. - * + * * @tparam U Signed arithmetic type. * @param f Filtration value storing coordinates compatible with `grid`. * @param grid Vector of vector. @@ -701,8 +676,7 @@ class Multi_critical_filtration */ template friend Multi_critical_filtration evaluate_coordinates_in_grid(const Multi_critical_filtration &f, - const std::vector> &grid) - { + const std::vector> &grid) { Multi_critical_filtration out; out.set_num_generators(f.num_generators()); for (std::size_t i = 0; i < f.num_generators(); ++i) { @@ -717,8 +691,7 @@ class Multi_critical_filtration /** * @brief Outstream operator. */ - friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &f) - { + friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &f) { if (f.is_inf()) { stream << "[inf, ..., inf]"; return stream; @@ -755,8 +728,7 @@ class Multi_critical_filtration /** * @brief Verifies if @p b is strictly contained in the positive cone originating in `a`. */ - static bool _strictly_contains(const Generator &a, const Generator &b) - { + static bool _strictly_contains(const Generator &a, const Generator &b) { if constexpr (co) return a > b; else { @@ -766,8 +738,7 @@ class Multi_critical_filtration /** * @brief Verifies if @p b is contained in the positive cone originating in `a`. */ - static bool _contains(const Generator &a, const Generator &b) - { + static bool _contains(const Generator &a, const Generator &b) { if constexpr (co) return a >= b; else { @@ -779,8 +750,7 @@ class Multi_critical_filtration // 1 == a dom b // 2 == b dom a // 3 == none - static int _get_domination_relation(const Generator &a, const Generator &b) - { + static int _get_domination_relation(const Generator &a, const Generator &b) { if (a.is_nan() || b.is_nan()) return 3; GUDHI_CHECK(a.size() == b.size(), @@ -813,8 +783,7 @@ class Multi_critical_filtration // assumes between 'curr' and 'end' everything is simplified: // no nan values and if there is an inf/-inf, then 'end - curr == 1' - bool _generator_can_be_added(const Generator &x, std::size_t curr, std::size_t &end) - { + bool _generator_can_be_added(const Generator &x, std::size_t curr, std::size_t &end) { if (x.empty() || x.is_nan() || (x.is_inf() && end - curr != 0)) return false; if (x.is_minus_inf()) { @@ -844,39 +813,33 @@ class Multi_critical_filtration namespace std { template -class numeric_limits> -{ +class numeric_limits> { public: static constexpr bool has_infinity = true; - static constexpr Gudhi::multi_filtration::Multi_critical_filtration infinity() noexcept - { + static constexpr Gudhi::multi_filtration::Multi_critical_filtration infinity() noexcept { return Gudhi::multi_filtration::Multi_critical_filtration::inf(); }; // non-standard - static constexpr Gudhi::multi_filtration::Multi_critical_filtration minus_infinity() noexcept - { + static constexpr Gudhi::multi_filtration::Multi_critical_filtration minus_infinity() noexcept { return Gudhi::multi_filtration::Multi_critical_filtration::minus_inf(); }; - static constexpr Gudhi::multi_filtration::Multi_critical_filtration max() noexcept(false) - { + static constexpr Gudhi::multi_filtration::Multi_critical_filtration max() noexcept(false) { throw std::logic_error( "The maximal value cannot be represented with no finite numbers of generators." "Use `max(number_of_generators, number_of_parameters)` instead"); }; // non-standard, so I don't want to define default values. - static constexpr Gudhi::multi_filtration::Multi_critical_filtration max(unsigned int g, unsigned int n) noexcept - { + static constexpr Gudhi::multi_filtration::Multi_critical_filtration max(unsigned int g, unsigned int n) noexcept { std::vector::Generator> v( g, std::vector(n, std::numeric_limits::max())); return Gudhi::multi_filtration::Multi_critical_filtration(std::move(v)); }; - static constexpr Gudhi::multi_filtration::Multi_critical_filtration quiet_NaN() noexcept - { + static constexpr Gudhi::multi_filtration::Multi_critical_filtration quiet_NaN() noexcept { return Gudhi::multi_filtration::Multi_critical_filtration::nan(); }; }; diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index 520ba22691..f3034206f7 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -49,7 +49,7 @@ namespace Gudhi::multi_filtration { * * If the lifetime corresponds to a union of such positive cones, the filtration is called a multi-critical filtration. * For those cases, use @ref Multi_critical_filtration instead. - * + * * @tparam T Arithmetic type of an entry for one parameter of the filtration value. Has to be **signed** and * to implement `std::isnan(T)`, `std::numeric_limits::has_quiet_NaN`, `std::numeric_limits::quiet_NaN()`, * `std::numeric_limits::has_infinity`, `std::numeric_limits::infinity()` and `std::numeric_limits::max()`. @@ -57,18 +57,17 @@ namespace Gudhi::multi_filtration { * can simply throw. Examples are the native types `double`, `float` and `int`. */ template -class One_critical_filtration : public std::vector -{ +class One_critical_filtration : public std::vector { private: using Base = std::vector; public: - /** - * @brief Type of the origin of a "simplex lifetime cone". Common with @ref Multi_critical_filtration "". - * In the 1-critical case, simply the class it-self. - * - * @tparam U Type of a value for one parameter within the filtration value. Default value: `T`. - */ + /** + * @brief Type of the origin of a "simplex lifetime cone". Common with @ref Multi_critical_filtration "". + * In the 1-critical case, simply the class it-self. + * + * @tparam U Type of a value for one parameter within the filtration value. Default value: `T`. + */ template using Generator = One_critical_filtration; @@ -84,7 +83,7 @@ class One_critical_filtration : public std::vector * @warning The vector `{-inf, -inf, ...}` with \f$ n > 1 \f$ entries is not considered as "minus infinity" (the * method @ref is_minus_inf() will not return true). The `-inf` are just meant as placeholders, at least one entry * should be modified by the user. Otherwise, either use the static method @ref minus_inf() or set @p n to 1 instead. - * + * * @param n Number of parameters. */ One_critical_filtration(int n) : Base(n, -T_inf) {}; @@ -95,32 +94,32 @@ class One_critical_filtration : public std::vector * is not wrong but will not be considered as respectively "infinity", "minus infinity" or "NaN" (the corresponding * methods @ref is_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use * the static methods @ref inf(), @ref minus_inf() and @ref nan() instead. - * + * * @param n Number of parameters. * @param value Value which will be used for each entry. */ One_critical_filtration(int n, T value) : Base(n, value) {}; /** * @brief Construct a vector from the given initializer list. - * + * * @param init Initializer list with values for each parameter. */ One_critical_filtration(std::initializer_list init) : Base(init) {}; /** * @brief Construct a vector from the given vector. - * + * * @param v Vector with values for each parameter. */ One_critical_filtration(const std::vector &v) : Base(v) {}; /** * @brief Construct a vector from the given vector by moving it to the new vector. - * + * * @param v Vector with values for each parameter. */ One_critical_filtration(std::vector &&v) : Base(std::move(v)) {}; /** * @brief Construct a vector from the range given by the begin and end iterators. - * + * * @param it_begin Start of the range. * @param it_end End of the range. */ @@ -128,7 +127,7 @@ class One_critical_filtration : public std::vector : Base(it_begin, it_end) {}; /** * @brief Construct a vector from the range given by the begin and end const iterators. - * + * * @param it_begin Start of the range. * @param it_end End of the range. */ @@ -139,8 +138,7 @@ class One_critical_filtration : public std::vector /** * @brief Assign operator. */ - One_critical_filtration &operator=(const One_critical_filtration &a) - { + One_critical_filtration &operator=(const One_critical_filtration &a) { Base::operator=(a); return *this; } @@ -165,13 +163,12 @@ class One_critical_filtration : public std::vector // like numpy /** * @brief Returns a copy with entries casted into the type given as template parameter. - * + * * @tparam U New type for the entries. * @return Copy with new entry type. */ template - One_critical_filtration as_type() const - { + One_critical_filtration as_type() const { One_critical_filtration out; out.reserve(Base::size()); for (std::size_t i = 0u; i < Base::size(); i++) out.push_back(static_cast(Base::operator[](i))); @@ -183,32 +180,31 @@ class One_critical_filtration : public std::vector /** * @brief Returns the number of parameters of the finite filtration value. If the value is "inf", "-inf" or "NaN", * returns 1. - * + * * @return Number of parameters. */ std::size_t num_parameters() const { return Base::size(); } /** * @brief Returns a filtration value for which @ref is_inf() returns `true`. - * + * * @return Infinity. */ constexpr static One_critical_filtration inf() { return {T_inf}; } /** * @brief Returns a filtration value for which @ref is_minus_inf() returns `true`. - * + * * @return Minus infinity. */ constexpr static One_critical_filtration minus_inf() { return {-T_inf}; } /** * @brief Returns a filtration value for which @ref is_nan() returns `true`. - * + * * @return NaN. */ - constexpr static One_critical_filtration nan() - { + constexpr static One_critical_filtration nan() { if constexpr (std::numeric_limits::has_quiet_NaN) { return {std::numeric_limits::quiet_NaN()}; } else { @@ -218,13 +214,12 @@ class One_critical_filtration : public std::vector // DESCRIPTORS - //TODO: Accept {-inf, -inf, ...} / {inf, inf, ...} / {NaN, NaN, ...} as resp. -inf / inf / NaN. + // TODO: Accept {-inf, -inf, ...} / {inf, inf, ...} / {NaN, NaN, ...} as resp. -inf / inf / NaN. /** * @brief Returns `true` if and only if the filtration value is considered as infinity. */ - bool is_inf() const - { + bool is_inf() const { if (Base::size() != 1) return false; return (Base::operator[](0) == T_inf); } @@ -232,8 +227,7 @@ class One_critical_filtration : public std::vector /** * @brief Returns `true` if and only if the filtration value is considered as minus infinity. */ - bool is_minus_inf() const - { + bool is_minus_inf() const { if constexpr (std::is_same::value) { return false; // suppresses a warning } else { @@ -245,8 +239,7 @@ class One_critical_filtration : public std::vector /** * @brief Returns `true` if and only if the filtration value is considered as NaN. */ - bool is_nan() const - { + bool is_nan() const { if constexpr (std::numeric_limits::has_quiet_NaN) { if (Base::size() != 1) return false; return std::isnan(Base::operator[](0)); @@ -259,8 +252,7 @@ class One_critical_filtration : public std::vector * @brief Returns `true` if and only if the filtration value is non-empty and is not considered as infinity, * minus infinity or NaN. */ - bool is_finite() const - { + bool is_finite() const { if (Base::size() > 1) return true; if (Base::size() == 0) return false; auto first_value = Base::operator[](0); // TODO : Maybe check all entries ? @@ -277,8 +269,7 @@ class One_critical_filtration : public std::vector * Note that not all filtration values are comparable. That is, \f$ a < b \f$ and \f$ b < a \f$ returning both false * does **not** imply \f$ a == b \f$. */ - friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) - { + friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; if (b.is_inf() || a.is_minus_inf()) return true; bool isSame = true; @@ -298,8 +289,7 @@ class One_critical_filtration : public std::vector * Note that not all filtration values are comparable. That is, \f$ a \le b \f$ and \f$ b \le a \f$ can both return * `false`. */ - friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) - { + friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.is_nan() || b.is_nan()) return false; if (b.is_inf() || a.is_minus_inf()) return true; if (a.is_inf() || b.is_minus_inf()) return false; @@ -332,8 +322,7 @@ class One_critical_filtration : public std::vector /** * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is equal to \f$ b[i] \f$. */ - friend bool operator==(const One_critical_filtration &a, const One_critical_filtration &b) - { + friend bool operator==(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.num_parameters() != b.num_parameters()) return false; for (auto i = 0u; i < a.num_parameters(); i++) { if (a[i] != b[i]) return false; @@ -354,12 +343,11 @@ class One_critical_filtration : public std::vector * * Used conventions: * - \f$ -NaN = NaN \f$. - * + * * @param f Value to opposite. * @return The opposite of @p f. */ - friend One_critical_filtration operator-(const One_critical_filtration &f) - { + friend One_critical_filtration operator-(const One_critical_filtration &f) { One_critical_filtration result; result.reserve(f.size()); for (auto val : f) { @@ -381,13 +369,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param a First element of the subtraction. * @param b Second element of the subtraction. * @return Entry-wise \f$ a - b \f$. */ - friend One_critical_filtration operator-(One_critical_filtration a, const One_critical_filtration &b) - { + friend One_critical_filtration operator-(One_critical_filtration a, const One_critical_filtration &b) { a -= b; return a; } @@ -403,13 +390,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param f First element of the subtraction. * @param val Second element of the subtraction. * @return Entry-wise \f$ f - val \f$. */ - friend One_critical_filtration operator-(One_critical_filtration f, const T &val) - { + friend One_critical_filtration operator-(One_critical_filtration f, const T &val) { f -= val; return f; } @@ -425,13 +411,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param val First element of the subtraction. * @param f Second element of the subtraction. * @return Entry-wise \f$ val - f \f$. */ - friend One_critical_filtration operator-(const T &val, One_critical_filtration f) - { + friend One_critical_filtration operator-(const T &val, One_critical_filtration f) { // TODO: in one go f = -f; f += val; @@ -451,14 +436,13 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the subtraction. * @param to_subtract Second element of the subtraction. * @return Entry-wise \f$ result - to\_subtract \f$. */ friend One_critical_filtration &operator-=(One_critical_filtration &result, - const One_critical_filtration &to_subtract) - { + const One_critical_filtration &to_subtract) { if (result.empty()) return result; if (result.is_nan() || to_subtract.is_nan() || (result.is_inf() && to_subtract.is_inf()) || @@ -493,13 +477,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the subtraction. * @param to_subtract Second element of the subtraction. * @return Entry-wise \f$ result - to\_subtract \f$. */ - friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_subtract) - { + friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_subtract) { if (result.empty()) return result; if (result.is_nan() || std::isnan(to_subtract) || (result.is_inf() && to_subtract == T_inf) || @@ -530,13 +513,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param a First element of the addition. * @param b Second element of the addition. * @return Entry-wise \f$ a + b \f$. */ - friend One_critical_filtration operator+(One_critical_filtration a, const One_critical_filtration &b) - { + friend One_critical_filtration operator+(One_critical_filtration a, const One_critical_filtration &b) { a += b; return a; } @@ -550,13 +532,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param f First element of the addition. * @param val Second element of the addition. * @return Entry-wise \f$ f + val \f$. */ - friend One_critical_filtration operator+(One_critical_filtration f, const T &val) - { + friend One_critical_filtration operator+(One_critical_filtration f, const T &val) { f += val; return f; } @@ -570,13 +551,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param val First element of the addition. * @param f Second element of the addition. * @return Entry-wise \f$ val + f \f$. */ - friend One_critical_filtration operator+(const T &val, One_critical_filtration f) - { + friend One_critical_filtration operator+(const T &val, One_critical_filtration f) { f += val; return f; } @@ -592,13 +572,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the addition. * @param to_add Second element of the addition. * @return Entry-wise \f$ result + to\_add \f$. */ - friend One_critical_filtration &operator+=(One_critical_filtration &result, const One_critical_filtration &to_add) - { + friend One_critical_filtration &operator+=(One_critical_filtration &result, const One_critical_filtration &to_add) { if (result.empty()) return result; if (result.is_nan() || to_add.is_nan() || (result.is_inf() && to_add.is_minus_inf()) || @@ -631,13 +610,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the addition. * @param to_add Second element of the addition. * @return Entry-wise \f$ result + to\_add \f$. */ - friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) - { + friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) { if (result.empty()) return result; if (result.is_nan() || std::isnan(to_add) || (result.is_inf() && to_add == -T_inf) || @@ -672,13 +650,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param a First element of the multiplication. * @param b Second element of the multiplication. * @return Entry-wise \f$ a * b \f$. */ - friend One_critical_filtration operator*(One_critical_filtration a, const One_critical_filtration &b) - { + friend One_critical_filtration operator*(One_critical_filtration a, const One_critical_filtration &b) { a *= b; return a; } @@ -696,13 +673,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param f First element of the multiplication. * @param val Second element of the multiplication. * @return Entry-wise \f$ f * val \f$. */ - friend One_critical_filtration operator*(One_critical_filtration f, const T &val) - { + friend One_critical_filtration operator*(One_critical_filtration f, const T &val) { f *= val; return f; } @@ -720,13 +696,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param val First element of the multiplication. * @param f Second element of the multiplication. * @return Entry-wise \f$ val * f \f$. */ - friend One_critical_filtration operator*(const T &val, One_critical_filtration f) - { + friend One_critical_filtration operator*(const T &val, One_critical_filtration f) { f *= val; return f; } @@ -746,13 +721,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the multiplication. * @param to_mul Second element of the multiplication. * @return Entry-wise \f$ result * to\_mul \f$. */ - friend One_critical_filtration &operator*=(One_critical_filtration &result, const One_critical_filtration &to_mul) - { + friend One_critical_filtration &operator*=(One_critical_filtration &result, const One_critical_filtration &to_mul) { if (result.empty()) return result; if (result.is_nan() || to_mul.is_nan()) { @@ -797,13 +771,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the multiplication. * @param to_mul Second element of the multiplication. * @return Entry-wise \f$ result * to\_mul \f$. */ - friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_mul) - { + friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_mul) { if (result.empty()) return result; if (result.is_nan() || std::isnan(to_mul)) { @@ -840,13 +813,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param a First element of the division. * @param b Second element of the division. * @return Entry-wise \f$ a / b \f$. */ - friend One_critical_filtration operator/(One_critical_filtration a, const One_critical_filtration &b) - { + friend One_critical_filtration operator/(One_critical_filtration a, const One_critical_filtration &b) { a /= b; return a; } @@ -867,13 +839,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param f First element of the division. * @param val Second element of the division. * @return Entry-wise \f$ f / val \f$. */ - friend One_critical_filtration operator/(One_critical_filtration f, const T &val) - { + friend One_critical_filtration operator/(One_critical_filtration f, const T &val) { f /= val; return f; } @@ -894,13 +865,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param val First element of the division. * @param f Second element of the division. * @return Entry-wise \f$ val / f \f$. */ - friend One_critical_filtration operator/(const T &val, const One_critical_filtration &f) - { + friend One_critical_filtration operator/(const T &val, const One_critical_filtration &f) { if (f.empty()) return f; if (std::isnan(val) || f.is_nan()) return nan(); @@ -927,13 +897,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the division. * @param to_div Second element of the division. * @return Entry-wise \f$ result / to\_div \f$. */ - friend One_critical_filtration &operator/=(One_critical_filtration &result, const One_critical_filtration &to_div) - { + friend One_critical_filtration &operator/=(One_critical_filtration &result, const One_critical_filtration &to_div) { if (result.empty()) return result; bool res_is_infinite = result.is_inf() || result.is_minus_inf(); @@ -975,13 +944,12 @@ class One_critical_filtration : public std::vector * * If `std::numeric_limits::has_quiet_NaN` is false, then the returned filtration value will be @ref nan() * if any operation results in NaN, not only if all operations result in NaN. - * + * * @param result First element of the division. * @param to_div Second element of the division. * @return Entry-wise \f$ result / to\_div \f$. */ - friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_div) - { + friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_div) { if (result.empty()) return result; bool res_is_infinite = result.is_inf() || result.is_minus_inf(); @@ -1008,11 +976,10 @@ class One_critical_filtration : public std::vector * More formally, it pushes the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \ge x \} \f$ * originating in the given filtration value \f$ x \f$. The resulting value corresponds to the intersection of both * cones: \f$ \mathrm{this} = \min \{ y \in \mathbb R^n : y \ge this \} \cap \{ y \in \mathbb R^n : y \ge x \} \f$. - * + * * @param x The target filtration value towards which to push. */ - void push_to_least_common_upper_bound(const One_critical_filtration &x) - { + void push_to_least_common_upper_bound(const One_critical_filtration &x) { if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; if (x.is_inf() || this->is_minus_inf()) { *this = x; @@ -1032,11 +999,10 @@ class One_critical_filtration : public std::vector * More formally, it pulls the current filtration value to the cone \f$ \{ y \in \mathbb R^n : y \le x \} \f$ * originating in the given filtration value \f$ x \f$. The resulting value corresponds to the intersection of both * cones: \f$ \mathrm{this} = \min \{ y \in \mathbb R^n : y \le this \} \cap \{ y \in \mathbb R^n : y \le x \} \f$. - * + * * @param x The target filtration value towards which to pull. */ - void pull_to_greatest_common_lower_bound(const One_critical_filtration &x) - { + void pull_to_greatest_common_lower_bound(const One_critical_filtration &x) { if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; if (this->is_inf() || x.is_minus_inf()) { *this = x; @@ -1058,7 +1024,7 @@ class One_critical_filtration : public std::vector * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in the filtration value. * The ranges correspond to the possible values of the parameters, ordered by increasing value, forming therefore * all together a 2D grid. - * + * * @tparam oned_array A range of values convertible into `T` ordered by increasing value. Has to implement * a begin, end and operator[] method. * @param grid Vector of @p oned_array with size at least number of filtration parameters. @@ -1066,16 +1032,14 @@ class One_critical_filtration : public std::vector * the values are set to the values at the coordinates of the projection. */ template - void project_onto_grid(const std::vector &grid, bool coordinate = true) - { + void project_onto_grid(const std::vector &grid, bool coordinate = true) { GUDHI_CHECK(grid.size() >= Base::size(), "The grid should not be smaller than the number of parameters in the filtration value."); for (std::size_t parameter = 0u; parameter < Base::size(); ++parameter) { const auto &filtration = grid[parameter]; auto d = std::distance(filtration.begin(), - std::lower_bound(filtration.begin(), - filtration.end(), + std::lower_bound(filtration.begin(), filtration.end(), static_cast(Base::operator[](parameter)))); Base::operator[](parameter) = coordinate ? static_cast(d) : static_cast(filtration[d]); } @@ -1085,15 +1049,14 @@ class One_critical_filtration : public std::vector /** * @brief Computes the scalar product of the given filtration value with the given vector. - * + * * @tparam U Arithmetic type of the result. Default value: `T`. * @param f Filtration value. * @param x Vector of coefficients. * @return Scalar product of @p f with @p x. */ template - friend U compute_linear_projection(const One_critical_filtration &f, const std::vector &x) - { + friend U compute_linear_projection(const One_critical_filtration &f, const std::vector &x) { U projection = 0; std::size_t size = std::min(x.size(), f.size()); for (std::size_t i = 0u; i < size; i++) projection += x[i] * static_cast(f[i]); @@ -1102,12 +1065,11 @@ class One_critical_filtration : public std::vector /** * @brief Computes the norm of the given filtration value. - * + * * @param f Filtration value. * @return The norm of @p f. */ - friend T compute_norm(const One_critical_filtration &f) - { + friend T compute_norm(const One_critical_filtration &f) { T out = 0; for (auto &val : f) out += (val * val); return std::sqrt(out); @@ -1115,13 +1077,12 @@ class One_critical_filtration : public std::vector /** * @brief Computes the euclidean distance from the first parameter to the second parameter. - * + * * @param f Start filtration value. * @param other End filtration value. * @return Euclidean distance between @p f and @p other. */ - friend T compute_euclidean_distance_to(const One_critical_filtration &f, const One_critical_filtration &other) - { + friend T compute_euclidean_distance_to(const One_critical_filtration &f, const One_critical_filtration &other) { T out = 0; for (std::size_t i = 0u; i < other.size(); i++) { out += (f[i] - other[i]) * (f[i] - other[i]); @@ -1136,7 +1097,7 @@ class One_critical_filtration : public std::vector * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in the filtration value. * The inner vectors correspond to the possible values of the parameters, ordered by increasing value, * forming therefore all together a 2D grid. - * + * * @tparam out_type Signed arithmetic type. Default value: std::int32_t. * @tparam U Type which is convertible into `out_type`. * @param f Filtration value to project. @@ -1146,18 +1107,17 @@ class One_critical_filtration : public std::vector */ template friend One_critical_filtration compute_coordinates_in_grid(const One_critical_filtration &f, - const std::vector > &grid) - { + const std::vector > &grid) { One_critical_filtration coords = f.as_type(); coords.project_onto_grid(grid); return coords; } - + /** - * @brief Computes the values in the given grid corresponding to the coordinates given by the given filtration - * value. That is, if \f$ out \f$ is the result, \f$ out[i] = grid[i][f[i]] \f$. Assumes therefore, that the + * @brief Computes the values in the given grid corresponding to the coordinates given by the given filtration + * value. That is, if \f$ out \f$ is the result, \f$ out[i] = grid[i][f[i]] \f$. Assumes therefore, that the * values stored in the filtration value corresponds to indices existing in the given grid. - * + * * @tparam U Signed arithmetic type. * @param f Filtration value storing coordinates compatible with `grid`. * @param grid Vector of vector. @@ -1165,8 +1125,7 @@ class One_critical_filtration : public std::vector */ template friend One_critical_filtration evaluate_coordinates_in_grid(const One_critical_filtration &f, - const std::vector > &grid) - { + const std::vector > &grid) { One_critical_filtration pushed_value(f.size()); GUDHI_CHECK(grid.size() == f.size(), @@ -1187,8 +1146,7 @@ class One_critical_filtration : public std::vector /** * @brief Outstream operator. */ - friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &f) - { + friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &f) { if (f.is_inf()) { stream << "[inf, ..., inf]"; return stream; @@ -1229,8 +1187,7 @@ class One_critical_filtration : public std::vector private: constexpr static bool subtract_(T &v1, T v2) { return add_(v1, -v2); } - constexpr static bool add_(T &v1, T v2) - { + constexpr static bool add_(T &v1, T v2) { if (std::isnan(v1) || std::isnan(v2) || (v1 == T_inf && v2 == -T_inf) || (v1 == -T_inf && v2 == T_inf)) { v1 = std::numeric_limits::quiet_NaN(); return false; @@ -1247,8 +1204,7 @@ class One_critical_filtration : public std::vector return true; } - constexpr static bool multiply_(T &v1, T v2) - { + constexpr static bool multiply_(T &v1, T v2) { bool v1_is_infinite = v1 == T_inf || v1 == -T_inf; bool v2_is_infinite = v2 == T_inf || v2 == -T_inf; @@ -1271,8 +1227,7 @@ class One_critical_filtration : public std::vector return true; } - constexpr static bool divide_(T &v1, T v2) - { + constexpr static bool divide_(T &v1, T v2) { bool v1_is_infinite = v1 == T_inf || v1 == -T_inf; bool v2_is_infinite = v2 == T_inf || v2 == -T_inf; @@ -1297,8 +1252,7 @@ class One_critical_filtration : public std::vector return true; } - constexpr static bool update_sign_(T toComp, int &sign) - { + constexpr static bool update_sign_(T toComp, int &sign) { if (toComp == T_inf) { if (sign == 0) sign = 1; @@ -1319,8 +1273,7 @@ class One_critical_filtration : public std::vector template static One_critical_filtration &apply_operation_with_finite_values_(One_critical_filtration &result, const One_critical_filtration &to_operate, - F &&operate) - { + F &&operate) { bool allSameInf = true; bool allNaN = true; int sign = 0; @@ -1344,9 +1297,7 @@ class One_critical_filtration : public std::vector template static One_critical_filtration &apply_scalar_operation_on_finite_value_(One_critical_filtration &result, - const T &to_operate, - F &&operate) - { + const T &to_operate, F &&operate) { for (auto &val : result) { if constexpr (std::numeric_limits::has_quiet_NaN) { operate(val, to_operate); @@ -1363,10 +1314,7 @@ class One_critical_filtration : public std::vector template static One_critical_filtration &apply_scalar_operation_on_finite_value_with_all_nan_possible_( - One_critical_filtration &result, - const T &to_operate, - F &&operate) - { + One_critical_filtration &result, const T &to_operate, F &&operate) { bool allNaN = true; for (auto &val : result) { @@ -1390,37 +1338,31 @@ class One_critical_filtration : public std::vector namespace std { template -class numeric_limits > -{ +class numeric_limits > { public: static constexpr bool has_infinity = true; - static constexpr Gudhi::multi_filtration::One_critical_filtration infinity() noexcept - { + static constexpr Gudhi::multi_filtration::One_critical_filtration infinity() noexcept { return Gudhi::multi_filtration::One_critical_filtration::inf(); }; // non-standard - static constexpr Gudhi::multi_filtration::One_critical_filtration minus_infinity() noexcept - { + static constexpr Gudhi::multi_filtration::One_critical_filtration minus_infinity() noexcept { return Gudhi::multi_filtration::One_critical_filtration::minus_inf(); }; - static constexpr Gudhi::multi_filtration::One_critical_filtration max() noexcept(false) - { + static constexpr Gudhi::multi_filtration::One_critical_filtration max() noexcept(false) { throw std::logic_error( "The maximal value cannot be represented with no finite numbers of parameters." "Use `max(number_of_parameters)` instead"); }; // non-standard, so I don't want to define a default value. - static constexpr Gudhi::multi_filtration::One_critical_filtration max(unsigned int n) noexcept - { + static constexpr Gudhi::multi_filtration::One_critical_filtration max(unsigned int n) noexcept { return Gudhi::multi_filtration::One_critical_filtration(n, std::numeric_limits::max()); }; - static constexpr Gudhi::multi_filtration::One_critical_filtration quiet_NaN() noexcept - { + static constexpr Gudhi::multi_filtration::One_critical_filtration quiet_NaN() noexcept { return Gudhi::multi_filtration::One_critical_filtration::nan(); }; }; From 5a807603d548b901b10cd392a69ca16a5b8b772d Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 29 Aug 2024 18:10:17 +0200 Subject: [PATCH 74/87] add enum class for _get_domination_relation --- .../include/gudhi/Multi_critical_filtration.h | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 369e92e7f8..b2bbe89212 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -71,7 +71,6 @@ class Multi_critical_filtration { * @brief Type of the origin of a "simplex lifetime cone". Common with @ref One_critical_filtration "". */ using Generator = One_critical_filtration; - // TODO: not the best name... using Generators = std::vector; /**< Container type for the filtration values. */ using iterator = typename Generators::iterator; /**< Iterator type for the generator container. */ using const_iterator = typename Generators::const_iterator; /**< Const iterator type for the generator container. */ @@ -746,12 +745,10 @@ class Multi_critical_filtration { } } - // 0 == equal - // 1 == a dom b - // 2 == b dom a - // 3 == none - static int _get_domination_relation(const Generator &a, const Generator &b) { - if (a.is_nan() || b.is_nan()) return 3; + enum class Rel { EQUAL, DOMINATES, IS_DOMINATED, NONE }; + + static Rel _get_domination_relation(const Generator &a, const Generator &b) { + if (a.is_nan() || b.is_nan()) return Rel::NONE; GUDHI_CHECK(a.size() == b.size(), "Two generators in the same k-critical value have to have the same numbers of parameters."); @@ -761,23 +758,23 @@ class Multi_critical_filtration { bool allSmaller = true; for (unsigned int i = 0; i < a.size(); ++i) { if (a[i] < b[i]) { - if (!allSmaller) return 3; + if (!allSmaller) return Rel::NONE; equal = false; allGreater = false; } else if (a[i] > b[i]) { - if (!allGreater) return 3; + if (!allGreater) return Rel::NONE; equal = false; allSmaller = false; } } - if (equal) return 0; + if (equal) return Rel::EQUAL; if constexpr (co) { - if (allSmaller) return 1; - return 2; + if (allSmaller) return Rel::DOMINATES; + return Rel::IS_DOMINATED; } else { - if (allGreater) return 1; - return 2; + if (allGreater) return Rel::DOMINATES; + return Rel::IS_DOMINATED; } } @@ -795,12 +792,12 @@ class Multi_critical_filtration { } while (curr != end) { - int res = _get_domination_relation(multi_filtration_[curr], x); - if (res == 2 || res == 0) return false; // x dominates or is equal - if (res == 1) { // x is dominated + Rel res = _get_domination_relation(multi_filtration_[curr], x); + if (res == Rel::IS_DOMINATED || res == Rel::EQUAL) return false; // x dominates or is equal + if (res == Rel::DOMINATES) { // x is dominated --end; std::swap(multi_filtration_[curr], multi_filtration_[end]); - } else { + } else { // no relation ++curr; } } From 15324a3ca9452f03114d40f08baf3ebddd05ef87 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Fri, 30 Aug 2024 14:27:54 +0200 Subject: [PATCH 75/87] windows fix --- .../include/gudhi/One_critical_filtration.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index f3034206f7..68c0f48161 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -19,6 +19,7 @@ #include //std::ostream #include //std::numerical_limits #include //std::logic_error +#include #include #include @@ -1072,7 +1073,12 @@ class One_critical_filtration : public std::vector { friend T compute_norm(const One_critical_filtration &f) { T out = 0; for (auto &val : f) out += (val * val); - return std::sqrt(out); + if constexpr (std::is_integral_v){ + //to avoid Windows issue which don't know how to cast integers for cmath methods + return std::sqrt(static_cast(out)); + } else { + return std::sqrt(out); + } } /** @@ -1087,7 +1093,12 @@ class One_critical_filtration : public std::vector { for (std::size_t i = 0u; i < other.size(); i++) { out += (f[i] - other[i]) * (f[i] - other[i]); } - return std::sqrt(out); + if constexpr (std::is_integral_v){ + //to avoid Windows issue which don't know how to cast integers for cmath methods + return std::sqrt(static_cast(out)); + } else { + return std::sqrt(out); + } } /** From d3625c42ce081bdfb8609ee7cd3d066c1a6bb130 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Mon, 2 Sep 2024 16:58:35 +0200 Subject: [PATCH 76/87] correction doc + no empty values for multicritical --- .../include/gudhi/Multi_critical_filtration.h | 104 ++++++++++-------- .../include/gudhi/One_critical_filtration.h | 46 ++++---- ...ultifiltration_multicritical_unit_test.cpp | 6 +- .../multifiltration_onecritical_unit_test.cpp | 12 +- 4 files changed, 86 insertions(+), 82 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index b2bbe89212..9d6a7fc5c0 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -31,11 +31,12 @@ namespace Gudhi::multi_filtration { * @class Multi_critical_filtration multi_critical_filtration.h gudhi/multi_critical_filtration.h * @ingroup multi_filtration * - * @brief Class representing all apparition values of a same simplex for several parameters, that is, the filtration - * values of a simplex in the setting of a k-critical multi-parameter filtration. The class can be used as a vector - * whose indices correspond each to one filtration value. Then, the indices of each filtration value correspond to one - * particular parameter. E.g., \f$ f[g][p] \f$ will be the apparition value at the \f$ p^{th} \f$ parameter of the - * \f$ g^{th} \f$ generator of the simplex with @ref Multi_critical_filtration \f$ f \f$. + * @brief Class encoding the different generators, i.e., apparition times, of a \f$k\f$-critical + * \f$\mathbb R^n\f$-filtration value, e.g., the filtration of a simplex, or of the algebraic generator of a module + * presentation. The class can be used as a vector whose indices correspond each to a generator, i.e., a one-critical + * filtration value. Then, the indices of each generator correspond to a particular parameter. + * E.g., \f$ f[i][p] \f$ will be \f$ p^{\textit{th}} \f$ parameter of the \f$ i^{\textit{th}} \f$ generator + * of this filtration value with @ref Multi_critical_filtration \f$ f \f$. * * @details Overloads `std::numeric_limits` such that: * - `std::numeric_limits >::has_infinity` returns `true`, @@ -49,7 +50,8 @@ namespace Gudhi::multi_filtration { * - `std::numeric_limits >::quiet_NaN()` returns * @ref Multi_critical_filtration::nan() "". * - * Multi-critical filtrations are filtrations such that the lifetime of each simplex is a union of positive cones, e.g., + * Multi-critical filtrations are filtrations such that the lifetime of each object is union of positive cones in + * \f$\mathbb R^n\f$, e.g., * - \f$ \{ x \in \mathbb R^2 : x \ge (1,2)\} \cap \{ x \in \mathbb R^2 : x \ge (2,1)\} \f$ is finitely critical, * and more particularly 2-critical, while * - \f$ \{ x \in \mathbb R^2 : x \ge \mathrm{epigraph}(y \mapsto e^{-y})\} \f$ is not. @@ -68,7 +70,7 @@ template class Multi_critical_filtration { public: /** - * @brief Type of the origin of a "simplex lifetime cone". Common with @ref One_critical_filtration "". + * @brief Type of the origin of a "lifetime cone". Common with @ref One_critical_filtration "". */ using Generator = One_critical_filtration; using Generators = std::vector; /**< Container type for the filtration values. */ @@ -81,19 +83,20 @@ class Multi_critical_filtration { * @brief Default constructor. The constructed value will be either at infinity if `co` is true or at minus infinity * if `co` is false. */ - Multi_critical_filtration() : multi_filtration_(1, co ? Generator::inf() : Generator::minus_inf()) {}; + Multi_critical_filtration() : multi_filtration_(get_default_filtration_value()) {}; /** - * @brief Constructs a filtration value with one generator and @p n parameters. All parameters will be initialized - * at -inf. + * @brief Constructs a filtration value with one generator and @p n parameters. + * All parameters will be initialized at -inf if `co` is false and at inf if `co` is true. * - * @warning The generator `{-inf, -inf, ...}` with \f$ n > 1 \f$ entries is not considered as "minus infinity" (the - * method @ref is_minus_inf() "", as well as the one of the generator, will not return true). The `-inf` are just - * meant as placeholders, at least one entry should be modified by the user. - * Otherwise, either use the static method @ref minus_inf() or set @p n to 1 instead. + * @warning The generator `{-inf, -inf, ...}`/`{inf, inf, ...}` with \f$ n > 1 \f$ entries is not considered as + * "(minus) infinity" (the resp. methods @ref is_minus_inf() and @ref is_inf() "", as well as the ones of the + * generator, will not return true). The `-inf/inf` are just meant as placeholders, at least one entry should be + * modified by the user. + * Otherwise, either use the static methods @ref minus_inf() or @ref inf(), or set @p n to 1 instead. * * @param n Number of parameters. */ - Multi_critical_filtration(int n) : multi_filtration_({Generator(n)}) {}; + Multi_critical_filtration(int n) : multi_filtration_(1, Generator(n, get_default_value())) {}; /** * @brief Constructs a filtration value with one generator and @p n parameters. All parameters will be initialized * with @p value. @@ -106,28 +109,30 @@ class Multi_critical_filtration { * @param n Number of parameters. * @param value Value which will be used for each entry. */ - Multi_critical_filtration(int n, T value) : multi_filtration_({Generator(n, value)}) {}; + Multi_critical_filtration(int n, T value) : multi_filtration_(1, Generator(n, value)) {}; /** * @brief Constructs a filtration value with one generator which will be initialzed by the given initializer list. * * @param init Initializer list with values for each parameter. */ - Multi_critical_filtration(std::initializer_list init) : multi_filtration_({Generator(init)}) {}; + Multi_critical_filtration(std::initializer_list init) : multi_filtration_(1, Generator{init}) {}; /** * @brief Constructs a filtration value with one generator which will be initialzed by the given vector. * * @param v Vector with values for each parameter. */ - Multi_critical_filtration(const std::vector &v) : multi_filtration_({v}) {}; + Multi_critical_filtration(const std::vector &v) : multi_filtration_(1, Generator{v}) {}; /** * @brief Constructs a filtration value with one generator to which the given vector is moved to. * * @param v Vector with values for each parameter. */ - Multi_critical_filtration(std::vector &&v) : multi_filtration_({std::move(v)}) {}; + Multi_critical_filtration(std::vector &&v) : multi_filtration_(1, Generator{std::move(v)}) {}; /** * @brief Constructs filtration value with as many generators than elements in the given vector and initialize * them with them. + * If the vector is empty, then the filtration value is either initialized at infinity if `co` is true or at + * minus infinity if `co` is false. * @pre All generators in the vector have to have the same number of parameters, i.e., size. * Furthermore, the generators have to be a minimal generating set. * @@ -136,10 +141,13 @@ class Multi_critical_filtration { * * @param v Vector of generators. */ - Multi_critical_filtration(const std::vector &v) : multi_filtration_(v) {}; + Multi_critical_filtration(const std::vector &v) + : multi_filtration_(v.empty() ? get_default_filtration_value() : v) {}; /** * @brief Constructs filtration value with as many generators than elements in the given vector and moves those * elements to initialize the generators. + * If the vector is empty, then the filtration value is either initialized at infinity if `co` is true or at + * minus infinity if `co` is false. * @pre All generators in the vector have to have the same number of parameters, i.e., size. * Furthermore, the generators have to be a minimal generating set. * @@ -148,7 +156,8 @@ class Multi_critical_filtration { * * @param v Vector of generators. */ - Multi_critical_filtration(std::vector &&v) : multi_filtration_(std::move(v)) {}; + Multi_critical_filtration(std::vector &&v) + : multi_filtration_(v.empty() ? get_default_filtration_value() : std::move(v)) {}; /** * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end * iterators. @@ -157,7 +166,7 @@ class Multi_critical_filtration { * @param it_end End of the range. */ Multi_critical_filtration(typename std::vector::iterator it_begin, typename std::vector::iterator it_end) - : multi_filtration_({Generator(it_begin, it_end)}) {}; + : multi_filtration_(Generators(1, {it_begin, it_end})) {}; /** * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end * const iterators. @@ -167,7 +176,7 @@ class Multi_critical_filtration { */ Multi_critical_filtration(typename std::vector::const_iterator it_begin, typename std::vector::const_iterator it_end) - : multi_filtration_({Generator(it_begin, it_end)}) {}; + : multi_filtration_(Generator(1, {it_begin, it_end})) {}; // VECTOR-LIKE @@ -202,11 +211,6 @@ class Multi_critical_filtration { */ const_iterator end() const { return multi_filtration_.end(); } - /** - * @brief Returns true if and only if the number of generators is zero. - */ - bool empty() const { return multi_filtration_.empty(); } - /** * @brief Reserves space for the given number of generators in the underlying container. * @@ -214,11 +218,6 @@ class Multi_critical_filtration { */ void reserve(std::size_t n) { multi_filtration_.reserve(n); } - /** - * @brief Removes all generators. - */ - void clear() { multi_filtration_.clear(); } - // CONVERTERS /** @@ -258,7 +257,7 @@ class Multi_critical_filtration { /** * @brief Returns the number of parameters. */ - std::size_t num_parameters() const { return multi_filtration_.empty() ? 0 : multi_filtration_[0].num_parameters(); } + std::size_t num_parameters() const { return multi_filtration_[0].num_parameters(); } /** * @brief Returns the number of generators. @@ -310,7 +309,6 @@ class Multi_critical_filtration { * minus infinity or NaN. */ bool is_finite() const { - if (empty()) return false; if (multi_filtration_.size() > 1) return true; return multi_filtration_[0].is_finite(); } @@ -408,7 +406,8 @@ class Multi_critical_filtration { /** * @brief Sets the number of generators. If there were less generators before, new empty generators are constructed. * If there were more generators before, the exceed of generators is destroyed (any generator with index higher or - * equal than @p n to be more precise). + * equal than @p n to be more precise). If @p n is zero, the methods does nothing. A filtration value should never + * be empty. * * @warning All empty generators have 0 parameters. This can be problematic for some methods if there are also * non empty generators in the container. Make sure to fill them with real generators or to remove them before @@ -416,7 +415,10 @@ class Multi_critical_filtration { * * @param n New number of generators. */ - void set_num_generators(std::size_t n) { multi_filtration_.resize(n); } + void set_num_generators(std::size_t n) { + if (n == 0) return; + multi_filtration_.resize(n); + } /** * @brief Sets all generators to the least common upper bound between the current generator value and the given value. @@ -444,8 +446,6 @@ class Multi_critical_filtration { simplify(); } - // TODO: this is not well defined for k-critical <-> k-critical ? - /** * @brief Sets all generators to the greatest common lower bound between the current generator value and the given * value. @@ -484,11 +484,6 @@ class Multi_critical_filtration { * @return false Otherwise. */ bool add_generator(const Generator &x) { - if (multi_filtration_.empty()) { - multi_filtration_.push_back(x); - return true; - } - GUDHI_CHECK(x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite() || !x.is_finite(), "Cannot add a generator with different number of parameters."); @@ -547,6 +542,8 @@ class Multi_critical_filtration { /** * @brief Removes all empty generators from the filtration value. If @p include_infinities is true, it also * removes the generators at infinity or minus infinity. + * If the set of generators is empty after removals, it is set to minus infinity if `co` is false or to infinity + * if `co` is true. * * @param include_infinities If true, removes also infinity values. */ @@ -557,6 +554,7 @@ class Multi_critical_filtration { ((include_infinities) && (a.is_inf() || a.is_minus_inf())); }), multi_filtration_.end()); + if (multi_filtration_.empty()) multi_filtration_.push_back(Generator{get_default_value()}); } /** @@ -655,11 +653,17 @@ class Multi_critical_filtration { * projected to the same point, the doubles are removed in the output). */ template - friend Multi_critical_filtration compute_coordinates_in_grid(const Multi_critical_filtration &f, + friend Multi_critical_filtration compute_coordinates_in_grid(Multi_critical_filtration f, const std::vector> &grid) { - Multi_critical_filtration coords = f.as_type(); - coords.project_onto_grid(grid); - return coords; + // TODO: by replicating the code of the 1-critical "project_onto_grid", this could be done with just one copy + // instead of two. But it is not clear if it is really worth it, i.e., how much the change in type is really + // necessary in the use cases. To see later. + f.project_onto_grid(grid); + if constexpr (std::is_same_v) { + return f; + } else { + return f.as_type(); + } } /** @@ -724,6 +728,10 @@ class Multi_critical_filtration { private: Generators multi_filtration_; /**< Container for generators. */ + constexpr static T get_default_value() { return co ? Generator::T_inf : -Generator::T_inf; } + + constexpr static Generators get_default_filtration_value() { return Generators{Generator{get_default_value()}}; } + /** * @brief Verifies if @p b is strictly contained in the positive cone originating in `a`. */ diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index 68c0f48161..c7e1ee54c7 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -19,7 +19,6 @@ #include //std::ostream #include //std::numerical_limits #include //std::logic_error -#include #include #include @@ -30,9 +29,10 @@ namespace Gudhi::multi_filtration { * @class One_critical_filtration one_critical_filtration.h gudhi/one_critical_filtration.h * @ingroup multi_filtration * - * @brief Class representing the apparition values of a same simplex for several parameters, that is, the filtration - * value of a simplex in the setting of a 1-critical multi-parameter filtration. The class can be used as a vector - * whose indices correspond to one parameter each. It also has several numpy-like arithmetic operators. + * @brief Class encoding the apparition time, i.e., filtration value of an object + * (e.g., simplex, cell, abstract algebraic generator) in the setting of 1-critical multiparameter filtrations. + * The class can be used as a vector whose indices correspond to one parameter each. + * It also follows numpy-like broadcast semantic. * * @details Inherits of `std::vector`. Overloads `std::numeric_limits` such that: * - `std::numeric_limits >::has_infinity` returns `true`, @@ -44,7 +44,7 @@ namespace Gudhi::multi_filtration { * parameters evaluated at value `std::numeric_limits::max()`, * - `std::numeric_limits >::quiet_NaN()` returns @ref One_critical_filtration::nan() "". * - * One critical simplicial filtrations are filtrations such that the lifetime of each simplex is a positive cone, e.g. + * One critical simplicial filtrations are filtrations such that the lifetime of each object is a positive cone, e.g. * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \f$ is valid, while * - \f$ \{ x \in \mathbb R^2 : x>=(1,2)\} \cap \{x \in \mathbb R^2 : x>=(2,1)\} \f$ is not. * @@ -64,8 +64,8 @@ class One_critical_filtration : public std::vector { public: /** - * @brief Type of the origin of a "simplex lifetime cone". Common with @ref Multi_critical_filtration "". - * In the 1-critical case, simply the class it-self. + * @brief Type of the origin of a "lifetime cone", i.e., of a one-critical filtration value. + * Common with @ref Multi_critical_filtration "". In the 1-critical case, simply the class it-self. * * @tparam U Type of a value for one parameter within the filtration value. Default value: `T`. */ @@ -75,9 +75,9 @@ class One_critical_filtration : public std::vector { // CONSTRUCTORS /** - * @brief Default constructor. Constructs an empty vector with 0 parameters. + * @brief Default constructor. Constructs a value at minus infinity. */ - One_critical_filtration() : Base() {}; + One_critical_filtration() : Base{-T_inf} {}; /** * @brief Constructs a vector of the size of the given number of parameters with -inf as value for each entry. * @@ -170,7 +170,7 @@ class One_critical_filtration : public std::vector { */ template One_critical_filtration as_type() const { - One_critical_filtration out; + One_critical_filtration out(0); out.reserve(Base::size()); for (std::size_t i = 0u; i < Base::size(); i++) out.push_back(static_cast(Base::operator[](i))); return out; @@ -209,7 +209,7 @@ class One_critical_filtration : public std::vector { if constexpr (std::numeric_limits::has_quiet_NaN) { return {std::numeric_limits::quiet_NaN()}; } else { - return {}; // to differentiate it from 0, an empty filtration value can't do much anyway. + return One_critical_filtration(0); // to differentiate it from 0, an empty filtration value can't do much anyway. } } @@ -229,12 +229,8 @@ class One_critical_filtration : public std::vector { * @brief Returns `true` if and only if the filtration value is considered as minus infinity. */ bool is_minus_inf() const { - if constexpr (std::is_same::value) { - return false; // suppresses a warning - } else { - if (Base::size() != 1) return false; - return (Base::operator[](0) == -T_inf); - } + if (Base::size() != 1) return false; + return (Base::operator[](0) == -T_inf); } /** @@ -349,7 +345,7 @@ class One_critical_filtration : public std::vector { * @return The opposite of @p f. */ friend One_critical_filtration operator-(const One_critical_filtration &f) { - One_critical_filtration result; + One_critical_filtration result(0); result.reserve(f.size()); for (auto val : f) { result.push_back(-val); @@ -1117,11 +1113,17 @@ class One_critical_filtration : public std::vector { * the projection of \f$ f[i] \f$ is \f$ grid[i][out[i]] \f$. */ template - friend One_critical_filtration compute_coordinates_in_grid(const One_critical_filtration &f, + friend One_critical_filtration compute_coordinates_in_grid(One_critical_filtration f, const std::vector > &grid) { - One_critical_filtration coords = f.as_type(); - coords.project_onto_grid(grid); - return coords; + // TODO: by replicating the code of "project_onto_grid", this could be done with just one copy + // instead of two. But it is not clear if it is really worth it, i.e., how much the change in type is really + // necessary in the use cases. To see later. + f.project_onto_grid(grid); + if constexpr (std::is_same_v) { + return f; + } else { + return f.as_type(); + } } /** diff --git a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp index 345c130d59..1fd94bcb80 100644 --- a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp @@ -27,12 +27,10 @@ typedef boost::mpl::list list_of_tested_variants; BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_constructors, T, list_of_tested_variants) { Multi_critical_filtration f01; - BOOST_CHECK(!f01.empty()); BOOST_CHECK(f01.num_parameters() == 1); BOOST_CHECK(f01.num_generators() == 1); BOOST_CHECK(f01[0][0] == -Multi_critical_filtration::Generator::T_inf); Multi_critical_filtration f02; - BOOST_CHECK(!f02.empty()); BOOST_CHECK(f02.num_parameters() == 1); BOOST_CHECK(f02.num_generators() == 1); BOOST_CHECK(f02[0][0] == Multi_critical_filtration::Generator::T_inf); @@ -373,11 +371,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v std::vector::Generator> v{ {0, 1, 2}, - {}, + typename Multi_critical_filtration::Generator(0), Multi_critical_filtration::Generator::inf(), {0, 1, 2}, Multi_critical_filtration::Generator::nan(), - {}, + typename Multi_critical_filtration::Generator(0), Multi_critical_filtration::Generator::minus_inf()}; Multi_critical_filtration f2(v); diff --git a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp index 42bfdccc68..dbaf2f036b 100644 --- a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp @@ -26,8 +26,8 @@ typedef boost::mpl::list list_of_tested_variants; BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_constructors, T, list_of_tested_variants) { One_critical_filtration f; - BOOST_CHECK(f.empty()); - BOOST_CHECK(f.num_parameters() == 0); + BOOST_CHECK(!f.empty()); + BOOST_CHECK(f.num_parameters() == 1); One_critical_filtration f1(3); BOOST_CHECK(f1.size() == 3); @@ -91,12 +91,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_utilities, T, list_of_test One_critical_filtration f3; BOOST_CHECK(!f3.is_inf()); - BOOST_CHECK(!f3.is_minus_inf()); - if constexpr (std::numeric_limits::has_quiet_NaN){ - BOOST_CHECK(!f3.is_nan()); - } else { - BOOST_CHECK(f3.is_nan()); //by default nan if T has no nan - } + BOOST_CHECK(f3.is_minus_inf()); + BOOST_CHECK(!f3.is_nan()); BOOST_CHECK(!f3.is_finite()); //{-inf, -inf, -inf} is considered finite as the user is supposed to updates the values to something else From bac48dc87f1083fe5abc0b3bdd301be6a951c3c6 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Tue, 3 Sep 2024 11:43:00 +0200 Subject: [PATCH 77/87] unit test fix --- .../test/simplex_tree_multi_unit_test.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index a801124115..972b34037c 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -360,7 +360,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_insertion, typeST, list_of_tested_var BOOST_AUTO_TEST_CASE_TEMPLATE(NSimplexAndSubfaces_tree_insertion, typeST, list_of_tested_variants) { typedef std::pair typePairSimplexBool; typedef std::vector typeVectorVertex; - typedef std::pair typeSimplex; + typedef typename typeST::Filtration_value F; + typedef std::pair typeSimplex; std::clog << "********************************************************************" << std::endl; std::clog << "TEST OF RECURSIVE INSERTION" << std::endl; typeST st; @@ -488,12 +489,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(NSimplexAndSubfaces_tree_insertion, typeST, list_o /* A facet [3,4,5] */ /* A cell [0,1,6,7] */ - typeSimplex simplexPair1 = std::make_pair(SimplexVector1, 0.0); - typeSimplex simplexPair2 = std::make_pair(SimplexVector2, 0.0); - typeSimplex simplexPair3 = std::make_pair(SimplexVector3, 0.0); - typeSimplex simplexPair4 = std::make_pair(SimplexVector4, 0.0); - typeSimplex simplexPair5 = std::make_pair(SimplexVector5, 0.0); - typeSimplex simplexPair6 = std::make_pair(SimplexVector6, 0.0); + typeSimplex simplexPair1 = std::make_pair(SimplexVector1, F()); + typeSimplex simplexPair2 = std::make_pair(SimplexVector2, F()); + typeSimplex simplexPair3 = std::make_pair(SimplexVector3, F()); + typeSimplex simplexPair4 = std::make_pair(SimplexVector4, F()); + typeSimplex simplexPair5 = std::make_pair(SimplexVector5, F()); + typeSimplex simplexPair6 = std::make_pair(SimplexVector6, F()); test_simplex_tree_contains(st, simplexPair1, 6); // (2,1,0) is in position 6 test_simplex_tree_contains(st, simplexPair2, 7); // (3) is in position 7 test_simplex_tree_contains(st, simplexPair3, 8); // (3,0) is in position 8 From 8385ac495c3c52e491f85d6252d5701e7e206c68 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Tue, 3 Sep 2024 16:56:11 +0200 Subject: [PATCH 78/87] windows fix --- .../include/gudhi/One_critical_filtration.h | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index c7e1ee54c7..b7f121c2ea 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -239,7 +239,7 @@ class One_critical_filtration : public std::vector { bool is_nan() const { if constexpr (std::numeric_limits::has_quiet_NaN) { if (Base::size() != 1) return false; - return std::isnan(Base::operator[](0)); + return is_nan_(Base::operator[](0)); } else { return Base::empty(); } @@ -253,7 +253,7 @@ class One_critical_filtration : public std::vector { if (Base::size() > 1) return true; if (Base::size() == 0) return false; auto first_value = Base::operator[](0); // TODO : Maybe check all entries ? - if (std::isnan(first_value) || first_value == -T_inf || first_value == T_inf) return false; + if (is_nan_(first_value) || first_value == -T_inf || first_value == T_inf) return false; return true; } @@ -482,7 +482,7 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_subtract) { if (result.empty()) return result; - if (result.is_nan() || std::isnan(to_subtract) || (result.is_inf() && to_subtract == T_inf) || + if (result.is_nan() || is_nan_(to_subtract) || (result.is_inf() && to_subtract == T_inf) || (result.is_minus_inf() && to_subtract == -T_inf)) { result = nan(); return result; @@ -615,7 +615,7 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) { if (result.empty()) return result; - if (result.is_nan() || std::isnan(to_add) || (result.is_inf() && to_add == -T_inf) || + if (result.is_nan() || is_nan_(to_add) || (result.is_inf() && to_add == -T_inf) || (result.is_minus_inf() && to_add == T_inf)) { result = nan(); return result; @@ -776,7 +776,7 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator*=(One_critical_filtration &result, const T &to_mul) { if (result.empty()) return result; - if (result.is_nan() || std::isnan(to_mul)) { + if (result.is_nan() || is_nan_(to_mul)) { result = nan(); return result; } @@ -869,7 +869,7 @@ class One_critical_filtration : public std::vector { */ friend One_critical_filtration operator/(const T &val, const One_critical_filtration &f) { if (f.empty()) return f; - if (std::isnan(val) || f.is_nan()) return nan(); + if (is_nan_(val) || f.is_nan()) return nan(); One_critical_filtration result(f.size(), val); result /= f; @@ -952,7 +952,7 @@ class One_critical_filtration : public std::vector { bool res_is_infinite = result.is_inf() || result.is_minus_inf(); bool to_div_is_infinite = to_div == T_inf || to_div == -T_inf; - if (to_div == 0 || std::isnan(to_div) || result.is_nan() || (res_is_infinite && to_div_is_infinite)) { + if (to_div == 0 || is_nan_(to_div) || result.is_nan() || (res_is_infinite && to_div_is_infinite)) { result = nan(); return result; } @@ -1198,10 +1198,19 @@ class One_critical_filtration : public std::vector { constexpr static bool is_multi_critical = false; private: + static bool is_nan_(T val){ + if constexpr (std::is_integral_v){ + //to avoid Windows issue which don't know how to cast integers for cmath methods + return std::isnan(static_cast(val)); + } else { + return std::isnan(val); + } + } + constexpr static bool subtract_(T &v1, T v2) { return add_(v1, -v2); } constexpr static bool add_(T &v1, T v2) { - if (std::isnan(v1) || std::isnan(v2) || (v1 == T_inf && v2 == -T_inf) || (v1 == -T_inf && v2 == T_inf)) { + if (is_nan_(v1) || is_nan_(v2) || (v1 == T_inf && v2 == -T_inf) || (v1 == -T_inf && v2 == T_inf)) { v1 = std::numeric_limits::quiet_NaN(); return false; } @@ -1221,7 +1230,7 @@ class One_critical_filtration : public std::vector { bool v1_is_infinite = v1 == T_inf || v1 == -T_inf; bool v2_is_infinite = v2 == T_inf || v2 == -T_inf; - if (std::isnan(v1) || std::isnan(v2) || (v1_is_infinite && v2 == 0) || (v1 == 0 && v2_is_infinite)) { + if (is_nan_(v1) || is_nan_(v2) || (v1_is_infinite && v2 == 0) || (v1 == 0 && v2_is_infinite)) { v1 = std::numeric_limits::quiet_NaN(); return false; } @@ -1244,7 +1253,7 @@ class One_critical_filtration : public std::vector { bool v1_is_infinite = v1 == T_inf || v1 == -T_inf; bool v2_is_infinite = v2 == T_inf || v2 == -T_inf; - if (std::isnan(v1) || std::isnan(v2) || v2 == 0 || (v1_is_infinite && v2_is_infinite)) { + if (is_nan_(v1) || is_nan_(v2) || v2 == 0 || (v1_is_infinite && v2_is_infinite)) { v1 = std::numeric_limits::quiet_NaN(); return false; } From 361134aab36be8fc30c18f2574dbcb2fe5c8aecc Mon Sep 17 00:00:00 2001 From: hschreiber Date: Tue, 3 Sep 2024 17:14:31 +0200 Subject: [PATCH 79/87] windows fix --- src/Multi_filtration/include/gudhi/One_critical_filtration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index b7f121c2ea..f1c76de322 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -1201,7 +1201,7 @@ class One_critical_filtration : public std::vector { static bool is_nan_(T val){ if constexpr (std::is_integral_v){ //to avoid Windows issue which don't know how to cast integers for cmath methods - return std::isnan(static_cast(val)); + return false; } else { return std::isnan(val); } From 4190ed7ea9f22366c0ef0fd3cc7b6e0f17bf77bb Mon Sep 17 00:00:00 2001 From: hschreiber Date: Wed, 4 Sep 2024 16:13:45 +0200 Subject: [PATCH 80/87] doc line and box --- .../include/gudhi/Multi_critical_filtration.h | 6 + .../include/gudhi/One_critical_filtration.h | 6 + src/Multi_persistence/doc/COPYRIGHT | 12 + .../doc/Intro_multi_persistence.h | 31 ++ src/Multi_persistence/doc/multidiagrams.png | Bin 0 -> 533983 bytes .../include/gudhi/Multi_persistence/Box.h | 251 ++++++----- .../include/gudhi/Multi_persistence/Line.h | 417 ++++++++++-------- 7 files changed, 405 insertions(+), 318 deletions(-) create mode 100644 src/Multi_persistence/doc/COPYRIGHT create mode 100644 src/Multi_persistence/doc/Intro_multi_persistence.h create mode 100644 src/Multi_persistence/doc/multidiagrams.png diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 9d6a7fc5c0..340f54d9ac 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -9,6 +9,12 @@ * - YYYY/MM Author: Description of the modification */ +/** + * @file Multi_critical_filtration.h + * @author David Loiseaux + * @brief Contains the @ref Gudhi::multi_filtration::Multi_critical_filtration class. + */ + #ifndef MULTI_CRITICAL_FILTRATIONS_H_ #define MULTI_CRITICAL_FILTRATIONS_H_ diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index f1c76de322..010c966735 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -9,6 +9,12 @@ * - YYYY/MM Author: Description of the modification */ +/** + * @file One_critical_filtration.h + * @author David Loiseaux + * @brief Contains the @ref Gudhi::multi_filtration::One_critical_filtration class. + */ + #ifndef ONE_CRITICAL_FILTRATIONS_H_ #define ONE_CRITICAL_FILTRATIONS_H_ diff --git a/src/Multi_persistence/doc/COPYRIGHT b/src/Multi_persistence/doc/COPYRIGHT new file mode 100644 index 0000000000..70cac8b762 --- /dev/null +++ b/src/Multi_persistence/doc/COPYRIGHT @@ -0,0 +1,12 @@ +The files of this directory are part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. +See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + +Author(s): Hannah Schreiber, David Loiseaux + +Copyright (C) 2024 Inria + +This gives everyone the freedoms to use openFrameworks in any context: +commercial or non-commercial, public or private, open or closed source. + +You should have received a copy of the MIT License along with this program. +If not, see https://opensource.org/licenses/MIT. diff --git a/src/Multi_persistence/doc/Intro_multi_persistence.h b/src/Multi_persistence/doc/Intro_multi_persistence.h new file mode 100644 index 0000000000..a23bed4382 --- /dev/null +++ b/src/Multi_persistence/doc/Intro_multi_persistence.h @@ -0,0 +1,31 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2024 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#ifndef DOC_MULTI_PERSISTENCE_INTRO_H_ +#define DOC_MULTI_PERSISTENCE_INTRO_H_ + +// needs namespace for Doxygen to link on classes +namespace Gudhi { +namespace multi_persistence { + +/** \defgroup multi_persistence Multi-parameter Persistence + * @{ + * \author David Loiseaux + * + * \section multiparameterintro Multi-parameter Persistence + * + * To come: a Multi-parameter Persistence module, with, for the beginnings, an interface mostly in Python. + * + * @} + */ +} // namespace persistence_fields +} // namespace Gudhi + +#endif // DOC_MULTI_PERSISTENCE_INTRO_H_ diff --git a/src/Multi_persistence/doc/multidiagrams.png b/src/Multi_persistence/doc/multidiagrams.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf004e46ec7899723a7dbb650062a7fd65714ea GIT binary patch literal 533983 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ŏj#KQi@q|i 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�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 z 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 z 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�re>&5Fy+^c8XL*{CIO zBF{zIAB!f}*5W$mhv8a#Tq3+1djqy!vhLO(<9p<@Znhls&WAhW_VNb1&JS$Jzh2t! z7cD~P=AN*(9lg6GKMS9Sn3GxgKO8beyiP!Yq3FuhLiS*h_A?5o#zd?tAIE>cxDt0K z*jlROIvT0z5>y=Y7edk0*|AaRawXG&JN4J0fNyLS*-bm>L>CVF0 zce_qELCV5O7)qUbJzz{djK*uF_;S17(Pi^3rXoc2(kX@Tqq})#(ch_&DvnR=^4zNB zF-*U+6abGxLp*Q|0h+TD3K;;)==?-sFcAy|9SABq*9%jQFPm*(6Y`L#viTK9nI(a#igGkm^kc;stwadHTV7v0goGrAx@wdQb#){SDCZwM z0JRrKAqhB;X&WY&0I%r+a7ggV9Fdfjl>7{PZI>Huu_cRcHkuv6zpeXaNZvp%wYz7) zcWsHqWSl_;hyjhz4WPhir|^#K4Zh09yF_G(^UDhE6#1i-?B?(K=5M;vMFH8ULo$QR zn3TE<^2Ps2+Wz+w9+v4Wgrh-xhcvbwwHebC9DMtByU4lt6@o{s($rh*V^?Pgr|u!+ zh`6UybMhj8Po#1tnOF&+?SG_cP2?v^QNai$;=^vgfz;{k)j@HZL_tQ_SW>~o?|j!> zQGa#yo`x!jjxF2ed$REH6dZ-}05{+u_ATj$?xr>|6C z(D2Egq*xL8`yG+wZ#zUnp}ky_Sq^&g{s#CBC0GpGw1wnlR|Tnc=YJtoyG4O z5?qfFRS=x&h3HqEfOT2?*;T z)BSGw}5xK%ZuFk4#l#HjUG^6sOE*GktFj6Bfc(~gP1^;9= z6}kH5iD%R1s`W$6T``lBih(KxLn76ci!T-iJM!=$Bm)BmDGCZD&b<7adb;`0%0$Sr zh&PnDY85Y+>GV6IBRM9ku)~$VWO!5_vSMK*0|(5PeqesP;x`rPBjoyH{gb?S=_+*i}hbJ zFXEo*z$ZH1qAA1E!422R)Q3-P566b*RnEsjT;LUccAk=vr4-~A=|$ji(*wzG?OEsi zOIqc`y!I$j`RH-9HO@}#*)$0I9*vNiI}Z;L-AeneubQl-m3180NTcs=LoMBUIM=HS zRqw630n_@duZRA0*Y00{go8s`W8Iz7hSTE){Pxp=1B{CmFa%fLu|F!1iu<>t>`Z!` z>l)=vBWoi4GHxp8$b83wyNz2Pvm&e|cm|Ix!rVu>%Tkl~Tg~n0gyqdm7jqGUV(nel z2l&Av?>1P5Wi8{nR!BP%i)pWG+VW##paK#fd`0d{^o?jo@{c`42DSj7F`(~YiOWQ3 z&qrtZU`{~(^sv)qNNppJh?q(c6YKZReR$6GR)?*YyY{%5AFC&-3yKe^=BhSS!gB)m z`DEXNT#o&{NhDQ(A*&q(*d}OH0;ZoyC|%w`g}dp{3ozo?Qmf$9J|E%|)J;8Lm9$xF~ z!*U9>@dKk{$GulzH}*O_v&8u1v~%__)M`^vX<|uA{Iw1y;t<|q6V7oB(6+5=UIaER z-vq8|EHcP~U$*93<87ixyg z?H~qdg+vpiMBqYH9BhM7YJ%nrxZ*(G{|w8wfhxUa7@rk77e~d7GQ+Y zWKb+yB$O_9USioFrn~oMwfW5AO!_Z`i5ESKFSE(e)=P#8VBX^dC4&0el+oq#>Fg-E ziyve^ak`KFwfFzs9^REQnxhkPCL40mO(Ficbauw5<2!EC{x6HhmrvTiH74F55kYG^m|B=b>0XY0v3V@IfAnK!+w?o$)~QioWG5CsYdd*wZ;0Ft zbS8#{wtnm9`{*<$LMS9+j9PDxAZ$6Z5gW(-DXz;1+0>JZz}r$SC+{kt7jMhIR83(@ zTd1HLwHbOh%Kh-v=171on>I=HZ#i9Quuor8Q@lLP7i8IPG?ISp03_|2*%^Z7y~+C7 zaut22yfrapsuvTN=;VO@`W*i99hv^MFSJK5eJcokL+A3!Ddja#B>n34!sVw!^95J; z^;#n7OSEv3R4NiNZHSw)db5xo;i!^=%NWDw=Fk_~o6WZWn$qxM!hFn%qq;pWntZo& zId(DaHMFyRVhb|2QgPK!&n|)qyD39c7F{xq-PW|tD4~HZ!$F?UFz0VZKokSPDv=a< zQq3`6MbmB8aCoR8*QYQ-54;jPOmwA)HiIkTk7OtD zwb<>&{2|!vM3L@#5>#Zrc`%k|RibsGSuS5Q7ABT2Q{eg=K}=F(LSYh!nU5`nD`?hB z!g&%Ilo4ivrg~S3R65Mv+lZr~Pz0O!*?N&0Ap>9pMce|5FqVZWJ6?@4mKw7^M^PF# zgFgf0i;9|Vy=KR?6&({HKQFFJ-yUU1s+&MtD{|a~K)Cf!j+(mxUg`4nzY|#^qW#+I zsxDM?U)J__+@qsZ|G%5xRpke7QHvJS1o2mXV8z63+>aZ-ABp%b4hFhiT1>ZW?OyfD z*R;Jzci$eTA-p0Ewf52t7Y_y4_r^?jdD$KCw!}mo-OSa0xZ?6}WMXSCPnc_p4dcYa zc#Ub2w~zT>j-m5Z^V5N>E6ERxJshPKWVo~8NWb$B*N+0{B&mmR3$gZb_`?Z3g|*rk z4E(E2RZ7R{4`tF&p}MGxXzZ8Qjd5fCa%A&)pvT!=P_|c1tGlaQuxjNB{Nmbnb?ieD#$d)fdS&*I*!&&t>jKevLzacq$s_QaV8he98cK zcuH@DK7^rPxfjYZpX#!+{sUjmS(kvDp9dm7C*61N9L1eo7U>Haw~o5?J7hz1Ng>Qm z2joL5^V4l*#L2fl3WXDwS1A=TaJ^pwqD{o7OQKu-M%~6HIY{-=?-=HTnp9)V$m#OV zp~D%shh7M@MExTAm_liGx9Md*=}jYPu3DOd$;%kqc5#qN-1`_7Q&hg%$toogfV@`bkRu=Yya{2V~qsv{S>Z6EXuvahA z%(cy_w;3iOrSy?l`3}x^X#3cE1mLD(E8cs+VtBQw@bJhBA8$fIgSqb_jTzDiw6m&v z2&W9g{8Veh$(EIBacXR#t+a|gJ0mQynOiP5o~^+MDFXu`tE-g-kx0GCeIXg~swiLdV7Hyu>`ZY(9{CvI?e(SG-6^4;hUlcfKO9MHpM{|cN^1UMy2Zj?W9T;&ZMYj zbyd~nnm_fnZ?s4r^4^YS|C-O@Co{v9=Koq|Cx^k40$gD)GSR#AQVGY~U z6X>gA1dZ+U6sdvyFD8lwg7*JE6KZ4Q#XcLsPNW4^{ImQ70MnQi9?Le_fF5J|zit*( z*Hq|rbp-AV;ae5EqT&nfq3SRD0JgsoDRI2NCyIEJUv{S%KGfg)vIZ(U)t%i3?i721 zMwp=XJ7rZsXQSTEtz%lN1p|r5>zQl9ZqLt%v76wV(%-LV#|A-O%>-}mT?tQ%_$`;mHo zR8QZ^x=D^bx*4JTX3e9oz=wRzx$yehQnibpopvRmEXd*XRPKEA6e~ZS<9?ccOjy9e z|IP3<_=>~hpeqP^#Ozi=O8TZiPVrDTGOv+^E=3dpgF3JANz$eQsj2QzKOZM`j#t`N zZm|Uc!S{tKw{KFA$7TAwDeC+o^)0)sk3gP$#p7v5Nmux6Y2kjJK|H_VimgAqwFovi z$L;-77^TQ|7z|OnGKoU+4FV^Qn248(y*Q|n%qgMYaM+2du2@HuK!At}a! zdFDESsYc6ho5m4idYZ534MM z&@8_gkj{{<*Vv^3WQ32_OV88%CX4gUON>EPRRarG0SJT1B@LWY~)zLmit+v1^xI7pWK5-8N!q-yKLXx`X<4!f`}T9RT^ifPlfcV0w6qA>3{$l6hfJVOT(d$*y(P0` zla>}5;l=wRxFwKV#P-e2{H!1O^E&u#hx?8Ig+eDK0+fy{@MrONQwYUdi%(2a)%)Iw zpsCB*OvDKL8G1P}aCIv#V);-O7+b+$lO4u2_ZF^BKt9(*@#Jx1<8zqtoa7YtAbomEy5Z6 z<`)eBu`aSlGDM_a)N)K_qrPOCPs?EeFlCG*krJvn)@bm2B*C>q-rX%-Ido0MGL}ax zYQv}gN-zSlQ$t_II~GY|*~PyX@uBfTtJhv(WztjVt~_#i`;25neR-wa${sAuEm{}! z#H$ePDIh^O)3wg@wr+SoRe`ajwYZ&7RU4dTE=ae!;~GHtJcD+zhEWFMdV8Y*eAmYT z8W%M^91f(By>{Hi{!xS?IFiB6FR?MFf_wr_!%{6e&q4)x^P3{qe+@@v5&${xcRY&<)%-Ew|wf-h=JOJmI1St3SPV-kIzyrq%_l4Cmc9rN$yIBt>}*TgMdw3IW6HbcjGu?^ z!fCy?nC{w|x0s*PMh;N#w>6>FR(X$;R*zlEBso{z~gs%2z? zEhs~UY~kVFZM3km@-ihgHR854V57zByjVWYrxM-ZB7@=EC?<838g7_Ba-w9ByxSGz z`AR7TA@fLAQV~=bdaA_79Vo)(SAP!Siq^o>hre>c zHHVQ7i{fBF!s6C?s1Tl%#=wb5h0s*(_UN4v`<965kilq-7RANIF{ShjPTlou;+@Lo z551MZL>VM-7e+BF(vK!@JCt8-f8$2;kY4)2-~0Bm$i85#v?@z&A;qU8KPx~+th@BK z>wJ5C8(&HftrGJY+b{+RQAfAG&kZ#u`w!CFuW^&@piIH%ecL!JkmHE6f9G4y&<&hhaSHFv`)=NBZKQC6`r| zPQ+0D_OBK9EUO((UpmmENw0md=@inWuZHU5yMf33W+}IZrR(VxI#}2^s@NPr1%(uW z>_U(3h&t+7Na(=~GlAVmOm353xoVNNj7mtz$8PEl+WdMEBO1oQ&QhFu&xa5NFxkHe zr>?tzWmm`X>W)vP7}t~Dmp@ClA|X#ampj0#K2ywu@rax=Z5XbXiJ7H1{XA0i=jJ2cRQZ&7lAOPo3jsuJxcKLCV`f4b*QmlCrr56U&JSp-W~=Z^pWv zUFjgUh!M8T<(!&bKVq$HbmQ09EVk!Y`)<^0KCap4%=J~e#3R=F~ zI-ScHY6%}L51C4hS?pMGCwXGPbV(C=3q;(%Wn~GPo>DR#F+TG;7uXIu4;yshkTthX zqv3wg&(MPc!F#S>BP9NzaeMMOBix(ikKv{`JB{B08z=Y@{euU#iz?2!noP_t?K$SZ zm0~|1eyXq*Ibo=hz|c=<_qPvq)lF8T=8q8MuX;w3p_M496GRhiwrJ~*{{q>(wwDo= zedfy;kRG?VrgqVtI^26V7DDZ?doy=($xSt}kZ+|=()NCCOJ-#Mq50k8ftM0OgSe5U z8;6djDWgYYXMr3LE7$1#mf)N~#vaC7KQ~HB~+RQCK zTu&`=KwyCKz{TK2lN+`vt!FcX^r~^b9Q_wExjC1ZW_mnM6^w~mg#><^bE9iVyeVi} zy6!qw|5}e6=G;NsvxfSg*|yM^a8i`Orh(O>S-{2@Fv@gKrtC2UR=+-u0Y73oK`4Wj zo~=XWr}_IfVa)=8)z2msc)JXgC--?rL4@`1o1I+dSwS`h+(p!RK55BE*JeHCqnsWPqVDm7r;@4V4!nWgVXK;UHVnc=UamQfKK9MHhvXrLb; zKwzz$t0_%QcasxJ&z&lZ$S4M3JGDhdSnL-TCZ{V0M^JM*FcKD2>XUz3tIDbIF-*tY zGp36vg5`@epSHgFEwQ)SxQ#v zKAkTs>i@)W8ZNGB#0bJA=H`o*nGn|t<0UrW+GF$Lhdq#*qd~+FbVVFXPCI&YGgs|m z>s77JjR(~?%p2#3A73)W)?MKRm9RMx_)w_y$VWx~9N)lHbNi|PLD!o9w*j}X_zNCW zn*H#JJ5yV+o}(ele`h>Gn2;L!x#z>^+v?TTy0NmNd%#${H6;C36x(~Y;zjtrV4eA1 zg>MOF5Ec#TGvhq72NDxmRb<@Fa{9S+-!>Eqgyz($ zG;e65Vd6B2k-c5d$`pfFuJ(_>_PovK4xxaV(B@*8x(xL`Z9Vg=t zHX~-`A@lInR@!e@V|;I#gvy(Un|^@UkMuvO7vS}A*DxF=peaKR#~jF!D}&QbFk1(e zo)QYg9p0RM?vY}N9(W07FdeZhv1Vwafwo3*`Yde|t3}3dDso_6V~~Q2#rJ&7#wG=o z3T}~^SWpObBbV$cy3%n`GcqW2I%5_7cP0@L93l5CMLI(@TLl%2rIJLT42Y0B3!yCT zohZ|Ylf|({D3?)*Q)f^dR2a-l^k#T2w*4iCPED2Of`xPxdCoHEv;uRwZ(#DTnY7;f z#uBarVyV5cXy%e)c;Xpwt+vSpxE2A;QfxpLgSJoHf9Of(!gdwaNp5t!WOe@qvkl>q`%)UsrfKtLk&x2fB z;47%Sk0?*JllkBS#(tgE8Da~HNASTh|AqK)hU)i*Hl6C0O8&=H=qX4sbLr1?o9V|p zzc>nJ0XI#0u4WN`ONj6u0=BG^%^Gun&_upLKRoZQl`}nL9s;YBZASfXR}KVPob@0A zRxUnq*B4+hnCE$>BkNSart_s8N<>*NJz7dKo_8O?;5ffQ%aP!YK@CwgT2s;+g$wYs z`M$}GlD#uvBcF>ccz>|QnBR~9>fqrV&ZA-L6)X_ zk`giXEM4PE<;}+u&CeX7n(GqcTpRa)vO8z|i@wbagfcfblp6N&n_d>=_(|%!==|be zQfEHR82gkW&`%p_uCyYnAN2E$r$TTIR?_?Gl7ZrOEZIYk+4~qamUNF%N%@{CWkF(^ zMDmb55ttUON5WlE5^=!<3F(&d*vA--O;C9%*J%1Puz~>7YEiHBuMdb5n=@E*oy_c! zk+FhUt&<-~9xj3APu^sqleB6WBD^n)$Em*m(qg-S;I$Y>=ABYv@AN#sDGyGEx_t-? z=!r@z6H~H3ngFZds&0%8I5`25*$bwGmPUcRgZ4zxM&wf1`G~}koZt){ml@^3z&nHMt27nEOV#-=T?jW=NNWypM{xqzL;*{1<^%H4lS@$LBmWu7 zauk39!S#;~zy{F`_nHwQ)H_ie=f8r=G}utnA;2(qe*o(XMY~_O(K%T2vd(7k>iePR zMAe6neFZ{uXNiK9r2)gO-X>&DljkhC_&i*Xi})sYtpUhe-N!Rg0<>lfiC>o%i!1Ns zD6n^+)IS<4T7+M~Rhc5b;^xZ1A?Uwcf(Fiek%Je}p_GLZ+`QP`7Q(AtpCg(Aod9gd zx{)^m`cn9aZHsY*$4&}^-QUk71K(VJ#2ExkI&R`Z#Jvr-2u;C${GR#<-{4z|e^`C( z|F~h>zv%DrI;!!*uEtw}`xao+T$N*To_%Ca;QcMN2t_Wx4vedC^b+!fIZ~D!ZI7-? zz2dL%Qt4_~S?)7x%IKn|ss2x`7WDJBLsrmC)7=?_?yq-;WM-7>{WJF4#&(WMb*iKf}sXMHC1kZhv(vCpo`1xmka&t`++& z;4R}kHH{~rn87UgDVLU$Ehpo};Z;S3n81lMF-sEWXu zHC;`m2$g5hij+lfa6hukhjXX=HSqO_g!sI)CcZFofL%I@-ToLNSq!s@KlGj(4uQqS zhpU_)4&@~UVTN+EG{$uwNf<64)kH&mz^uH_>>OVSrz(V)E_h%wU#r*f>(>4%X=vd1 z_Wbb8#NU8VJwsd5Z;;{Oz~;kUmkNxMaZB2t#WVBvfBX6^B8k3aI>Yrwomx;R{NGVY zP-VAe=Mtg2c+ z5yKH)?BKKY_<~SDi*PK9ZgD?B7%*~fx8k@z)MALK8c2$0Zkc$qSF!x|uD_gd1vC8V z4#mvk?{?oHMDC)QB9q4Di6$u`vYJXRppxPqiYOCS?clDRA^;{0945%wn3ie+kdalt zo8o~Z%S}EzxHL%-IDULKVJON={+XMnE7g!90<_(}gwpD|!_d*{{Iq^V51#C~)5r6b z1$Zn`EnJ!mPn<&-Q2?x=H;}<_r_kNKAC?!B{VW}00w2>a)m_uh;lG$<6F}6GSd5fn zfRS%k>Y^}Wy(Y+w690m?dnl0Tby7xgaO;A>$iAz=uyKE+!jLW{{n z=U!9GzBPC6?>fFYZs!{AP78`fjLSI(ZSEKRzBx^cD}VUi*Dsy}wur4tCa&-?pKMLI zRHxdsfX$E>UmEP=3TCyTccgXpIEGj58G<-eh8E`kC%`b3kq8pNW~ficwfi3r5Eq;c z&=s=*p&4g*3A|7j@J8^={QX_~14)*Drg7-vhGoW%3XLYZARj??S-eg!2W+ob)d%|s zws&9%RMhFWk*bXwE7_IluU_}S2dWm4_cUYIcis=zwtw$44$7}JR`(r%LJZcWcm-j8 z-V((lNb0PaRrED_$H|@NJ<@(egXhXD!K4b$Q@;F>-P1+m1*1Qk zffTMZc=u+V$6+FVZ`MjO!^(i&N>sKlUStD8w*z-{xkO^Wl5|g=dUu}y_YF73zU#xD z)%L$$J3y6?SV43~w{K7@sh(nu$E3~mmN+W2Iso-KWoq37?k z?er-QK0$;V7CZy~i+xEE))b@lLEU}j+-Ok;0YzwpLeL1X;#Rhu4 zbbL^;6N0WJz0s@;q5Nq31(xKYnP_0C{kYfeCQFSpQnm&Blw`*8t+W)VXt^%hB0$kA zCgnR-(UKU7dQ7&~?6Np;BL7i5M6J@4D7cM47E43uSWF$*najXv6fAcfT8-Tcgvm$& z5~&+zT((8y+FSe{+7{$uV`dG13~ zn!!+(5VALvmNs;{B?$LWFz7OuHeEuUiNksbTXW`ygzNG8xdCGowoFib5OpYGbQ>nJ zew*v@NWC4p_&PQ?{d?a%4nN_BW~g^q$UP?!UYZQ7aQh1;2}UM(H0Rvn0Q{m$v};SS zb31628o4~KbgM(gfV2Mi=nl*F(V!c!?{DZwV6fL9DQ=491pR=NAhwK@OG5|>kvynv zrnZjpcpfy!Z45(KU8T&1p-Si}#ryW1(3)0wO34SDWdT0pY;KK?B8Jx?4%HnVST&=! z2zatmAeMrIJzfCDnlg4VtmY8ZJcpw#u42LxU{FzCv$In!^P2k|h6OWyOfv_18-|JW z-h6tubIb0>Omy%|j>IZ+Bzc*W9w!ZNbtS*W!M1@zjAR)0JB63Qa|NJ8eQ_%WO8T$# zuw&il1lUia7Uq!m%5j{@`n6tuP_wY+FS-o)RU-UU#a_jdU^CMKUKjtB1ETgg(c~l`L;8X>d!I3QP z?`3hsVG(tvXWY}?+byk^r)$iMvwbVDt_>6r zug&OhIHM9Ek!{;ofsw^Al2PCW zu@c(6>Z`ygf)UbbK{7#Qxrx@r07d`^0fdn8*(}AqS35OwRFZ>c4XJOsSiQ#it-CcT z>+S>IUWvvL-iU{}2jX+HeNIwcX9F;)3{7tNY_?OquDVucRsYxCD%0g3J_}JrqBIg` z=Ke^}@IPzyb%$Yo-g_tCZ29!2xi9!a2N{kQ>mTs;oRNvjpTn0lY5JVK<-Xo@@??#( z-TWoLts}xD^ZT{bf^%I4N_QPkrvNMLxz1FxVykTQ0ffs+9R;P*d<7Ug5_2*K;`N3R z)l(PYS&hn1CSD$;Lv<#N^}<~UK4RfFA9h^^UmJ;+PKPN1VEU!6#!p5gV3qzGttW3B zwWL6&5++I5rewIC6wh;!vSN!j+FN;R#;Q~LNg$WgF0DuT)GxuZwym$z7Xd=%`Q|v5 zF<*8gdEk(OMvag;%qwT1gNpIotg3kC3;d&=+U}CwtGRY9OsLJ?`Wyy7=TL$gj^WE5 zlB)*$&WNsrs-Gajt42wm^sM^8>h_Z9V*4Gn6SO>WOdz=W+DN%D*Wz2bZ3uCs5A9gA5Kl0UtS5{8YGiu8}WCb!^BBlNn8TFh0@BG zcO@eRr&_BAd2>`kH3pg`Fgh88vC!_M;Lr#LKCM}m(@&ejeCk>|KuDFgj5UGc_6bEL zJmFT+Y^$gExbl$cY42YWd}%OgSVHj^2A%_gp(hfCLgw1UgHpW|P!?uHx-yBjo1&*M zEg;{9seZ+43_6)7Y`dTS8C9vn?IASyduae1f)1_YMOe%Ar<`T?_ax^a;V7nQf}$Qe z-Az@YD58s)or`9YI^WIYI+)P~M9Q+Ow7v!l@;mgy7P== zmIdTRVNh`@rp!$&mC=j%4ss;O0$S+_+s4+(Ae|j3~Jri+W%YSIOW@)U7QDd zjqxoMX>{fQq&nZJFMr48ogI+dwnYfRKQ5*;>)%`!=3%XXSXAtb(S9#IfB8S4LkA=( zDEfcfnf*IHY<+{;>30phEi3+nm5UZt?5?;O*$Mo_DRRZky6dCb(+iRv=8$Z^XZ31= z@X4>N4eebn5&RHEwZo6MKDUjlsx5bL=ghgX~@5VcV*AzM&HPn>az91f8%A&-uP+EZ<&qzg%OaZ zj>Lg7p}zV^;eJ!N^_26mN6z7e2^5oJZ?kEZL64>$^f6~IT0uW}LlTQo4!q{S_;nMy z&%)+?!pr)6I3?2W^#!n=EZpn$5An0U^&_w&Z__X*I_x=MB!$0C*XKW4fZpk18>)i# zYGiEM8@wq(hqQ#v@ws2QFkr8+@_m1)rf|K+1q=!XQttAnSyYap!6f!lWY#aXt&z04 zOoYld=R5m;!oE>^$~+`^{-sFeC^;!4<>oq!$cfuuL~FbXoD6eq!T;kvSuqhhFNz42;=86m}qPgUVmR6!!1v zh_tujpY18$&K6=v6SDz`kX!2#_6I9##5(C6RAABL&9!L)Q;8F?by;*s?G2syLs4+U z53|}pAIdz_fLO-zQXm1;R5@{&me}=l(?dfpM&;Neb z!t^NaHGhck1pTU#&M$o0{{*YvFTox5+XUOTe*IzjUT;IMdDXUHG`Hd545b~(akT66 z(tLh<{VJW#HU$n&{=_q_!=nCd9<%c&_gyS^o>Gj{ScHFJU37q_c{rpdS5QRIEe+a~ z9Ff3Qr_vE(y;9Jw&)ub@fCD9x>nDO+Ro(RJpmhTS7*vAD-GvcTGQm`w3E{SAsR>RYSM@B^+3M@K@TnJ9tg12 zZ$q6Ewccjr34(iM-nT8M)en=q3k%8!@Xri<4;rQRE z-YRI{S1O&5?32)}Fn}_Jf!yYOoln;?{iV01uip&#nYzniVq|*Llc@Ncrp16}n2Qjq ztPV=`O2WL>JJNTFmp4{`OhOh1HmCj`OKX8&W$eBN>J5H{k>cQOQOJnKd6B4Z~s zr&)f{@xBfSnBL5S6ZLv;kZ!L@yUpDoo>ee7YOCw61o zPGhS_AHo>-03*tXHwcGKAY=KYTS?)^MJ_WftA`8&tD?n@{5q2Zy0SF+0cOPX&k zE=hMcuEULx5qe9z)ft(3A$)0vV!hERA5oJ4oicKX3IIub%iAJ-s-rFuUcasJ!@9DZ zlz>tfXnYmTGn@h)KK&C@7}v;ZELw{QgL2g$Aj**jt=J}AM>6eMK!t?C58!VK2uJD#HWvBSvebC#cR%A zfZyc(e+0?K(V%tS{0cE$Q>!sxWC=#FT2g(!OC?K$$DV}E=Hqb=Cqsv$U5N-u!S|;) z)LYq1{rQNg7L4A7&TSuJOCwp2-1O)(uC1KVE0K`qCkJVs#?K~+Ye3YYYiJBjE=;~m ze zJ&c2H+uFQ4vAmAjxP|W#13Q@C_T2cj?UoYg{H=s9M#bB@CO+Qnv z`AN^1cxAbL@`p~IlPB}${waFp^NZ0FSj7`ja2L~Q;ZE<*{)Wbn6VXNF#H?e_pq-{B zaS6h0X8aAj{R<0+v_Fio6`V(JHq(m=a5Bdl~}K z_qi}(RCjUkxI9;f6s6MekIR*4!`B~4pNVcb5SkOa@k{pAvtiX@mz@CdWm6au$h?zx zFnB5b8BZScso}kQjS^0UPR|sO$f89&`{q*QO~4I-pkCO}CX^XbBUXYG0{KzA4q+74 zaaa`&-K1T`Q@M~dZ2gt3f!G{r;x;6kn3fKK{cCRLDeh*BuxTILS4xIf`Whg)M-ogW zJXN_-t#-I+=uJN7V)}^T5q`R>pPV@2A*>fX$sw)>XhlC>5wgu&%U9Akd zM~TW;u!`l?(^WXpcH5IYuF*%w<6;fj=k#3(GcbS2@K1#RBgi8xElhE-RaHeN6(Uao zHY7OGt^?=`Donw=v?*f93%odWC%|1r$w{Ompe4DfQhSoDIHrjmFmgcj+s`%NwvS5E z#@KHw#WAhSX1^iInsTqvXJXThQHG!%ZF8^UiyT2!;)?%nsJyPUQ81)5Gsd<4Ck_34 z_W29_v%wO_bH7>nZGivh+irUF*bJR}L9Y&p8*yGCeQu%Wsw5@c1w6Sv8nl9i_}_qQ z!h^AO9gvPUmAi2e((_sfX9`xo{iWwVj1>ikVMuLF)v<8ns+DYmrU!{x+--^~?TB&0rv*r2cH+EY0{@}?BQD*qk zrfJ>^>Q7(87a%a+zX+_-PLxN%I6dYromz4a_B112hCTj9dv$Cy;rY%%_;%{Sr|%aa zRVa1@H^O^6yrp9nKzqFXXx@mmd)(6GwdaXZ{{@FM-bLqxn~hO~RayiPhO~-l)$ZXZS1R*5(xu0_A}lzr z&@2jmni7cx*yEHbEaVZy)a8N%oNx(wFqy}ad*Z{|W6l{!GI!*YIlWV9^21`E11yXWI zTY`~H^$Etf2BtJO7^sK#QRtFH;g-@z?Y!_icu@|}yD_S}V|r<%(Tk)$P3my3g`Myy zDhy__d*lV2kZc%OSOjs@kq@LcxC`i#3NWggz#Au4O{RTmbWSqF3Z-Cgg<@8wNe##~ zS3|^XnLE8i9rhneFsj$iPsZf?;CX}qL~pf0hsApHCHD$iuaf&Xs(bdo?_P?E$@rDt zo0t>IECB(wk%#|J)AYZOQuIm;Z9|+$(gs9(ru6f}%MRt8Z?;;I+=36uq`u(L5ukN? zj%Gtls3sS5@ZGQ4EFwj*>|qXu(xqAAZ1p{;cFB8IdF(hEthI7}@0mI{%{w4xBOTW% z*3^|0Y1i3zUTt&Xx-j4x8SR$c-~I_0jiy}Y=ktg+X?u{wbx8|N$)Lb(4Ri=eTpE| z!cU72u5JdPIc^}5Gp@J0H+Q-6@=WRD&y?_nS$t0+mPyB7z%UVT71=uT*1u_FMr2W`C~Z$;44?PSIw%kc_N=fE%7q#>?0kVJ zE$4|&u=LBLFGEY>{z)isL;nro+9L>4;$;t6d{hxk8Oh~334>KH7_zgTYk>8Nz*DtE znC~9i+REfr;)k<3%6tnoy~f8b9cEy$W%7DUkDl~d@aQQs$7LgsDlCeDrzu7kA1rJY zlaQ1^kKIEkenZfh#+!W?>!cSFdLT)KlvGgHnA4!fn-}1~8Iv6SA61y#Dgz`i)b%0{ zlPCIM+R0@7TXo09k^iFy(e}@>ave>H15OOD(1@z6mJ_62(#+N6bkEaIY0jDF-jKDv z|0=~YGqL(@u-Pl0!bx>Po8zJ)8iUf)(b6*|)m#v-8uUK*&*0MoyB2GWK<1nCEe<{H z`Jamp67bMYZnJ)&+1JtmoZfvtTi{El#{2Pgy60~Nma`uTn)2H+ch^be=Z#)C=cyuI z+S{aE?zqC1@i&JAIO!uSKFJW{`sb)px4%^f;R!5TY6*-*H)f&i*EuN0_0~$SemQP+ zD^f9uwdCo+eZV$xm%aHtheuIZ(0l%X2i_y&jTb}f} zG`Ax-CU4QLvaR|OeWWo=`#75uS#!8Em^1GX!@19q_)w>sc`>7|mnN2OWPHB2KN{y> zNelg$Lh`52acOhANfDs3z*guSjt#nvO|7P0%8PSgyUVv5&}747pFs%m^sAI?6JuOK zyB`vvGTde0{Ox5;*OA3a6hsyCqrZ$MLR8K;#L`ZNUG4T4wCj&NMCbxpC2_=QhYKSu zZV4c*;DgqjR2+3QkN({|I?aP_@w>X;(r-&VnJp!oFD`yKJsE)x-RsYO$uvazF(Y-bj13FDvj`R%m~DJb4;N| z^GoLJjUa^I_>!h_@O3pg33Cm=t}d?kE*lym5J4niD7n}!?%g7SfMwS{+>A~e(y*^x zT@kG~REno>KH^P1zPQ?O68te@X70i5?{dt@deJ-^z3% z@IbXLPX6>vXwl>t40Z6EG0R!$KaGojE%BaXTVlJ)mt{tB-FTSu?#0*_i4F^X&a6adn(k$7xsUvKCLgx;WYR!1PotDM+ zU)b!}BYV!a@x0M6q7mPqXrB6{3&4?&N1FZeDhS3je3E}5M#8U$#}-~NZ*T>%P*2WR zXn0A(;J$A+B!!Je%y7EBg(o%dm1c>N9zQs!p|{4MK2Cm#=_2Xc@n}mts1|uv(P0~Y zY{k4sRSCo1@n6%p+DQ`(PiGuhCAU3Nkfv;s+fzOs9HtrcEs@ScHdji9na|S}M z>?s97K*^D-M(nXVd4BbsB*Y3YXR{??%{*E?fDC7%mWCI-jvi+#jQGvOYgGc*#=kDZ zP4qj=n&)2Nqt4@I$}c{O>zV8ceTY*l)PZqdhz!4?fOMYCDnkNB3FlK4R76KIS%?lb z#4A3IUTPetWc?=%S+jiM8<0#P3_~i3*`5y9&Z^B5+adOZg5pc~E_?)BV&IeLi3~Lj zB8{iZ0Z(WAG(Ik@5+Tqt4$nG<3ZcID3nl2Lck-nF;{a*V5VrH#XMM!Y<~v`sjqsG$ zNL5lW;5#M*i)jpTt~@3HAeygpc(A8f;Qk2Wo1^WR5_ zbA+j%wLxD(2;q%(r$*vH`dquTfEWhDi~K6>W_N@n#(sfu`mpCix@gUPInchBD(H$I z&%hJR$7su3e?G`b7uv!P*!#i$ZlCJdMpglw>Y4>xAUZta4vw8cY}+-{KK@(1iQ$-D z>9XZ&`E=Y3zAsu2ZlOg*OaYAA1}3WkF%bRufZYWF@D&w8DU!huM64^wL@EuRuHZQx z1EctI70sh^)#Q2)NGap##Zsz8DdFeeRIIhw{*Phj9;uS7g&~2sedwYQLGO z7K%|^rGb-F%6w*Y^{r!RGLu8sRyS_Z@yw!(WglBsDb-%a1In;|dZE#LlPFc>pcz0* z@&sNjiXGP_PWBJrPlEP+j*FBmwq8z>jO(SW3S>~W1`vuU#^_+*xonrM>=a3_o%PfQ4vBgnp_&~K`7-6Lrd6=4MTis z3L7;={!a|<*jD#vhnVnju;{R`Vo>Q(yGItC$fKMvFS>}P#1alMt|Zm(4*SG zHi4ago$Q;d^-dD%Fss_1=p|S=M90lDDi|QOEJE*x@KfRB1llc2RAn{kzlP9J(Dz}p z4QW7?ApTW#vk9(v64RK(=EBLwmQ*>`$Vcz{B?u`*)xQEygle~eedR+-J(h#5SJdwK zT4+`YF3o6yvc`LQ+DC8vq6HqE_ozZ_k6Bn7^dt^S1HVJn;3N`(VEyMOt94RIgemIO z|L!d-J#Or5K>t26Jyuryk25s@Ty*S*c;YC8-w*9I0@E%sb-Ly3q5QrK!$mZddH3d3 zTfTBhmnVoTu`1>IOrJ84ylGG z`JrCVe-&K5-k`mGY?XeTopHa7xYY2OPh`03-R86NHry-&6*AVEa?Ke_pUZSIzjnwF zw%S@!o_#eS5v

;j&+n>v-fT>TvEzcP0?0i1}-Wj-k7#u^yWId!G*=OC4NWK);Hi z64c~r$m$%}HFdljhbhjUb-5cCsk|fJl9DWfUti6N^e%+=ZDKX6XOKT&FN-MmS+v{9 z6LEVjo~lcmN5Yg5N{T-2{ao>_Zzgx5LukQ#=9entKrEHhV$AXWNG3@(aXJK)h&n0C z-(w{6LEJlz+c+f|>$cGLN-&y*r7`J`M|T8D5R6=?(rLa~Sfr#hv8r>ln^?rqwjh@6 z=>d{3CYQ$Ol;`jf&F6g~+q5;Q(eABANix$VW4+kv#n*ziwvbkGQN>xZ*XAQWO%00@Tjn zfoCGhEy3lv6%Vd5E5%I54}PpBEpOnt_A80fq?Z{*K{elZee0DSK}VgAVa=Js@*u$8 zY#U*5y8=$pvGjP}=Xf&Gi!gRSm!(Fbe~~EWBcv#HE~-z&9MHfJr5nO8gslLmWiq$lu(pJs$cg>fE|Nz5`U3<)u^PG%)$Ifi2VO)_aiX)`B&-qS5yO}s&q6b z|B>wE;&hk5`98x>&<1%BSuNXy@eWn{BBjX$=bCQ*7Ysp%ypjT(m1ZJGg&|lV{ZU(G zBn-_gjfA(FCC#xt8Lqw}cMHE?TDp&1HybqgVwOHWv0D9gV;=rJvVNfuFN~4+iOjid zy*wx(@-jd96;p;vwaB^B;>s(mB?KXYeam4HU`?V3>n^iPN6%nTYS;56}bNt(u z+2m>_$5N<+=1*M9-7e!Fs;&4O1yWaHtoLNL)$c*un@Cs1$K9`Fov#JNA}A13*p_L$ z4E{nxu5wPdx|ZfBYw*?_SCTEciprme`?fw{ed&iffa3FnCjy@I)FjJmhcSopFz5M$aINU{ zUXU-^!ee4VQ0o$cl1+7Wx;&3(A7|dP z0k#@@7?BWI)@}elf8sBbPJ>Qh>W#tTiD{}M^UAh2G4p!ayf>pbMjBLOH-`e7KEu|z zv!_NQILTgEsUqK!{-jXgE*rT13=EPX6S*S+)R+<5l-h96L1DR~XQR_0y`wVe@x#ay zxtMBV*O7x&1}E)hGf*TyiQu%0cyaS>QDM}sT}+K2&>bxWs=c_4F0(xrs^M#^*(P=^ zv#LGr#N-CN2xXNnio~Tvtho?%e+LV=OuBznjZsBlg;&+68}0foXR>+KmV|>aWuAZd ztuRY&9z`hp=m-qL!5Hg<%l`VW#aQkrHLTyx5nf9C#xuSQ=sRBcuEX;Zq%KV+)lH=8 zOU}keD@`Y+0e^S|2zF+*-lWlk0#e?oN#Gm zo5c{XXvC!AGl37z0Lf67Vnjnm&AHDA0R ze{TN8`qbk3mN9D7G}HS2N#f8$g1T|tZuH7>-18X!$!&QYIw<6K%+j+90?L>Ac^!bsixFBahY+ptG`lW_d|$>kdky)cxi59(O;gwS=ImHy`&H*q)eGz5mj zta~RX8sJRg;nZx?a4KYEm~D4w(h2vQBD|pV2`{1=>V?tB4_lfO7>i$*&Bg~MRC^P0 z?R%VeRx%^2ZDHb$7KhTVCeR3`JhDNK`a0L9xr!VC1AU3<32iP%j9FtIE{}sf{cI_| zl_#Om>yI~z0nGCz*R9biT4NU%MEPB(m2ayoMty!hYrf}8y#{E|s7eGs=(Fo^nSE1k z7NRjpnhZT>(%COE>S4rUaSDvbuJIZqnLZes6_BwagAoX-_Pbc+q2xI-)fmxN0(Y6D zQX+z6L>=b`y_3pyslUG9Uq*~&P|m01z-4Zy7x~uw@bXd;legp zCxHW9-+bC_c{}_P7zz!TQ8wx0iXBj~nHDvCgeghrh2%LPcvm6j&k(V;f*8+k1F10g77!%7tk z3A%Ph{lxwvE>Q<5U7VPsu*%H$W;V*F@mgAaopqAZK^Nx4J2R?;boCXRKXkzs@N(qT z&!2;ZPWGIFvR@8S8UCKCL-^$cM!G_keHI0!JxHxqb4M&rvWVJIp(mM*iqLOQ+EcHZ3W@wuW}FAc~A) zLBtUsDklpSp`eJ+1^+?LQdEIGB-zWAd%=rhZnY6@>0) zpljK-{Nj*MKm?O=FN>r<*BxFnm95N(#;jB;!hPUtH?#aS){r~-n7wT1Y!FzQclPuY zJK|Bx$m@@Xj3K@;=Q274T^Go0vf@!l|7Qjl1yRwuBc`kgAuuJ>i_Z2ktU!iLiYq1g z^0i?_aWo2Oh!Nc){C;vjB3Lbrm^G~B{yw?ItK{MWx1kS*BHn7@j0N8PQbp{k5*4@t zBGZ2aB|(#(bq<~l$c29?uP&e;Fzw!i4M8i2W)^@^RjuXyX%0f5{0l-XsESn21%GPk z4Kv(@ps^GUC@*|WQyJH%)wPvqX&&tu^_96tB2DdNSJ1c~{2vWv@z_-ga?q@Eu2jc_ z26q%Qv~>wgY*TJ|2CfhzvFSq1Tlh&vpvVO=iAioaoWZ3vnk3fq&L~x&!|W2WhRUt@ z8WA}XDs7NNg(sj`Z#W1(NCG81Ui9lBbM_-mJ(Xr-s!q%-ox;AmB0ynGOm2qXJB{@) z92%eI&bNOPZu#CU@rX-dHu_Uj4yU==L;rqKbqP$q*KfY5Ae33e*Jl>bV8u=F>;vog zs+|K=5eQuJDgc;+jo7v`Zi5LY5f~y|WfbH>ml}f#$r?jh@Z?gt=7Q?WGT`BLDi}SW zI(E1NWotfF;)%N9eMZt|YCB)ON}~BXK*=!BX`?FjAAQdMeVq~?w&61|wj@PQoa)uQ z#VzhtAI~!}YzRI=+9{p-*S>#ZI_2a%AGh5~+8WTbhD6Z=u>1u60l`z2guc(XjUmH# z+)Xomp4F|_Ahc|DSm^Iao9#+gw*AhOX;s4PGE8;D*X5(?Fn%LaiDuRM!t&x?i*lE< zd(S=noaOO8v?=_4*7ExoG21j-k;u4DoDOA~U|;YDx?vL;EYQr^R=Hid{WLUyr|G4r zT!$(50R)UU?1(}{&Y!m*+T+bNl&M(oVwZmj4mBa@&3~Y8Rr4j+EOxhM!f>=Ov0Fs9 ze&v^m=D*U~k>wG_xM0M*@#4rdvkL~(0dxUFWGO?l+PgP{%Q%I<{(5Qbvp!lzOXq5M zazN$=bbg+_9q=mmjm^Oo{S{2N3x=yc8R4FSp9z@aM1e&I(C|67BM6 zT(fJn?;-PB0?DXs4h%>AqNUXSEI=mAF_Cw(PHU4k;svM7eyO|6P^Rk)7QOA|nNu|W z2XY^yjC0|pGiqB*W>Jp^PwDSB-C~Tqt@{p_k?1^>YmWP`{SNwe2Vvt7QuY|8j(Kzj zB{l1`U*h2SdfXV6bJbOaUr36hUTl^o%m` zO73ets~>igMfk@uJZ2a9iK~rm2>9m6Sl4TvG|Qysj6I}1f5EnCJ8WCEFd7r@escID z=1BX%Q>K#~Q^JWIJ=66DwkUQh`}i=l9)&KtH7h-VRGTm0b~Fo9!4b2t zR=mQ5u1)l3-6#DlU6ICDMkiySN;e%&2^2;s0ZkMd<`5ov0c!y~Lh^G$M`E8{uJg>U zTXefEh`@_>D0m0kf9GEcw~!O?2th`o{-YK}CAyA^rcex?24iTlB7|TFFPNSJSGZ96 zOIVaPtEMFDY+!kC`;$_EkY((T;PR1_{)Mk{5#Ygw&W1Z}`s@)P9Km_5T@?}1-$5_w z?F(JAluyaIxYZl|^N~sUB(OtiT&9Pc(U*RuvnNiNT)s@q!)r!Kw14Ce&Yt4BP<98B!&|c^EPE z@;tX4FdkOLdJBw^xUjAC`1t)GBembJY(`4S1{#N0M;fOd`g$qDhq&7r4!p14RLVAL zk<|gdIvr%6vgfX4AO54dtV!D;NF`yKaI)}fG}34qUna)9Z5$;ar=@mO+V8Db;Gc{^ z*gkw2^NDNCRrkDqoY ztQeQZ&&q&VQjgo)Z$ zxO;)|;2(;7dT~01@JgZ2=SksOj$Wzq03~*@aevXfkBFt_P@5}lf+&&leIp9f*Wrpl zpnCSM0nK5TWu2RDDm;__$7xS}d9D_n4QnBBP(vFcVIL1uhS=arw$j`}b}>5J@Eo%m zpPWov-a2?u<7?DfTe4cbTVXqn9;8KCn##<)QOT*%2RnkDuTHf>VRrFs-glY;6V7ci z%ne{9M~k}TSI|I}69Z$FF%iS|b@p=Mi<2c;sKCI|mN&sCC)dj3Xy7EK@9Cn+pmj=l z;h4mh<+op+DTaxt(D;Y2k5e(uj|D?8_>kJWDwp`Oz!sq&z-|AVNDO1f1hj{3J{S%O zhSCIUKXMHZFK}}%@kP?jQifGi^$RC_1wE!%3@rkPk2Z-1gH!=aHBo|EvN+M3Zjf`$ zj!LW}Herm1m3KCA0L}_HADO2VWYFP`0gZ`7U$&A?rq7Uh9I#Ijvxy}7!A~2$hG`bBPvaR>xk4@ER ztmRqw)&pnEviIfQr0W1;GTKqm*>V`)0J={6R-W`2_7IqZv$7<%8GwXE8O4Xe6&oiS_ z96b8B{Y(M+aQF%^Ps=W}yF*I;LXPG#F&(A?%{`Jhkd^cdj8o2FBAmoU;qwYHO#E|; z&?P{($pS>*vwNBrG@INKQeqtye47@2czW;~A#J&FJWk>u9%B1fvbsJphQ^Jj57m|6 zczj2LP08_n*kq70H$4tTGwAD46qDT44B2?$ueoQL&&5(^b}HYfZuV%r^Q@%1w;RTXx=!~$S__=oIdR$;>L}MtRy`9n_q-c+%eic>AMguf!z-fji|-0jlAD%V^?E?n%PS zN&F+B_Uo+|?OCr~HC*`riy--bpR`D5QSe|Rm2MOPR8Km`c{WZb_2)G!(CT^RYD=cs zu~W}WH4^jZVrBK~1;OJ{de>2fLA=ko4+}rWy5HTApHE52Hz6(HSIJ+M^kHG3A;HF6 zcoNVr^m=4p5INJ{O5bJhraiT(M9K7(WmdNWR_OLdva)p z;dRL;IeksvlPRkZAgFZP*(;>W5xVGr4reB&_ zgh0M8(Pggx+oYZG_~?iofoP{SV=;wlWgQ>8W~T3q$?JU2xAbP3Q6oA%^!u<>2&d1* z;kXxLSv9ET-8gw(D&+tlh>!W}Gg5R=g?L>ah50@`QY=}<2nGHv7i2zb~M*s8B&T=wgBnB-mlX|r5SlPaf9UjA!NB?uo= zM1rpkPDR9yECMpP5T4!?n;d|7X87wCe#;EX^Ws|n*EMMLdM&?DrjV@c4n2fiGD(iU zTuxJM^QRWaG5+?u*<@R0*K&0Qm1cPbYwos#mBnwaWssS>+3(D4{w?l^Z~kl|F;ri! z7+}OXOJ}d1Mg30WM>&)=r55$-gS)~J55&z9A{Ks2Y+yN;YEJml{FURkp|4P5^CZD<-$r4}kn2u%;>diut|G(c;)`XJQ7V`C4?EDm$Nr8qcf$K%QLpN zG;ph4hLOEO##`}eb&ZWV`Af;y#=Ui+K=*!U>oE@l2ZNl?DDcNybTG0CN)rTSK7D>) zmbX!P{vLz6kt81SFHG=UDsnCv#yNvuV>IX;sXwe8@3>DZkYRWDt3%q^s&|FaUF3gz zf=i<_0EJ1vPBKC)M~{BO=EC~2ToLWev7J5iGWDYL=6(6p4-j&~EJ*Uh-mO1jwa3Hi z9|=SvjdOF@^j3Gc+?vnRzOT1Me&tH$VOfBSSI4_VhI1)&jsuyCyJg_6Jd#XwL*J50 zAL!Rk#vK1hd-vE0*U~jaZ#y~@ev5)o9ynlt8^6DN?M)@sUVVI}>g)Af&Dw(NybSVx zcth)X)v>-0kH{_d0%R`3!0$Cfx;`lTrW>cvYfLN{x?enFeZu?Rf$T)~TAe;cDUEOFpq#k3x=Yd37dOzRn zhFAp8OtQWF5pT+LcC&n-(C#wXS%_Z#dRsPMQ0f`X0VCYRl}7Ls+DQcSX0b+q!(R%- zmBL2!uuXY>Ob1GNaozdK2E@rD&mx$(QfioUroq&rZ}yGzjZ3n+0@lpr1fqE|z1!h= z8g&1_8c$khK^5TA(pAkIwYBJXRdFlDlvj<2X%6B8aNZJXEyq(Q^+anu^})O=R99W` z*{@O;kmS&E+c6;ns5oLJArHX_w-$Ywh4Z9XguW{6X|v-K?bD>i$Od`43+giYXB^(< z2U>{}y?x?Tca-`-Rtoe6Z!TOn*x5l^iQO>i*TRAl+PcudjJaxOZ=o>d41`pKJ|g}L zBlXMVYitU;4&Ss(fv%=K_7SA$iq_fWii-+l16|w~J~E6lV&ST9Mi^|tQ3aNT5kt^9 zpu(d2?+vhQntw-=0x4#RDP1T`OLVID6oF)JYq8NvU(Xe^n(~w4%2MhtyBF(UCWFi- zQhQ@(0xP9jkVOYc{@ z;O|gv(IaBYTw;eZnAS0C+ih2V;37I8&Zjy1R^{a?y+zoavLD8H${SH4*Q<4=^R!a< z&Yj~KVw3@9tBa=R5`&4ob!VXGxv1X&V6QsK z)0#*>kX}RxZ7urnZeRhFMlR9~zxK6r=@i@d@HYMo@AxrX(^X7L@HFjp02{8K3daeR z`Te=2ZWz;iMPn;$$(0EI(QQugjEY6yt_MhYYTUv=j!5OayXbvZUk2HL}|3}Pd#(Y zh}z$s%+rw+-z>2F__}Wl1?13N-tGMpfC4alfXR)_t>J=aJlqs6WOJY~+0K?I({TQ^ipypc$M>k(}BJM1mOqbjy_yL+rQCcl@2vXm- zwThMk+cFa%bsKNtf&Wti_D)`3L4S>-t3K6d{Al&i7ca*YH#^x8#P&4R%&$bS7!_o$ ztiLwfuQxA%{f1C;571uOLkhiE&0fC;oS`70*-8@`!P{stcU8`9U=EkzA5h^>Mrt!td_wg* zz$|{6KZd3Ytt#qIVByLZHON9@33P| zmLb#KMd)+UZ*Y9WNR}qsyxD?oCOx(7rJ2R{lAq6gtYe!d?ZWfAlZ8m3LtlQJX8tZe zAeFb1O}>x$YZ1XpM_8#U?l2Q!_4~om6noG1?DKG6C+zsmbVk+fhmdQ0`>WD!aXQ}H zsywaNxyO-y^K2p$hMB_gRpV6L_ET$3}yYVU%FWU=zym@(qfOM zewu1_GH7-0RFxNP0hIf^4D?`?XM9TZzbipMxy^odhicYYp3tIh&nxUUtiSK#y?i^4 z(V<@2AU)u+U=5hi#r^2!HTlKMZ1rT)cj2zh>jQAdfTz$reZ8Anb zjQdZSHw_gbe7472-haBoA6eb*7q!1@N_ zMK&p>!C+mrwFD_-=xxZc_<74s#kMdh>@;;MX>1+>jYeOcN;BB2?@whPK~*rL9=6YZ%Hyy&1$l%c}>k6WCFf_B89XOJ$$qjSNl8j6{_ z!2#BDtj_L}%jn~JBzkp7so%=~(us7H?PmtZ%tq5~b;k^6BAEdeVq`-JgD<1R0{5vr z{UE&Q&n$H>ZYh#W4E0d5p2DkfxcL#=x+|yk7gLEE+7jfAA4>jzukw;$YF9thlWoRZ z;<|0TlUy#sx9?wESggCus>PiyEML__#!kL(YUqmsd4u|6lz-6Fz^q(Haeq#;B`+ptcp@tA9o8`+&mO*TX0gJCyMld8tITk- zU$S2CnR>?c0M%1xMGvjEv*IHeg)Lp*QHU|F$HfkM#E}+62gEbTye*VBgC5bJ0bTaD z%N8^pEcbo-$iIH!%|XU@Yv+cQ!WH7lu6AU{Pf6X&zNeHn4U9B(O9=*HBb6?L!6 zqz8bRYzXHntg>hrX5@{di|UywoLE=3HK3#M2TO5P>U#?0U^x;xP%K>%H+&gF!PXuh zSJ@{{_LmG#?{D}>sUj!wMEz@>Q>Hce1hz}&(f^o6P9#y-*%0sVf+^LFqKWsiLMs7^ zucmF~TJiOQyv_pIu0m7EA1wm`&j0f!L!E0)RN0V(jz}QS=J)l~83IUDAZ&Pi2Z< zj;8Abo0;t9zv$_#BTc;O{v34PH^dly&ftup8r8x-f5fna=RAKeR1-Ae4@{;UIRV0; z!9Yb$RQxi&a8IOJwt*r{`l0eY4QDJmYU@Rgdr4}rBY-)@T;fL~>Ea#Ix4EqX0C)&p2ZR0U^vvM@lxY$FzW}g=l7eu*y1P-Y3 z+kORpGi}?k?c4}y@(GWP)9vCGMc7RztsSK$y@+pk-fT{~Tut64~AGoLw+{H|WA;%zb-($95?gifPs<7CeIbS60Hytyg6Q_-ZN^TAJW} zv)R5&_MMmg4$pocQQ>1nYjptE)}pJZ z-8V-96m#zOzaoRHOj5$(QGuZ+9YSQ%w7iW`OvWmsgB$M+Mw>i}o2MnpDshH3DM7a! z9<-cE9Uk#;r6XO?#6>z%6rC5twiq-==%Z9Muaj7rvrB&zLl-xQ(af)Ymp6Eeftf1r zoBsR1Sb&o-)y0R;Zs$8bH&refBVZ6bIb2KOn<7{R5`{Y4Y!lf$_0PoX{VAN{2_Nca zW1O#jx?ZW$angN&14}J7Zx$EAspzd2JKk}mxER-CHnDfu^ zuf-I=7eY0B_ytBov!44K2ERqbMok&DYkD8>_R+{^Pl-;c$_SqectL5pVSbP=4^~5yX1qhh zoyZPV5-L&6-v@1R^i}qFfXlQzh|KGSJ*jvSi%J+=P=rXWf4hb+(?#EKw33Ph6Q2oa z30KOrq5^YLLz8MjmC6(l988xH0g8%<)HW+tjZBDyFGLd50gV>(rO3~)jE148oUgHX zxLN^kr)ybm6f-)U@O<*>QY%}Z6Myx{{Z|%~$u7)xra;Dc_TLHVb?5Nei@ca=VHnX3 zylyZGIMr3yh6MCOTUu6p;ylGUO?>T?+cDb$p%;9u?ZG^N32Vary^Kxi8!E`0yv0(T zc-m!|O?TgA!S(DHcp-Rf6!RAa#LF>AC1C5c45OUMcdKW_qn1~*2iADo4Ytx44qudD zgr2-xcIe#iFBRJF)cbVvT=fuqc!}4)UBvT~l_qE18;f{PB@+>5wWHWQK!JD7U6Un`t!kb=j({sD;9&xE{%ny z8c0vTy(x~q7mHc7di!hT!Fj^%?}r}>Hu0;S12*>R?J-b7S`HVSAW&;`L&G;w?C;V3 z^c?kT9l~igC<;aBJKDzIKtIvQfYv~gWy+0gl31<^BqSn36ih3_`o3RjB>2^POt z*rI-sdrIpdu?|AFhxk!5^8PgAaYddvmZr#3Qm;U)mn_N_`evW@s`s{DN;*I-+=>*K zYtbk^4NM_(BvYt2#68J3Z(0_2LE$?74j&eUJjOwSFya)s8Nw=6#;L6qE_VzozHi{m zNcE@Ez?_gMtY%Y^6*R|Ooc9l@PXf4DJ>|DJsUk0a#$_TVzgE!uqt}<|o|RHP-g6nx zMA71~41NF^$A&uw;0&*eB*Pd*v+)N+99)PA=rY?v)H-A%`EiOvtb$uf!ROYB*i?Ja zjweR>t4v(?*OpPNIvP8X4@Z06@5pZmaTT~0_$n}mDjtv=CUxtC@LHLDtvP*NFq2j( zBP-db1>ilRIKR(R<5xZuCS+**rW5ykt;ix5*FIKNszGTSazbOe1t+Qk45NIqV64RP z1>15BCF=Y=PDHjcXa$iJb1n9TpE;zs( z#FJLO{YUCUBQ4E_55fPe#a;0&HiQuEzVv3$K+?9?AO!FQ%0FXM0(s+d~QY*zYcf1x5%^7hLF85lE5E zLaxuWY}9kEzs~|~U~Brm{s@T!qU8L5(1JPWOb34J2+bi$>Jq7OzKw%R!iQ>o!IeVp3v@)yYi7bqdr&pbAkKM^1gm%DxJx& z{oxEi_J7Fwr|?L?Eoc-DI<{@wwlkAVtO+}|ZQIGj#>BR5V`AI3Pxklx`~UWN&Q;&^ zUB7FsTD7XHNH7ruLWbsuz})VPXvgWokU}&z@b7R9S7XN!u%z(VLWyTf`)ARmG7NI# z&2!;bzl8HJ+)|SfmEA+V7id@Y|J8|dFsC)1Ja;fM{@el-D#-7ESzl2H7T94(sMXHU zU8@dhV?6I)x_{~~;n%P3K6<;O#{l{>{@K$l+M?By4HVF?2*@-bOxn!WVnY- zFv-=q+9x9@Ln*R6zNlskV5+xy+6%%){7w+2NL) z*2+v!Yv*e5>4b@1^8Y1LBZhWYQ+(mhcE5_F9~19TA9z_s5j%Zq)D7KJP*0=%$$Dcr z-7^+6hQ)oe&zK8nz)`8_e&t>Sde4gM^+4KJp#A+p#*)7mQw>ps?S|5(D%U2j+ZwM;KDfQ1MXi(thX_-0RO%>fo%h3ba1=Re9?!a(!+i$*S-l64IdDuoA%h z_tjjoAFdn%x5y2>n8k%$`KI%yxHvObtio{N{OJ#pG@vp*KeEw>xxeS70C|cvfAqzg z>v)ou<{r6M=4&$d|Ljoz*{GD05^2Jp&CCyVt1#k~Yrn!--apYk_Zj`=1KA~S1jL2x zTBfa5otD0hrJbKl8F@U9KK{di30+jQcQNgEE^MC5aH<5%nvDvqz$Lj<_8G?H3V{(1 zG2&s84Zdzx9ay5R_&gQ;;v)Spu9nJ#Q6`fC9XqxxrpK(pw79x7fouiQkcm6W;`4nI zz%B+Q4NN=6oY+LVl^2Ft1U(5G}HgJjS8t!=T^TpMrEa?!5;}o4H2E;d8 zcRwO{#%xGZ5kgPDO+|5(qq_oJ{lB&2DMECs&C~matSo9kDO-Vy)sH@z9`bL-Zo#qj zOxTm?9YqH@CTwNdqaNl1+s~L@r>ivzdtyE3PsGk?>HU$WRFM&|ld0#`%0G=)xu03I z0+BWCK|_n4IVs5=(_>z;!zRrM1Fh;*Z>;>55bbx=pPOE2$hUIB@*=EK(VnG+5fMFH zfAM#|)lM3P;W+q(2dhzf$H48RF+MLlKy@k&$p9`vGzghOd(1!2*`P8fC(K9`P)Nu* zdueQ)Q2adJ?$7-n(A+d>>Bv)p43}?Kd6aa-k85WnoM!-^z)e>dG@JF6jqBG zKZl?-glzIj;j0?k#EP9R7O(|ecWN}TaO(Y{wVN=5Eo8)h)$Nl`kjKr2Cd-4LhN%+Q&=d6D;- zpU7Q{oczJLU@azK9oxRfG|T~0v@#*Ntd=xGk%cL8!{4M6Q1%ck&}zjNFc3A4ksIOu zmyxT30jz0Z7J2Fc=uZRISrN80AlkLaz@l1+hAxK^1B{E);HQ|_#3fGeM$)TMYpEqL z`&Hu2z5o#r918vH&>z&OCwvBBkRpMpkhZ6trPZ>djWz?3_bP1(;s4w&x}%Dv&Cb=cK{$AA??4Lw4A=sNJ*kY<`d}BWg;pZcz%u{^1Wj^Pv!mk z4eE|EG#!2t?Aq}jEfodV`nFK53;6Kqw-GA@yu8hvcIvyO*?zvBeO1!dO#;=8$BehU z&X~F$QmyTFL6!IW8kv}opJvAJNv}i7HLX&k|7Ooe{8(4CIREMB)##1+7l*_Z9VZS!i;rG0ga@X=q5nxK`gik4 z;rDlKMkL#~lbq8gJdCPH=V!YxrsgeR3&7^xW5cbeb$&+C!%a*zD4NoVw@9-sq(K?s z*Qz+_E1I!T-!9nxrmqP>rc(4|Qb|JX7{EF1RaE_{%G-94S$34n0~v;87OTb^%@TY; zl8Kv=?TxA~C67wzYcF{ic672^d)*sG?*ixIx^y3m^;UM`<0L7}ja+n`+Mls7=n%Q& zQHc<7Ti(V6M)GX9)QZ-_jq*dIw2=Nm4%^3Eqg4W(cLWtF!;N700}}#MG;bl{Z1Wo` z1u(>lmMtl_l-by_i;6>wO-J*WCljHvv2wLAcUD7rhZj#JZ(<4ftlc4`X3#6GuK%Bt#v^hIt zarI(uA7;41@O#fZSjK);{b%<`44!0juzR+ptvAFa$oL;l4QiMMLyD9X3zUh#!(5=| z3gAp-ANBH4xiks>WqSAi;dLCA)B4#oJPpZ2RFLXLxn`^PuE)RA$h1;-Cf4qn)1Z1Vl zU-GZ$Cfrxlzk{Na!U*t5fq7E(x1L`2I@=;jA-K0Qyj2V8hB`}UCdqreZYqi*Yb5I6 z2${}-OZtTO({WCM`n>h8x@{`2{$!8JnCISJe0G$Tsl_U^oSpf1TjH_!}^!jZ> z^@nChBZ!m+vEK8Jsr;CM#`gD|_f)w6R>iXTL9ljk1C%3 zJd4Fs;=`8qBeutFL_LxbyKvB>>k4u0%+sK7+r90=t=9#=3m_azmSRgK`4%z>kn+C- zkoR$;%6I*{!ODq7q}3Ez3~{*4J0swQW4OGiGH~wdaZ*E-UHML6KUAO}1r-W!>*0j~ z?5f9sr7ECMr#skj4`wlkkaFW%$*zygK&i>Ka`~g^56p4rdF1>?Z)_;c7xO1-dv*v{ z&(hN`maLWN$;dZojFj`D>Jr5EmE23-J!M0Tdn=!wQ*3gxl=7%ldv_<2EJ?kp@vM4_c1hRSk+t`K3gJI9B2$4C<%OE68`}_)8{7@Pz*~pQ=VqW8 zj%37^m_OK!&rNeDRUxNTF#EGO0-!1PY9LuGW zjVw4+NY}%9VBTL^+oCIN+Y+-Vys*O|OPkHl5~-ZTvoGexVN(;6K7!ViBVG5;X2k5U z4?F&r596hEw_d3&mr^co&dtuL0PS_AeR%n{hgFGv@8<4X1ofPfE=oCi`OVYk3-#vb zXe8&+vB+r#t3#S{n*xwF!I=bX zF1=mQ(qJsn8jUiiRrEV}o&>(3pBZGL#;WM>71tuw$nUpLQciHRsZfKjO|MEzzrX{k zBZJBdheaquR+-gW5%0PN>#&jbfC37UvY%2LOs7T1G;KB7 zeu_`qHFDVHT777oR47C7E%(~S7g04=3hSe*ftjI<0~(pOd8F$rJkgOwE<1jVIG*J= zocoTznWju|{fHlFrkWN~@GuWJ6sg!sk%;g$z%asS>0=|&5V_-C%gN{RfVm@GCfa@gUic5@>J* zbyHf7DJl^Iz5Ee0A`n(qa|2TgeJcf7c=f9cplJ2jaeTaa5088Z3GNJuevF15V#p}) z++s+(d<`{_Sg}MA;xDTN{Ux2)u@mdzWlo5u->lW%&QRKVZ)3I5HKf zfIe#h0V~ZhY`Np&WvE4euI2Z7tP8{CP;a-esC*hBPmVh5&kp-N3jPa*cFBpsvtg|G zX9?WnDuiYUq%+O-!+{@Vek4XJTK-vL)t!CY)eu@#7LJkrs=}1eI_LPNw3C@`wnZ1j zP+5rbPk&G*MVRyG&$qJTA?)lAo2AXrW7zF|`d=6fYKvWFZ{m#N)|CIqMs_4qF^+#nL zi3CWISttvK`FXPa6@XbFRVwxx=+ z&dGY)T_hn{6!pmqF;L0lMv;+%F}W!XNeQYdEf%|y4U`ayPV~L^nu~)c(KI*8n~v`j ziUUbx<5c|{S4dN9kzp@uai%5_NdT-3RgbU~{-Wz~ks`!+d+3fzY;u$2$cTHa=<|J6 zE0+B>tiKGxVZn=G6MY&t!upEfV^@ydj3`_B)f%E?`E~L^el8doh4qYVa`m6Iuqa#P zEpKBG;Y$;kl7=85tBjJf7Z`NgCb_ow6#l@M$92tNym7MIwZ}bG9NR5`&J#+O-l8ER z)(E?iBEc0NASsUdc`L&0W|pp-MiRMlycCQxD`~{vyFFJgCx|k{T1X^;`YX0jF!7aA zDFDS$KRZR-KExBNp8xy0|I^I@Mm-QoHJIkZo2L(+@5R+wItL+x|e-k)_j2D>K66^ zBX8Xg=LprU+i0FKU%KwwnP0uGf@^S0>V|r0C$_DO-C!MZ5WVN)#5(0hWmSiOsOrn- zQZB)lzO9dq#mZ_=ohR`pA$tdAMQEYdiOlls?3>0laJ`Mo70;e!&zV#mip(y_)_eYg z2snbo!JV}>gGtG*nk&Lb)huJSj$y_0y(x#}xj#}EP`{xi^M=SH(DMHHJxS(8kthLD>qRL0Qyto=Q*eRTlWHD0Xg5a~Qxm||=9Me!TkAYO* zg4z2wVKO0WUdR;`fN2$xyixxNRU_L_uFzC;ykS}%swBV!WK#+wRJr6%ti-~Uh>97% z0#%1wm|U`887MvsPwO~7)I4NMg_yjEr3K%;4&5)x&|~Hbdw8f>`+#Z`zAb726`ceP z8N1@-5Xqe1FTtjfLA(lo84WIZ@tfRWlFO`PB0vZ&9g(4MFTs2Hh6_bbp z@m|qSzlc~#wJ2CQ95q6Bg3>&Nbz_WMm~k-Od=c&XTl-Prq+~q`zl|fdR%^Y++4`ti zPv*n)z3cwZd;d>|hv!Z*J^P-U%{&`chXj=lpZNY*kt2k?-H!)YUe41^)$cRul_^J# z>h@Vs%WV%ugxAr*?Oc9Ge6XiIz-n_~=9wwTW^^Ah9hH^!B;iXF> z^Cxv)ih!h&7%HmPxJbknQ=7L(&3ZT8SEp53F8p`X(YNhzi-CzcpQpkJ}vsb zAB$ohwINN~OsALLJa8VRg|ZU8w1Bu19zWoJXlCFxsoW!DtJua$GaL(_2H17;YN!0# zJ9o-sgkO>)`DS^vh=AroE_4}0U!{F8#gzfgpFQH}LF6$JConsqISKY3#R6TpnR`ki zEKDkiz^XJ+-~00|w*He0L}FBpYltli+wJ$#H#=-cA5`115HG}DjfTv(vVi&e1lR)P zIARsldZZxim~Do*(P!$cL@l68On;)kipFBp2>5&Jgq(SvI;NcoOmh>|Th&PTCJ^ZzZ| ziY!d=?}C#>xmWb-%T7Qg;_uK;2)(-|!2^lZ{6_$y@65O%f>iE3ddWzY?YwqUsy}wY0yNyI%C4FCQ_PJjY#FW)lofbvU zWv-W1DWinw+nv0TmyW9hqJh5Hx_<6wRC$g-F~xI()w@TkXS(7LwVnwbKcCjjl82VT zcv+`)V>{TKSOb5`ELvnpSl2V&HJtw5-n57f*OXdlgbhuI>|Z!o`wIZ;JrBDfQ)mt! zW-i0f=C5E>h6pSQ5h$_y@%5rq8@gD70chbjizVi2$Yjt$AFGw5FSAgdg%$m_H?P*yZ`m}Hoca& zy*N0})7%&vUSY)2&{CXY@8J@s4d!Vb!GRx!p$n0uK~BREw|8pLfkK~Kg!C_S4^Yz) z7_wu1V5toZuAO~_M6$2IiK6?UuqclDTPZ~qB`qG=Bsem}7qw`IL{XVq4mo4PiD+#=HIm93yO9Z*u z7DT}YBXzr2eq>clxDcyTurzs?;nb7BqBw4&Pze2;~3r+#0xVRnF7t;R@lT2}TdvXLKNT1aS zUZf@w6n8#53OjH+gll6qzKQkL{-y=6Y?ux_H~8jsFP=QT~5e#P*yVWQm zpW(+NpVLXLPZQhvk-^wiX9By8C6`Rs;F7ODJ>s!(f$vYlHml!YTz5YStj-LFdLI*d zKs1>6PreH?I;qIW0@*;H&2*jFIf13pV6Vk166=l1FUrm|F}HiW@5^)}(Uuiv7da`S z?10-ZOCLyE)dR(VA3CFPaWW(AwG5#wcnu!@3fi*`#?p*^mj1@1QIo#6F+?gm8z#vM zY?EJ3WI3zzPkwH9*+$aRb5)(`e9ehkbpe?T~(oH`Y%&EeJV{qC}IP-l?k5q%+5VxS| zfw1x{G%)R8h5P&dm%dwqXdBA18^vNn*%n4(Ar?>maJIM395Z4^vG^Jy`Y(7}<9WeH z{}0Fs;XwlvKIj(igC|2`QRO zd=9mNT@+LmjynPn^5JQE{g;dmQs~Zu#L&|d-1Hkn>P;x8?`1nM)K^X7>TD}eYgEr7 zkV)ajV$j|g_4*H4vLv4!P*?AVV#RwD{+{Czxu%1R7w4Cx7#D(zE&xY1;Ga{cr!HR(9zt~OWjwq}y z$G(9!7w2J(n}Q)}GnB?}WAF)wF(9GNH<-N;g;!A>*xjxIC`M}1AO!HDz-;FGjAi7D z0I0gk*j?oSg;Yt@X+{CZqVkxO4(0@72Yz~S2*Qn)-RrYiC{uj>T_aq^mqR+|8|_Ku zRc$Xu9qVZSTPozJTa@(9ea{P_)IH0P9XQXwwku6S)0(`{Q-5PUYoWZLD~8>`2{V#1 zv1sXg*zd04?fjg8bWE3EZF52Kw%r9y$?_advDtK=dI8O@I&{(Xn99l_V(+gc-hz?j zGy3C(4lVsVkBb1da$GpGbhf@XGc}tBX7?I2?GEiBN`Wm2*sFr#;r40VLevG%6wcN= zx>sqPHzPd!&v;7twIVys%tRW3-SzWAq5AoSf{z%P8>HsN@Tx^T&==9a-R4dH>&v=} z`HM-vWQw-7=|Q03Kqh%D)}ViZ<_+HtQz3PJtLrYwmYWhRN@nx^GOc1lh|x&CQH{%M zn5p}SLGR;2&ttgOjPGW|c=h0Yq^NRzBYV&BX=}1F@~uR)r}T0BRS4t$%_gZ;j|*qWC)(K4c*wdJ`K|lHJ3s zf+{L|`qdWRq)aT1x`{e8qG0l^SF-%iUjm-TzrOb4-*&>mGf7=4)@i*G0$3i}jZPY- zwdc_@Sh^ZI!DmZv0q`b8>Y^^vqe##;x^EZ1T=KN7|CA3^r?*YDw;?xGIiGhj*>wjt zab@<&%DA0V9?)R%W;^5=?i$4cxFOtjDPoSiO^3F;Hl<4AK0<>ll^?RwqyEg39XUM;MUkC1KT*hHm8Abg<%X1x z4`utY_tEmD#e9r?u=MHcFcZVd_NC?wOgdXS+XPknn$hc|EHqvzTBwJ`KgKjnpGyDz zR8WTFCjYF$sjv+P33T(C%y$f)Y0-@8&Amm0X`~COUrvT0bvDulnIUDtg->G$AAKyIEYdnGIKTN%3X(HYFTH|$&@|Xq-K#bGCNwj#9|NO zbY5aeg%4t+#QZz_;ExH4)=Q47pPHJ-(g7$n9*ZCa%qzgL=I=-#m&$rmV;mKh$qv38 z2hCOn^%*%>M3CN>6p~pk9g->X{~vM2-t$%Y|7$@B7vGhJ=hL6aSkXahB0+ISy|(P} zocNY!<~t%ZV(&eWIxs12->JVR|81Y!aWnr5tT9+Hx`+D@vxdvch(JIn6X zv+kzRj4RV-(1tfHLgrY};EtwRYy`6Evh6Kn7PLWK0!`)7VwKWJE7Mhbz+geHYZtwuTP3GDj@fzZp)*I6%NXcG0Oj~IkR@n%qQFS; zI&dd&cqeA_*MVF8fIE=pJKFBR+rr>akWb;vZ4=%SSUPb`{GzBg#jAd;I+>E$Q2#6V zCp2l)>r?;CE8ar-w>NITSC@|vdjKrp2zR)^9ty*NL25xuY7(*72OqnuqJYMNk%x+cQGq&A zxW;l*nf)i>hkkY-6sECiqvqqQcb&(cxz$#eR@M3(?h%Z#Oi+TK(Emu5zURu#bsl^s zGbW*dmM^py`1e#SZwJ18Q$`DLD+^Dd<}Rw1)C}O%{B4&CsfD7YvKlp*aEtkM8te$a zBuYub2%(knu1+hbUGEpKo?qV&yXc1L1fP^+Gp_dGOq!tbuuQXII~B0BL{{^1(dxSA z+OIs{6LY#;&hn-PG9H_YyK6KswEQ|~s{BSooBwvQzWvaC7C^DbPK1OYc~>C0oep?6 z?6kN``qW9C{z_4K9p3%R9!b&yrl)z{u=S=8JE$Sc2yThcsf1f_Lmxg6ZCb34_rlyFJ|0W?&&=yIg%o&9inR*0kuF)glE7{`4ogQ&@^jWM09c;fXL3~Wd$ z)ndH`r-Ngbd^Or$RlxUK{OB9d&1;mWMue?`yP)vV{o!ZtHOl6;CXb%UN!LP_Q3pay z!fRw?J%UA?6KKFF*!B_A-t97^zfQ8Pz|mV7S?qYWi*sIHw5&SGYzwggRDo6v+l62| z{>@>h*;8`u9Q?U_5ePN7v#58LT-J{>mNo+iY6}j!T-S6qY!N<^?@srRMYta^u^a;v_4isxxFTWiDON3s>nI5@*fpBg{&GN$hGGB)@RWJF3}Shznq zKvqzUI3$J`ne}?*v+rjz4DwJ=5EC7!fdSMlNk|R86^a#{yTV$6)$hOs$E}^rvem1% zk6PC($IA;(&$u?@ADi8cQ=LcuN>>{#S5=?7rr$c8GC#J*xb6*XqEeY$>)de)oV>`3 zxm3ey`wX^X8HVt%bg<0QBbv%aP<(`%Kk%b zi6S}#AIyfNQ+^7IL^|2a4oupFZ~|JTl>JAv%90{{fVi|AHf#cKxMsd0Fn6QfwO^3i zZX4v`V|b9#7iZID&AK!t#mN=}Hdr)Ifg1h4AErv+NT9?1P(;>b30?4RgxBfkn)Wo` zD&B`4Awbt1YIXTF`QDeu=bM_JE#Dgd*Y=cc*HC_^DKoy{mHG7U{*&*q?fazb<~`n* z^`2L=w&(OS*HzoiQ6uyFaL5%hAbd!tzjlFL_vm%cTUzYKsaauiqH2CxxoKqC0%0MV zlGE)@p;+&sS?KxV7hKL`*(WVO`}l@v$^KVCfk)#Yvr1BcI9j=RCF&Gc=DP3p@9u}q zLz(>rc`y#vt1k+h7Cw=zQb>yf;Vbqqi~ufi?^6V!*S0gCJ3Z}Lr#!r>*J5q@qHN2s zlLF4$>bLuh&BxN{(Q_;~q(|Ltj+T%X?OycN-W=TsX8}d%5eA8BfnmT~#2wGT!TggT zoTs(hq<2oo!BL;#ZRXa?e)y%fs0Bic{ngU-j^R~a__%4-leD(c3et6EFN;e^GGg(a zv@aT*@PR)vKG&qhi&c-n!Lp>pYP7#}ZgVqNAhP&gJ{wAXy(GK-3M}y8Fat( zWbzV0PdWm3hl?NGsWQF|6C{Kw%ngtYlFa@Ld)iEI@vmCgUt>}H(X2NXrYPlo}!PlHJQIlQ(XcTXj9Lb%Z5H| zM><@K4}bNVm~eJ~bm&8hloorNeNB8MYzXq>Fha}6V9)ms*TX4-Oot%gttsH9tQHOJ z4kgOXKr`4<_8`}h!>>gl1E-a?GxTov6#{>`UWI&QYBRs~)AG}}z4nt#m%&|Ogx)&s z#gmh>iN+cIc0vi7;3pO>A#X*W1Zzas3dqc*4eJ8EYGBqRuHszf3_#>|cKG${yut9w zriJ(6`~Opf|9S(fugx*~#A3I)=)P;A-u^?$_3_o>R3}yYp`?70kL+=`U^~Gfy zbo+@(uDNMwBQ{Z+tLw+y++SV2ozhU}$NHA+457=umss1k>t<`*ruK*JtntGgXHu`e z!Jkf_GQ->Q1UceJiD4agr-50auB^YG^TU^lJtNOTBG5KS%Q?lv;y#P@mXdUiuGevO zD~$%aK;SjYbp_1N^w0c@@MZ?mo2LI@u_#>hKil&!kzfC&?qhg%V+HD58kF^K22k2O znm&0=2!h#7SK4}p&2QHj+9(HRep{;)HGAJG!7zhduDic(T)rM5BDJ=_Eu9J7e|cSf zq*!?8AXx( z{2hO_di_(o;AQ5(^VA#}#Q@<#N`r{)4=FQ$kfHh6o|{;E7;h2?VyKx7pwi@xFbq7N zIRvA+oKe^j7I!MM6F+;P*EpFfZQ)+Jl=ZWx&3@xt{_ca519&|X;eqHKR@UBrv;IXH z5QyG_32pXz+}mu;kv>OepB3l$v7?7VPBjhDM87EDyJ>}u9baUX4rQqUuv4pIhrYrAnhurvCWRhkx#H_*k&cKC0LH76Mr)d7D_S5 zwe5giH(D{)($orTbfA&q3O8~x*Orf|C8(rO|C*kV+ijE#8$;9~RjF@cWz@e&me=CR z1{Igykx1%Ree57)r8Lx?`6tylKrekKExAO1#ewnOebPF!W^KzznZ*yZi&Y5Er^|z5 zvSJ8zDzd0RyJ3Qy)W=RUX4v3jXnFr`qwFT2X>Bv@|G(`A_bJCmCM7={^bob#s*!vq zTjk71{eerSw10=+u9`IYDl+xi_GM9L-P0rZOrK?p@oB#< zH~w6+^?JZbV}Reh(Cw^ij2N}z5U*D5;S4zu3Z;WDAU$$H#4E>EquD0Z z+0>vACp*f6lDF-i0H3btd-u)TPc*r{+xziQN%GvMjo|8d0|%tL-07mU@@*#aIJ+kj z%JCi-;&!-b|2ojyZUcP*NhRLA!+tz<-w8#;xh{Bl_@gg;faWT7Nf6inJOMyI3uGc0 zv2XR%g!TxH64Vx8D!Oi+PH#0E+2G>j*EtF)rKxnD_th&hI%n|u${F~lKhP^sy@N#b z>HWA!2meo>+nyC-P>5 zDZ6fIwvYo{j*OIMRJqi!8JkxQRlCi13^JRRQ~tAieo*OY@bqjA$K6P$@iPkXlS3N( zR(?LU`zMjab}(XBxP<*5poLBcG(Z5FKk+C7GWnfKHn}8{GjxOwm-B$xKN^K{wesy~ zHS7{T4h1yz245j3B*LZ6M1tK_I{X;Nw+q*kcr8Q+I#&S*(dPeY`~N{kRAg8(LG~PW zl02a@BO5PIcQm9?eGq%yNUxYc0PA%@N;J1umyGY#LpLAjW~cpY^Vb#Em-D={5FyYF zxbsi^c1MA7{RG-6IRMUE_}}P{ibBz|MDE-hl_mUl-?Xz0kyn%ctMc~K9PFK6+|i!e z&^&~vc1N1ZTTJ-%R-FvaHt(k!TlbI6nbv&y>Uvti&y1N^yq}(dqkU_PKq^cSZ0;DY z`Q=~3+EdgsaEt+Kna;tJw4)Vd(l#{1OO74XFpQjR#L_EMoqmBY%uDQ^+IK4z8N(z^ zsAl*6DOB~shFfMxo>)0krs_m_O8xn`AtXv^`e1hvwM!K%$YT8Xt`5G<8QpbmM4tV$ z1byqJ$gq$nBghA(6_7K0)$Ke*3R>L3O)EzPTK+L`l?21ec>SxdehSy zLTK11uso|LYE7{ATw4BUP!6&<1I#Jg$1B^1XD#3sTlvQ}r`%=kpe))+iW3(?>0%jL z;*?SD)3x-Mv<8VdJcx$y^e*Dufm}M7ke`fUy3N5hi07M+yBB-Vh$KoN30`rMP~F4&55%;kyJ8y?mvgHN{3ICb;uH3TuErTC*Y%- z;BjuqP5xS?hQE7I7T|N%z-4=jA0?f?mA+dmz-&;mWt>Xo#4c&J>n)+XDZ_*8*cp_+ zWhwQIkuL7zMcJFE8}O{u@uA@}2%;Z99#2F@?v2jfCN;+utFs|VExsjpHjb$B3rINA zYWkOp8r3+0Du&A&-Do=PH%;(+af;3r+zz>A?{L_Y>i>iH9cn+>xOeT@!=0WA64d;> zW0$`BJ%Qw*5OZmt%c!2^WsXz*6~EK95J&9aNiOeeK0UwZ*q<+Lyo*-#oq-3TxP3ka zWe8zvFUz8Mow#v*FhpnCS1f&ZYHP0xhIoa(#{B~@L~d7fn=j=()sJUxpI7h8UkPks zwLe)vpThdqpq{e`-oPzP_hj`J9>h+w!mR>$$I4KlIb_ZHBc_hJCpl z$$#~P5{~=}6Yq;f#ZiKjR<5OTw5y3ES z;XL0m`P>?13N5&=M00Qnl^?46R__RW@sYkjM6#^!Tncr?F!?M{EqB>QBR6&VU8S8L z75#k!skIXOba3EVLW(i4II+Vd;adv}cZF9`G&W65j?rA`2)ZE6cVtf$*Up;KAsjr2 z5_tJtcuR}dW$LqxwMXxUJj3!Nm~tS!_wBr@{V>~*mu4BH5gqtTCVHaU?XY4`Ssku! zTwX{(lSAF5Fy~a+HOe_yx{i5}KZ!me0hQQXoHLB2F3P&=N~yLA7E)EzBQ}39?kLL64A2fL7N|9b5c0SisHR-3 z4TB>Q&EFxN?_KYNI^8{xbrZBWeuV!MrS#4 zRq`FFJiFfa`^m49eZH=Jp^lxet`jbot~(i@J%}rh9pAP+7A}iVRbjCh!UnbB&~%;d z&v~woquvv4w@FR>&y+ZW+tt}sf0W1Wutn>?3@yETSqaJzQQt)~ zSu5V|-;FZEKbL{)4N=3FI(;^G7}|%gsb^1Kj87ku?Ui$*HrJnW7=jssSrTg8MHmy+ zSdk^;)cl+*QX@C20jBbK`_&-lIe>IH|~XnCx=QO2}jtM<#Cc@q&g( z2gFWU$~i?wS;vXPSMX^FBO3A2*qzop9Y_ya;3EqpQJGowls3+4H*jQO9oDSEb8)V^ zk|(K-nkvzfDg5eoLfeEP4U(kyX*0Q*f4~8Q_iGEl>!w!F1Mrv$drhA~21P!oD7R44 zM{l=xxr{J60^tyk_87vKLo`iUs-gj#rAhTamG39tnZ%-e0 zC$}jcGo1i0dQ z&6{vIuOr8kUj{gBrD1tHt4K57tPCFge52GVIH}8;evE8S zb;<}s<)0a9u)0n&4101VA6I3fPol4tYk{EW(`=!$&Yc!)FSZ|HC{)KB1$A>WC{6<@ z*owFIOG>vhutNluJk{=;C>m~pohrAjc&@D`QWBskjL<4T$f*M{{F!hGoqc} z+m#SwmArSGaaB(9hKm-H1LObQA^s1MM99UMj5Z|DGfn~FDkPPCBe5f?v=u9ect(pp z6`t1)F6b+eRv-`Zo`LoG`sVj!t+5ZP%ldYmozi`#qvty8`mtu>Y`)~F_ZS0pWa>54 z{dJN-cURn4a40Y6cqZQg=e9KTK-Bdxqo05`B(c{jbRUCf?153b=*lXGECkl^WKeZ9 z+ILyOdYJoPEr7t9*Gr*8syPPsTqrf9%I5awf$xoalBX$6rnNA}{_M3%p@D_kjv$82 z2n9uNa3X2YC}zL%uF0zpV?VnV0(Eh5pZ06@-?odpuAK=!y^2UNv;HSGsHk6ud_+%C z4FYFH)5#z2EvDxc&3CWmHam~g-hNV)!%A^i{GJZJ?V;^dP(?YG5{yKd`-gwuG@ucb z#gMC^y_=e-$i4)@`AC!ZMC)FzY~$0%9PPquk(lMjGAI!>>K{meK;>+m%Q6o3(9*|{`6br<3gFG|az zc@+3qRd^yEPvUv_Y-iP6%Wbrr2PvK8!m2^8j)ud*X&Odsd6ma=WZ$z!v961SDJUWR z_Z>Z__ZO<@`EofOs?Z3|BFB8G01=9~`G(zWp|;_s~>+QnIiaaaE_o7;h3;|&WtqEiw%MjmE&>sjb zg9j(vvuEFocEL%@vZjC#*)P{aj#cA$0C_P|#kWCyKfzsxZ<0;;2d}jEX~CJJ2U`)s zJ`2r8bkbPU1BD#2lV~(h>DNZ_l$@qdO*jbIKIPUsMgf&KOhT)UYZ1%Dx>%r=LtD?h z7_4L21bbkpcC1X_-=2n!upJU%hd$_p*3hzqd>K^+396Aq5VBSaV)x?USup#?*(OCL z#vI<(B1)H4d*D+;r0d2*E+U~v zc%A*{!-S#E7_etlkbE4XK!`qGnUWU+SmEy*XA|X!HSPB%fD_X zl8evB$tzt7iKk-iH_NYkz3~^u6jx_9?ev6A3==GUCQRZxc)+-_JBs-v~rv&tm`!CMEgtnggMOOd(s9n$%5 zXpW3HMtTAGwfGve|(ANRt?B> zx9t9HwVD7Q&U_L)A18f7g%t6`J}LlD4ZvF6{Jy7!}c>E72=@ zNY)PFtlOlNde!dG#Zxt2h?>_(R^s@IPUTI*DLbZSvMBMk6C;0Ph_(uBDxQDDSkfRi zn^KM5Jm{^cWR0$ueuVf{=v_Ud$aiX}%#stw3&BFX8G^ zw$O!5cPd-G(=_`!JZs(CFdvuM)%!;_0yb+OUgnqw$|`}GhKKw9cZ>BjSk_lTT2Gl@ z0+^|6CpRnHly$koVxJpN=;*;};7&UM6)5;6nkDMf?^TEf)13Cl4`N-jauPh4&NvZy*Dx#Vr}@r-~h_@C>;cYR#HY#W3#`$UrWJ^%R8 zeRVn6is{xM%?t7_07Q7+lWEKr)o0Uv-ST~2K<(ZyVO>A?>`M9EjNRO>zHN7B+4`(> z^;$xL!hWBdy!yO1)LCNlJ;)K%^1qV%3R;}WLWcPQJckT-Q5+pk`M!7)weCP|y+|Q4 zLD*pfZl(!iorU7V)Gu#Bi3lS>dwvi@AYoy@y76aJ4|Q1Pl?A#|#@7B#Plkd)JR||s zrvk7=Qrnf#Sw@s#n=*PF9z4hnK%TDt{thvhqm;0rLC(joaya0<;KAp((v2ra?wz*# zyDXk-U)8dU0~ResH?=%)^)(mHHozgH?l3u*lzFP=2D~7VYcBWldLdafkV;|e$Kzwu zXo;WZ^wg*ao!0eAMWde_r9QN$&CK18@-Jpqx)+r1cAW*e>#1Xyp$tS@4~`#$$UJR2 zcp-3P8C^NBv=U%Msz5e@1Z$!IMUAytA@BiWID}&l>x2}=m?oN^56sNcpclYA%PH}e#7M$Yl z6nA&G;!@m-yYuCFzjIzWKdwn;?kkg-%*x(tZ6%hoUvVLsdG7P^%dY;@)iwK$w= zrrh`;$le9C2^*dX+uj$`-4oL_rQ^`mue!eNMT8zyD;HJbaW(fuk5cqk&!=ueWBjPC~#Tb6?ABh(w76d~Xg z)^^n513iD71#*6#V@->q`+8O`%I?-7g-V3V;iAB2e4_#|H=+k58fJBw2J0)`QlxA; z^;;O@hucDOGAQp%5PLx&H|XTu_laXVmoAA}E-8NgU6$kEBRxr^&u@5(O%nArBl;F# zmpyH7ehf$o0`1h`8Q)GbOEZ@55$uCkc*1{@wh!E5(;TUnm8$*Qms<`{Do_a2Y19c# zmN;FTI#w;FuD1N}J0j(;_NL(*Xw-ZparY4^Q4|`Xj3eG#{C?2}(JKGHb8_H+g`-o8 z)(6uorHWNNGo&A`$GEt)I|(SP#{sH6;A7`}Jk?krv`-`L*3H+?vKnSqyj~O99s2cT z^1|=Zc07l9>21yq$v&Fd82|9vt}Ma8iFH-z^ZFH$1K*Q%)tLv@(Xq4AYXn#iV7%IGTGq8X8N2d_I+MQUn_fic1g3X|Uwv@gr2RpmK1mVSP=rJqR~ zB3MG;D4xvh_8#IHB(NBgXu`Iz#g5~L{js>V+`5|%LA-uP?6=>A_RIW?ApOo_SF1UT zFD2Du^@vszSwX>D0O>WVG@vyRRLi+>>9<6HQ;{MYZc2l~ZixW2WaVyJ|%@zujRNJYeqP`Pc0CKS-RA0ZRVPAyz<`E5PqC zVaLxL@HB$1l?vYN0adY=lcIB5+9yWer)-Z}+ zZ!LP>NdC~&?m4uDZJ<^IV8t3;ATvb^h``velv*+mEmfzI4ijmzStfR$P7$w1R6V5D z(<4!k9ViiXz%ySUAxXj&czQ+G1_*u_g zC6dOli$lfFN+oYJl*iyU1oq@gZh}0rO~%IWO&+@ISe)~vNoa7GoNmK=aJ?UrNR6O6 zU80zIX19}8)OmEj4?bcmWu3`c8wBY1wHNV?YP22wDuCWC3r?M!j-5ISzfDU=WE|^k zorer6hp(7mtyc1$PKme67?95>7Z?D zFe@CDv!~maf9XkV=h8?^3&I0mO5vcOUE_(M1DJ* zDJe^wF9If4-5N}bQCbiM#f}V$C#F@4$w~&F2wM-t`iAJ7@!m+*9YIOoReUHR%OQQ9 zpxYxq3?VzY#O00iv`5ko5M|u{l~-Om<=TSrK}(OlNnNz-%8KjiXU-ea5H4%;jegTz zkATg~(|p170HtoHN9K4KgKn!wPy)rb(W1T=5Nvh`UKR|s{vm`FYQ_Qdx+gfgfa&s; z*O?-}5i$%cjWbY+_oa2F165&GnG8Kphr&2E21Z9koJU8zzdTt$q@<)HvZ!?6xm;HF zX;>R`F_bvNYO7%qvOenyAJX*%0LojASMU1b4s}T$E&j0X?3KF=ZzRCQ@<=N31w*tq zM_cIOv>dlZ8I=jDKx8-iGEc8|rFv^BUia>zU0x;c9wWJ*>$XPW*?w^FRW#NUYOXJx z?`{8x#A75i`<8G-f)fb&)_VL@GT%Dy*=8M_OCij}I^bG;yx`XR%^!p9MO{m(hFp}Od zk6QVt)q&k`PYymO-~Aq!m{y|@zdPSdPXAc$H4>z0@#o#}nYA!#oq`P0f6m#2t6wJ*aj4y!zK`?m6lu(SR}SIzp_Gs`ri&9*TmpzC(icnyT$-r9^ z`LsMltFcPH+X`W+qd7IxEDQ`Rt}^GF4@G!CcWJKQujE&Y<14`)>OD2P2OE^ z^+MsYe?e~VTh&heta|g_2+i;92xK_n1oL9qGf0fDBdj0@a^3;g!Fx_zbLCeT79n)P z6{p|`v#L-F$t>8TChSlucVZrnPjWK~8`eofM45|!f6G#p03*?g$3I`Bn4{u!rXd}b z@{lBQ7Z|w=CZbn3ag)^WBDIKNL1#^x(v2sEvWsq_+9ckc>72I{l!3&%vrngH`P@f( zaGVpWSKa{^(I;Z!T3BCY+#9yuk>&T@(Tj&DnLKfIA1i$_7Lx(eQ~0rPso+`*K^O2+Rdf+57VTRlIJ!mU zhHo;|M4%vCT#DK6b_LXI=ZSvHCen2q8b)h^;B_FOj>Fygi-weMhlwyJ&gg^V?%Z%0N7vCh1{9 zRTR2tvg^u}B!5^m3SoDYz$&TQ5Rl7aA$B)*+>8CGyl~(_FM!D(g+941qU8EO3wjB? z#9j(c%VHE61K`+av*jdrL+${}&P|#cC;b0Rv&TSXg|k3&Tks^F-Nie!9+(Suy~6uD z@2O^5E|rSrK5&mR9eenFT#lg%dU|nHsarI-x!Mt}!C^rVR&_5_e-&+7!jgluO&dVg z;jGQ zi2G&?1A&7*Xd4Y#Kktj#AZy<8A<-C#{I4AM&;)0lh6TbTmEaaKl$sYd`T5Q-i@!%@ ziEr<)A>zQfpYCqO0>aqb1-+gH&js(gS2VvI+PL4Ckvw{|r%Ku;AEGL5rHlnhB|zq5 zeyTaL3wTZ#`c(-hHNQu9$|%AHn-=R)wk}<+B;Gb;kxlR>cWX~*@(}Y!!P}a&E(SEO zjj7PsiX2W(IJZ1&DSTLFfrZAQVZjW+y~#A|(OJE51gW~E)||Eq-8Lzcz|Emw!X^_x z{#l({@Jr$zYQ>pj)*6iVL-Qi?0k+?*vQM#0q}9TgVSz1JkF>M9C($h{In>>rIg1ll zxXDQ^h#F{8#-~(i4=Jj&ksZWFiiX^g6g3>5r6uI<+)w!P8|}*BtU{t*Uq`3#m{RL5 zgUT+UbnQt&$)TnamG*9cJ=wD_*a({%^LyqobwNs`&izmJ3kHW`ef~)Y4nP=r5-y@{xteVWAZxN#cot!m)!Qpej4Y36TFhZQG zKUg_kdMpS@JaTH?rf}*?CInT55luICpZBk`yQh-#sH0h)MBNf95C3n;a?m2hf>RCx zO`U`>80}@q(#|td-;z%w1Bu2!xh`!MEQi^(R#u59JIJ|c#b!=JLxvmAyKKy>%M+&` zwtdLg)!hA@Cc!MC5r_8Ong1MusvNtEEYi$$X~U$@h?HrMhaZ{}+Ez3KGKA`v7Yh?Z6N96i(Gs`8k*}=Z z6$kGknrxrj{_PQ%{3Ak}O;6EjkY$`gQ^$Wzql`aNH2&tblTzP(GD1_oQMi$O%46Za zM;+Xgeh19xez?Ip7ut5+C_pn)Pxjc={H=QhgFVCO;|Gt)b=r}Ve2)FV=nwL}qmyX( z9-0ivjhotH!nU_^htU)|0+9yzAnz$fZ-hz?79lKkV!6BFHYanVi#Yo!OZSzM*Y#ZN zYn#Dd;9R0GWg7;1XtD1D?zHucWjiqR{Zt)*rrEn+c;TB85YO;S6a_2i^E7v9&7yj-2^}Nil2)jY(ZrF!|=t zlm4DUMB-a*?C8^hIP4Gi%^+u;f$DS0WQWeWbR2jKvR98Fv)(=@JPY=^rzCpDB zqBho?)ZfaJRIoXGuV~Ej5lQ-=2=RY&gjtS!U>7PGk!*uxd-->VH zJl$D(rnY}n4FB@Uy9_BIW%hAr*ZrMJbC;l zs>?E0#2-8D(<{?K6C_1rx#)cl%9)Myd0*4n3P(L?;aiI42 z)kFf|f}+0#%t%9|R+g9LPGGtU%FWBq=<-Us~caWcHQjp-dO`#qb;z-1rR z?;3+2+d)6ZK>%8u9#XX+q5Y?Z^B)c=kw_!4O30`s;=aef>A`^>T7`3#o0DYGx4R@MXyWPe;7z6G3 z{v=_%K7*@@91MrDZd%^%MX+#c;l=~u!+N|BNrc>R7b|)`9|pc>Pu*^o-{$Tdmyz)> zOCN_N4G{X$VJgz(x5Ma?kADk}BvY)$#|%6QG{j^olj+uxwk~w~5;OBPJoYR^6>O8| z{CL~o;{I-qqB>n7cJIb29v%FAcyxF___pEoS8wpse}*MnoM*-H&q=A?)Ky}_KDTL2 zLVXZFCPe?%2ZMG0{Nim>wdcFwpSQ=peU0$7PnuAU7o9AGy_>!!LVg_wY`C49O(zT$ zl&~j0VrL|?dCn2%ZY**3=d;Ax@Z@dS$)L=FLWOgZUOsp0LZ*nt%qZO;F`i})8vO?a zjBMl2+~^`vaIl$MD{Xu*yu~YJV|}0G*;Pf!w8Pq=beLy)lFe{e+zLK64x5YXD6}!y z4zm+P8S&_+3<)(%=%>=$Cn2Wv=S=@bXnjm-?8{A2Pb^m^jdrk@WLwx0UDx@_z8=r2 z^RDrCVSTwg-WNC}2DbVfbGWha^QqVl@UtKW)~x&E7_>b=3@>gS3bDAX;@1EzD|e2r ze|(i!ylCzfTT`>Or-n)1a+}uL`&*;8To+Td+%4PjcaqX?Z;3FLiSG<1iLwl8-PvUD zy8+jF9Y8G4kq-Ux`prL7i2oW=u>GDVWew&>2y1% zT5f2us#9hYX*_g!x=w?P#VI6J$^e4wWIWbX!sAf9zivdGe_^DJEk=p+Z}fAw2GAp@ zjR}7qW2bq@OLBHfH~dbEOo=*zL{J!lS@h8-PC$<3t>7j|jfjX`$`!_1N~M>+iCW+$ zJ9s!i?=P&-ay7imI8BfVQPpAz(X2CZbTA#Es=u zcW~>Lx=7{g`9)RomqRgUzef~GCgy5^dT;X&7M7B@^bH9CA(vZbGo!F^i=gN|;C2Mr zHmUiIx70j_;P??BJs10*vl(y9rFb&{CGk*~Bmr?CeOLvkLOsk-*-1jcj80+V5^U$-ob&QM` zKSu2nU+xvxP6>!s;#pi;4iX%{ScTa!gCSQqDzSuYxXEeqY?J6rZGmNOt3I}8+Xv(l zazXR=^y-V02JP5}@nzcLaxXCc;;>v6B(B$TQybk1u?*}1Q{;Pk`{mkbBdMK8=(Vjj zy+Ch;)!+C7!#Iq~#cS^R+&;6_8O?$YHsNtDPIsF<-A~mR7w@0HT)afb(hIw%*xr0Y zL4v-@GT_{5WPa?cyJhBgf=67h`xxx_I11JZ|ijo zPelb+b$hF=Cl+`i#a8*3QS0#gzr>NcAVNP?@{6V=dKW#qk$xi<8G-iw69Q@>kEB$2 z%4H1cC(%(ClSSb*j>%Z8;EBmTD{W_${4*lJR*8qPsgY!nFm%qhRe1IP| z;+!;;7im$Qv^>HsaHb6lp42%KqqPLvaz6;b<7ehfzn2_6ri`N!>nd!uB53wI1|4Kb z4%qJJAmK~qf}}H@?QbadW}X@8TjT8Q`gbirB=MvyK_#ScnB95yw;$7Fk(eAP!+L4l zln=}_Ltgf~j8yVp5!nxP*#kCd1wM~z^CZ?IvVZmQ7VHCN1!sJ2--Zx+#Y3|+rt9}* zAl9-9uWYE7yVWtyLwt?K)9uAUve*Ruah`|zIEvFOfkNZz1>`Ds7?Okq2vA;4)hzdJ zu@2!h#|)r#_>FM+dQM*W;MJoBZaC)~wgDyOG9&kO*hGxz~E)9Y}6iC`i z`;pIpZ*PH_F`spLZ;{76_~AVpbo&y1ui)BZ4l` zW0W*iT+xm#@9puE@d>WKZY-)tpUFD*wbTHX8P2%t-k{!hA@ z8Y}z$N8DXV!FlkJV9Nob2Br&pxpVY12X+(gmFZGw-S{))G%9B# zD)3dJ@mLe8UtHyrF?vIPK5@{k3gakHJ;(%Z9VA1sJ?l@L?p1c}8X83lZD1ajmwrFos01P4^a zQ7wpJM;%3boY_R8q0ttxiE3PJ3X$Ew-HjiNXf+3c(v|fPl+gpuuD--Jt6K7tC~ejG zH$6JI*7!REt5CCjw%*Ri=y24N@lD@ro}D#+^g6CXv9VN?@b%acE-2nBnbbZCyS+mp zOK}AuF^a2%x>`KuIS^jg5k)}{-8SgC=ltd+2f#P0g^9gc2`!-QUsFmel`(!r`8JY? z9)uk~Az(-vqzjIPN^xS=0kH36&=(p>)x=@w<*8K!#40!lv%bQJXK^oD4F^Iyeqgk` zPn@-$HLbZG&5#TIxhee*tLeeWZ%?Ox{tkaxbB!boC$-=$*~4}z?9>7F^NOGBTlcp( zn0`F6==#5req8pWvGdlY_I3@u{SJDG-KuOl-+YSCtNL2C1k!}gFN zuB&=Az(ETt#IZ%U1aKi=PzH3iP>gfdwQM6lAYTj;x2}(-?*R43SY4)$#xrhTJX5q7 z(rL)U(rLbpgtnNoFweC(8V#9OVwqRQEJPBukXG819tmVBs9nC3CiJl14kh?z45S*CP;>*!D`4Siu&-rt}4H3QLVkEL&0@`8Bm&ua%%WfSO%u8^ zbqA||jj>Bet`w-_ipnx;L)6*IuRxmEH#p^_P#+JcS-wT^#5kJBhyZKRtiBj(BhP+^ zEGo{5Tx!T3Ab=v2Ma6%M*n)cKIp#JV#4CPd!P?c@?#WodH~ki_Wh3b-O(S_Ld>9CB z(nG7$0ysMJQ%Dp+X?tpM&IJfs!TlXei~vwyr3t3PtwZ64A}^|^vne5mXaGsEd1Xfn zVz_l@UgO88&sLaFJDmpDYmg81w~zvTcJ^NOy#yq@*s-h?^qA{}>$>3zPRqra5~WIX91jw*Oa81ax8zyv2B_E2W;7BKuvRIC?Sop(orvyH=y4&lwitKwhViYn)Ic_`C z!!(2E95adQVqiGc1k!hQ$Pgk06&jwa$1aBMou7ScJ#U-d@&2oCRdfRtqaVPEWh^x^ z$9!kCqN*%@kxd?Awsyss8IXH}X>n^N|IDa8J+*&(R>-(Y+H5MipB3pVj>q8H3(>Myv3Vfe+fkBP*vL?@z$G28TY|1cK1qN+BNNCtL zZz4tlJI`l|hv{q82Z;<1E{CIvj&*vFlLl`eLf#Ia88tJ&MND1YhprF42^=5|!pYOA zbJS?9<>*=zC}Tcbb08}cH#4dj{u-T1ttz%!6hJKjQCx*q6jLQRO$L$POb#^~u9PFB_D_Mu^ZY6)F zczmBX*A5%bZ#=vHJRDRzTw-|>@hAS^oJ|9zAHSG<|zq(e}k_neUc_Q z-0=BJcEv+1vGI9iy1U1xKqq$xk?L><>!Pu(z)5pT^EVaq2>Lt^*uG1_{{*i7woeXzmfql4}EHd34fmd^7>uMQhwF(nhwI}b)wg4)deU+Qb{x5O5=Zv z__aEO#gHSQ#+=$nr9~S$Dp2Xi$TG3V^Aq>8W@!$FS8^PUw2e*r=F&<`EA@jU+u70W zvBfCYMN~brV>XfQ8t60*8_j6}h#B?sYuz4!>sNSK1(?&fujEmTaq zZ1=fbJ^x+0mF1sCvWN>$8)7v;viP#dwLhnqV?v7M6P)?*lEm9~no!SBcPZ$l_;rq7 zDrI~^F`z6$xrh|H<`GMO5S zYh67tIsqUG6HRa+RFg8KR~3JbLBvwoMFo?!Pu&+t?%4sbME>Xu&#bNFq&gvF1^d_x5WCM*xfxI*PWb@{~No~o<0n6)!9FF;27nKrmJNNZ>qua zO=4GBYUs%%XZy8w+R^4mT=&gloQuC-_|&VC!qga%fjG7yt)9qwrcnRS`b2)NHd&#s z_76mWOq8Fj%8HW3^|Te_&kMq&J(LO12f)i@%KnoVF9l=L$gV|yrI%ksBR?pS->C*B^o)!wD9mO+DQ}c2YX{l_(Rrx%$Z2cT6 zEyaGv#_N_b{=4o$E1M9!=b(K&gjSt3|Q^a`c_UWMW+bZYsDlf?f5nu1mzg~yLatd<&_`|-8 z#XysWwQvWZ0QRQ%9`b>h!szn|kM_v{h7qc{vIIt7czOX9d_QGhkkTw3+YH7c#%!b% zQ!+0|iGD3!JVd(4WTW7=vY$*nX?##lrPMeK*BI8#{6wUK*7s~Y5F{QIwvb-o#v)ED zvoy%&P2QI~LIA4Ge0zrHF>(7GMOmA~uVF0+YDgjlorstw{Pmg|!Z z3Jr+JAS8E=Add7CcWg;r(*Efeq!{DiWZp2@RO8ZJ{lM}~I7toY3~@i`TXZdIYTLLK z0unVc?MVikD__^~lY{`CqHNP?$%%sR#O1^$2a)h!KE+VzVJq5`?zbLfj~GojOYcEA z5nkAzxgrE z1o8LtTML2;=6SEftIzPmt1LI1Zg7Om|VS~At^VfqFl_DROyQtz6@;hy~t+hlG?`cqbvB4`>xw;uN;7{lqNrA!)wP^7o>=S&Vh@ zCbV_kISsptnWhGdM_62<7_=z#?(;pQj$eMD?yCbuC!40|;g^#ELm`RR^;=>gA@7v= zW5FE!Ge@?wnbGlYrcQh4-;w}Py#++E95~De->Xj1S7PLhB_yklF~DJ8V#)*ZdtbTO z25u40WbuO)nYV~I+J4CW4i_U$HXi0bKtGIr$Bhgz09;})s@c+ zrpVz(;$1@3;C;3mUs92*Utb@=9Q&om=(3hT*|dR7sxhYMfy|<|7PkA|CGyYZ(*T~o zo3TsPsMSTdXi2@b;9^v!mjbhb0&Q4dZ5>DhRH;!2%y2aup`4&i22fY3B_Xqgm-Q!0 zV|GThX24_>hwx4|R4BaNcO7_Eo4g@76{m66bp8;b> zANcH6C?>M}Nub;`kGDc2xTO}9Q41Oh40AhytuQAyZawcG1TN4gk~^8OinZ~olsp5* z2@@p?%@{Q!jT&)gcgU{?qmq=}Z)YlZz3iyyc5iidWV;y!8oCN+Eqy$)vxs;9JWn`m z(VV|yer#psSe&H43Yr1ouN3?<-Jf?MDy^m@GMw_)Ohi=|ZDZ-AkQZpe!lQzfDgA;# zEv(UEipKCHml=`UMiToE{sG0PVy!$+c@A_X;{C}{3GziVVc z%zF;sy9U*eA~yQiy>-~yEYjrPCx)bowqAgDEm4-oTW7?Z&2DhEd7~8@^D|MmT(-tC z`>34ClWVgOM4J4)ESn!HnTk48SdDs|dvrYNd5SAtQQyzQbjFaat)q<*Mbs2<@W$`6 z=KIONj*La-&Q%Y%Ounm&qNj@)j^xj>vip+Yez=;OXeZDoBJQ< zRBz%fqh%5LPaC{jpZ)XHXWiojGpx|1N4Cdv3;P$sI`k$)HRK03#gFWJKd|GA<7Bu2 zQ8MZKgpS)DpC)Va_`P~AF4eGZ{^RqS_nB=a?mJnsfF{HB7xq6F`#BPy(wIu57y0E7 zxo9RRA5dkA9*C(#(W!j$#_+~aTl$=7d4o_XJryORLL}*bk_7^L`VMkiVZI@ONvQp00!ewyQ%W)j71D9jA_Xb++}~AShgf4hw3^`SG-1{$=;>8 z*x35$c#B@oJ_E_^p|OPV#jw7-MSOpwR=rrBrgX-qSe9asE%IHQul$6o%)l`McrqNs z=?%PocUNpl8BT`aM}C;Q-BKS&Tl@|5i)W@_osQH7+`9}<{1rmTFSV=BT+XgeJtQ!V zFU`Zz&*p-EUY~t{3Ren(_@nsf2N!)+lc!a#tH@4y7STXyd*AE-Rq5*s^dHs(cmMA< zV>zGpL%xnghARjYrqCU$fNSxAMYOHhM559O;yOWEh^CvLCnJRZAe*UXcm9oJ(FZLY^E^~_)p@F-s6qodgi ziQKy0Lq;|I%NoU|kt@{y!@CtjORn)`r7Z&gpuIBmz-(&*8o#TwJ%!q0ye@|BDKq77-@^^dQKfOBjDkM^j1fm0t$ z_IR3FA0^p3LQyG2m>G6f#FSnZo3un!gaVtW4Eh0SB+e6sDXtr=)z(3vHW|%?Ff~IN z-dDLS)C%K1l>nvD0t0}V7!IJkBfz8_6vk(6)-eOi0~JbA`gPWbr(gsRqYj^58Q=Lq zRwk@GsW!v0SEK=7g-1h`-I&}Ic}*1?Lo`j}G{hZ;Jql{ zir_-U2r4c$>B?SZs61Zz>+eFK#4fEATh|pBFfr3Upr7+EueWc_k54ZSH}|%9Cu_?D z*mb4QOV}ShW4(0kP7YmR5L~F-s)5U+SU;{mLE2aiNo24$A-gVI1r^c~4)x(ysEEl= z!6Q770S;ytJ^?B8_cGFI|KJ@P<3?`JaE4f%9%As_V63Q)B1C|i5^N~o^vmU+yTBqt zl5ky$3)42P7MoMH%(YYtmd6ryQE2bi-8Vl{So6#9j|GH3?s1Qt;MvpkN^6iON zO@rH47t>*AKG^_CVFWg*?5o{LJZ?QFoXh(;?_YeXCVU+T<*kY5==bk1rE z4cZ@_`#!BACh!8POLp!9@--pi@lW;)6PPItiMEamZtaivRJ4uVROa|IO}PYfwN!1o zWD2xzH``DDZf&)j-fuconDa39bm(3hTJ@zBYPvUV514EYPQo+FCuiWGebJI{nlt6s$ARq8H=q1h|};=!nFm*OhuQ zXcoKqjReC5`<*@hjuP8TkYw^Oz0Y5yUyf({a@Dk7iD|tWGtxDJw=^T7;23N0=Q+Y? zhz~nYeXYphf)~{gG$5lAIj;jStT2xzzx*P0AxaSY6U~ugZfR#X@V3!_wgkp3`_d*RCy%}_Nm z&-FdsL>N_EU>n5mr0)sCq~`^*yfcR5@w7iZ+-OsC(s*Unc2lxbIo+pyI8fI5r@Ov_ zcvv9Z%EcvSg|BmH(JYQkQFK&}0NTvCkkDXzTZXAG`7(2~z_iobRc4k*CKhuqBx&7+ zV#3tugvE>afpPe$ zyx%~riSif_s!Aeb12%t{oq)^)x0;!X`FV<+wWXx?7$Ms4G;H!+3@d{10W>Xu>2Hg; zg%8PDRl$HH4B7D=C8#0MLSXUQ50E(t zx8QM(7ZFV>;9D1C`(V<&qtR2by7mvTb_`~EfHb^y>PuW34QZ116Jpi=xo?$~#z#nV zz%FGIG8rKi@*u{gK-$@kRjrglXOU#Oi6ukzHFz)mH&uE#<_PU5cFLqYm1my{-78B? zP;j5@n0N@4bjYX^IB?Wsjo1D&-Lr~}0QOrHzOopQLOi}g4x?x@q$eM_JIT&7jWLA| zw{dkZAhR}}G3ABjcZQf@p3&R2jv=R8fm+6qQ5nJ4LNl=#&ZYdeLR2V%qL4id;~_RT z6RAE!a&sxpHxpJ%HMMA?jrd>ruKe_0f>&|3_?3+MD9HOO;BFubfui*ZpQ+7=rKT`Yu@@cobf&J2>L}k>bpnzUVhrfn)9=->@HhMfS9dC3gMQ} z#6H97UkCCV)_ityZ|eR25bNaN{TA8LrPWEHH68hJB|H2y;I*fvWmYlE=t+dMOR&h!6p-FIkY)*UIB;W@AiN%B?!aqXK7JS`(f38RtvZiz*ZGA48!SR*bR@6?xJ)`8hZdb9>AT@eGy)+u zJ-uUH=l4$~Ebb^J3~F-bF97k(OB^1PQZ@|ZcuGLDPIz4@XPG)x`7wbqg8~KEsOi6W7z&3^y zi;VFiTn_ISzn7Y`$0>(%?#2~VSp#`gPyc8v;>yh70E%xZ?8c24oN5V-rohk^{I8iK zd84T3oByr_0C*M+wz{_5w)ugMsHDZD`_j&7+!E7&ELe4P*0ldih`+MmG%ndk+$3)8 zmpu4dgWV5#2FAa`iOUnYmt|i78WL9s)>` zG6Kk9lmP@o==z*d6Z@p7o$;k9#(!-(OO;g^i zDDh}kg#9iaT8t<1TK6rfS9tZM2!!J1EDtPLR01YPUd%=~Dj{F2<+0TPy+OZJ*i}rU zX;p3UlBvU0*@I|zzba9TcSaCL^Co_q;7-bLVqq0ErWzE*h71v39b^%8mwMvXHKF*T z@MvI?A789c zVKqSe@|1n(=@97fo_RIN{KMxN>+JGo;ovgTw57Swka0><>{mQ9(7FBVsamgcv!VZ4?*GVjr|rBN`V&cz zdt|v42cf}yh&OA(F2b$JzrxBsF+1Br0awr$7Fh~!LIr?@e}X-`zRsp#Szg~`0HM

4?@e9$gY}Xb%Aff0zHQl`?0A@B=YnLR>z_|rHHY&G_fV0_ z_5VYI;Cu)?P+NM58dLVNe){rz|Cq%3KIZsqM zevJsK+WMc@Xq9tZ1+ctuX*1`S)V(1g0iVW^C zZTwLvgBv0PS?HYDW<5bA}dz<-1N2iqr+QnbIy3_CBA~Z=VEScwAAN zUg!m?aj96e3{Wk-X~QZ=V)sg0cId+Q3j5F9tJC{4xa*s%<_}Hy2!@Z+H<1Wabd1we zx#e~)BSFP+7%xh%T%_MHS|mR7;LRES`Gy!K=-MoJBs*Nb<-2iye_?;dX>+F`HwoI= z`mR21GN-&82&`|Q+#mFABF9!m-eF`e)7Dg7VVH>5ZCx^-Uoxmqiv_#l%SJjm**B<@ z*A|;;*_}Gag+d&w*WIpvC#2f%@)1-9n2?3D%PF1SN$V%ZTYK&^)Vod8-j#v$ zbBx`+O2MoLsN)(@x9w9Zv%$g6V6;=H<{caJAeb~;+t@HX`_Xvpel5{ozHMoBcskAa z>~9W+%va+-4^rE#89fbTQG67-=+eA^Tm;_NMu0 z;|VCzSvUj*lu2@9fywsBsfWLkrBVJupUaA zW#1$<(#Dp%15Me83Q?x<>B=)Pka$d_rs7%RC@jU)l>5STlIhja!+r)5nQ2sl!;697 z$#mCZTECY_8_TIGi)|uwB2|`>*Lnw#vGa6N>*U61^JSj0%QQeq)bXJEZv$k0j1|(T zC1#dVw(MgV^cj*hv(<_asQ6->5j9#XFr3P=%Whn)O_NqL}s|jibzgflFd8FEn(awRhTTp zPOOjjP)@&>L(=&!54?Y5S1mV?Q*b9~x5GFg(RHi#8%L!DJ1m^zqpvOo96@>aiD%77 zDp-MteP7_9PgL<_Jp8pFgUMpWG|4w=-dP;m=46?O^1RF5f>aX7(}QI8xkj(Ox~eJ_ z%07jUNg(Uu`~M_Q|3TF5?qq@#KBy_+bK&dC{R`!eWSnt(h1h^UDHX3 zwgh8sfXhDoyi%gkAkqj=<=^_!Ac=e4mV|PycvhBg4g^-{Y?Z}Y$j1a)Wwd!>dP!^L z`JrXhI#SdVE;!sF+eT(-#qflqVPY{Xk_@8+;y`pZe<^ENG5H?aMp{e>GF9oV++r{I z$_N5ZNXiBZbEOm#(|GzkF~eedh2{7WI`^^*}9L=!-OG$EsS?hU79J{eYGI|8e!*;c&fM+a#hyNf2Qq(K0hi z)X{4qN{kY{w_p&xMf4KA3}I%BF3J$S_Y$HEgAiS`5JV8YrpdSc&Uw#!-tW5hT>h~4 zHkb9RweI^~>sb#(m(_I@;Vn`T1A3v8Xn_NJsEja?9u&}gi$~?iH}-XPrc0T%+|cD| z^4bMhmZ2_Rl1gP(O#~&HcAP`|F=|kZmD?WS=ouyWx>_+ACKJs-OwuFNA8)q8)Ep@o zU+bLADu{p~Xo@%#F&p=twe9n(9m$!l>n;WxyWSLb^jBVVojmu_+jwnkFe9_ht*N~O7M34{dcQ%_bY#QXLbJ86%O9Y z9xe_y?!3iIvuxsb#?N{qw@xS3)6qKctcvNNEqFZ*jXr(pS}vG%)$#2>EeheVpK_GS zSK5HxsFl|`R{BFeiQ`KbT-%NMrx-pMWMmH=bDB&TSji|!9V?kIYZRupS9bn<#|i86 z;*|Gz#%=p#)8pU^&`rIS>b=rk(j4fgmdbD81dsbK9q*DuagJ!inLblHUk&*k(|G3k zTYLG8$P!i0LK~pDA_>s(ehfSH)#XFmW?$M$vsbB>7lA}((w!XEFA6ij!sEYpnj{09 z%+GjNGkP=p)&wJEe#*YK$;{qcolcNWUnmOjGPT@Zo2cd`K#l#TP2<1_9rX$_I6SEk z(XG#97t4{LLpMkV|MPgbD~5OFafz9M{C#vUSJ~)njFvdgPO*aG{rVr(j#!&ppkDG4 z*AbnHCqn5ms$crp>@hrO4qKdjqlykK_d<0>#{2hcRFV+(9<5vx2;En$aUs<&5&9+X zWdzxU>uPsU?KL-r^Ks6+biy2iF9iuqJWq>1;z!pmuOG!}dnO`;G(FDM74 zER<*lVWrklTA(B;UR$bg1KWp;b#aA8P#4Ukk6%O#*A?Y^$2?Pz_*VkHDyqs_zciyT zNS`u35b4t3{?z+lmr)~7A0D=M?wl;-`kmzOw!rWY&Y6JVFLtB#(Iaf1_A3Rpx!A5A znZc6e0v67(nm}I&<-N|Y&fRm;O$Rq`Z$y&IOZs3eXjim#`4K0GY8gxFO>HhcnfEA9 zB}r|8QJ+4r8Na3f6y}#R?l3(j%}Is@eP%y*rqxvQYFD!_miDb{s;hdAz%O7&O$U)- zr5QbAQ%2~2DRGypz?UcRIUwV1glb+5fpRoH{LSAXO?!}tW4(59Z+Skn^B3+7Aj$={ zb6xE(GoDxABQ#vDB1Qq%zLW=5TkENoJhx}rtle)c5z%Fd90fu*nKC{0Ub?Ytdu*-c z?79W0Pb&w{EGCwDjX7AJRb;*xY!luVYmH>f8&jz($rM44!C~C~vEWH38V-~qHloYv zFszKxIuU<=CDFS;akrDYYc;Ja2 zz#M6TIPwH_c^d8yy}v#5su1i~oy5!4Bk`3MYR~R!R3S`JDrg0LY@nDZShaauAq5T} z;yMA7(Fv0)*wJb`spx(ASQev=OY{ehm2JqwE3zw<$V(<+X+5-t*$~})Tvb6g1&a^W zX{CW?41+>s@m0f9*5T=XU9`H^?aIE!vzI_E?G-Ep3W;XzNW1#ti`)oE#x3fL8MAT127eQf=0v4s4yA zB6VQPHel}MPTqLZ{F^T>;^10F1h7^T(_->a2+4)&Vu;_PUbf0Znc+&Wi{A!a)Ey&6 z_u#Ql@hbhAJN=8Mx&a%fibW@aJDcByZ9ab*fx0-|y`L)OFz)bqFY{E&p#XhqwdDr&eIM53j``>oK}WB??5!u+~l-Od>7uxq@fE~)CTT-mfy_~~(mT5+o2deZTL zKN{7Qd|wf!i^(}1!QIscM@JJtLCL}c9m#r*8pDyPljN^C6mTYg<$GU&DLHQ+MyA%2 zUnL+4QHs1ef^5T%>oN3pvybr~wd`wAX~aAnc&oAeK}NdU#i}5s$y^-52qSlco@@eE zOt`DGl?%12z9n4j04ltq$6j_100Br@eiBJgh|frn|{6PEKHemB=Pe$M=LpE&rEjq2GZ zrS$9Z5;ETDIo99a;C6hhJlWqpXnc=0Z@*fv4Bq7gFvbY-NgL*s(Ae05w0P>-V~wxs z#OJ-B^Fr~x%{!ynD}bu;t@{VujF_J#*c{SPn$RW2%xbR}zQtlc_Ve?5)z1HFq!VEo z(NuYRGJE((8ZH*X%<+7pTQ%mwN%dp|=Ju;RuLyr7Jt*CtRXwk6}MdY=UgB7!N$jM-jTDGxd=j~S?&~}Cl)6{C`l!srm@umG%oh2=a9*m>4|(vX ztt&U{6`hhPPfj`Pymvk zKCtM!!Khwf{OP?7a0&9W?(otQP*B>psfq#6)&?op+nb-%XY;3VI3S^;vU*w(gF$ZQ zhA5Z{zb6xlmOq9=UnQ*C49$arvnZhk(h9*4!7~ndCM6WPp#4qYfOpWdC~Iv~j{Jou zX_;G|R?Yfj)+!@_2gmVfV(O75dTzT4kI5)Y?w88wbbk`Mc013+Qb*^Jb&aKMI=jpL zsAFX9qS91s0Q|F{wrv7C!~I)@Qno_d=kBWbq#WYOIn*JpC)Bv%HItoSYEySy677RJ zqK6Sl+I>k-#3glll7@=G8J!5w+%1o8O=iEX5Wj#^Vo0gbv&lbbN<}RP@<~+IDU^3 z>M1d1OU-)m7ys`6pnu<6({?n(xHKx2d?d{|6Fj=D`8@TK>p4XgBnj?L4UJy0lnmRE zrFm15IpP;k2p& zP}`V;a4u`rgMM|QMJ5MIXr5sZwL4kvy zmqr(vVuN>qW=>JO&InT>?%j=vcE)V@^%Ger$}_d_T?`3?`+j*{CDbnMTMq_@;f|%{ zDWOjTXuVN>IVS-95lTh_m`N(5I8Z4J&t^yTb@nkvFbY9cmI47v-R<%@>sZKcKRn8B?xF6BHez84kMRmTYNS6nu#_^72bg}} zjGDU4rw6nM2@usLQz_YDjAw9e-0hojf+?+KMp-@_dfRa9S;`THyB()=jol~R8+8^x zdNr*5Cd>}(Qj81VQGOd+6qY#gb_M^zC0pXxm5rA74OP?PrT>fA-r*_EWybyv{4yaN zi-$fuMVuA`zkK%+aQoGb?e!|+ixpbuJ&$w!lf#p@$AQ42uo-%9Lbv>gL%F5>cIu~b zrN%3+wI95fA*bgs(+y6K1YPFNm*E$IjEmdSTb6g9`0To5x4tW3sTOzJJa6%u{ovAZ zavBu$Wf*iRTxCow5TvEN9eWq0ZPHJB%>{R!cT@Q92&_{*%P;Xy6tXKd*JvO>+g{%k znSMnzE>Yk4x;3=-T~Q7=#UD-mL3D8s46Fc$B2W>5%SQCT8a9}3kV!?a>tpZghg4A- zVNxoQ1VIEEpjJ9Cd438enC*h1+7{>?~V7DhA_%?G~ej*GYs4WyiTF zXfl%y%&}WB%~th$c~VlRN&+_V+*z+_7$p|pFGYGLsL z6btzyBBw?JjQY)weBmQEId19j_93rQfNHsfi>z+K40^U%p@@%Ls{i<6Jo~0f#8w^) z7nv{L?GpZHdL?cu2or|iTP4c+)x{J{;+X>lP-)EvFWZM&9h}%2pw$!U(#vX zHo|CaY(J#K{33FN?9h_JF17CiVW!iW>UMNaTWalLQU3I_CZ=l6A01jBR-G^izptHB zJVt#)h+vC7@kSY=i}fZ>bPDCoxGqo5*txT%GbKDziYnR+Nqk?+ZI<^td!5abuIyhZTl0dmZWV4k?N7Z#YS=BhB$+R@pgjkwF+eb{L zhsugPq7eP^XX!XvS_;*CGJR$W8dXrPj9N-m1K@oQAFV2A=n4+ShG zuu?PJQ&v!=NUFd%|KcM@{>XDVF2pV3@EESg%Em?4K|<~JG!&rM`i8aY{Y)G?ulE!F zDNNt!+Nufgn|*1;Ap-`zy5XR9LS*@%#=4kITVt@ROQROW$iQE%v_7rVrBwmt<~Bb{ za>lBm3`2jYOE*Kah+tXQDp?oy9vD_`e*I990FS7ea`0WyNxfsF$XWFf1jrj8n-JOy?GOBOx$WIV$xqWsE;Pu4YqmJ zER7{7=p+kAIihJCq}D^T*guG5W+;v$t{fS|@~eh0IX;jw1}H?Szz3O(`v&Px!i`Lx zdEH?bD)olYazt|D)N28#9|W)a23B&DtmcPH0>S)teq|4=<#AeOdRFA~6@}JFL0ygU zF7;;*db)uqBp1p9N| zenS4PvReP8?^UrpIPL4!P9SGstOXXxw2HD;!N;U{AyuhkZ$ewz(#z%K z$e9eb)oN9XQ$)yYQFOn;s1t>3{*WM+E1LGUdyhDYXRlOR5LFT}zBv>x2Z;8InB`}O z%!(qMW&d*W)d6kirMX{6Z-T4(o>s92(DRSv;Q256@C?HXRJw`I--Ld?@*4#Ie494l zN&Vtg6)6JDWwk%2*Xt6Q6p&ln()@j8MZT=_uP#6eev98z@-A$hKMoE41pL)#Y^pkf z?T03L?6g+8xYS&unEzE_8gbH34Ucv>wUVytUEKD2wOHei~ z$>nKgdH6rW2G~9o9+H;2w(!BrqhH82Ve^~!#-k3n9rzndxp=yB?Y1!dhC$}{@Kz6% zU(YR-MsDU&OKFH2cBUc*^N-_HXzAd^Gj|oivAo{U$6NNUs~#o7>^N=J!5}7fZb-=+ z5P_v!7;Y7ZQwK!d$zCes5i4UW?sOSOk34da#d>u0ce}@=?^MPH6c%FyCv*nbs@)+G z>C|-5>1~`8x*B+L4%$*tt_Pc-Q*v&bo5}z=QDoULXM% zJ?Cs43?&WG|+6V%F5*{u%A)lLG@=8*R5K&a1CM}6&> zge%_G6*a2|g2Us4-FlG_^69JnBq9h*1{$#&g1X-~?;splW6~PfMfE6!8K_FLH zDsM%{u|<4`=yu5RC!vQ2A}>oWlRxv_l!$|Zt`Oot;r)kdKbK-8biymHGd(2zef=5f z?|p68PT($vrESV9oLxHZyBQ#O- z%biv`)6u@$w)?qnV?Z0PX5QKySR0>RlFkJ2rQ6jiBSaD&Mc0|B!tmzVg;Y<}f6%+-)k5L z1KQh<;T?BJ<LPajf z#_I7X#MqiB-+pd;{eOA^G^+Q%Q77x`?Hlkxav46w z#25rs1Gfv08hFEDirkYt+yXIHaB6%0-{iG)5OssDSl78)f-E(h)-ahO1S6S~P zTn;}!Fsvs68_}tNpa;dUG|HbH54vXDQ}9 zvS9Wd&h6@j%>EDmnKubBZ=~Z~fci0>Y~?+$BS!!bFGCG|l~R`<{XJhFGX3(!fS11J zhAL>E&eZfx$fMy<4tuS2DkeK0nlL=I#TypO-yQplBneag^lg5I{iE1#yPED_U-_e> z-`Y1n>ovN87XF<_00pdiduQm&_w@M_bX06-l_xgye+OwhSgRIh;EL?Xfg^<%jgEc{ zW4)mrKf!mVCXoQd|Hd8*x(&UNSG`oN9RagChVUsoqZsx|7HTKIr)0r~qV=r)jth4H z*%cua)9Aidg1f=0Fy%=ElE>~*3GBc`T*q@BPKJW1o2 zo=ShSAO=L69EG8BbWxoIQ|qsQlTwx#Vr{vmwc!VTVpU{Ldfn-T+(t+u8s5aZoQ=3Z@F}BnrH- z4_SsRzXc{2Eq9V#$Sa=z`jm#V=>lfylK-Z`7G#OP`ujcRwB>S5f^VROp0OkLcOT=s zY8y!gt!VhoBp3{viyl-L3mK;fFF*6dH}Ea@_0x;A`q8xJcFL&Qs zwNA#$C)4s85*`c57$A^;-*hy+PUclRs>}Ht@Kh0D7xcp0dq%Hm>X2$_nt9`UB`>4c zv)e^~*qvMijAr@oR0yW650UnSMe?#&o4WLHSk*ss-Y+ zf6XGj#QZgBV|2Rr$qRi$L;aWfc8UvL78ep5%8GWj28KTNCo}D@G2ZuG7n(hUg%1_= zvNkS)i(M?uOQv#++CokcFZBk$&A&c@?3Nf}(+nIy6=A&xlcm}SemW$_6MC3I12mHx zv~#?ouSAjdiOb&CbOwP8{>6om=!mnu1;aseRe~&0dI6tROsiNFEa&%9PT)}mh_P+e zwZq`A$H}d9c~izSPbP$x%1R@Wgu>X!bC~Ch5uR&EfwX> zUeMvH=Okdb)2P$_R6<@qRX1G2Ue6uTsE`TYil4H%b0=z1RIR2}YilWCHQT@YNn^Et(ub7~(GC;$I)xBh&<#SUO4f+o}wx5-+izID?@af5@{i3Yt z(4ZHZi?|rU#e%$QqY|XhRx3q0X+p9*cFhh=54j|&!l!K z8C1gUQ#o3{f=V{Eyki3#kBns@JsF`^QXDoPZ4>4Y30P07ujf3H1r(r$*t-Bi@P15M zHb@6lehydH^>kB(@b$>mZPl&PN|Ho)f7g6bwEZcKeoFb@Ww9#90z5bZ$wnTgyAk6- zEZd^8BsJd}$_`rkl8!eiNqIKrR6XYuX~wg)qRy`qu!HZPEIiFXp~D&FQ&i^Wc&Hdy z{HN8u4%EML?0>D0&F(y=6F7p3%SEwj-XwVw_+ql)2C$a?ed&G?K?}N{1)zfI_h(*N zwtGw%F9-aZAzPB&uWI}C_k#VDmPCGE@6&e%x5xM~&6B5CSZ<%qk)yQyQFAX<=#1sx zxMu&USF01kOK)>)X8TsC+GOPY@$>_r9!Q$oAn0zTXp1{AY+`R`JKY}E^Cy<{9=X79 z+P9q37t{TdNI%UFk8T8UA4S%`Y3R60#@6zni95$mpDksR?W7l&rY{0tSUQ-6#Uo?hQ z4!zCcjyh2ew?rIO0n`2Tc2Ywdd+#*`wDD_}s@izR?qlOtTYbB=YVV$W@oUTc3`u0nKO_2@Y zKi!BdN@E{ZVXO!*199vp9_y@GAi+&a8Utu`qG ze=XOIk`Jv~4fTp;MQ!rQ^s<9!2E)rClo5Ec`B|pz6?U=Jk z$z>PMJNa4j4xwJ>-ZW`T*^)V2uBVAgZ|5ru(0sR#fR;_^GH|bK|D@$y$yq??LEgT7 zehie<=(!}*q~X(hJ<1iaLs>bf6>xcFsk%vNl)>XD2_54r&~3V?wuTKU15>cd2{vbp zb8O%HvGT8uAHKImwm)Z|buuXvufj`J{T~ntVEEQjFyhklZj7pidbtTuEIIZf@~6d? zoKhmjNVlMqqU=3WW^vw-SjuwC%2Iv1@zP2h1=AKVHaVP>aE%gOe-m+P{9Jwt36~yF z>-zBI^`Da&A8*t*=Ko`?x9>~Tn22_R)yCaOEUsSMd-jw4$8*^~q8FK!)p6-Y6F@Q#pFNOV z&EYo>YjSnF_w>WZf)Y>>S%ycB)!w75d8wiw5Bl_^xm=UX>1~ zxO1p%x#7F@>A>aA83_|!b-=w|+c=-!_S}j)9BR{SvxK24mX>YK$C$PTm}%V~6w9RVDt81dzt8 zic#Cr7F@;J+?+#sGb{qFZse_#f^yXSoV%!8b>A2c>W<(n<@9$Uumg)baTGo~Hi&w8 zFC!^WyZ5X znDR}M_t9%fk?bbd@%{-XnfFq?wMT+@-)z~q?wo*^6lE$9RJz_xla_Z>Qy?X3jQUsk zso|yJ7)X1JWQL((PF{3|)9eEiY~ixsGl{_ORe`rI5sIA7&pYpYg#owtH!cZ8`8v|! zW74n8uHFVL{KtLrwtOTlXK zk!eD>lEoxoyVnt&l67!6T;=|_f-v-Y5X6`YA97oYO10pi{`DGXhcP{Su}inm5)_=0 z;n6&T8`SF+PX9z7(ulI-|L?MpR2)Q zlTmSoy0uUGkZ}$u@Iw8IJCnVX5XM4Im1To2#Fmb7gU)6H>y!$ii{7F_io4J;7HV4W zkIG2OkQpme^Uqc(l`}}?f{V6H6jHmzGUY>_Jwh3yWz0$*!w7d#3-mA8!y8?y?mIlj ztK!)x#Dz^`nU?Ja+J~5m;hdfZbgG(N)nW%x@KPHoWfy(U?&KHsrMQZ>hAF__vmvHk z7oR7#$crbm|JaMn{)K>nKDgf{bbss6)c|Qz3GYZmlrvhbdRB3daV^4)La1}E7wR)B zPwd1cImC+GKhUDwafXma3ujsRxnB2qFe+=w{kgTOUH#|W`<%*lnIk9X>u>*5L$Waj zw@Kc=C3;vdVS$h7-2V^eSib)ih=2EYFZh-_cP&-?X?$rUt}a}4ZT)re#9Ici@|%|| z;#T`sBncB3;g>!h=i~Pqpsxo&WC35+(YnIT$8;rc?J)h*>1J!Yv_dw*LaVPbN0QSW z_=Uz4Y_o|)=9B9`%FPd&s4O|EgGEBe!45(`(izwqv*r&X&#`E1Lq=^yAC(&eRKX-8 z$~i-iKz7GbjNpRG#MNM7!=Cgk&c=?`?z-4Qr~vrx{Sy6n-v&q30*rPsw^bCTbOs}) z12eNDEiuf%ZK>uL#p$3jzOh5}QEG$|f;k^?I5usi5=_I1FcM~^dx|2o8x~1acoyno zkGFS~I}-)Za;U<}Q<1ZFQc<|;=DohSQk>>O3ngJnpi=;J-%%9+W=rBO&XajQjCVA^ z&Ej>H)Wc<1E~17SP|LRz4x1}cRgNW(N~bEQ`)uyTPJ4qg}JIk-GK_?L4xO{Mr`B{*YYm+TF8LoezMK z1|aV24elnb3Ls42=qAn{R|?DKWv_);x7`!h-=$^LCBg%4861a^)ikp zk-zcO)RyOgZGr09gwWsydK}RBl@oC% zkzoN*0z)kmeJ@T7LG zbRc1~!z*fgmGaf@?urP7TbPe;tCq*!a=0aE;z-K(L%~i@oC$JkIMT!$K9ubvXhgwK z2Bz|HzGt)NJjk>Imz&0v=N$LXU?Py0K={=de!N4;Ailv|uT+8Z#4~(CrlaTc z)rJ|1iPfbe;LV?uv@HO%`0o%WV=E^{acQ4(Ux|`0Yiq~IlMF*icG>Wm;|r9qD{-~Y z&eyyN9q|VmVtvTI-Q5Fks6gW+l9N_=cR{Xdqj-TY98h!b`h0e<#z#`xH;1@c7J*AH zk$1VHy0cTIaF#r;KMda(b>9KxkkOE~m#I=)VPOS(DA7b%M=vg#qgcridNisB$Z*6ShD_^bN<63PPD&m>|1^vTun~zIzdojyA{PB zS3WL8^0hJrqn*cT^Xw(y8l#gZ2;|Gt`Uyuh8UoYmnx!V5NfvpA6`Fi=veguMX%u(f z{#)qg`)&$lf$9xO#2+S)^gA%DCXE8Af_~m;uwffbrHNp=KZlNSA%a&0#+R~q;{MR7 zMRW!;tn}>D>rLBbQX)(1z#H9Ve|+D39pxks(*z&j`Tye_zH<=~z@NEE#0ryLy*dbL zviKz1`gL{^iQZCw>GwWwCVhX+TDiqrbA$ht>zkQJ>&~DTh9xs;>b7&1Q)wznkvt>o z=m{7m<*g~5#)yQTRjnqYFzFO{DMb0Jz zv>?eUskEKby7=w$dMUJtY)PRF&H_FTp@f{^kTsRPU1qAzI2+$oAtp3z&V_Uf*hxkM zb&P-aEtW~_>0B(@mMXnzXlZnC7p9ylpbWYyri45lc5C83+yY=vVl8cCUIK0XwObY9 z9#jkKa&cZ28MxCI1&yxdU@Kk`?T{n(Vh)H9RoQiVYPbS3xM;YTiVRN1Pk>+XL#Yh^(4Uke_Vm&J!j5a zsFjKoegN;8uxw?W5R(~bY-qhSu;?D*CP4?{38Me6Ct{41eIF7lv2PQ6!T9JRKmK@lr4Bi z6z(y~u{%W_tce|lr$7;UPN-{1dhl8-a%HN{_0>P!m#;RThC zWDD zif*?%!Y~yf(eU=RcVB+%Pj{Y{X`QIaKFN~S%!IR^xmK7Fy&#Sle#=3Sn<0;*5jIcL z(?)sln`HOR27punB!v4H0X>Lh{QdK!YHKjX9w0WI`DKQkOzceZH?v|+XrE)3(@SLS zhHMH*fR*xZdBM%=sX4G$Zm}zbDDa^R>>7L~^z-JfTgPkj4&vW(bAj`$m}7Tyvg@cPVB)?tO$Igr9N#wu8g_9a@=<67eh>%T9{GR7mtrU2UrXl^NpP%VIox|+R z4@Lp4citPx%xJ*JuJ`;Y!CeJR_t9)FV?bmk-JkSBtsdhQhv4e^VJ=`BEZ6}yX5E?L zVw+-Nsbj~*w}9O(a^|u4;O^w{-H2G1Sv|)^2Tkp$4^jQJkBV#4=yKPr7*U+=jmP3% zr9k1nF5C>}rNtF2xcFOl9s^CiP{eZ1fd(N=uj6Zu|JWLpiUf#L(gb2#ObPNWlSppr zr9wiV4Vc16!RR0xox;S*Kp^{mOd-xCBpdMYq?%h zA87J@Nb#G={p)~6713YXeF3@6cME@_!GFm2!@F(}KZI_I6aB4iOP!GXa%m+8_pB^- zc>jYtnn@WRC-MDHu?zmTsb_S;CMg8z=u-9DZ35@~<-N#MKeYJQ{>ilc#F2-e9o2!I z*Rp&zY5-hhg%1g)7mXsE3%b`{oxV67Ha^}pLw|ayHdIXBDEiR%Sw7F+nwXI2bgG0- zpE^8)YP^;b#71y&Zz@r@u4cDI|BUq?dJk=OKxJZ9a@Nd0R*Tu_$Gy!mQB^K9KOMhD zt*fI+C^paPO5riD)Y5=Ls&b4MpI)&=>R(az9+mx(Pq_0GFAHdO&yteoJW46|S^;1G@$#_xoRk5KBDR zeB*J(wMYe^h+8YcQYD~0eS1&6VTsB?KpwqIC(P7`3`aYvH~O0>qhTZF@6`X3!^{J6 z;{kB397#B|7<2Db<$;OIYK<9xRz~V5s|`xbT4ubgJ$%6~Y5gzgFqeTyY00#Mnl=}v z!zr8OU6n-_5Zx+9v`|)cgsv*7tG5<&;kER)U(#CMVi30b7__Mpp^UCnqo`OF=!SGA z2jwDkm>25I;L2ru9-i}9EY_+bzgG#x+Y&%8ZRztI4LaEnEdtd-#8+T4SCz`=c*-T((>WVCyea`Z7R%M2QzgzyA%WORa=;M3*uL!^;ZiG#%tq2oFha)nlZeQrK(u_!p zFO4BMf9=njU;9rYdjo$eOtGptMuKF`B``hV1fM?qmbmyw1KxS>T=P{3{ds0r$f5k% zCD9G^^gWzJ-hkTOHMI3yAFK;bxYLS1uvS(ZnhhGQM~Y<8c2#&jNqu8!nD)F}(9iDU zqR+S$w?gKndD13Z^u{iN#paDw1_vkjO8E66qP7}$P=K-!9%O?>#5=0Be0ZehgI3w=IacvZZh}t;Rb%M(+!9+%wI{2+!`wXgiLtiO& z@`0L+_-41MEL^R1APgG@2mtze5@cw$C=0gxzO!g%9srms)!zgk$P>EP@>}NfTH}bNf9%Rv=`Vf6 zHl}Wis;w^^mPb}`$OIg6eY(B$DPpjqRnhn><+}0o^1x{-w$a>kCf~X-MRa)48H=E7 z%2+JVAl0XLjhe4^4vT6xOywoZRIg33Qt=e$HqOJr(TqAC4TGrF2&#&0c=1{d3O9wp zAPW`EDL{Ve&0WtAmGmney&)Avim?_R9J*=)-x{D2+uJ&xm<5MEL{NM7oWDm1Sfm{;j*gu7Nxz-rVj^LUQ}_U0D$AX814ZlkB-r3i zm^ii^O<#!;uG}fZiIu8~RjQ%XZQTiEd}t8`D%~_z#QM%~PwPiXnA*1jJxn3r3mM^@5e)Ru5Bzwh59Q?qY@%$?XY2N?z0_=sd zUR2*0S3-WK3}iU>c@=Wevnvcdeg49|HqGP3$S(>y;YvBH1OnUvgmeH2l#j!hCSVrd z9YCMkD~<$2f$_V7enT%=1Z=esXPhV+ggW>G1d6IT=G_oZoj}nnUM1#F0uR>ZlS#56? zOGKIW{iX#ebl)`&Ax#ILne3?f2QEwg;<1mvmqKhT=>PadieHQ)in4g(6dC3o7|zK5}v3i^4NTX|j-s@>7SH!jtB>)>~!16qA)cd=00G@yqa{mF)7 zM?<8*@uQ-3CBfPBmxYTuA*sOUEVZ#?hi8|Wr?DYL|Euc_eHSN_LM1fJgePh~*Aa_Q zN)s!jvV8#9t`@~0K%vVsg=W)Nfq8R>feqCfAHieSQoNZ-mm(;2Q4f4*@24ks_`j6N z#LU$~5X}KtW6kc5Y=POOD>?V*4quv^-}o^Td{+GwZ#E%myMq3yx@QM6VLMZTOnWY^3leRL@)H~6=}*V(^psV-fn-`S1ZU( z*Kd>k0Ap7V5}GHHyV32g>lIrB$O5YVzF>Z8U}DUAMDvkrJg=b7tZNO@WOG z;jvF5k&odp2!kd!0qidtt5YJXCYo>pmPlWVb=1hY*^&?Tn^u-mF5^8=S8ExVlBFEY zo%+-6k7eo#$RI78NjWa1vxFcdz*(gh+Fzc+jJ?lDTv6qejQlH8LIlIFilg{%0Hi;y zvbQML6%q?X3NeH$a465~&ug)8;G0;dvc*}xA5HnN?t2B?IRDvml?6*oJYRPz`h|wU zh6}GnExtdO1G71fd#!!t@M73$v}#MaGGJg*4@Oi0_O$h1I*gwdm^Ab(^ z99QN9T=?xSfe zp{jTFC-t3+Y(&#GY`a&Sc9Qu#VzxB0p4Tc>L5&MZTHMh?rjXdzv5b{sRIeGpvh~GE z^xnh@%t_E84qG^X4Hv*zU$0yyTMBHQ+#Jir((3GS=Qw*zKeJ$D#9Ksv85yYWd`g&g;s#lBaI4it(rk6( z%GI&@R8QiinzAc!eeXZ=s20t`^e4LcY@70|d$iE(4|LV}(P#`B05y*KV1w2eb{RNW z8~`<2#x}4h?}L1QyuTDFqFjvjYVA;6dpxr;sclc4G>FqM8B%Llt0>Q$r2*=xo6j3W zl};~db@(4b&5aE2Qz0Ic8tri%T(?`^WtuLcyisT^80`32^VcZ=KKm!p5itj!zHZ-O zIiz=6`ttW(Q-5!7?Mysx`@6r{6jb&Z*C#}(%klY$Eeg#yy9hSPiFOj~?}5>K`%O#1 zQJ>G$1W;d$8D*4M()p*DXmL4-V{twaD~CctHjBR_n%1uWXa?Pi6|t~%xMPkl*3s;_ z2@h8{Q3X3t@EpkxZ4FM`8>xNf$C497MjFaE&%XQb(jeY% zBfvQ?!A_2p#rBP(2&)`vviXqEiq|3u4=?2tFJ?M?^XpCS@7r*{MgjZRi#-3_oOArc}R@P^YZKo@1|w9P#=Q~BQ; z*CrMrV)A97bo4u&ZElC~droR2BegVv4t}kLdCd@g`nS`ld709!wxto zdRy(XOKYYoM1Q6V5IovH;*hDQ$FO~T{KS(|weJxaq_9kq3J=6^Vr33hxSLswsvS9R z+^U}|N~)>T_kWD<#U>g*?Q?A45cd;PbM2`GYt+ia?qK3nQ4in*k`gU+I!aZo_oiw} zP9i&Ok_20FycRFS&?C%sKf|4vk5*x8lW8zTirBU)rz2b3{H_2L;u9zD;Wi$(`p^g>yhrjE{s328|nlbiJJmZM^k9EeT z^Gf^1^TayV!YB6vZ!?j#>oX8M?y$ADwsZb9{k%kC5x@~u-gM(!b(l!+-gXf2;TE*P zAC*4`%-JK*Mk$UVcy3Q2^uCg*{r?31`Tr95C^isKLbyH<=s3|9YB>1W0<-cnT>kTe z)vCa|(W@z+4?JXC|3`6=|0qFCvFa4`BQx~x`K{A4@bBq&zeD8m`+-t3d6>-vY&w#t ztRmEgN8MMW%Hq$Lyl+Q6Cy;(M5HJ`a{YSwR8rDO8AZIO8%v7Mw_jVw@|@+MhlrlY6d!e}qu@v?%QBp_deA zSgWO!6Z&0?HU;X|yz1)c4JP+G6FE&d{z>cOgANep_pc3(@9_cXqtO}a+sEFus2KT9 zW)A#YQ2&pk&i&gV2Nk9r9BVI70xz8jEt|xq4$tymIsZSZzB;I_zU#KM#a)VPa3{EH zaF-&*A-F?Z+#P~@vEopyxVr?WNO9K|cbA*zx!--?@6IH1W-@0cf1I`VZ|}AC*^4y* zevk&vnJ?9mG780#hUkiL6iKfXc6YQud*_HUxs^shpD*h7%#F@pE436T>QSXH5_r4_`o@={{dO9 zEX^#XNM8P%O5PZvg99zy8h|)$f1+m$umw?(r?|!#}j!>3BjtB#B9hw-BcOD8?!fd3*D<$aqgJ?<)FbS0A`A62Zn7 zhaHMGAroC5fftpLYqf=nX$YXyRie*L^Qq}dFcr>vFUd=5NDeb;H@m`}LVI~lCYp(B zrLnOV<+sxBA8BCG8c7}tJ-yk&GNoXR^F+EN@E5r5Zx*5>AAP_d2+Ig-0ooAZ)xHcr9m6j{%lzg`_1WC9MuG*Wukl zUNO1aoT$xa#mf8;I^7{Mebu=bMgsGIuod59^Izat^%0X}3s^R_DQv#9TDya0UhE~e)gjlLG(8d ztIocTU3|>2Me2{Y`L)@IDEX~tFFdn1WbI$n?k?s}FL$fgw}mF1&VAXlwsl0i#xqJ; zkyW}g)4%RCIJpJ0sa}B~AD!d9N1Lo0Xq7ul%N>48a(&y_i_=PJX84#MQV2*wNF%H_ zP^e=9W^;Yp2#nzMR4Bf1Y&@;%)*;l6fJd;F`9&EHvmG6S$$7fUy;bwNNA?Sh=O#aPY)( z*qxSIqDObs^D^DoREyuNH$I@HfF-KL_syCvInAkFwq(Kx$XGTN9sW6ZdHP4dl zs&S!l+4=*d7awYsZD8H8K)}jAuTS*N*@Zp0PlUe<-WdB{g+Uh;K z-^=SZ^DViWSU2hM!0~2*qVNb% zb2)AyaQbCuTQ|Ojc$;nHGBy4MN7MCw2k`Q;E-5crGN}CzqR0;{Y-*XP;e12>{ zSt^hm)Yap(&M%6J44q&qANzUXZ0bp`sM$0?%4Is;tC5pj)b_EOS5cG1M-Gr#3(MSU zt|>G+BgJ`JWf(lD=!^|N5~Hj(TW0A@k!lOz21jrZ)T#^zohfiR4?rq6IX+bCpEzZ* zDL>?Gskq!SX#o>qQwF781FP-h=)CTLYrUS?eduZr>GxKuk4vNvOtsxmu1?=9-4!h0 z++V_DJ#1JSkD_=URPJ;=g&WBAsol%?+=HwHAu( zWMbzX@kXqV55dc5ogn z&F08pn(fRg@bsX3?d{8~&5_VQM}X+3ISrY^YW~j{!0rMKgzCS)%Z;z*-pqN}DI0!P_TqWTH!3rO&FrCm40cYcUSm8Vf1}zs#&SQ1QK6 zUK{apuaQd$9j3P^w*75an_QV+7^nrpp^=i;MwIxWI62~Z_K8cLk>?%|ykGb&{72+B z4&dwoF6|Ny$&Ulj^cyATD5b>?{Kz8>7poxkm9hh>cR@$_Bl>`_;L*yh&L328MO9jm z(N1!LbfGyZRBcX~Okw*HM+zJu6884Yh;ipNuh{hs*~mkhJBxhEq|^Fln!~HF(Ml^+ ztLO_Wq{}5-0hit2m{X&iL?YQ1Pmcm#!Opmw5R9h^{#Z<`J2%#;>fFzbuH?J%T`9wR z5RNNdgF^sU%)~L$MqUeNAf|`}k+zNjS<@n4L7Iik(jt=HTpf}ZwFov*huoVyT^;-S z9o$ImMEW01W30bU<99u6U6s8)1*^gd3g3|3hEGd|+QUX`uOQk28nRQ8tk+v=@bYP_ zOjlQ^jI<0!v@R`5|C_tW&I6sduO)?I@19)TyIi)iDS``65&Xo?-gWPlwEO>B zJ@t){!uSU|aS-F@htu^=Z_9nRqjK9F843U-Q^WU5PF5-=C8O$o=OhG zir!vC9@_(D7ku-QgRE@@qXqFUrL{W{rN?hJpVGcr8{ZyfsoJW~Y5bm0s{8R{QKF$| zY67fLXq&$j9Gb|Oa`anCVWbvW!9p!DOv^wXz__RumYBjbo41q2<8f{P;-#ktY60gU zX#7OL4N(a+tz0cF8uSlzuFMT{k!nEoc21z3WSB0!S+iD8d4oxSlF({v>r5!B>KYoV z`&?c0+UwtE>bYHv7IS-D!ng>+@E`KpyEIg0K9cvL&+lHsojT=xApz&v%TDLz>^>>` zmr{jrhu1tmRb*Yle`xanBtDKB*cb{#!u5@p25n`u(38p;4e@Re7SSO@hN5sGq&f;$ za50$)v8F$Cw|$9Tq7ci}{848y(U0=jS1(TxQT72rk=3w(W+kQ!!N9CEgD55PMHe16JAYQzYl?l(6W0^|_oe#28FOoUa9^KY zsgUBaIqpA$aZai#l^ctz{uD#9riU+^j2cdXBE`6)qad=^Z&VBmVUvHk! zPO33SAJ*6IDqlB$=d5M44*AlnYc|Ybz%% z1@1VlqzVw^3wkJxJ0|va63FFF^YxT3mYap2UFGyr#Hy?3BqP(_4#Ti?VZnNU;jn)F z>*0^{r5`dsmXhc+GfcFsZ9XvBmyKItg7EfHHTLIoQ<>`xu%NSGzx(NciZ3*WLboPey+TP}i+uO4 z&+Hu9{0627E@_@OPwykeuBbJO#4eh;UVn$n-Zn5=Wa%2#W+e95d8PC*5@j~f>Qrsa zH&c0FQU%*ovn&E?*dOP}IxK`*`vcg(*}Ls1nDrF{%JLdhWAtAtm>1WpQ{8K$bS|HZ z&@XIzmC{3KRV~V-UFoDdet;N0Fanb`3TbB4R%#Q`^Y_#T#d8wEG!FX>T3QJ*&|T@Y zP~?M6ungzAqer7k2UerX@WUh9e#{0VW-*nXxbCFD-s^LZOFa@E74n~aJU0BepCwv( zqTR%%Yhnt9I+8#oTsV*^7qO6H&BJM2+3YyuvDlb7ESp2q3B5p+UkcjzB^2Cq-oA(XOAL1>DFSm+|=I9zCTW8a9DMa|-r1=iy-r0YnfI3@T= zYzDbMS+-CC2x*}!@+gT=${~(#?-{-JatMpaxu6BClGshV+OcDQSMIX8$o!Az$v4^k zd&pld6nTH{t0Grk(CCuBgf5t+!+*e&55+&H1$lM~e>Y3c8=z*wkfbt=22*6fk7y_$ zOPAUNkq*!nP>&9pN0iO!(sNmz8V!kK?pAAUa5!ISZ?NeOU;ofznxvEXS^l0TxnxasoQKrT8&&Bg=^A7+d;t%b!^oH0wV_*2L+Ee6;m+fv6>a8hyp5}k= ztm5>)sB-GatNCn>aa>0y_Vicw_C;@sG?Jt6=WmOm?>tbJunT5f%qj1O3C}C1hu&O2 zD2dobDn%=}X(e=uR%-riOK(HLOcCQSRtN*ppp0@`;>282Ij#P-Sn4V(QDm0ss9wc3 zA6&=aLYu9my`^x|NDQ?}YHLJvhp>zxCH3xcWnfz-(cQXDgBZ)d9177&4Qpl=i6Uzh z{OP!*8+FTET057CqI2agQ>P$zsCA9ji<@G$mI7neQns-$4-Ihwf-QpV0p9%^QGtj? z2JAHKsdy*~@8#1YkU}9QRPB`0l1A9k;tBaBKeJ~OB_euydCi-s2T!)?6~=2?O@-B6 zyU+C|sq1p|Fp5u<#t7+MOtP9CSK_bwzaBOUoxY4ok=m+WraX#Hu-aiJI4i~L8ufKc z8d7r$ckwqCo%+M4+$8|ou|xoHl@^541g#vcau64p5ioKbNUT4d`wGmrXZu&a8Gg@9 z$(n9*F3hV&Y@cnZTjQi30+q9g}9qs|iqs`(1^ViBk#)#ViAgCVL!i2@-gW-9A) zH9{}B9;qzrd6-imIQ)+9*75vYcK@l{?xrU7pzO)Va^TEt7sQ^l+j|#^y4C;zbRwy> zh-&o{x&pJdJ>(=+hB(l_@xYD9*$^pj(TbO-Cf;gLW9yA!6(DPl|F$XiV=f=fwtO}^ z7FjqY|8=ao{sM!KPUM?OlejMMf3O7mE%&3rm&uKYh14sa?&Saqi@$J>$sT-XVmdGf zY#8Kn9M)Xto7NJOIzRT1r5;HeRosgh+z5D2{@M+@yu{YO1d;VOB=RmdD&Cvp3hbDGLiCjIs)F5^`{)AWDCt#AxI`t~3ib)pv}Mm@0!NdcUb%shP>)*U->CV2O}t zd{CDGc?3|egdo}$ogt+>1~TJG^~>SCzL9(%h^`QwXNddZUK$OR?NgI-6p}s)kPTb8 z_G0G(Dlws6KA&bPB-HiAHZv|K=VF<@$u34*_M}XXg`lzeeswa5hk!e!Zf6n>QZKhqqqOt-qqBvmMOhp@1Jb!Cj?YCOT5a5 zSqHr7(p-3>;gsP>i30Nr$#u^Wq6*V0Qf02=tCT!6Jr%0ljFeeNgI+>Vt-a>mMr4hV z5c=Ba0(zm&=Xurhg6dT$j{|F_h?Cx*Q8v0JT>~_n&1l_(9&9<2U|n+}fh`=#5WJ8e z1|SVn6a^GadtAn%<0rA}I+^c4H<5`JTvPEP`3NPa{BfLaTh2()t^h(NNE zPR8EtlPNi7Gl^nL!^5sCUAQ+2|;W?@%2C9AXD zUGsW`OhG8~OqLwMT^=gVF9vIXoMm|2BvnDvvf`z~?jg6S@z`9T1lzJ|Gsy+j;&DY{yqEv(1L|VIk@vD;e z!p(cQ7*FhE{?E3AO%oMPHsAY8!8LPN=|OdM=M!|OOLQ||BG)!M-9*-Jj43vAeTEzC zwW$U#69M^Z722}yWx$cYyklU+`%Mn?FeE%C7g};)1d{@In4=6MmH^2(f}KV@Hp*Lu zBC*KSs|iPzQ#F6wx(#5D~ zRc6u40xu((csGlRSmLW@YLX#1$u-0ZvzFEs1P)RP8D)_TDc?y5!4E>)2_e{&2997- zD)Gtz!%`j9^X2hq^8@o{J%CgQMg66D-ab_Q3oe6%sh*sOFP>xJst%W$xxxd!R{L@W zTGrc+f;}Akj)y+1)ZFRq`xFf4+E#;|8vdR^<{RSN6S~q32 zelgUZrCw~Q=&=$BFqI@zAZ_qpNZ9gL6dYUaEO(@RU~2`Nyg5khtu*x<@x-G+CU*rK zy-Lo^-t~N6iE1}%+G4yQoDLH^%iFQ(ScMA!jP4xu##Ui5tc@aWQX%_a6Q!n?6jYCDihZx91y~Imsb7S?N0t$RDJh&sxSO9ecS2K&hF5O*Q~CW#6ceA_z=17 zGZUBH{6wrHP1FWY6#7wp&{1OWd>Io{`xv^ovHFH{z3ngvP5?eYRs3I`A&u9*_S)xz~ODuww zAkq_z`>DmZLzQE--j1}RAaE0oge10k^G`IebTf{?%8H1AwwavL1%uzM(P#W9v-n9) zm;Ok@JSrh={OIDdRY}N4WoZ^xg`jEs4(6ZWG%WL$S^^GeNyh6XF8$rvu!BiyoNx~l zG@35%A_Y-wP;pK*zE6%gijH|VF(E7Xudv-ng?xSVwsm=$Vx*uc)zGgkQe7mh5kUe8 z9?^xGBXTDbs%go;1zV=(@1+IRNx5Y3Apou~1r&2m*cBxLZtS4|9hbCpUDf?Tq(1~T zR8!yO>=!8e)%FIb7*BEy+wdY;lEo~vB$B*%S@`GU#DB#jN3uY%w~Nh}^_PrIFi9-g-q<#QuEDsWNoj!`5(v&{1F}+4zhPU25~{98y~> zr|Rd|b+g6{b}|kAtWv~JRg#WK=rfF|eHf~$8m7VAwYOZ%)@I~XL8v7W$Rn+ZU__>8 zNz*X)Xf_DLy}%LJqQX;Gf-MmK$?eSk5igjdKC_bbm-v|smk|w4l2olXDS%KF1jS*;jq9G6e?mYEf5+U8uqAi(fTWKd2y*< z)O4wTCCBhv7~sqgLZ)XB3>Ny12WvI7Zj zF$L_j`|;nza1xHWM$0SBa$O?SQP#%8#|V*Z6IoepZ?+qMMnfdezunLw|90{6DC=__ zJ(ts;P$6vf3to)v1bWeKEEk1<97^R*MUAAFagPu<5c@0WgF716nLTY(VU~krsXSZ) ze3gKFvC24cR-8<>CGnK=n?GSxt8Yn#ZUQhU{1zv?w-QR+Z(--3RU~SEJX-#6bh#kU zdo=BTJI#NnS5mm@;x1sq;LR-IRVoBI&X&yLQ#&f3irfTBOnPV9!neVrx=O zw>4tVqRqfYm@#fSV##H-a%Fuc7%+`2Hi>T4hF#Kzy#I(@*Y2U88bsK_BRjqwKyVql zX=h5SK!Xy3cV^q`@1gW~GvE38*tyNu`EY7r3K=efCn`^%B|zb1Bhu+z6?`IuttWIu z5FJOR8;$;dgZ|@!miCYiBWIbI{(7m5%P&bWP z27B#6ggVonA~eu-o<`V=LyOSD5_ZzSezwDX}7A%@jCx;47#AL(&?LfyeYxF}i* zH;PowbQzr2Z4#L0UKU=eMwi5CGnst9Jv$TrCtreTil*{ZEkl_bmlU9X3Uj6VQ zSB~3PLAFE9U-cRH!f^TScjxPiTMdX%Qo?zdkw{8t-DEs}t(5!`Q7U69C${?1FwDIP zSvbslR5uaO$?=ZDfO91pH!Q)~OI;(oP_#_7qdx+uV%EE8Q^Fl4a%6h^jWOe$uHS4i13R1sbgJaVoGya^;5uk5u#sQHNS_w z=ePmnnRmZ!3;I(T%i@dRiaV5Lx+- zb=D6w@{P3{wth5dPMgb&t(CC`5Y-FodOC|dW?znX6ckksnYGO&|C!C*mSTOBRErgmXcrF30;yZb7 z^zDg8o}JIY8)m5_$YOF)?5D0Mg<|`8{tpMaFE7TYMHIQvJDpSC(e;PV23sV5BeF-D z5HJHbiQdEt2R0{0x0?SfvZVd7)10k^d+2r7U!c%PH^X1GY}`+{By@4UXkTsyvBdLp zY*Re6yYmUV?NxSb8WaxKpli84iEU$Sp_J_v+19?|a7-*1YHnf9Qlr@vK-!UD&~gO< zzD`R642r}^@@Ibsn-#q3QiY|xf#l5yoiWVOMW~h4El*dA;k(92yu+;l^m}afC+-AL z+-Ha1|0$TEr|rf%`#tZQJb(O1Q9jHr-Xa4XsnDO~IndPy#SB^ZAyDAK;Qe}ZBLXVdN!(W~io%L#MfxhM|n(2xTVOM0< zktw&Fz&X<$WK83rxJDF`$KkUU=!C%L=LQclWcu>HMnCQ&D&)j|PFNJT=O)vCPLBW- z%NcV{a7rBqPNXZZynoSj9oLg_`y}PXz-UBn z14@f1=0^6VVJD6EO!I44vbD}bCR9`LU$tb3$)h)OBacQxG~&KB7R4E%0Q1`?Elo08 z_U^ET-jN1TDccbYZ2n!q&GmpW7{6)Wda3p8(#ENxbx}syH^H31&FVtMJSsUNVm>NX z{0|#4@*Dc?R6yX>efbUjF$iQw#^?Zlq< zxPLy+BeJdIRHW&-ACcWaW*UL{c+1WK+I+n3|A^T6*aU#C-|bdEc;|Xq${LnwRSEWF zTHJ+RoAkAq`h?kib8yu2PwzNRKHKu$FpUrRWl}_03yB3?XuMy&!8YV3gzfS9Ib{Dx z$Z-7&fgZQr`dJ;e(#>0cE_BHB^BTuEt8e3Uo|6QHL^vUHQU@F{z+lngt@!j|;$^G) znCGJZLyzo>_*pLL^UV5V-TJG3+S(H{gn3hi%#^k&q^~u&uLjHf4Xk3sb`%+ST99`X zXvh8N`dxmjSPE7y+Id~|zx%oc#x^IV{9ECjW$ZG@(Gmkaxx8fLu{!}KWp2XkN?nt@ zRZgfGg+_AfP?^~XYgZyxtlTAB+SNSxPeK$?hJ~HuBH|gt621E=lNmIS(7%3&mW%vA z6;?3a*0E&=JnBx_NT3=At2a~la0N-jT>!DMCvSBVDes_Nw@4HsB1Qf|Zy_{R1sUh` z7`~7`l3cx3W5NmY!-Zd2AzU>kzWi*+1u3S%BQl)C_R``K>H~$-gNqEx_#sP&@wa4r85e0+e@$>wqN44x>%Crt4GDAfv>a>R27$*o<^rGsx?&RC({mL zLSe~rS)Rg-C8JAqB-u@m$bIP7duf{2;)Cp?#$g*9yd|j@Rc|+|My0v!v%-xFWiLp=$4=iZvHFPJ# zmFm}q2@g~*jPe%&aGvMemlxarw|`9;af=F&Ql;CtvVEx`7!0Ow^}m!>{USoWKel%M z`g!s#ys~u9Eqg+i zS+M=zY|$#TURR!a9Wt+ZLWM5t8qi_iyBTKDAGcF%y%<2!Dfu8 zC`XjOcD0Lv;pB1e|I+iifV=*6a-Q7t z?!tSU(}k8)@7{Y)rLxt0Ma2cWuq24keRC5-x{GIr3Pkvq#?EvkA1KMNKJD=}tr%XI zj!fd>iZM46@S>&lv>&D(rjB|1nXb$AHFt6_hudA#BW^`bG}D`lxP`gl#CN}VN5umm zOhnGcj&ZNvenvZqop;8;D2Wn>)JKh|%ZMy9)EjYz#)&Q%{T-C_#?{7|kwLmYFQ98n z&G4ZIy|?mnB>PuuG|A}f0gu4`#P(aRe@H^Tiw}<5om0H?suRwuJEY#Q3_zT{ReXc3 zhRuAWta)RN5y2ynWcD#AKxS|V2ftS%hKBMjo8S{T(Ll|I5&H9~Bs6At!!J1S zal?E|sD~3(Ctwf_6)DSaVJ$Mn)0~&zg7BBZ=Qa#4fiz;&Ie?oevCsME_XQGz3DH+U zsW}m0;9e2yoh#D{eW(D1%Xa~&wviNmaKzEu_jccAfQ;MP0q_C@a2f>=eMy0^XSIOcCMjyyLNJyT2nCUw2!2*mz_z=IiD9JR$Kl2C?Ow4T%O@ zO!I({aHSz+BD#z-QqIusk2IpY`#Ct?(~Xg&dIj27Gc+>j(*{Ry4$1?TqrnG4_HZYP*Jj|T&?RLAm)4Qbe_%kOzOWIhUqf81INo_p`==nQ*&K0Rg+U(VKXR4 zhWq8H#$m3qAWsUZkBG6((v6qfB5u67cyaIBo^Ym3CVD1UqvQQjZFj}zglhdsFD`u< zTtW${Vh7Gc<;hP6L?sYB$PV{jdXJ1yfii)0&)aW!>AUzpk=7C=VXdHl%O#Iat*U~7 z{Jl&kxVO z`&%+HYrylIK|ai*QA5Ak{gz1*Z?_ZS{qvkg3h$Y?_P;{8w;g=Gnft!PF>Pyq$NnbH z#AI^cey=<8T((Z_+eaA}_BrX86uDptp9I@PnH_K__Gm54a&ety04!rI>6EeS0z5%u z@5YPLsmE#eus`Shp?pBPmh1SQHY)|DCv^_fkBiu<&Yva}y*orygd5~c^r2@kQ^)am z*^TkvI?D3D7E=+edQ(s{rg)RJfzG!wo<{oco_$fc$Fgnw-ToD=GEeyVUrYtthF&ER_`4*R;yn_PrdZMvrDsl0zb&tV~TW8S86e-B6i(Bvir$n z_@XWt-^UUR^cbo#MKDa^qQ}0^=s~82s1?&DS&S7>4M1Et0eeX4-e$!Jm<3b`1%$Hd;>otM^i81DFdM|OI*%Dk$R7Q;-m0z7HIR3Q^^Z7EG$Uf6TQ z;EFZpbNZ75lYeG>5;GnB&e^OW;i{j%4p~wqHVVsf#*xRFF#FWvGYZPC#~!? z$0Y7gkOZrFlqM)vGJC~^1|oaNpWU2In~{|}Ph+JR7EDNi$+1Em19y^?e&l`$vG>dt8C#gjDI{8cyHB zO({ieI}2tm`NS!ZB{@27X5F#*P06MGwOv}7x7+fR$?9F#y-P?nk&O8ljL8GyUK3?zW`C-bc*QTYBi&3$X&=p ziXDmEpws~HTUn-0llH`fb7KOjw|LhhxbR*LdZioo1j z^CSw$$bsR1d9c3gH;q&Ptn~VO1-<>35&7#0FS91yxffAlIY*DcVuEA zk=OOE6F1av6NZ{`DlPV4Tf=i4h!eApWQg#fszqmo3C)jnv>3n2$$}O>h>p(T}TNN z9=4u<3Pce3w#Eve+rK(%a#vjyZO4-xirpB~L1Nj`iPB1}iFm~Haq;>zd@IPPQLNJ9 zAsK*nAANSuJGEC$h9Gfu3}*%;%rOP&mXPq|OA}|AUzBBp-_{`CV@|o-rNIGi>OLC9j=Vm+-4w_uvN0_RW+_*vWHE4Bar+ zvIN`z-z-3p+rX~GMC-r?sD__pfEa!FYej!FZYcKV=-bhcl{wb?#dx{WiGO^Z6Lm*i z5q4ErR3a~)`f-+x3h`o0{1Pg#sIA|#st`2#RMrSSaNz4}?@&alu?58;4W=%}Qc7DE z<`9k3hS2u{lJKsK0J4es&8elJEU>E3GLh8ZtnbPhWp6P}F92F3b6&4s_YyMPj_;8yc(kY8}&NAr9NaL z9fOmOIEN_BuuRk-+CdCldy*}I++!(1DnvxsRkL)iA+<^eQX(*;35B;ZW0o4^d9f{n z`c=M-1;oW8EfO6FZt#Qh*Ec6_J4MAd$nJmd>J_w zyV*$ToI70e-Z#>D!gqed=()H2ayIF=PVqR-_mXYwKSBcgcj$eeY*!0e_QGvA=_;Wq zB6@82z;mwq!y0DSWvsi=Y~Eg^>(NZEH|74_q4)gN4XA?M;a>5URe(~Srd^i=?FOD! zNfI37hxI97mOL6nPcIuJXRqr#0mX9O{-b`9OGa7n+w2KP z(^6H)s+=S+a?q{pH8Uch#=^2CPyJVm9KKx79(ZJNG5x6MtR+H-D1-?8kIZRP7vfzY zeV45H=D~L|_lE&|v=hRWGHQ3>SVHqn2rvSO!9A>Ln|xfjb=P`BxK*-^L4TV{A`q&%Lgpi_T%Aly($uriDkBwle0cICj#4vqp zCL5uS#>j9RZ7De&KlgptCJ2EYBCYJl(1ttE@Bb4sf%RrNwr`-f+>}F^(9!+oQZoB; z#UeF0xAk-?8ihk?g1O2wV$x8oMRBffr1Nvmq=RbB`h;o37XfOCMAkIE{#Mu~Ks!x~!g0>IN*ip7p3od!Q$0kyeNzUJO$fOWtNkW1nh7KFBSp-hK9C@hEV zQx;%)h}Ir{lO~GNEQG5mEQZ^B&G2C|5UYMJserW#P@~zR(8pgG%3qo_8%ZgfuRLMz ze82#RaYg3|S{MC&9!4_QW@NX7Na15WF}W(X+ea_dN(#ZbnxNgbl_^U;+ZR|6;(S@S zHh<}l9&CRQj}|GZj^C#cGJ_24XwS-u{wW&C(p^(rP53|+@_qoWubX;D7aI)LQ2>Oa zN;=Hs{~0#bxcUase@MC98~f`p?p8g1SdFM+@EJ1D@mEfZ3r4wRK)FO$Z`RjW3JBiW z={O8vZ)99-u7#^=T?72t-2Pl0-n^yHJ$CuG{{FWNAKCtwG=?YLjJVuwztosq_q-ZE zv>ES`$UC%LTgh~|QYHRLGN;-!U!CnY+4MSRY#l!_a^3fO7X5PU-?d_AF}}{g|0Y=> z1i<{4B+w85NqZf;b@Y20e|=2)qf)JvtLrwk zuG;%`dEG(4Z)bk(&Rxv4=1V(jk==>!y&YgtImDR$uTqHUjPhJ;=ik9~VgE@Hb~5*E zxAmC2&Sd+TGs9g$xb3{zZP9dfmUjS!#VjO^WNXZo4D-)S@M|(E=5Agl_^g&H6lOF- zMx9SQw3aPHANC*%=9-NcAy@`{g5&QleF>Cpu%z*769gxAr)vK!{s5t;2Muz1f$V2x$3$V7FXVMrJVJH)UXBDFRh5h;L=-tJq~oS&t}7>MUG2|>)qk)%QwXb*8b_y zBuG$X2kR;T4_gTv7==ke={$jWiTS5*71fV8h0l_8KbWy_NdXWXCVDZ8bWaK9QJEVb zVtW-rmm))pO=R^s_{~_pPTN-BQJzFdyk53P(cX7U>3=4`Hi58Q4j`VIQ;)OhgZy`Q z{4fgLkZP!`@MNYZS}X}kxPyD-u#su>3%i6b+Z?Der(pKC(pQjfz!}V3im)RKTZV2Z z`S8l@@{M>tf54b|*{&%~NpyA{gY+--L!0D`FhYH(Fg@=yBG0TNh`Q^lSvuqa>7@&|t_W%Sj{EZTWOYv@S5VccznXzkLgy=% z%%UD@#{7m%pYW;fL~e%A>GLe_Ki`-Q)El~&yXZNOoK)Wtd-@1r z&zwIjF}p78OIT+;OtIhyD3rGMXYK-mNTbB=$z)$I6kmHPUmpS$t8_hudbt%cv@-&d zsXJWHuLxeQghbN{bBS!8zOnn#x~}lH0F}(=cQC zpsx%9ago1kZI0khhUEP>71tj5UJVbn^hLQNlKpOQt3C8M*E;!(&KuaO)caZD%e4q) zkFR`QLLZG@?D!y!VzPMzs4~oduOS~paBQwe*LybC0?~G)X+qwj0Yb_nct2%1IE7VR zO_!}LWF4!8!Yh#yGZ?u1}*h?yd_P&3P8G zUUn+`MR$LZ`i7A-fAXI2^Rc?nr3M)~+{j(Is<6&AY7PK9$5PZ0ZjszMJIUnUu z5X!b>Hki}5?4F^!z`}yCY%>IhWJ&lZ(LKnDHoq|XC#k%EBsq1AnWb;N?wA$6(l@zF zQmWor=_Cyg*;0P`kh3??x~cTD9(pkY5cq*(@mHn8=vX3E0!R`&F{Dk=GD;e#jz=YP z-mhzI1}d{b-3)dMV|AZ63ov6as>Qvlt#hg##P<4%6qMWf%H46g7SS+!-Wq%hR9S@| zcwTJ>Uvcp9TK&X2)P9f3C_PmhGWCn2CyF*wK@^hV@zBA}HtuSNug(~NiRiLvmM1}( z2;Om?OXepLL7k8Ekx*9SFiz*__TR- z`z}XS_82lmH-YcbQl_rqDEztIZvWQ3|LLFQvArLAe?Xw@ah^l0e^IYKYes8p^YOIa z19M)oz_ibmsZ)Fx(KADqz)v#xNnH_}q#2Y*jZCm8og{~S)%*!3gJnF4E=lRs*(hev z$|@-A9pXmMw*Hd$A3DcPiC9Da7wXA{oFBrn30GgbOQ^Trsk(?5qxhgZqckJjjYr)5 zE$8ST`DjuAyjdXLP5R8?cVcVA{J#n+mVXN>i#wezw`Ik;d+)h%<2?l>i_Y*ehg}|@ zQVbZIqHT09>0cti)6yyi_cS`7Y5cnWvXpxi?DSrS>iN-b{?>^9(*%-=CONLbS;ti3{C62b(rVbuX;|j_lf!G&8KSc%I<%e*;(dod8<_9 z`USSua97wG2vYq!A zKOmuYbvCQbL0P5m2U$<=dtYZ(Balo*`*(F)ze;p7$af?{ydhBR^l^u*$TD{@dMi@+ zm&1h{1k9nLWK|N84xV}`)~S!Z9D@hxGNXZeq_>m$Y>N#PX5)erd*}JV9)I}RmlG6v z2dDq`hB3rU=dE!aE}f~|qRtUB@`E$JGa9E0Xe}nH11C09^g(Pb?YoIBlk00rEdd7J}$iWgLZVelHK3n3#fvm`W)qO z>~teL7hKR8C&iX;wxhqkGPubIpd+lJvkdUjeQ+V@(H&&TDul|o;$cQ~gSkO2F@)AG ztr8Nc&VnPP31O=necR-b>IZ)w6;V6CkI@Ufccsy{tX$aes{#MK`nYq}0h^|+@xJ%2=&1YV4FoP7%X5WBapINM2WKWAN zmX$T*n6>^?8x0O5d-1ErK0^%Ljft0*Gg%u85aX2G|F?-28)zE6do(}?&KSL&=*~{n zCEGvA^~P5dq(n<}_MF&>f5+SgUy))(3}+{Qq-aj8anF*#)xWzF_1{Q=^$4jR!2t5e!X|UOQ&M{WGHj6RSW@<+`6o^;;_i1WCZ&A+zf3;K>3Sh4Apbe^ ze?ELof{3kR#BTa>`}_12FYA?kiF#8YPjpHmdH(F=JFou=OiJ^|o>obrG;`t-xvE@z zl10CUbGcaxe_`2G>`~Yi7*2b6y7h}~d#*L{7oNJM1uj|d^L6e1lJ#r50*x{t;I_%V zpD!UooJsy|>!~N*(sk#lzGY<1;@V%UXdo2`MDLnOd*H|3-BQ(V{XIVmybi14en@2# zJXFN>C|jIi7*cN?VhsvYiUZc<=s6NCw=1!vt=xQX5cecphi@2@>5+wi7TeCuwn*$BKi<5|;0tb4! zOiwnmC^0BpMPT|a2g96~@&?qz>w7{ihA@dhBvi<|7B-%qg0}RUW~JQhSsZNmia3)~ z0sn`ocM7jGYPLpWqhs5)*|BZgwv&!+v!hPOHalLiy<*$O$@g!Zy>8~SZr-agt7?uh zswxaw&<{ye)-qx^m#OD5C3gM*5}Wk7`0NP@48anj#DxR=XMd&`cuQk?DE4hg{$X{8 z2-IpUk5NBF2mI*pm)K8T~Qril$hYR)6r_gT7Sos{Lj?V6Rr)JP_(?e@in5n5$z^(Gc+x5{ z8A!JQ5y^z<=eUR?zZXQZ&Brl$Bn3jnJI!`fOxpT9=xDldDCICL<8Y`j+?b$zY_Q%? z6gZk_SqTIMY+B8+>*?t0eiRo(3(-^O@;g-Ow2~M8aY{s6&}vcSJ_AAlcZGx9ha-Lw{f=bLXHV`yea752M`3}EEc)zHonr#s zLV6!4W8WQ1vAjW{&*ct;n;z)AUCPQ2NZ*^0x0ibiohsl3tUO)30vpSSBDIB}9YQy)l8jRw1JhWFoXy5$$To~T04Ej6nW`Jb~j`g8sELKy`M*jZcdI``l5 z`+n;<&Ktf$1Fb&OH_`IS3XgMgoQo&5F=_f#n8zn)bSD2rAa5>QOs^lc9v0V3mzT01 z5j{or>c|9BNRSL_cHj5D&tSc8e)s!yPag_aspTX5=jN%lKEZDmn+&~&Zl&mq`vGGD zss(29*MV`}{n_S%y*!d3rlLHOqW?5j8h&ab2sBS!x?7VBI~`VjV$*ul023{R78GJo z=?29F#6-DP9y3N*f3YNlf=P@`h_r!;&-@*XX>vKlKI7bTGw9rZgr3p*bLXK1a;`-w zg;R|#M8I%}MJkrU3JfDSH7|+C?<4Vo(=&(#^*lw2#@>6rDAo5qTQcplw{zt}K%v-Z zDt*H)H!kvjA-Vm=N>WHQM+3i4h=7;efYc`RVaY7_Z#thCN@LQlY3wNcZUnl6UYM7e zr987C*1#Q?pITy4tkU(7*evB*>Ij{B1_(%)bG>6KYukAawHbA5I178r%ef3}2Gnc3RAqUrlofiV!bgV*4%E%Do)E|O+y+l`Wsr(C@)Wpg-7uLSGCF{S7 zt?s7!cv@(v_0km+k*w-zXc5XE?SjtUCA2*Slaz?eShVY?QbWk2c?Uv$&Di zHFJ$R_GsE6*Hc8#%6*P90y6I_t%vLq0^(c*Ld}pR7t1s^eEQn!?Is2 zoiEieWdGuX?xg$<`C*ZzMA&c*R*Dn!NEaQhhkIX|J2tqSgrdU56!SVhh!PF__ZmEL z0O58aNon-)7#QsDqQYUPW{g)2LgRg}ph)FeW*PtBQp76e(HeXgiA$-ajwa8Gndr55 zx1Soq7^nk>3kjeBn{-RIF)Ui5vCdq4S_H}s3AQJ9+;+j{U9E-@Ssf&WjxoD|tZo$Na>Ywo zh@xdjG4MJ{HEXYwuHK}=!gmd;S2Z-VPt+JrmRl_I?=rJ&*vSb0u_r~q!=3APigy_A zba7sfIEe(M;kv%pZuy)!3WK#a)w1^HO<&(|CV& zTzIMiKV|ccP&}Zqj*_X)1n&j+MmjaMqn=y-Q*)1JhpK%|3sos7pGSVqE7$JUe7g7T z4DJ0Tg>3VgBIhJRc9*r|FLq3{hL*7#BX)`<@4w=`YPuhJpA!0YQcv7prAx461tvtD zCcn>{lS`<>ek68Qj9G7#82ly_Uo`^hq0cl$BRgeq!l|Yke%$y&(C5$htGlnpHQ+DY zv@){iO2nbyJlI zXcDtXsS5|b2w|I9k6S1>%=NV)yY&zu)On{**L3BY$;&Nt% z*GFPeUwK{(sDvltwDzP$TpK67tE_vnjLC4U;L@vs8N#fpk#Ir}m_PhI%sniE z8jF&+;x8GJ>A%xc$M?*K=#=8pPmd2LdE@HE`Fw2lZyhpfhSsG2Y|`{dr_HW%J!!`e zUg`oCo7cIA+mO0nDgJQa=u6vneWgoD=aId$8?Ja2A4TicoAPURnEvxj_}V=3ee47B z6hUxr%i=%I_J{`T#oe7iRW#)VbX1kAlw_Q0mCEb34!%s@vAmjO-(csYnlPzP0!q<+ z39~azQY7R}6$o;9d7ITalV7APUPk=Ya0ZNwBeCI#D3(Wok|Jb-qopWHWJI9NYeb%o zPL6$eg%T=cPt+)BBe$ux(Iu%=dWXE`>5y@OiY2t#lVtL|v*H%_btDCRETm1rB|RJ) z?GJrWUF0XJ>t0R<#d=d!&juYWJ)z^oi2wy&ps&tknbxT;) zK43Zd#I097E`UXBF%IkE=3*F!Bz10qvtugtiw778rGVJOy6UE@Nl1`_Hc?KGB0}0!Pqq}zCHHbgEB2~xHshE{urP6N>!V&$fl5-f zQE)u92~HNUO(w~+swaXqKO{m`pvy#L9cPKyFj2J#-ELX0Lp3wnkxkzxrQJZCnCj9c zUB{?40V$0rUC;6WLQ}B?9Uf-{Wu5B#dSecX@8fc~fC>B%CkhkUk@FIN^X>j>^>6w3 zxV@W6@5c)1j5wH$Iw5l0wH9o`n!@x0YVN`{4|pt~KLCs@TJ< z>~LEN#5-fD((qq4jPs;9&4X1OAvod|IIO>oe}^X~`$R)fybkiqs&i=n_*eF)^-_=< zpk}{7knBnd*lgMFzEY^6ZX!>D*~zDtoga_4#OQdv{EV*s{2=Oh{d9b(e=`1TMfmUv zzVh4N^E-Os%?|5d-KR4Ye5cK|#P`3csC+c;!^CS4$TjkH&poR|+t6chadk|xwZm!0 z{sANCTz#AZiRrJNX{&b*p`gr)O-f7~o9_Z>Z5GXhVIfyQe6Si%%nw7)0|siooXEqn zRW)v7FK>2coqBUVNtm7a6Lr2QG8N23?;bVXA?=$uxQs*U78ne-+fHBFa&27m^aJyp zE2)N-@s*Q@uvZxa3W&OVBL~g5)p36Z^-dhjS7n*1!6`w(0%71z4sztz2aqlzp{BH5ZXL zRrRP{BUMSf&w~PdMv>SuKsY1+Ui@zjE0!L1$acr0zbGJB<;@T_ zkT^7!kNf;gdQnqs17Ui~DidVo#1$lPM(nICK|3xCLE`FQ+&*T`z!prh*naQr$H%8V z+wSAbks$Hyn!BYU+5F}a+Y#5EZ5|P??7-6*vUwqOU=;?7DmV0o?^R6_nn7e3{OwoT ze^)?ExXw6JKz5(cFbA1JCGOT#?&N;&qXXXnr=?b;fSJ6E-S^f6KeIzDf8!l|KUvZX z-~Em!(w-=>Y~^k>)meWsJ919l`L%R#q_|jR-Nb4qbsCgOZ117EkNC0%u?tXH1(h-H zdl+pW{-M(?h1Tt_m6uBBfNN97XCeJphu;!v0;P^`X-r?efkfL^{`-dS^^*Rjl3!;} zJ-b++r|Mr9Tln(VS5_bC#dyxFt*w_&Tm;}=+Yj(x;Lk)Le(S43E@AyI#1vmX`^_^( z)yrH@;d+}w(n4ZBHrS=n2P=Dk9sY3Fqm4Z~MA^~2Up%g-7H+K~P*FUU4T=4HF@DYI zN2j#HDToz!l>le*dGk`|9hLNAnN+Dr9LRKjll`n?>&1+Js1R8GJaGxt@PE<&RW7Lr z#i?s9VHoH-i|^S2_%sMcrkV^*SOYhtk>>9JjWwcsk*HUkd_V(`b8q+UPppsE%jLk^ zD~59cd+;exG{*==H)0_@qko=Po7G{ED?@@?jg}D}7i&AdPXStvl!=lEvdDW6XC+bt2aQ zL!0p7uPwM(UhW4Knb7@g@%#CBOS)BZ*^rv0?!#zzH@W*5&RD&CWNLBVFj>A6Kul&7 z0oD75d_5E?xbJNrOKwW``*_S0qu$vr5U>qbdT{*-6ke{a-#`AmW>_Zv0a z)c(>6DlrWYV094u&#OYDunt8$RGIs#gyCb$>Btrm9IN&tI)h;grt3y-vlBY3x&U~? z^h=ZC=)2eR^+eO~PLpa`=MfFr@W~~s7gN(}+-nUpyA0nRubn@Ub`&y*k*>QoR4m zxm5J5{dgS@xcRyL@A4+_W39mZZQ1`CI?$TCt};itV>YB4tILJT=syX`*Z6xFi)*3N zELmHKIv7IAU03_SM#Bkl$V_5g3+=@ouDjB{Ia|R_LtSW6Ci0Bw8Xrjv&fzgyM=sLK z%40y6yP_K=>Sh!xc20hZUulWRg&UARA0k_0XeQ-vHv>eCa%)mo90ovqn14f#;aGp1 z3UXzk#gfMU9kD@=oXZ5&Jr~n1QW=hJZ60H&qpYabGWDLZh+l% zcpP_GTje58Q-ZdZmQxV$e5t?2AIa$n$Op0l5WMVk(I3o;OC{Xw95cD)#dbDkQq4NSi+Ub3XfAI6>*ki;u@@6N38<|*T~eqI@)Yvp}e z2?qz1i?oJcHZGKZaB683YjX+G#aP}w=Qdzduq*~D%s+K^9)nPb*zy$zi1tFujti); z;zlSE*n6#S-|z=nU_<$*^jA3_2x^CXtIs5YoFsj}n1Q z#O~KX1eXX0$%r|UBNvSkG!cs9_=gV^ngmJ+^u;sTuD1vxIw95tei{EvyCSi@kgT-f z8;PjA-Y}7UdrSRdQcwn;cDsI2?7Pd~@hwOjB~U5hz%rG2Y1^?cRuncUh`_|mr@8u2 z+`7Gi2ZsN5PWnE$3I20|YP;O7F73hZ-Bk@cpD22A*wBsbKF$doWlI7X7Bak=nU=oU zZkvYC3a0a3AIbijE%FQe4i(XS&UMYx$uTBqanIJZ@`%5cKox2GdUT(3?kqd{mO798 zzu+|5n%uWZnt@So1`p6e^-fO_OCKT^mOb|ZL|}q$lyA?zwcaBn+drJXG`~KPfsr={ z7CR|{@1CC@mQ(v5Vf_??i1WxT4;jx5=o4mCO=4*@5mt_TR|@sdulM+#Kx-igjfj>T z_QFTd?#00kx!deC4LMQ{TiJ8@Jy7TP<0e7Ig?}$ctdRla3niqLmn3OO!M&N2^jHA` z(wQch`k7^BtXapOoC7KCX89Zt;c~ZTtSOy%Zj`jA^g=Gk=N%=jpE%VK(u_L39x^9( zABra~E^S_m*i@%tb)$%l5hKgqBYieKW*$O^useDG+FKl{?WNSe5wLoM#TNgH~KH+xBjHR4zCS>Z zBn7256?J+)oj6oXr2#|47A3;%+=7QMv4FIQ!78>o3vnPeLo|4tZ)zPL@yiGIm42ag zvh<8khjyMr(9D`<_GGl`ry*j(>uB zMSD^^MHZ@WzQvo1Aa~PFAIK@<_-8Eec7fq%g1xyEA1PdjtiwIV+S1$y$xTR&r)Yld z2;l#JI#GHqq9*+=_RQbrRAnRVYCsQ8fc-%CeYvfx;{xhVIBnY$`csR=%`8@bh}Te3u$k9G zGTwz|HLQnO;$_TGN||XQd`I?uKq&5$LhepKu+K!7M#FZe*MT0;7S5A|X+1Z~WI!8b zYZ+hPA%lnhlAI;UeCymxPp>K;RcBGQVS{jNym#hDuh2gFx1&6DH>Oyz^j;HXGC3+oaSH+4!<4EcE} z0C~c9GBU2F?Kp(C)k5B=dySIAd}2U{kL_>&9YeAz1*r=v`&|xwKVjnxGVX1*L#EAu zM+KHnLJ6=63IrXL{Ywlpd@-iapAiyj9#Y)~QUCr!wElNw@3*G;4~`E!dq49AGCr2M zKA2|%b%tTeg73iP2nbA6f?azU(o789UfCNI6i=_B)F1!r6(;#3f7+Nr5p zb`GQN9RNMr&x4N~ffVP#=KGC(MTJ~`lXpT7zZyNs;lhHc0zWQdrO{u1Sq_cbk$@(8gSVkusjM$hD& z#1h4;E3n06+Z~tn1Mky)fr2Sqx$&Kk=bKIYi?+-?pig|x`XO5BZvorAzH@IvcLa_- zjsnu~dp}~z(I$hhELt%^R*t@bOziZ#+6;dz#$hWL3OYUZq7jytL?Y+~hKeL#?sO8` zhC^7q$`zCu0*z(Nnt;V>!qkd@xhN~Ronrh1meqV53Ovh~)f4CPC#CC%Tmz@{pcs}c zDH#?)ic@(E1*l`SYFFdq)rNXUdu|!w-pXpEYdH9t3V*w zJdXDN;P*c;)-%ghhWw+%o#VH!F7y(g_)c;8si?mQ|8>sc=(~l}yZRDPlEf#v54#s< z7|KHIZZQ&dpW!!z&`L z8%R)~I--PT;Od=_Aq4g}86**4Xz1K@SMg!_-J%gf#r#i>s!w<|6kpl+-d;!ZIFo*B zzbEpg3T(yd(R<8PE|GGvRNbqUQa<|kWE+f(?x33qs)7-Z20!N-Cu4REkgh2&+^t_cng}1a@BhbkO^tn>}JZ9a29oRAld?n>( z!1gL%dV&OEJ(FYw-lzLsy$r%Xbv;~debxXqYnmAyLr`vu{c>ISrCSFDx4`?5wg8}p zCY=dwOL*~bPQF5=;If1#rBZ3xZu~>0Bou}+lXB6ssQsMIM%MClEXcAXT;j;_j0JBqZ9Huh7m_7{*9tw#Kyf`e@>Nn7xW$Nf#Y(6ne~VdC zZ(mk}S$z*Lp~K5zKFDDHkj2v;(-Y=YA2$CO!ieW;MIyA^4Bs2cSRVxI0<*Bcb>=X_ z9=_jn?+CG@c5zq_tl@d6vVOk`7ioTsYcF#%l|PG|1w;_P!JE;+6ye2`IS-=D40b&n zHx;qy%w`^NC#TmZmT(Z=YHa`hZk=65s{oYmS1S#iXphBX=Y?M)Scu6gm?!=Gi=)ON z5Tlm- zKUo+yDJ~9ioNZBnM)&5ZUl^GNQNj_*Yx53C@bTqiJ#csjI)$HRr{BQytU7_fjGy6h zZu{`*YoEhd%g}j1o!_aj7#uEaK8g0@ks&AleRX@%=QRvtV)>jfITyXE{mzKtPP0es7^W0&-~ zS5jE$bk*(h**`Re;q&CC^_PmxWJCq~tMd|ji#O!|Rb%I!?+F?;lMSn??|uA0#fRo(GnJ5%rA9P!C52%Zsjo&Zp%>lqLNxx$#JFvsQHlsIKS zg|QaqIrQkdOmD-E z?1@BwM5=-MsGGD1?T$uye-=P1-agi@c)SjyYw*tQwID0HY|BWdAhTz$S1D>)Ri9$W=f^C1B)r}Mkk9CiMJdfxyv zQY8){D%b84@F~dSvTLFc+ZcU{2Dz!XHt*FpyK=OD`E6P^2JVckoxl1yQ~Cb@yMMkg zk{J$5pkU*x%dv01mCwiRjK0@pnfMcCMN_)xX(z()diY4_>n=i(-}z$k@PkkON2+C5 zWejZ}i~9aG2o=dLtMl|DHe>=3_m}VMkn@OR&%va?5d*}k zX~g?y&em6oXW*f`qtC8LYo(G_g5$<#Jy~>!f^ylDCF&fX~~gN=C_YdNjHs}f~$gE$zwL-D;cxLf{b-HsoSnqMP=-Dg{b z_D^oK`6YbN@I5U*O!;PzuGYEA#)Ae-%k_nM%TplK*=RHzB1oafXw(Eyic!-{ zRC69CXxUX4FLv8RITSRkLd;YYYW-2LH zf{d#Kc>hyKWjVQOuXWpvEpsiJ=D1sA1;qUpQ$*x?=uL!FW5@^-2SK1}!wvcaL>Bdty6?kw>F|ELl1g&K_x`UxlYaK9f+UDY~>dS zt$x(I15bQ*PFc!;!s&sqr>X{q-EC;}<~Mqqe8JVsZL8beN;Gqgp=1+li5RY6tI`8H zo`|-sVRSLhs(3$xb)3h`X2hoI&QiqW?Xhj4%@h70NHF!NlK|+h-O93k-Q(QT>MW?+)YadzueQ@ahJ&n zL(dZ=ybB}~8mVA;K*ek7w(R2S;;d^^;LGx;kRfb-wnG9VU%c(Bd?p2}0|x}9r+@q9 z|1yvNrDnxsE1vgWt|M%c754C3XK~3K#y_d-zWB$iD-w2{boyF9KA^ztG2N~+t&LE` zz4J{sL7?_}E~*=HvvgPI6g;gMf&@Bmdfw7IjpX|}JoV{fXB4`-Vw@2{_Z$UtRw=E3 zlzwuN;u=kkX&54Yhaaz-iDJ7(a}Wy(dR^HjNPiZqFil|Ub3OMCeSjlxzLn5stb(_B z@g#$y--EV{Kr)}~CbU=znCR8b>W=!S8e8wMnlpX|E|#Q3j#jjQ@B#pv!ZfviEV#)f zj&}GwV77aK9Ya^C5;nOrjoPqDSkxyRJGI`g!Vtw+Xu=r6}lQd3QkZ;*FC0we?irbGZWmaVZJ^cmJ=WD)tgE- zUn?CHiCaLD3{65D8Q4h9Dk6}>Wnb#IbCL?N`?!zCo%H-G;q)GozAM40#oofejK9gR zb2AnO2i=GTvaCSBxdLy)0ch6@S{9m!I!mlm8LJ^7lO;Kt%&#Q{;4OXn&ztH9%z)qN$ZRC5y(g!_zxWQ zt-lh`8@jcg?wAMRDN--E<;0w31{M19ok|265Kv;Bbpn_{Hx*6&N_{xl-Qym zwG=Q=SndfKl_gD+KBK#9Q?)n>rkFbhUg`GYJ&WHq9Xg9@$Pv=+9HGZ|^`(%BH)KrU8 zG6QG(1Kt!TUOW+W7lwuczT?8Aj5<}b%2@&Hl9Aq8`VP>YWmdmxjigy5viXTsLEs|4 zI8smPs16ZTNtNUuvj%>=YnlBN^MjPZ!EwnAya~&rg7%6(>k@?+n*BkK9227>SxJMb zcqN@qO1}83y67~i>Kcq(RHEz^ovP#?Pa}rhlS1qB@!vBuwr^?#jl`y;Ai-bnS>W$G zXp&lOjSF%b^A9qH&M6bK(mH1oEg=PL&i$i~b__BNT;a^)@IlF)a_u8VA}r%iB0(#e zwBWQ>8{}XQ)MHTK7JgZjlb~cRc7Wg zYSQma+0LL}Hq{6E0ZmLQ6je4yQ$Ao2jT+6)WH0s28pGNiJNAn+(n(1ZZ?K6A+X%%s z|Lz(`4Dp#>fLz@(uv{Zb{`Y&e+T2Z>E+3!UWCI7YsO|ATf>7qf+2)ItwD5Z4)D6uH z4f3{I{_SNNRi3%HWxyNyf7h#8$VTfw;M*WGg`x#v574x4a zI2%h8%tCP=00qL8Hb#vk!(#m!P6d?)$DKXf?bOZSrE-*{BhK>7S68ei7>#TX1|x#dC8+{=^U=1`@O4{Ai#xqwi#r>_ z1IFW7p@wv%-cWY_+!e%^)Q5mk5#&!ww)7o>J$d^Op>&*Hv#I(tu4n406=1?7h5p`5 zJ#i?s9c`lFEDXSKpcZFTUGp2m3Ok>GWdl}<(mS3S0LoBJJ%IMN+n>Z!vyx*X;Kyln ze%{%5kJdyM*z*N#}`g7VzJaACYsRj@KPZ>8S)ruJz7)^nrj&C9jOOiVw z*PNH*dIIA*jyvp1#mq-6!KoNBEUkn|~AG2QZ&rxGHcyVBod-!pV zPFcKSvBq$*Me>He2&P)Vi5sms22HNQi%8po)R}noLiyym3J2PsLhKW2#gBKu`=8D} zGMOqhi*E}8Mg-*3V^p#)^ZSDfWbhiJC=37s<9pE(MbVU4rX+HJIV&ooZ5S@ffdQdDN#t7hB(gxps0$M2l0ug1nr0SsUA^qAQOfCIN%_Y9;-E(5k z1~#6YMkwgYblJ%t|ETHjxE#y=mpKCgGMK9+QQm+}gv z0ktFN8ANstUoUqX`yxBmByBFQH_eME4!Jy;)hE(+Ejw*)%V?SFD-VUFMk_0xTV=F1 zCZw6%;}?0c%mB?nsD++%m;voSk|A2Rgpzyoh#vhZ-B%Ew17F)qZ;!Rjd94>+Pt;Cs z4f=sRRu6H2szCLKx{UuAvQjl%hUGvow)S>7;eTf?(tT+1KdfxWxNXUg^JW` zJp&4K`<=qG z*GVK6nZPgh>orVr#PaagCJ86|QScH1_1iq?(j#ldbYWAGp>-4uSC(w?KVATqniIvM zh+$6bX*kM{B~1YZyz>&W(|VanS2>iK*8}43F*szor3-uIJ^_0gnOar83*|Z_OHNqh zlVe|kqZ}Ta$7=#M#ZpVRKba41*fduJ#;v>1R?TjP?C5&5fEjcY!4w_W?GJEY{pAzo z3;Qc*)1*wT8wPP#c-BSRN{=cru(-(VH2dyaqI<*4P^fj-wx2`($hT8@t#vf1UoxOg zd*i(6O7nqDM|loi+4yg13fRO5jzieq_u~W%6e+Ogh_Q5}>Qd1#F-6PZj@WSxcBXB5 zmAHMo02zN$$pm^hnJT#*>pOI9;Tu`Yx^ujsUc~pEQ!IYE`OmPDE0E9b5~`r_Un4=w z9lm-W`Txy||JRX0d5|;E?_DaiU2iiYbfS+MQ|+5nG=y1Dljl4>5Qu!q_#4y^Zo4G3<}`pEJo9mY@IOVoZ%;R(I& zl=Yf-?$|}pdvRIh)5tW~JSK4Jl+>J0a{FswydhFSj8v@~XbS5$!@AJ_3RavtQsV;_ zZpE+zu#qb1hn=9dw*p5xJ-;?Sw(74}yuOxxn4E7S!o!2Sy`3 z{0U!tci$>`|EI)7Caj~Wv{@UT*L`RfdgDU~JoEJCCynOfh%`R&PJYQFskLRc?@_XI z;XPLT-Fm{s(KM3KrU74j`|^FfN&fLz9a}m$n^-(%<73xqYI8(0EaZIm(t2(#hEI;H zUTnROChrkEw1mu=K?`Cc|4h^zE`q1!{`bIMT|^1_?WozMIDO_H#guiqKCypHV(_)> zUd!l#umZeEqjfczxsj^SmW_U!aSLOXcacUicDS)HGJBp1^YGe(Lr~wd*~FOG)%M8B zqGl5*3$V%ryeRpo^=OVD%l|kcqRf^Ml9yGGj@K7ClL1~diQd?Iuanm^tE0&zEJ~3~ zUz7NlWE$~X(Q#o?J`im<5id+-hM>H zSy+I@4e%>DZX!scYU*WqokyAa+;C{#&WI-19#w;H$s&b9kQ|+j6cZiTVa>&`6R3qUds1K|2q+UL%~ROjv?ko$KeBQNSh!SM8&{=g z`|&ht=ga77`}+HXuLyJeuI@TlcSbx3uS*Hm{Rc@Lxi8mSpXSXq)veDCNbFaaWLdOj z@&jK5(a>lfU)5FHIns2|=xm`d+(qKN)$tZ+eD;*6iaE@W=`*!xWcw$TPwD>TM_CE~We@XFPVGM2g?kWqqJV!-& z!DcQd{=%h|wI|ukDzq-9z#mXv_i8s^4!$fhFy}5l;r(hXF*;Qh@H8I|S1oHcO-O7! z|HU|G$@Abu>_co!ZWKjGjI?-%Z-2;X^^;IH!MDJ;igJ&zPVdQTuF0zKZ7|JLK`EZ1 zyet&2Qc;$fsK63Wa$J~6tOX%FQvoQsgFufeRpxP?E|c_PGe~SEnFdf%tTlA=uTFV+ zaDu{R!IMx+&#VvsIr>x$SJ7rs4-3&cFJv(9lILbFD4cY_8!yI(~=e?@r_4pri@!eFy=0nfdGW4Xng9nvj ze%pzp!F!LQdoA#5)V=m);q$`LcYEio=L|qq+fhRm$W`PB(>|NRB6@X~V}A`EFUSKE zqbuKKC+2SdH8UX;d#&Y`eGEW5>6CzWcv*sPubociODFW1Id~(EQ4dOrF>Ft?UyH0= z?c@tQ(ARt#U7ZyKlD!7DnNMFHfp6Sg0+)duN7Y}?OHW+~X9W@;t=CnQz;$~ zPpRaOP0tt2kBzdPM|Z`*oRg{%s^&k}mM#98eRKU1TA&N-d(j?+SS@AC_ygTDG3`nZ?=qbK>ltbI~IC1=x z3G$!PaqY{u--h$cW?xKw^1l>u`x>3f;LWWf2qSpcPz%Jk#2t|$C{o)1R|gTWQjLn_ z4#L{=o2z-(FA_YnDnZnv7$Jdsh`{&#y+L)no(9h%hOVQdw`eWh)ClRH9;jN|duIXe zRJRxpvkzg~8JL`_iUr)9B^dp|Y2U1)GkPR;a}Ozp00?evBtT0}fUug0@4}ha09mWz zt>iKplYXR+Sw4y`m4GW5Z+2wT+$f|OJm!jrI0>*a;r|prL&Eq zA)a6`iOSeNj{I5=P#J1?7AIJmWb`B}NNgLqAB)h(0~5q&*jPAmog+!2R6`ug`_Qcp z3oDI1Z~v*w+h({Uq&}GeL>@;)3FQp`tL0}fQpA@y{nToE@Js-G8$R&a{w3KGSi61X z#DTJr;q;Frt*1M4OMl71J7uetv=#{{i z@AHuJRgLdnM%UM*VdZZ~#q-4XZclo_>pQFt{mS+WuFY4KlwQ1(mi4W-^fx^X0Knj2 zEKI#{-7#QVmkA#8vqXSvXG!46PpLCt-`${RGe9B5#P2K4H6qYQD~1`w7%i~YR>37$B7L!M_eplRdRpfpZZh-z9tOffCC&%xtw zqV0T9N)Ubufjxx^PR=4%*bIjzdNpsv-{gll%Y{uqp%D9u?`YB3C_YZDLC>Z7W$rWz z;2~|f#eq$i#IQc~e|e#Y9W$wv#t!rL7|W`bm{6Nsn*@C&IpnA|c3x05Q{u3Emo91$ zQUO$L7W}{5&m3 zE3>8ZNa&rOS4;i<{Vz*37;w|Dr%8bwaJ&wff#_jdAT9dGoEZ7K=P!#~?^xTtddD9B zjri#Jh!ib#N?w@C-;o}Ec(dD3HO_(ex{EGFxhY`!16P>;#ShM+89PK@mFWgHo>oJrCavm#|_FS$2RL}ML(X-%`Ri(*6Z`b z@k1itBzoTDYd!RJ3t8=;pB~+bsEcYh4Ac3ShcAk7a6Q*8 zCRW{(PSb7F%TkwbB5&OeB}XO{k&gzY(jt5dK7xHn8wUf>WpD|5^byA_=n;}<-TF^$ zm?!IQLPN;(FJjV-sH80+7SG%4zfxW-ascMEJG1>UasG_f3f|7pxI3pba?rEZg`Ws2 z)3g+o)AunKyR&C<>%y4-8=}cGaXBck%meTga)k1zs}XBOmqj!4cBYskx5Y^O;>C#* z6ODJ_Iq}EcE-bah{u3wkSYY*vZ+%E90_T~odZqTgMjiGu@NrY%vZa#o>O;_UqMh-o z=St5Lh7<;rQ|gy+b%tt@8g;PRtWv#tyjGKXd9{@?if1dRa$PjKP}xXJ{@4vzi5DCx zZWkm&3tSS!KsX3&C*H!u^L&4(dn!2;0)4WK3<N$s_vJ@*d&D`5VpH&5b|!cvp&-5cTsuo=T8U;Bb>^)NN!Z z2J@heS@yrEpP_G*j;C~jPs(F3cM>MB%hdlLRc{qlN1!Z$ z;vQh*?(UZ05Zv9}-5~_oxVvkx0Kwgz4Z$6PySwYgd7Sgsz3;yM82OyFrl+T?s=Lsu z`PZAf&YKT~AGCz8*EWHtw7DgJn@p4Ef@^rtQuE@ zqIAuW=Vn#3=>OEzVZK4YnD^eMh5ueAMkAy`ewRxMOg*e|Gm$UC;3wyuA(pS?&{oc% zZ=Z;3eMm)tqoY1)c+hT%kq2uAKu(f##%Uk?J9#{2v0q;6e)?gFr+yu;9(8905AU{3 zTRjjT$j><7^u8DUu`a{?uU3wxCR7cUv4TNk=gT4eH55bPztre{<9|JBR4G`fpB((@ z!@j}?<-lTp62#f2u$OyJjY-YsFucx6$Iwu`@LuF@?rl(s90R|#TrSg!CXRirMTQ%p zTzxAQr}uI#kswutXcRjYI6G))FqxV+7Ah9LxQjl-eOaj|f&>r2c zqh$sqw0vumCgNZedo<Ilqv4CMQ*P*p}{&3+SkQf&ZmDl0#JM8@;s3=-wGA0)e4{1 zB}L=9`fq<+&wu^3fk+M-HU3bOSBGhT9ty?jR%|?4x_3pAi=Iu95J8|*|IlP&CfSA| zZYhRukD^bfVHql{E+5HDZAL+uhUH?)?f8m^9~h1DwYWr{n8TfofkR_h-L;@Hmfy92 zP(_iIYg~i!r{39bYfxEG1NEmDV#t{1tb>PByP%Py=ZskH6%A)BwM%*y zGOV>&*m$CvqdF?XtZY~`M23t5Q{;Air>cwsjK+7dv_X~NB+0)8ga2No&jQvvwgZEQ zU}+U8kB^Q#k1{r(C%3B%s*gb?8D_u9p}$1>E&P}w{=Z=~_=6%QE*vI#<6_4Y!edh> z3&fc(e61>`gJata&)fm*;=oADL}F}xTCi2P9hV8a zdEnF)ZHgmGa_8WVSW#=W&K!marM49M*|@bgMTgaUEi{u`eiBo^kGK+HWN^(dlx5t> z?`8KyVATKz%&n$!nzpB8Z8sx){!8Oof_wZOc{A+#E#whTvh>+*8g`TtcHPOyEh8_! zijPg!C6DoKg`T4y2mAnfC+`>5jgM+@8G*oUkDMX!a3t-%(&*z}x4I^~6U~Hjq|cTn zDB9F+&yMdAQw_e*h#F2q3}k!M`ahibZhG#<8+AJ7*cqO$woK9T z#heD(EuCt)#a~*)3+Ijr78&F&@AI>6n5}wf{Cpf9=A5aAmkaj0xMyCxSnixW$PErR z-!rc^*H-=Gk^&RE7JUV!gd`EuD;^V=BnG8~Dw9A(9gdP~U>u%LVqQKZLiPa3Wd4)F z&1f{uYI=l|ct++E{;ms1lE1S=jqVn~ij3Yfozt}%2gb`AkJxdrJw#d5JofMGGwt;j zSNy<5i)nT>7vRRW%#7Yu$WzG$7&k6jPbTi!hH|jkQjFP{f#G2zOqzma05%o}-n$B` zSQ`E4gzOPtM4C-J*drpx;D*}%a8K#usWHx~6|2&WB05q}Sz$;~P>zVK6{}Ld0q@!?tFT! zT@pXlDfh|vru!X_nL6Wb3Q`Q4nN=j4HAxao}{?j$xr=ZBkrew zSh=i4d8D;fw-shq_*A0gFWi2lUAE9XX@?5q?=2k~Oz-upo2jnMG2e+TZSebkr~l2x zK}Yw_G6qP*Zujzr+wZKp=5cP8ufs^^p^w*j)>q^CV}Dz3 z&->r}DvS4q8Qdo{8inx8(DWfg1bHAYplMk(7R~r1SqH<056|j>6*U{&rgZuZ4K*+B zyT?|Xi!Oh0me3cu>;hQd--B;Avkn8pgCF^%z?%M6lpGbNNJ0@yU8oSob^%0F#*F7Y zj*nv{pTnu#dg+rR3GmymKXNqjqtOr*Z?4JfLXjl&u)2x@E^^oy8gvpK+ZKY#dw({b z*Et8=p#t3v5*kO2IZMT_fvJ+PKEWXt8Ep1P-_25?pk&uLJp?e+G?W}fE zoi~bWAr)s3tSEZ#V6GX$h+s&B6xv3sPJfDiZo)4J_6{u!g>N;Yzk4I;#M`7WQ_1A0 z+zPIkM8Ag=s5uw5nqsX7tx=D!QzmtE&^&CYd5tk}$GD|0U(r{+LsXvI zcjtH}lkROIVqDSSCGWIvgj!gHqAVL`I)iAWP~%z>?Ilv0vKb}m6$^P~Gvc>t)+lW( zH(6rseks5h%$@>+othtp>}lFDuxN>^^32h*z6{{23|4z5n%Ix>HeFy%?;X^Y|KT>6 z`?2DBNk>AeIj3mYj|Yh`(?-Wsn{5~OHMoq8ZFG4??;!9xf%Tiz2$cUv zfzTAlG_IztRSBDA`u2uN`MD^yk=TPO^ue=rEn%gTom{`#)PIp=+|{53M{%Q^PgDg3 zF#k2e~&bodr_ifz&FGOko9(_($fg3)78caVnpmI^tVizM*+xM;n;LK`k;KDly zB_8uYNU`_bYXADadZtPbyykYLzJMEZ*vbVLwvX9HxTtI@x4=F;fjg9+r``4~Y3-7y zp~`RX=J?WcT`G`P@YMI^a4`3M#b7beb|!9W5Rqfx{pdicdoMP;#_z)pw6f*CT14tK z_+s=j81FYmxbdp&BsSD`2z&=K){tKnkM=bLT3qoUC{#5MV;fZ6zsd&MH*0<^D@m=- z2!>*zeSH2ji81*|W{7XuHB*{;D65+9NT$Vs?javLr2r6>D$&yS_XNe|Xu1U`bwA?9 z``-hNUV_m3j9S7V(GGflK(9GycC8Jl?fLQcHk-6-1y0?+bO}E#A^YE49Wz~(e=-nb zL3h62`{nY_)K6lND(Q>zG7RM%>>~@U&#&!~D;l7JHUFrzNu|Hf_ePVxP33(A<~;(r z1uiG@97?Xs21b7jQuGHv`%QcWwk4w35(4pr-V>nJd3k}&OZhK{8g?b2X0c%=BiVGf zx$|!+Up3ii`x&Uz5L9@zY1#z_(FunrD4I)vDJnAJsf|_E5-Br$CZ13dZUy3hv58r2 z5YInXNAv_!aVk42eChbQKJ2<*nUZJqAbc}|aMv)9e;uJ0Px8xkMo}wsR#jk4c`W2eI z7l1yU2a++v26JpwCKXO6=nLZWHSK`y0m=O%&*8c`DHeUx6zD?zs(vgRiu-^)Y|G^L zg%OstEE3DC%VTtI995KxFj+z#U}L{AA;In(xysnW{ZrqPvx-wUkGlLqi%7$$hLgB1 zF3O6ZI3pO>!=$R2Ua4P%<4U^t)0)p1FNcpR?wc4vbk!DBLt)GK_Dn6$-Q6IU!hjT- z)%(FaK(C@_jHD$MSIBmlOz3Yc!XgRy7?}Ep&t@l<{r)V|_p;SI#V5d(CM~&fX~$UF z&*(9=VFyk3>W{}Dm0s45$lMy$R_Zjjzj$Dv$z3uzut5x z%J{HTKUX=i_a-@F5UCMQs1%q> z`t!S&dg`@sQAq7*A}As_o7?d1eerEwVbgV;R4_#0k|+FiOF@{Yg+~!oR+|1eXO&gy(D7>9PP*0c$c&A!vX{&?%;HFJ6a^M2FY zXp&Z92m(n(IQ@+91QO(DN)0mfic+F`MLQAtL$YZXLs_ArKiUPP%XX-UX7+CP8dGb}2gMqNQ zYpGNc+kgl|QyEjTJ$FaE3&=fd)BG(_S1$kH3_VfYlFtNh^P^f6-w;4hjAv!|56d zy0;N9CCLB_4c!n?)(kiNYsj?QwJNy_ZcyUuodhPd-g{oT!d=DqBc zr2ZR2ebDsIolooOQ+{dd@t0@5;7dVuhm)ft9!`>Nu{u5y#YbnkcpJ!4fjQQ+yYpag z#(n-48JR(RGbX~tv+f;a){fU3H8)VkzKzz#z0{Udq3;IcW0#WPLG|XE{j-Z=4Nua+ zPd`5!ZX>+&o$48hr;El@9W>iuPSi>8=6SQ{bL+=aj$eYqksQzDoRt`Q zz%Op|tvnTtv>GXlAqT8^x3t0!^F=w`j(Mrt7<6@1&bzS?T2Fz{@Y2Vvv^Z^4kdb zJXRy7^htH27urT|l{8Y``YUg3w(SL}!>-$H2XAX<>h3P&kR)^*x9=eDju1c>fiuxf z!7Oo4B6}Nk7b}zWUXh^(z43zPG=7earg2iqI#hO0^6-$X+JkUqR(Q0zwzGF${{q#Q zx;YdOtenjaMX{qkdM8>yisAbeMO4h_OV{+YRZ%`I zLm{`RR98$VkDYy$R26zD)Ayd=iu(2YJmg$NPT3z<*Oadv@k9q#o^DbJ$cgxvSsL)0 zw4-ZZxM-^krG%2X_9PH>{@}+UKze8)G}h5nqeEFHjl%*c_Uy|8%7Z9WDvu%WUQpoJ z%uxf*S4|eHn<0Utd0h}%EqMmOVqigG;qG<}E9*{SDCRq*ds*iHf)0nI9%##6^Jl`- zV@g6+Qc^>Gsfr;pE*qXBW{PobJR@ckdm4J5!o4(B5Pijt2j?NaNN7HAnK`ea9_x`-Udv{&{My}d$vD8yN z%!-~JLy!8KEmPmQch&QWw^!rTH%Tg=qHA9I^1KJdy1o!w#ix^a+SD9}f_MC|3xr<` zs>an?{1Vp|%q#DMJXquK2vfIEWD&$(41)W_WyuwfirJV&m88tmODXLNCF}JVC+Ykb zaqiZ(m4C*qJpauP*h_@vcNar)X5Fn%sN4RSx=%Hq4+SDKk0yqfm@}bd>qT_|8XPVIJ<; z6%FK7kpIm|fRWpTAt({8zR@E-p45LBl(d_BY3SS_A?*1v+;Sd~Ciu&%@vPU!#k_5C zEOl|YbF^0sDa1TittY9_+!HBrup#M?qML39MNXBmzbAPunJkbtl46j~5s!vmZuB=r z&v&?si&k0p)dATcDd54&_`)PnLh^D#HlGJ83rC)8zQC{?ll)kCi3C5HFC?8(f9= z#F1lq_UQ~0ycx7F?$YX`;v6cHJ+eaRk|>$FkwRt%I}zQ3>ihr1c)AksLfGGw`w9Bk zifdFN#qpWyn{+88&Fq}K?uBf?V;9WP_QWiS#P1hJ8J8awFP~fDBf%rE17-R@s&poG z^9R*qATa_dI=}C;Tq0p)e8Sw+0n+T>B{2q&=q05yT#;0hsV!!pC1u!*y=<5QK4%SK zosZsopK*-biuv8bMF{NjIr?f;w~If|kwk9lfh z(*DVL_dTcn&C8f3HS;c(dKV1Z%g53m4NhVA+;yzsBRpLPj`-f{yWSiJJ$1-$H*GDK zC&wY#CXx9$Oc#sg=9M^9>@!20$$2_=mQZ1ms9!`<2rcHyUeZ%sEVUk`s zfP?&3V#2DQ*?0YE{;s)PuH`?~TXwl3bhm_L%#D5Bn+LASM1pG=R~#gDmfkD{Y6Bt6 z{^kn|(X-BMYv)pCt^3MyW{2n*daeTl!9wR~ezv&f-GhGwMa~9ag`)iqlj7d)ON_1- z+_+O%uVM!PexW0!Pa`BM9aCa#J5&Y6H^hSrhGJd4bRGe8C61H`-&XqyupEQ4$rw*t zOwke%?)KF4P3Scsx&|EdHW7VJ%?+*g=evDhe1u<`;+M6PMq++Lg%(#}>Q%L|s$M12NwCby&@^ zxj%7jHvvuOM(DO}Xj@=ti5oXy-S3Q|yS5hdcSN2jfGC8=rTq6f=2#?$d#`h16~l}W znrJcR-@$i*u7s%XRt--y05ML4Bl-pmn{5GGPtU&LB-ueSu7NkW!V-CFU-3rE%!&ne z-t#@i(L3emI!!PU+VNnEyTFjiyND@awUl1Fa-fwWBa12 z35*C#aw3hQF%&~oavBKc_1168gS!-~c+A}82gWlD_X2Kr!v)4KZR_Np1?ez%Fbbk| zrytBT@hbQdX8gZ3>c1C+|03D=CK(qmy4+D-SH`74{-^6&e(Cs1NI@33se8R=ADWdL zcaKu*zM4^~C8IS0x5Rmm+}!?)iyg;C$ZOD`n*|Vf)r!mZEwLZ78gyZY_*z1t2x%e= z?*Cj-fZ5_ZH1!&HPA`J%Q{htVLdl@mu-8D?E0H4WvY@2z&}1`n z*gvZvD{U6ex<9^yD76?lRkBX2zcK!&HJZ|fB_96gV%fwGTc5K~Cjpe#nPvThk;n2= ze-|l~s+Jc5rf9s?p!(lYn%MwLLA*VCQYN*~Sg_NltfSV2Sa3AjZm{u(QTA6NWu}S~ zIde?2ij3$l(QSkET}NL2ufG_Dt|mZ_13SR__A@0p9BZ)a}yqc?@pJF zHLf=XpKwLp%c1*`^Cpn}nT;tE(_*9HSBjcazAZu~Lx*b|r)W$F1|4r&(3~eiYL?aj zps%7po?=8MV(&sm6-zvLCuo}_(6m1u7gAD%@$pR9BkG%&gNa*G?e80dm%$PhNUI(z zoVb~c8pe9~?DP4XJG|mZS3@7+vFdjt97Q3baf-Hf^6UeN=~^2}57_xw(O<$VM?pk- z!!Mj(>G=+8PP`25j}Qt`QXh^ng;Trr!M&A`TTQi}&!&^P1A&ZI)%lU9_>93nVqBCL zj_0aN;bdyhC?K}i{j#mf|Jx`1=Qwmc`jY8R{*q zGYDdsgvVSjqotSr9M{8T)06PP=VwzF@l58oAA4O1uyU`T2~8L zs=rpHRXiWntFJfe@8?Xti#HK%o|5D!=Nlty9c>*!awSx60a$vY6X(&yShqBX8T(=r z?d75Oe$i;EY0>ah-xp#D`fSJTIG``}{~`$-M$Nx-?@Qgv1wCb#2XnCnIs~{A%pyjZ zX{8Y9d2@rTQ7Xv(=y0QOPm$BLsi|OeaCoK-|5i3f;c!FCe_ORpYTOCiK3!)k=5NA! zoq{vc)`gNa0q$#KgM+66&CV4Q)5Mcfv1*))@Pl1#?ga!#$6ghgmH#Rg->-Ech}3Ob zX}Ymje6>G6w0yiIeG$J!Q(FfMcrmieoQaJ7ru7N1wVH{ zS8Rl|A?i1D)1|;&-qQ6Y1oFI~0AeDQrQp-Iy8NYG;xU$^LjJD6`F}7E3Cg>0I zlXvL#5!9$Hs~BJs8Pq3gz)*HEEr$9Mt{cfbpCK~;yGO2Mwz58uu11y#Q6G4&_UgSg zNC;W&%5z44{?H#pD0jis@wC(c%ZZjIn86IkNtzi;zzHU*NH9gA_m+mF?n`P>#0x7T zBao6Qrkdf&B~nVF-5!b2?c>L1cJMwMTIvH%n#8K&GWlWp98@;G!JU zh`QNrZJ~Q~=BQNv_8J?9)d=*hCcC2=4r&Q=Nw>O3T=91K`+a9!`^oQUc7x2}|<}>`qQw{{kWtH3BPT-w;OAm34ao0%y8xI3_HFQ{z(K{{B>CHbN z&-TMzAm-`L<9!@H_v+%*5AhK(5XJBCA%6AKa=N4?8w}d2qTC{G$n)(BH*Ba%^7luN zsvl8)!1bT~aJftF(Xg^3U`pzH}0YYr9UlTArR z5Vzlv-iR}1EF4T1m{p@v-ho50lBa1!a7b+%*UIM5SNz#ZiPp+J@ALS$``BKUw_RWh z7~WH3s!bVzLUb8BQlZw}4w+4d1c75)*z=yrgj+kTKwh?XKu@6gc5zT(6$!70<9xdDnKfiz4Np=rVq;m>qCXbI} zZ`W&M>r`k)qup=y>)-s%RV2@s3mu5Hg_^NMzoxr=r4h%H&;2sR9=5k!2z2?2E-SPf z2C4qrJdjFST83iV5HTrr(;j~Sd4K)2lf{WU_=zWpHEesICLC9g+r|RJI@kFBiu=@!w5eB`4_7}_PVi6w zhDoBw;;4 z2cjFHPOyH2J=ys6H_Jb*hMtVIztz>|f2t^+hR-9hb`rs|5_IkSN;NnTX{CoF6a9(V zT54;nWR6ABZF6uJw(d^# z3rrTKqcZ~>7^ok1EjGJ3b(@XdNX8F>?%~oLWHiCvUh1Zz zt}*1XSrmh{c*Tx*f0H^^z`1M8Wxi-sZApJ%%;~A}QAXnkFTSzIusb*Xg4KPS>9;o7 z`O1F!h4bY^Ug6;rY=S<|)zeY7@ALoj1?DSfjg(FPypTtBC8L)Up18IGi>j=ex=Mm9Xo~LK zKj}aZY-YlVZvZocwXC6q$9WVnF=CA1jD@%G7`EnqfLqLpbcGC2Svd9tlU^kERL0CLLx zGloKB2Gvnn1@!Nvc(DXFHkIzK#bW`CN}c!yZ_WRCsdq)itIb$I$MPSLd7h;$MgRMv z?}`?=ee!)~L>+K*dR~{i36Hv4--3kUwMa)BmUI<1jXQU6Q7AgmANxjLNn3a6KgKCR zh_*z37uT-$oc3Kh&t4rhh9V!&KH8j~ejGjxalbF^3hv2y%v~2=KCc)V?oYh!puG*N zHKSAz_De&Iwb^p^e`Uw>pVP7aImAoD(?LzJ{nnH^CvEuEVeJo@htbAh>U`qOpfNAZ zvmphnDSy)X{;Qh3FX7A6b`b9e@zY}DH^1T{q=k0W$`YfZFT#1sOdoP8exk%Te7%!fPEM=kx_1kr%P=1c}mC5ZUwOZUztByh2^XdF+a;eGT2?pTH z2M1hQJu+LDZbW|3S{Kly+}Kz?(q1HC*i^eoNcLLP5=A3`+7nq!+Ce_PbH$ANLmn>WX0@>}t6id?ALz4tUK*TpC9X$kL5U67m&T)uYxAkS z(kdXm`Qfj4M9+>e!BtPQCE*-c!w0Xo7^=1@p0N=uI=m$*P8A>1^_Ln-5{=d0%yPsw zt!fa_KH4nKD{shAu)ieE=r5f{1&)5GyfBSq+h5TgG*Im@^27LbKkd7H9ztc_0< zU_#tir4cVbmXaPo<=~vO5+{!Y$;}!jM4rOL*(Og1S4$KkPi8@tqA}n)94vMLIo5+- z`(MfK>8kfukKjrNm=_fuatY)QdN^NQv|;L0(+0}eJg9@=i%N9*#|2JOP;`Q(tfTc79|p& z+>_u#|7bo%!dXBvxIAHzhd9Ob=#19RfSo3$b0_0|nM9Hfi+mDKr6Obip6t^?y(|4h z(H6d|CHG)JlB87_jmNx#c?;fTAZ90ShT7-n55)9^Ay54ep@+M;It@xuwu9RM_~H_y+%Y~Q24Ee8{tosQLtG-6 z)fqWcNAh}{rVwsHCVZx(B};>0j#{$mkEu7jByJLB&!3_cNd@#4w4uL4fUW}gvdhEd zo=L!6U8Jz-B{WyB;u1I%BoGm~V2O-U+=&P5bT_{7qShF4KX~&@b}ai7r8+bPF$P@&8gCLQ>~rE7b>2#8o=IHTyAl@VuA73qPDo}tdJS!Q6_wfD?I2SBIG!JY^vS$eUX+|M< z7w2dZ%1mXW;eUfru%I%eBH%{E(dl7FlCg?-;s{VUMvPU=?hmDcqSia|ZL;n>w|Z87 zUhv}r|G(<;-_kP&(64jPe#bD*tuX9v8X6)!`Su^(JYNn%;cm>byY+=I$#U0YQ=ET? zGUeSY=&9-BbJ?pGFX-Fc_Vv~jEU{z62h?H<<%b~zls{+n;rr~!0w5?ywQXiJ}Dh_57Cd83!7y{eVbycmrO3C^23Kj!g0sPemL=25+xMg`{Z zY?%{8qqvsG|Bn`+5>+IlKcKQ^YAvtjA6n)LMk<*aoVJ!o|H3|$my57<^g}-Lf-e5P z($B*LG@k76(=-qceD|FFq1?m+rsAR}iBoK$#Z_}6JL+>vYp)qH%>@N=glq%QW2o4rflESnqmP$oSL?IV% zxgR{bKT!l0l&BVT_V{<;AlCty$4e&L}#>WNt3Ru&T zMhM~9321f*-oAq9>gw>_33EAmU-vt%Bn-plj^T3eJAzf4472i>LgmFs4$ThvT+*g2 z`e!RwU)FK&_fA+KeM@^mjL86gA17V856RkuhP~+u^p+u$Oy}3ogk1^W+7;McnDUI| zt2)XdJ@Wp$1b`Oy8aEG`eG{A6h&L5%0lvtxV1Ho);K&;7WGB2TZ@WXVo*oeLrD z0vV=AxLzH~48A@1cq?UM!cL!p=n$Enb3rdu)MpnM z-EIwqmvl?6BolT1934tw2yt7z4%3T|@j98jB`f8HuWaw=Ko06ir%P;xPQv8EF35z}sRK)m%nf@Ct97&!7iP!w7 z!b?wLDE=LS-FI(R4GN!N6m9Y6&`CDClW(t{RF8+xrj((V!oy6ngI@F7(_V-F{k*@| zW4e>?J9y}qk@Iay;9FtVET*B?{Z`zf$OY)Aj@ut@3*>un3X;0m40t^l!`eI||5ywd zL=`y_+P;)|2fxJAudYk6y+!A?u_OT z<(~$PE0<5BW{8{Z)P5-eP}%8h?A<0OGM|*9eXPcLU!(Rit}jQMMJ(v{*(rxUrnLDL zlAgA7JpueC{hl>}s~SpQrabQSuXe()xLFu*6~9p!Vl69pWeXAN&8i*TY^wz6ou)K| zWzNdkN_7A!fcTe&^qiHS4OS)oKjci6>gR?!Y>`QQLCYn=fdLi&sq3O`FwN5#xa)AF z#b7AV|F+J*9y~SXc`VpdT}CJ=6i6t!UU93MToBu!LB6LQZoXW&n`*_OisboMFh8L( zmI{*Et^Uv4MG8~Omnp2Tp}dZ+nIR%idV}vB{GQey6f01rqtkbq0WQUfR4v4LwEUdd z36Z!Xqb}NVngF#4*Kv4#q9{WSeszmrP5N6&$GfkQT>)V?8(sD;R{>70embkw)6J7U zsQU#D!K;W_Y@hnKJ)s3vdEabcQeEu`-xu~vXw(BWEOlujlBvYXo!n42roYyq z$O@=?L<>H3%L2632@1ptx>Qy`eFpxDb*WU2J|32#jvV!ABsNWPJ$LK%pW1C`8l!Wv zvn-}7RoOe4!n`HarECl+xLk&b5gGh~76mbbjDwmgWwCN9=E#(yM}g6UlzmIn{Q#GQ zPx%YBorHLww|;@FI)$&_OT%sFHGYRuRU(>)<;&s2zIen8lHp$1sFyO7p*~CJl4UFT z9)`$4H5dPC`x`oTPHAT8{IazUo(!BGxj!!1yaa=%A{z9ybeso zUHXX&+zy_d&kzeV*8#b4NJh;{Cxg_w$ zuqZ2HCm#Q6UqfOQaT(gk{-?8zz@T#E8jfwuH&l|0s^2;`&>1}T&}n1GEvOzYJQISY z4nIoQe;og(uM$RjJ*g0Su4gozR&!q6MM_%kYW3Y=)&ia0qS?aYl65=f2_APjJ+nAT zl8UcH13$!J7iGq$i^ueKmDpT*OT|p5wzTbTY7GNa=+)@c-zl)tA!&_i2t?|oe_|&} z%qJjnk??HXEpiulO4JrDDlfJPb+UzL=B~AFUZsGEJm2CCp9U6p~;8fHAa=%Kze=dNNmcCSW}`*+OtmPNyBJ>2PQE%7lfK4_t&mq@3ekdCdSok zOPwXN<%ar&#LJPaowQTF`>38l4pxB0n{_C{Hj{_NHQeYx57RZ7%A9lU{M`DnyT4T_ zGeK8g#acXmjTtGl*5>fzsjNz!Z8TBrKQ(UYvmwp#rFl85Z;J}0ao#*K2l~J+jy#;5 z_!^DjY1#~)LmljRrqWgTG|O98xE7(+YE+b^95ZshY%dcqGykp$TfwB9&wzp~{0Rt} z)wYkdCIjHv#uOxD@#MnY?c#~)^9c<4%B`}q?)<@vvERRWJIc2}jpyv}K0L_CRr|)X zm;BP)f;(y}T)7N}v}(eXd}3CC!L2fj6J;FFXg4#*R7sH6_%hP4M~%jg8r5U>Ux{+% zt7Iz_-Zh>vGWYr&y@BsNOE^pHpTgaI3A?6@4`HAaiRG%sqL;s)-FerPvPR2A$~KJ% zlpzJ8TAxNAGDSYI^OgvHK@f9k#2usP%a2uu7o>(nnFzI0x*60@@mQ1@e9 z#t7y}Y$>})Q3sBGH9ogLac_eM5UF!zxS=%tVV5EgN|Bw4Us9=d{e98kKc_^IYtvt< z{Bxq(_2VXnQpfP)tY*FW@O8@X(x7H-?TgvQ50jba$;Y+jg6W;* zOo;Ui1%*mBOgM}i6=Ya)0014aR3gM0U4{j3Mw}uH2?O>v%%)sZ7Q=W+oodAVpBJG_ z5(R;|8P!M~f$5qcQB_w>OGW#as@6y}ZEu)roLmcq!)wpMqR|WYa6cRsag*u(n6?1FIAXJa?-edUbv%{Ohex1C?t3PuEAE4!@Xe7I%jWuS zR}0!>Q&yUFaU)l8m91;E&@*MqKl>BDOnS*uSq%0BA{M@XY`%sa)x}iAr~f2g)z_jC ze%LtI8=kqO@&DvfLnPDR;cWD&rz0f+@8*QVdnAf)nN_M3*=WjYodw)KPe_vs@_}ko zC;<*?HA9Yo__k@kiEcYhqh}@I=e~?r$Z7UnN24PpB0K&}vmrL%>%aNUc_T}7(}za&FvN7?8@ zTh73pCsOzf*gcAv{fdRm`i16C@+K7O*Ki1fMP*&r9=g@jx?KuEQl6HM{_~1e9sBlE zZmKZa`a)r2lWB5EErOeR+U~5W*Nss9hM6y7mzTeADAi<7GZ)+W)uoCoOYwChB$_A) zM!xj%B1XVqA{G-AV&o{H;@RTl==|7#Wk<%FiJ@ANZjtPlS937>rzA4L1}Mqk)#Jpi zGoMZnK-6sr!;GS8b5d9H%#Yl4&Tyf$^YGiQ6x`qw%IDHst3X~c>mXG|2mJ1BLd8C{ zd-)_AshY^Y+rRNM*yS)w7eHpVvQ}<3xd=r!h|!+fd9#0!;?VS$Zz9`;GpFcOwkLY7 zr-rMHa#Ao%Ych#BQqrN^QV@lF^}9nWpMKg%~dzQ)+8NZPj@VsAU_QL@po|mn}>@WE4of7hr5$ZitMqbOY_Xm1{0{&NDoSt^m z*RGO4DJI~*t8lm*H`|QWeATRO97B__T80|Xi`mxvS}v*Y@P_aH$ge^fPK*&ETf(`X ztej|YmN({@1>bpd>o2C8vxR3)g%V2oS_nN={B<9g+;Lc`!xJ95L<*zGaDG-d}*`d z8WId{b6>^$ee*>_1-&0(=B4yz@T2+4>GEmS*U0U#kuc0nY_<7~$iPq=>o8l~?PR=+ zV@^A@&L*3csuYJsw~?y2r$B;YC&&#)o;gU;CWqa$+)yh0Boq)~S!`Os6PdvfAu9`F z6Tup%rbGm=XDyi!u_sY6`>O9pr=rt*DWl$&kBZOKUH^ZWddJ5)2yOZQHiBW7|e!tFdj{Mq{7c&vWkcz8|i?;F|f(%vx*K&`2xgP?atnvPn{bZEw<# z;dL!HnF|3jk4Z+&#;1w2Z&Jm%nt;S%O1qkXVE>jdlU=zA+$@cwh{n9~i>At7jkGdG zeRQG>=)&9CK=t`bZOqwcdzv9cwgu1Vbu&+*tEwZ|#eGE)Ompf4w@IuQ!8T#PcbI;A8Vg%Xi5PLFE)@QJ;JrgEeZXYRcSEx z(UCg?6yow^le>fg)y_*$0^NWKz%}F=!MI#OydR3Jp~x?^)S0-DIJ87$zi?WAT%X|F z`p5=I29xma8er|J6O#C2RI2?^E@3&TXnehY<4*{b;vpM&1}Pz&%TML7D9Y^*a zSaj)3g3c)7uv9lCa57{m3LXl|=pe*z$8ne9>R3MG>gy2Xg;WD z`5+?jR<Now1 za4x}g96cqGEzKz$B_h}?92!EABYb7IQYp;*Mb7U4h9l7mIeQsbSg96M_Vy}S@NpFc zxIRQ<0Bl}t`%m=Gy_d7+o6XLQ(q;33Y`x3u4YEin>rsTh%<`}Yq^P8UWz-pzf@hLW z`Z!jTpyOBqfo_;Xl2mh4%MC`FUl2m(8}#E+X%0Pptjxv=2)eJ{=RSl)$#uj=ffNO3 zQaGfIGNE+ z>wPlpm&~|`D=CDZvUyU9D3TG*Pu)6S1Ju7hC!T7^gXo2Bh=O6cD1BxRonv=>)gedy zuEL|3ODwk@V$ZjeN@~m3+>3#Rv@h>Iz~d;*Gajmry`pHv9{A+$KKFz6?C}qglifrx zVmS_;a>rwNDvVMP!4HYEvhG!90>dE`OJTZ`;CL}gK&iZaC5j?{f6;;1B}S1OH}UsG zzXEFiykw=>T$4Kl6R#1A3Q(n=v8idd9Ce2p^|jdhQwg*P_kHH&A(vyDeaoxasKVg5 zk%8LWEZJ6Mma|YMaaiwahL&`ugVR1W|VZ#Q9**QDr!NXK9i%RcP z4@~BJPA7j`A!H5W^B583Meuqdyzo72IP6^s=CfO7`o_(O5$pPyg00)|7!~6?WL?r` zn|7ZnW}EpuUE0^a{Jp8U8sZB!t;nj{QWK~Aw#2Emj&HIeU!?#*q}+wP1wmA2v>W5p z`X(DtR%v!L{BpsC?uFS~s&Ai+dwxpl;#_|0TiSScxM>DadI_T5q8nQr~(9eS_i|So?r2eu<76`rdkc4m0 ztJTrHyQ7uC(e?t2>U|8@s<)jfca3DvOt8g}oNwrVbog@wl-*BQ4M_bsduU&U7oNzZ zDmLK zBY{eSnup~ICybDeQT{`gu`FL%M}Lmo@E0Av>UowZC1;K&ySXbA2m6n5ajK62rvnMB zj#Py*f06T2GHYXDG&29Z5afIXnrNAMzBEHT%2*qKZ$1U`)Rq z6jz|gQFXq?eLS4`?bx0E-=cB!em&ld_jfZLYfV=_?cZ~5Ost-H>97`5RAR=mnEnSD z_+NkkbC@V{9F|}ZKXo|9U%9(f$hNzc+&~3Ph;sd-*mYylp=Kg;jlY4d>jBpHBUy3% zV%&Vvx9j8e(0k=g7-|X<6o1&ysaRr>0-+gB-+AU;y~%o-_=$OkZ2#}Ft9AE_{yfR) zvdICRNAddH!A-fp1WT%iW$mr<^^K>&b9Fu)>{)E<51X~VWlc)m z8tSF=dJu+`*RY@07H}>9lfs&|XW4VZ7K570o_AC4O4dV-&leX$4Xr?XBt?^QR+wdb zu@RFEiutm;x1q*$FxjP1&fg>dJn6e7I=- z+kFA)c+T1w$l7ilT1CTQPu)0|t;j!*^ouHNwcm`eRGHR;1`8eTNFjDNp#_AUvx>3|W)9OjHtp5lRpZLb_(xr1pYu zG{Wwa&WK{aM6B16qmj{q4WV)}*G890O{QWl7Rn8jB??zLRxWX1KTuLV8pg!fHP%XPmWCwzjcSOh52`C4>^=uoVI{-N)fCmwFEC!PC1lV zWr^hI7M5U1(5g{^VQJm3?__o?*4+#si6)6RPm-|aTdG%&pgl>uzVM-pf1w@CgfF{+ zZ?G_yk&xn0ff*c5LQTGtM+4j8h-RO?j!6R%j*v_C!%`3-^2>kgcb_KM{Q=@1;1b_d zCzROBauUPoe-xJmsLh$boVh|>W@y=k*a zWN4BX^x_cT4^ zCPTW|PLI`r&dZCKwaN!gsM?PTx)wj=i{T8w@3f>T?f+TLVn;413dR5aJpmx)r~^q> z0fU9H03x*pzk|aIsIZu^Fzzr~J)LcKW%LTu?!d?bAZjV-)|;=Y9((X?I^9VIHgOLz zm)~TnU2@THH=PD8U6mUL%SPq0@FBL(1UNdlReu?v4!ylTnD#wOBsRxotR4KG| zA19WR1l~Y+Y9XVI7`|dR*Cj1Q-hq`L7$%2YtMayEjN_3Q^s|pOB)4By3B_U%rY~&! zn<-)(YWgman%YQ#(Pi(?pA7&?MvFIO;$Wh2M1_#7BX}od2vWb}oY_z4-JSfZ1cTzd z{Z5bMIP{Aaa_*zIA%~Oo)}f8i1b>XDU~=1|A>K|t%7B0Z8dg^@%#eUI3uZu%RXcqQZ>oM)WO4^h6?E4!1JjDejA-`I)Kv%U+ddsR`!GH{cxqj{FtGw0XavjK`sQ zorUobT{2VxpZ2m+ywG67EfuwL@r(TIQqbJi8wq&kI4gfaiiDcUdP>(98+h4;J*Tq*gV44QP3vYP7I!RI*>T8*X6 zNiWeFD>)cF$4eQ(3HhJIs{Hktq4QLm!%nb#1-2kCS8`^lD*on&;kjq)`@U8OM(ijB z`d1k_RQ#~!NglGZ`SC}#?V(q?E#DSYmn=FK-HyvDO{lUeG#+3_dK;@c%#FZW%qorb#aI};_@w=Z1TZz9;RFD6Mjl&MG8*a>x@*x(H&2lxJPP=(Mc7&k&%Uyf;jQ3YW4dm~4XT?YE^J#_WVL z*QPW5%8Apbx6NtL>fvD7xvR`dY3R)izlr1-b>eKBBp$Sl3Cvk&YpRmybo3#vyW$_c#+9L&NNy%;*C>dnsF(2zEeI8WUV26Ge`)ZOXgJ9PlnIO3 zlK=tsGZ9ci;7Djh78U{FNPsY)#q#pCV8Z7Bdwjpt1QNMOyjq2Dd}NZMB93*^%^(EA z?i^MEFbaVxa^G*S6sPPr&w)ivKJE+SDkG19Z)VZ;Xyl(Y3X~#NS<=dk=pus)5>D`f zZ&+}sFu@~*0bG-2{vb7Eqf)`Tm2IX;8LQk zrHh^AaS+@W-&F#azSzA#@~Df)Cz@@&<~Islc-`h5 z5mrciTKSHhs+v-0J?gI@{!kMKac8Z185pQara}GHGYLUi5hWne;*W1ul7z$d#Nwcx z0W&Gk;c+`5@gJaim}uB8r5`QAVNjm35~KyUw{HC(tpk6P@84d8rI(;XYTr{$#6eHR zQ@PT@ak@&c??|F<_t=qfMUxw3fT?1Pq73G?n)E^}2!@l*yYNaNqCGE6Sa~co z0G(WqnVQ%Pwc3IPrzF){v#M1xoy&lU_V~XDsY7NFnzTbO{#uowoi^;<=G~i4PgBM; z#U8Iu=#OW$WZlxO+Bdy>(*Nnf>Y*5Dhelu*L@Gi86?2L+PFJZXcShfMGe@j?;(AM% z(uj!+wqV5bst(luW3`hYeaRl?m`S{em8`rb ze}OR7s7BoRVY8WSDQP2mXzdY(N@L##`w)*l*JG$P4yb+||EPt{YOl%zS{L_xAGg_y zIK*xYqP^8xA6nDaUeO{KeeZSCJ3*!ESex;aKNGQ);QtHWsBhpXLbLCI9g z+DO8X$FZEXAVg7c-fUhIPzk%LrUX|i;AG7lrvCaff;Egd4h9{n*e74l!t5-F(1O#Y zD^{EY78F+LZV0Lv$d#QC;X7sAv!K7Mc3x*Rp?nx%Rhwfz3`_2(qvSHaxHs#qb7@`= z`3BuM6`m|4oecqu90xEDC2*-aH5-lZicCZ-sAfi-Ysr>8kYZWu#E3{K(aR(Srxw^TLkTf;;xiJ6@4L>x ziy)iO1WmlK@CI9jjAN&18Y)^6NFj_bV3lkGO%KN_nh&^rzFvjhL|;I%sP-DVM%|HrIV&?Gg|P9bf; z((sz^F;v#`RyF3e+X(FG$o72zYTJ10`eW(Cq2Wm)v}0ON)?Adx~dK*h{qu$*{X=A1Az=}P?gW2dGa3z@=cuWmp`hiv>A^h<#LcHfTkI-c)bE%*6ox2_9^li2Ba$7|7EY4p z!j@Xx6cD)D_ZF*ep`_r=8gJ1ke5Re}H>Z@J#f~@KW*9j{0Fh$RYM%bLawVx6R$(w2 z^F*&01P|1R)ABM4{wi2}8RlRHqYOQHklc?U*6TA?NB-=AuHlC3T_jqthozOdivfA) zK?pPAGB`3pwyVwzx?S%?>&ci>CCL~(*$oAl%N)_{H%GDfJT#c<^1rmgS zak8aQ;-ph@1`>;m;-kB=wWoZ=JQbuL3^;M$MgM8gtMp4xS`)@~V%MU!Cn8g78KJ_t zq>RBkafKVIx+Za@94RJL4pWq0FB}ZNUIMQ-FtP}1Ni?;pSkW~b21zI}hZ|>z#py!m z0T!V221`%_B4)8nM}kV833z;>&WJ`BQhs7*p?QAfJw_k@uQkpJ*KYQ!;dcAt6CK7h zCR}NSS%eRbFM!Gs$bIE(@##?Bej^7UUh5yZm38L(FRLF)9zoAY9t3)g7<3C#l|3MW znc@Dt*Oq;+^krZ09?MMY_?UI|Msr(VVB`K=ufq4vciNc|psHF@L56FEOwtAHi|Z+b z6LwOnG@{_~cy3|XF8l7VaSavx-Mh*kRm?id+G`p(*DB+xhV*$(yx3MBROEeP!a#je z1q|jhFhsed8>Uz@8Ud;2S-wb(7I8vX=`kpXN|@af@dOh_No?gh*dFeg zpqTZ)DZXu=22Kg1>k^9gb38|L)YvW$s(T#o2h|UwWC7L?u6%ZX*kAwTUh>#>y*=9S zg@sZ=yv@13^ z>UrrLZ0tcS3bOx;AO?;QvnzZPY1%zjI9=t2g)@VrlgLYqbpy#A0{5rwOAo!jUHuiY%RrBS{VdT38U}eRJyrs ziiG}eg6zPTa~hRJ;lGg#1iR`WZ4rfCqJ+`S^9t2tQBMfM z!}LrnYf%}a1Y(d}Ip29u_esLl!Mtzk@Bo^Cgn&6n-l89%NwMVXf#^)KFC(hmb{V#njJrUQrm4K{H?+jFBOY)pcB7E_n2#rcvn)W9vCyL3>IV*pq; zuk+J{lFFEXl%Gc%7M?U~OZ$N8aiJa+`2-CiP_D|7Bh`KaBl$U*N4xDqs#JPZ%}$?D zTL$+hJ0l{oz2z&R=Dxd*P)V6jF%Eh(*gO!0-dz6b%?i3(JKKJi~X zadj4G8l2U&44XDd+IFjpc^&Wj1&0M?RbvDZvRkBrC?QF~6MMq~tk&0WscAi&+Q7x- zjh|p60C;$8WG56)Lf1>yD-+I5TFytU%ayJiGOJ{r#1SJI;=}idO=p9G!L$MGKG*Z? z6Nirx3)#3K0~e2#3*-OI%}gjGfXHFXbCqnTN5&5AH((PJyZ`mll-JxRZzIoG<`-Vi zO%E|JV0i-}LP)rp`|1A6y-sSB&T?xyZDe-qLVe@tMh`l~8><$c)5{cFa z$kS2^;4$w^OQS)y>$aJKgtxc4nGAFRUrU~qJ4?2hFzrG=kp>rI^_yV6X=tg(#ecn+YYV6H=UPp}bt zK3>+e1J&j+nJmtx+_g1qw2XT=HzfLCSOld5UV4S=a}OiTkP9#(7|J>0%npeR09wfU zKzV6pq5sg9!oLT^8x{k*Dy6CQh-4TXFJx94P9kd$_vyn(;#4y1fFGw#ge@=zK@?B< zXf3HoLMs|0O&_xDUVob3~J0rX(TBHkuh64jpn(e?RQaxV#}TIFqq21GHjGkMid@ ztgCjz?%U2{U#Zt;Ibx|y8rCv9yqAi!Fw9vEZ4j7+xMHw6^?(&FUHk_8WQPK|sOoQv4P>w~WuZErxNwim>RY=rH%iNu5nlLLm7)T&EPF%esw_9ciLkg_ z`QK^$>57zONXIL`PQLIqt=FEqyl7{yX-O3ZnzGUP+;F*Mj2zU$=sqPhzlUbXI{PxF z73fc`M_iIi+p$y9uwK0>2ix+h|2LhCkky0YIB2u~_2jhX!qiu%T~#6usEbNL3g1-l zzFvLKU17cLLU%qdbvl*5rg1m|9AlVhz^tLZjLp_r*0w%5zq&8w3#$mK0GQ%bOjnBw zU*EPUB6NJEEmUj!*>9!Sm!TfIlQ#QMhu4&dB#ai?_JfzCUkI@Ef!+pIM6IM@_Qk+| zs6fSjk}A7NJ9PW_9~l4`4Wx=OYicf4UYDT)Q%J*NGobJkLAIFx?6b)Eb9aVpZrpfa z*zzayJ{Ex5f4_n#;LAzIzK!{e_*YYD&*(m1!JY*cwOPaO2}1A~5;{Q{yF_WcV)cqClLY4> zt*LWDq{+^k9fB7-36+^ASS=u<^IhJ_n-OPg+42}fP0PdNX-?W|CKn8HN$Y)5`%&Z9 z#pBh8$?U(=Pa_sl@RYGRin2$LxR8kjBNM|xg>{{e1=%RU^d5tV?INsQ~_(wZFxgh z<&3xDmd76H&emNZ`m2XRUILT+E;2Oa{xogGg!QALu`}`FRoQUl#2AZ#B5eNfM3D(g z_gR3N1|A4yj4d7jyY^1?c#6Yx0DApipYRc7KJWJWYs_nk_~k6qPsVbbM4U`-FUo9$ zL~!u&Uqc8jhkgTqIGp`RjsZjlLUF#RL{`pp>!+SkA|f-sMy3I|q` zS}A>dO0gS0quiL!`?0M~_Km^&slTTteSFyahQQBqGQO9StC!$MzB^CH2ZLTkda@gM z=Q}CSezsHfAAj$wAPalXdG2W>YlQ#-sF4+4&7g`w%E7WRhYN5J@#lQ~dd)S=$H&88 zCVrkMbesxLa*A%SnjdaGu&nX!NYA}Tf11PX&e(N|W7(fMXro<7{fuFZrMls@#x>NdWE$6a+D+md7~_IDm%3 zAo3pig6|s|04>h`zU$qTZ1&Kmp`92-xO=rzI(mlenIMM`*kYP1M(u{lB}M{>K$@6Y z_9y{~@HC>&pN1WF&(2g-id7;1il`lmbxbzxt=Q!{&^38tm4HDFPxuo#dyuEA-eIfK{jGNhyP-dA*csfuXLZN7*^*8@Y9 zd0H8BsYa2IW-^mVZ*kTeRydB`R9(a&80_sh@$`)ZyS2G5g#waFrMXrR%&!Uq&J?(5-ijvJjV-xU9XC6xyJ;3x_5qG);CUq zAZ(Zt*`SN!pNY+vlZ;*RUB9ALyA*b^NVc{-pnMxATq5!$5*1YrTo^WS+J9zx%ucNV z+5x?p9d&uT&3i@A0r-^*$R{bjAF)>C#!;9=O)FbeGoU)O{4n=?;4|G(U*k2wFT5+*951-3~0MBPx%H1HmbYi0Np+ROYe z5)DWdnypV(+dpNEG(A7>5M&*LUy;a8gLdQjyx-g1b}V(A7$1loJ#G_pAN{#}_Z&Yz zo_Ehb$48F^Vm$gmsE{}Y5~=}71OL`t)ZMk$Pjs#&bG#qg3lg?od}+Nuwdp?h$EGZ` zZYyOuhBiJux1Kzw8lXJ~=lf!ZzOqkrVxkV$Uj!Fdyy>HngR_qHwLLl;>VioTQBmu+ zri*+~(X=7uU8z=KJagctzR+#OV0=6Dnwt3ldeKrF;)jvPZ3LDqZ`g&g45RPY5v2Yl z@0Zpo#VZ?%BKz4vC{Q6sEbh{_bj)avK9i7we?xqT08t|v^XV7HoS*LymtEaj;~3k1 z<{r>!(KqSmsd_|@A_bMJ@N|fsjKTM|Cdrj^bDDt}{FiGyhpi^?5r2PuW6j#Q*76jK z2`+>k8?m-GEFF@?(E{?m6I9HQ-V9tIniQVTM~RS^j#B{4HSvW_LQLICP4q%KPyB3T|KeE?q~6%U^Rq_ub5eJo8U7d4WiIyE&udnQ>t< z{a)R6CwP_h7|6y|`+ZhwSt30VE{9Arq9|;Avq1J7_2x(-0o(WG1;ba-ZbvepW2Jxd zcGlPHr2T-Ox}BRl&a(O*;AyM*i%=*>qWd>4+-?Y?2>p;imPw%K{qJyRe2h$sUuw~~ z=;?T_QHQP8&d{#Xu=HR*@MT{-lVRHH`X)~%rua@aa#)@eY1IG498Gy93LwJHFQbO; zuJx8;3|QOwUdR9FNP>K+%Dd(??;`de6{bC>+14bF)|mkl$V8_~b%w`#_2)wDXx;Se zw5MKo$2f0LXEKqhZ2G8}tKv}p>V`5cNHx+6fdHWlBxWF%)I10NmzFr%Y*N^t!ayF4 zg@r}RepVztHJnsB2*yHhchClC(jZU5ipM;}2ycD>qv!*i)qt>43405D6@hFF1Mx2a zq+t%pjtJ8wV@kgCwPv^s;CPB;V@rDnYeR6gLlPBo34(==08wk<@&g%MkAd2JwAaQj z_&nOPm*#5#7rv;i$QtSTlD_GkJLqQaT+$EmOwhp9y5fMtvm+foWkAFbr}7m$53vVH z1Yzhlu)%6h3S_&^ux2}7!Vi$8VVd;%>&Mh8n573g%|a1q_ZT!?ZsOKY#7q-+ z45%W1-A0GP|LK#Zjp~71Rt#?*uJW68F9d}r0P}8xKFZQC6f07lO$t28B~9=WDo}RQ zHC=Xcb3ZZCSRN%b0>QSMu`xXjHk{;yj3~MmH{^HS8^17)UmyrZUXwhM1qEKL)g{a3 z#ryX!>PXg;4PyVXmX8-Y8J#h6lK-Ec>OWDrN6Mvd6rE5zr=>g$5dHuQx67R=x*H*g9kp3k1W6G;zuo(c2G2v9#T0R^U==<#N7kZUd4_2y67?K8b zowKRGVPfc0V<5Ii3!b!yiL*D@QI|!lD#~g46S2$Zb7TU&En(t`sD8l0gn;Tw>c_MC z+++8L0RpXg+GVJoJwHDNq`Q1C9?##_Zf$-Rd%9%MGiF_-?T(jDz_5zR08MCxKrn1nNl%16)ym4&{B+k{ja3MuLM*gz6nxo^_(a2nr4!U+L!cMX#Hk+sVG zZ3XoMSvAO!Ybv{K!2v~_7ILA_jk_ln$2FBW6_)?>j_qYk)AEwTd$%;=5Dc z9$@Yp*+s(iQq!%Be304o^{8|+1*hBTH4Z&oo(kE4(a#6))1=+ghB1SYhbPo}m{w+~ zV>Y4FX5?7)955hv1`Kwy7KWBXG_IvZ<4v7Th6BObUiOj4@Rl+Q$AUTjiTd|-eZ7w9?fsJ zWtXD=p&O!cVO^}{TVr_V*AV1=lesDX?`D*`)K`NYo#wFgxB2YvQAN1=Ry=tJrdQkI zAxDx^wlNku-&4ib)9cU7$S3H7CI4n37=f=6(=}d{!+G;}IFl0QS<*4#l6e)N>1T^arq)D z=>ge4Q7@-^(+DB0A+}4_&`XtpgAUp~QWJrg#sEwf@~cY8Ac$ldGo})T>W*{4oVSZ9 zU3+4kY`?;Q3e($I!k%MsK}zvL`G)%GqIci7;jo#!JV8C7p6OANb8w+qsk`^uZpnW` z7=a2zw+B?v=|0GKRti8g6qSNEMz(soFTG#3KW<0Y_WDL+<+k-mfHHc;TqQFMr$xZM zM0J55dWZ!m9MmeVh4x=90Oyr~l5_x^Gy_SvP^geHDg%`K5s3ix@btc4p2^{FmL!{B zX&>YaAuuT3A%q}MkyMhs(a@onF^3fHl@s&AEQ6fC2v3qEQIyEnFn~%c)hTZ|UcavN zrTmFQgF)~)H!>KR$Y<>_bc={I@J}m<58;*mLn=Q3!pbVql+)#uo3U#oz`Geu|aIekeerJfA1dIDfB(r%Zmyl ztrpOy#@JMFA`ys@)iRta9)6%tHEIG;6gY)zCBp?6OdK0(WAmxME7PAt(~yj8WRD+F z+)FLAhlkAv6;WUSgfm;1?>J&h1L(R*v((Kp#ZJC9DlA27r)XFvSeNbfMhCA9THsrJ z@U>hwq`_6O)}8+Slp}LY{jN<>P7tabZT;D#Q2l^KdRPonyuQuYqyD2S>Yyr<@G;xZ!*TZJ;Acyj@p~} zI$J&N2dS$$^QoFRy{Ay9^qcR3PW*nQy~Cp_nYAI9%rm#2^^b=;@!F>D zS67;rSLIB1C-Q=0Sk{e3?NOqbd$H`PB;O+^kWetkA(oIpIYB@%0=9L%1Q9(u0$9Ob zZvq)9aL9f`%uIHFKU>f*J9>U}nVLB05f@2|s9*PPA?2%{-v8N~ELSu==I1Fdy04e? zwz$%^tmet~KJ{FBO~?HEwe0=7?Qxw&g*~S~_5t(7dRU$$oil0>66Kb)kmvw#+(Z5X zUVo0lKzl7NVkts2T|&5vqe|f1n+vK(f~G0P%x@%F@LSfXv@6UqX6EGInS&YDy<42Z z_1&pfh0DqN$@Ry-pY@lW6k27-n74UnQb;jpY7CaD@rdw2Yi9bCCXNKA4*w!_1#ZeQGTt z7ko4B*_dC%Kks^%H^7ru@zy*h(gU5iC#GY<7Ng{mcvdG7hR6nSDkISgMz4@${)owj zbw<&T34DhYQBoo)A34kky}GJfOw99G=j(`U$EfDpD-OV9@xSWadDh}-KfrPMcOs1z z>HF3@_WY>JJr0e}iCA}e!m!7ft(9h+$7jIGI^2&^;9iwcsfs{QfgnyvySXfveyWkk?<^D%$oLF> z#&}IM_;Q@JfFt(!rY%zu2#Zk2a z@KlM_^s9^=JX!AJO$Nf6SEzs zf?q8R-+Q_1dqlnZm3MRJ?W5lo7si@g3u@e^LxT4wuCCiN^~+Prz_b!s0miw=jfdZBi%*55?&pB6lIy&;$Jmc*bKLza7gcq1n{&wg96NE|3EZEN#_ z5|U*8p+wT8JceW8XunQFFW47<4^l)Egm`H<8{DfN`aTr$5%LhSms4ei)*>bP6L+^R z3oc$HJquy8g5>_tBF3b1HWivFMI%L-HZ5ViKplDHR}cy1Hyd@Yofcy@_!N}7<=%FR z_zJVwnrUr%-Z0V;bCTyRn`S9S@kJHvMGr*o&Ry(GdcAYMncW`^HcEuDvOj2=nZ}p; z7TCW<3QpjpJfdTI1Phm%gU&+7V+Md_#ints^hUo2exo&#dgK)m`R9_(BA1B^Nm@3a z&@kv7$L;Zsy$6mxpO0QL*-(dcAN zWl>=rywT6mSFV-&+1(#V&DB!p>gC`QQl-FW!kejfwATEPc=TJSKWu8SA3o$}@1hJ7 z1I>|Zk)xg2CL^2ye45SFOeA(0E14s)DK<&-&k@~z)!n$G$PBCyFsctCB4Y`Wjw%C0 z!%Ay7Y-}+49N?8r!KJN69}5*LHB4h9N~ATo{0?3R22l@e+XLh!Wi-x=Yu1lOuIf!= z{l)ywT6aQFCMY|;yg0Tvp!xR!=R8y(4{SdaWzv=?v8_EYDhI4s+jWtPg1-|=|B%qk zZ$%vei}L>+mJb%#5z2H=b>2}IwV1P&=n&r3H~^4s{1!prS@wle)4}xWx~>k$#QFU% z$7A8DbI%x~ek<4%eD)!oZD~>H?8iM>a4UNz%-8BtBpb|aMs*Iyzp$f8-W$)UGyJy= z-S>aG-d^4jY`)vtpUvR--`|7!vZg+}+dp=KSJNeNIhKfDz&5{oX%85;p4eLCTr!H_ zsf)9WS^FTYrsoZz{GcZR7F*0_*PWheS&P#(oHS1=TL#1Vouu%HT2y4g(=5lX#KN$C zEI5@nbq@#RW|QWJZ5vpQdsN<}JZSdX^>MI8!?KI7F~Ry$KK8Jj$JXcX-*P(a!^jYq zDf^mi3eVc5Dm{*qIxZZ_AJ&FbQj?GO;5_2+5Fyk4R68BTl2K7(-!}P2i$6ROU|JST z1|E5SzXeM_9^@=fdghX19bZ!u&rC_v+^Mk%ECO+s#QCdAjp2VUo4hSam;Axakq)hQ z%+jaiy3}l)pGhwgPV)l4$LUlstZ?ecJW*SUsnRhdhc;HOeupViKC^%GP`2Rp4{<~u zh5GbHNMl=Wb<{K^r_VImHAjAUm3?}b?xH2W>$BtUl*G3|=IT|JF*@%P<+p>eBd`Ju z*Ktwn{b{}IgW{pRz)Boh@4B3URVeD)#z}zUop?|bXC>^n89}8*?eEw)blKpBiX}IG z=3zQ^FBw^rAhUdx%SRkyDldoVyFLxo2r82JU05hx0UYaWABaY_`oty#J}27}V$ll6 zKA>!Z)tg-`LI}O62#j7GSj!krJ&>T4CQV(!1TC%{oU?JjY#yuIZW`EKhk&qs9CvW5 zm!n95I{6)1;Sb@N%{U4MTz8PHjvCiHcb^-f=u^6AtiXR?VL1v^S_#a0f`fX?OtK+ip|Cq!nvHLQU;!x^R*k)SSX8G27=ONk5fMW6o#o(>dvJ}Ul;(iQ z!Va=?b}he?#=w3-A?%vV82c>nKnN_aD#KvVGpyAn~UVrnUPMk zDuv}qw&ag1H{uy@Mv&~_aea624`m5JFfzI1*b>x!=FhTK{#dCa zFziq_X*#snkg}pT3--(={HfSVOKsWyRVT*j6FH>d0;ZWI zg>H}<2U&0v5iT4VqAVKupAgfc5(}m0dX~iLT;8Dh-zSh=Q36MNr{U>oZF6zmX{a4f z*aJ~p=+$6?gYepML7k7*u ziTtouzt};Wel@9T#^2zGru)4irae!6*q18Z0iCr>S1zXj3s1Ko@^zkmJ6;h>S! z`VeE4`(R}$$bOTwP(!J_Ht6Lsd)yX_W<-4M;Y;@Ud@6By1!{Gg+RmP!pL70)?z&ePK^+0uG68-1{KpwcOct~rSR{HTbPSwaX$ykmymn2xx>wzu9G$5DT{?q$A-71=P0)#7%6+d4;0<*{B`I&D1eA7YL}cbZo4 zEJ<{~wn;LE^ANrIW^2#jE*v}@pu?HCC2rh+9{G31*4^+>KDb65WP!f_q!1`D2Dd&% z%N_G^pxGWpNnvz@T}PliMmqoSKzi3E-!kHEoEAy^{v-Vh+N=n zfj<6k1<$k`jqT_)N9os`umW`JF^Fx|`lPjgERA=eyy4g_Z~KJVcE0}E^4GmP(hDO-b3BLPjc&%+D?B{>Ha{R}2ekePpGMpxeLwT9k=W}Q2(lYo1fgU_Q zOk|eMY^!tP4_mPFG2!)hf}&I&|E#L$c8zf>ZU-;s+r%+7@b##@KFoOACzi&5(5+r8 zx8f}5^#Saz>tuYNbNDq1EuktOyGvYJE>_-Z6HH{Mhmvwi!uG#4`zIMf}tV+C<_lR93qdgfwsroc6*;!aF7s z=`>5QOm&+ACM}rR-Vj#ju7oufVij1v?cmbo zWRLzuP1&e<-wL~DOwe_YQs<}~?AWKo&}a=~J>Wa?F9OIGhYG=%%h{6;)owVa>Klo| z69^+!;zZ&Kf6rQs2UEj|JkVY37KlDvKPOR}quN`?`!WSnJ3W6r(3XfeYm?-7o#~!< zYZEg&@N1rNXHESmKAm7oQ%fBegSc-)s(hio53|&*_p6m&BTc+q9)P}<*Xu^90O#TA z78gHeu)kg^HeYUjWKtZ5m3RX18)g65p(=q+bx4V}a3fg(UL?2*z5rk*kdf%@lhfxqGKvw3yN?X5_EyoU-t$PbDT`mv-my}1@i1XB7HHe zx^I}TXH4j#%)nGPAk9Tp%LHaa|}cG!KKd^O;6HF=FIUsN3q_jHotqrofDv| zjwbYYrbdAGr{!Wey~Y&OTLOK}FpuY>PSNWnwnn>YC=oHPJ9t%#RiQCf9kz(9fv{e= zr}rb7yI~bY#|YYra$aydG+dZaim_kd5lnoh$0eiVf&Uxh+5e&HEu-SlmaS3TodAtP zLm;@j1&81ScXxMpcSvy85Zv9}-QC^YdA;vG_rCM}>d|Agjb2r=W>w8qMZm-@2veFC zLOYOB@{~374zy&x*&}>sq~dM`eNM&*j5^W0Rkk(dEvya`rs|`n;?|K_Qt$?X@>O^X z5S?>wj0H!WR*8mnu8vAE^=GKa5fl?+hm28ZK(0jyC?^WfVp9@aSIN>Kfz&32B}?Jl z7`wt51d+>_a}%n22c(%F;|m*c%R0SQYJoAcYAa_^4k7i%z9dX(sjy`OSEL`*%?FoSSI^py7$gM0~uj6ktE zzwJ`!HfPuak*_ZLQ1GxNdQB})UyRG+AL&$d?>Y#E+f_JP&c1P_Qrtdv&;tTmVWzWp{EGAt;em3Kovq z6x0hlHFY-4>NB!aV%OD<_Q8Q#c%4>r%E{RQkd@YoL13g)JFHhv@rjwWNp}>Ye%lPi z`d{lk3^uziMX6l-sQF1p2}8Wj^_q#Q6UL8)fD?ElZn{l%{a5pm4&w9B;4xqR=(6*3 z(b#LZEZR#&M(u`3>aIob50(FhRS*XvQQvOo(*_^0)@}v~n(fPO9) z&vec3Uku!mk!= z9L0auW|7kyO5N&Gm{LwSIe><`iJI3Vh9G{qWGW9+2WpIvU<~qr#C1$~ zL4b2WEovI~M~WIDZ%OzLFltwV{RGNt-VMyp@&NePvWt%r!Yze98E;f3w%H@dFJ631 zgrTejlXIY20o!<7MRFCQ&;5IHqz=$Irr8Mni5M>rVf+5jo?;(g2%&cf65?r5G zBNB``Y|muKw8UzCIAULrxqrQ_LPTu6uf{T3y?w&uEcgp3S25N-@)zYk+}ybB;$)e{ zHs?EG6pg6|FOw_TU}$z;Q7*H!MDvQYp921vhU)qxF5u638gn#A@UD%S;yfXzZK=MM zD;rha9Ei9#dGEJ9XRb~r#@wJf%DZNxTkGY?3=ShN+Vr4kufCiDAsj=K5WUVY=RRRZ z9Yeke?Ahym9tOfPHXBnS$uZ+#gGPAqJeO;p;VyjF6rRjIx8DiuP3*#~I^?zX{jWR+ zVUogV6SSBjF?jqfu{Utj&CDYq^v++q-S+d&{X{+2PLK)+Vy$+=_KUr$y7Ex&YnuQE)bg`Zs6|L!c}l3 z{@^vJ`fr`tubQ8C!iRPoU+962I=6!~owxlspJtnBzA#oV61HKujy-r(-EJExUN_Kv zQC|rRQ}%^vgN&2fLk(GfqQDME!(uODOL3H`J#QR$&pO@zj3;(KpG- zvw4kbGm+9F7196Y8T5}0xt-L0MM;fDj)sT^hQM)76VwtcU|icD`qREiFs}h`2($yj zMf&r5-HC{;3=7wvj#_!yWQ<_5Yro>1t?StD3c1hmtm z4rSjE%*B>$6=oFQM!|Py16ugcZcp9M$_36eua5;{ZiF|eD@;${SISChD;^I$|>~15@Hz$kF_1N(^~dY>bQN z2Mf{qAR~F?7BnJ)h&||Fp_5m2DrUTqtPi@tiy3+=GZq)f1f>uKHSo+|txl24gUsPd zszCCfG5l2Vv0qmJJ0o>7f1WK0ts>fi?=dY+@n{19NP;os$1rKGOym@!g_HDMko&ps z6hYS5ay6dpRpmIG+#?W?zo`|?;7DVC64!E`)wXxeoVzkfU=d-~=8lX1yP zmK#&X*W^*Nr|9W0n5l5e>#ONK z(QxplZ`d8Y5N0|MYJUPq^{1G?fhih(|BA?1#2k+#1m~9UwF;2hbg%S1FQB1*VZ01) zFrHQA>#|pNG!yxv)yC_pP3t&l$ABs;Ah-uwB;o4fImofHkOoBTdJ20{F1UQYoj(s? zj>j^+Wo(5YE*1X6`Z7$7G&qL{HR%r*`Xkqqg|@B!g)FKYm~^$+NIf*6SK&>&_fMZo z(ewG*Fow4MP~z5SZ-MK^^)~@LY!V!LSmFFlOA2)uYlJy_=Pz%mB!J<28e-q~R?z?A z@Yr@7N(@fKwTp#CPo?A8ivvsSyVWAV`t)*qYzRKU$-Gr}+_BAp$x=sKS_G`7p?8oQ zndhRq>e_LMK{1t`8yV^wwDFuBznrwagsKR5%~`J%j>jT&&&$&#%;nc1i_}mL;mn3& z2~bf~s@p@Z2;+(~6a$S}h+C&8Un@%wF&dEtz+BKTi_DY6OU;ZJ-Z~})>P4q_J+)h7 z$QhU<7&V@iG~Z66O9BhQ>i0E@sdRU>72NITOr>l&%{>WNSn<=@kP!{zs6(g}Lz9+E za#1$sRd4wWx3C~5V@tsmf(hg>1~co*h|!G%p-IKl>-aSG+Y3Mbn&hzLs4?;hQ>jonlDo`bd^ohr&tWx{e~yMx$KRpd1Fui z7W>Y8LIP}F$}Yk=FCzxVNh>*E#E)puM-I9J=}5Y@Z2KBE{POe1FF7<%hVC`9K72>0 zHpApz(Bg35mhXks7Q&7DBcx1BOh}!CkZ?);j4qgkIu3ZDSzHmFL088L+kQdUlid4( zGa^0_&_-r%Gk7eJ=LG$b%{34s>+u*Pg4P~vf-c!S zYf7B$dCOzdc^s4N27W~76pwb{pQxYB-Jqo06EIDlAA<(Ur}bGWUcI%i`!)pz*BN*r z!*)oa;mcRF@2suB><>iM$QUidjiC?BmM~yIRWNegY|f@i8`yR?fjO^1+NQ>7EQQ-h5$eV3Q6eAhlF-VF@H4V`sA64$*iysS9mUFyog z!6U;tmA}|38pTnYl+0Hjl*3}ro6@uQT>zrrX@i(<(x!_C#*U%?pwQKS9m}XD?=_BU z6DnEgODE^RQ)VSHwKWUt~d>GP?ojR;=rU=X60CFqin79jnglH z?!v9VXR>7mHN$kY;9neisrdYp8cx|5*D6tb-Prnc6S*GyZ(fQM3+mu~K}aTm*`#}# zG)WU&0KQJ#hinET_O>^67;ehAww;1U=>k#tE6`c3MQ2r@FqycmX(=WlVs^nDtNrmatJ z!cRetzbLnC-}Y_4&L#+0JyW?rKZB+}B)X_;Kb!L}bveE24m^tyrYlJZbMQ!TAP5gJ z`ywxT6;klcQS{b~GfNbQ>MO|MuKd=j3B(N?xDY}R;d{T{eAXBUa$%8#21wtC2~iFl zZCH$(80!zXt>|{-$r-N~`{Y>D7|h4<>U9qWPIQA9pOT=`G-abHe9}r9H785%c^Ril zKfpb;ixE0R+bIke%2C>#C2C^3kA$iWOD*ai7~r2h^d1myIbbKu3m+wB`e8r$7jt2~*T}1#cH<(9O6A zgRIskPf}XYVlJ55Y9c~{$b4Yc_fR#K%PLnIVKyOE;gu3A;AM@S<0LU~T9MVRx9Th# zSLV16-dygERz+LG*d^4#w$~a+8?`GP;BS~>+%1}*-yN38NZGt?QXMkaQb+5OBY0vTlFFd${`cSa$i?aoZq{5Nt|kT{`&j^6T@x8ntsP+H`&4 zDt`L<*FMU`Sc7%tbc2g%e&Hl43M5?C+Vz@tXMYlC^}xFSKlY=gWMa~B|AG0Uq+=9Q zw2H&U^Q-?~yGrKVSI7aqz@hD}<@M7uTAS>wz8Y8i_2%@#_p|?Ewl>w%*89*?!Rv3T zci7o5KVZ@kR|X%K4Qnvj6gHB^TXGw~^`!4-1@)Xcg=Q5bG2{yi8X|soFVI{G$B01L z1K}H?4#hnkhtLVpuJSa}d%sO%bObBrz)`P!-d z1F`aD4&V1q&~Mcy-DY3*!6ESilGDylJDK4Kt;%_|j1wiz`l|;aP)Fd(~+O3JD2O)@GxG0JpeE`aMJ+Th4TcTpicXH zT4z;67u+le#Ua8}jg56Rf(Oa;rXO`gYF3^|ipUYW7N}IXjCYlgNJAG~rMUeu#dMmpg_ZUu|sl zPW$jz1?WTQRwBa}U~05K!}@(4!IkTe7Pkah`T71>r%P3B5hKG$vS??G9tz)P56}$H zArAbE1VD?VpWZ2nn|#D0KMlKO#GbZB zD?PUsBX|aacQ-UYhxxkjb?pXQvo1-!0=MoZ79n|p3E7WH12-Szy{~qCZ?!)U6FWa+ zO7rgOQ?eMA=Y{C7iTd7u>6||De{g&(Q%If%_h>YrnDBd*3E+{Ai+Rm5TVb0Tm3~qM zzDjmuk^uAk)6Fs^GXxpYzY^?@Hu(5Y5-juelubwy^U@y2#O+M_9xS-}FjbzyN_T;F zwnH_RpHFz(jb{a}sv<&YMq4`@Xt}#**CT0PdkP8_9CDlZe)(l~D z18SE#PBvioB<4#X4XPT7ThWfC^uZe*;?Jm$0x%9*%iBApuJ6#ArQqFO<28`; z-?0_PD`%1U2#1oG2UZYAx}tterB!mN=JQ$(|K3;R>A^6!@cDk0f_s$_yvyt5MWgK3 z>D)_jt@wM!wy9u{pY!=5gU;W`L_IAb5x3{JF}1@O#4>%av4na`ZWW#a25G&CvR{Lw z%3y>@&Ga|*90M0@i^&+kVC=os@1!#aJ-D+?-=U>fC!TzSU5-e1`12&&4a)5j`dDcjcQlLd5#`cnYsJ?T`$N_bnZ5wMxCkMa z@~x($)D;Go4^xJ+&F%<@7FF4@GkfmKe>G#vUqBa2H30eO-OEFywJF_@$cSHgjI!mR z2i{~nX>)EmOyB8H+V_1mWfnuhF)~{037wV)F385WMV+#M z5ySoJl|q}BRMNkH917sBiOXvGpr!@AqzLVEpuD=g(E5dD7YCKp=iNW>Ep`yK++NZB zxdFDRrZKD>QxB}J1diFIuP#;g@VJ{IFW+leFnGFZ<^0;+2C&-|Q(8hsV5zz*Hr99B zz&G5z?+y{qq3s*qRBq+qH4v|m_5-NVnj*6yRTD?&S)(8ZW|S$P|C*z@kmh_VVWZ5d z(LDcsm7+F0VTqhq*arOPg) zW@XFzpR~S*C3DKsS4-x7ouXWlyqKc@^^bv6T&ZKdAO<-}lrxgr{VhZ1?y8RWJI=>~ zIR{5!PtzfG$|~xeKLU#CRAkQ7B5ib9ssG1fIyL> zAV5#y)-D_di(^rqBnj%*%OJ$GGv;!e_q$ijYd(gILtlRWv^LvSi6~hl*_-c3F@{l~ zJ6rZ%oV{AM5|gqYjR`~cUk}q1O4RV?tz7uw3>ix%hM@CN1|~YLYb#f}FP4E_Zq!YE zozHK*YtByg(O|nJ9|}4RS6fA@HrDVg)#JR$C)pDrs+Q#Hsb%<#)PX8J;4JxKQFVAS z4lyA8r`iQ1EfQulL{^O2JS{ITodAQ8I>0Q-B)@D23e>fZjAB=RxF zbk?03^F&o>`9)B_a(Sq66RM1{2HnQ{gm>3rE8elW{9lIz(FdN@659{7t6aqDiv0Z5 zO_GRz3M{;ijJsH9I!t`$QzJ*eoL~JDkIfMg&+VI>MRKoL3;#W-(L;gGSA_eX$drbA zm>boHhrRw2RZv6EuFdO_3|8QJ%Xt$kY7-z=Dh&m{I_9#?8eTL3-^X6Y~F*}`@p>~gzdaesbdj&V4D{mMkRKsujM zbWnks=iQ!l0;8%>1gTpOFW{nQ{A+Y3UCr+t%K-||03@S@dG6MkdgH{t0a|se%d*emvznPdZXgDp9x*bVhcnlp5BvSrxikD!kq?gX1ItJD6A!P!K#Uf&<~RVFLjxf_<( z-oDpLt2OZqw&|})vDvi~SO}C`GtbzSAUI#R-inSTY&q#(kJQs7Sv0)CadK1S^;-Nm z>^PIMecJi#Sb7IZ5e}1+bzi&AvwgNsviq94hfq08ekMKe-uFSU6qAeb6XKKTu={?} z5%WE~;ZPl|+qS-zyOJw^?zLBXUE(bGey|r=pIsU;s2=l&u=j$yX#1q15OODEGR`H> z{aE?!o75MR!`bZoS$7`L9#cL9=Q9k%jGhoYn$k*cu{^MzC zIy}sDEE1c@K+0+Xo>7FM?$_*IhzI)G#HhRDMJnfUSt^8B)fs?n-!XzpTaqxtT0fP{ z+(*VT5t`p;PhZEi9~r0M(R76BrvbYG7}DVeZm!U8L2YrSY^kJ(q<$0z zQL<5*3eGfU>3Y~?ukwEoZr)_6euSd-C|TQ=Bak@~H$$ii3_Q@dT3k!SF+h#eMSn4$cVd%3|0-5e z(m_)%BuM@j86y)jWE4xtZZ4cDE+BO@9#@tldY&$+5=AOGK9gZ!rJkw5=E?gotvYv& z5b2@afM)YLG*nG7#x_2xyJ}F{Hwc$J6pcikM79~cDXLH*o0_xsK5WEm2Vlp(SMHdm z#9~G>LuDXCu154==W78GReA{gJnGkUzm9n+dwI3m|0$mQ#DFR=%>53X$i<-R7N^Ib zY7*8_A5~dKsNWY=uk}L$ADS!#E`qD(56@-3G2w4oe15BP74|Sjj0wsZ-U;2#H;*25 z&Uaoq&TvITXBEAKuRY{xeYAd(Nr!=Ck>4Fyq{SRc1NJ+e64Q^stvgZi7*C%&IpOa8L;pkQICNj9d|M8;uvDusDs>xDE1lm4kxaOyF4^^bQJ*>@*C#=N-(<~xYt*!U z#_Mw7`~k&roD8FAL+P36{FwN)b#(wT=g%JGKuK1Ye8v89-*vVg8dM_gut-3Cuzny> zsR|$jegCW?_GZcq_PZQ~zxS3kvG3`o`y`F;esU`SZM9J@U=?YLtP8?!G;4ijGU5Mv z)%&~18etmh{u1T<-=<4SJhHw570KNqzXV4faoJO~tcfym*rmEpAgbdFCk)1>J4_81 z45TM3;51{@ppk{fblnZT{~89mJU|M(o)EUZ$D*=GH`Bqx^rrcAevP{_S`G)23jsz2 zm_dbfR8u%o9>TlQ5XSNs&S<>a7X91dXoV6$;mO_v&d+R3bBnZxIVSS%Aay-cfvW}3 z^yoB8lUhf?Z7Rn$nYW!o;ti56uqN}1>IpXEL>;r%UyQz6B~5J;syi56OKp=d=rURW z;FR>Z4qV`UHke)Nc8RMq`T@Q?w`7zAwJg0*07yvB84D=zk5iI#s zv$Dc+-xEJZF}%_#Y`G>;E=sfACH9g6UHL>ZuHyH$!^@3(LSN^1>Px?}9<{-VQ5bG7 zKml$woMLIWUY8xGh=?&)7>!CjB9#~~A}={K0lAP%n;q$z(N<=3S0A*nM8ct~zYU(B zDTD9nM*48n1a)7Fq{|5NNiH?vY-SVK1o4@2vrWG<1p|En6lU1LHh& z*fZ+#;65mY-Skf5avfqB3AStHwiy`9!s{=y2Z{^B!<>ZeDGOot9!Y9&`BGAT)9CC9 zLDq>W2rhJgu8G zU%f|HuD2N>iTO5KLgiR?C+MF-a5Js`s=8-BpuB(f@WHe5&Y83i6~ThVx{3xaEcqcz zkAl@S=i4~6LhUgC1D)1WJnSq2TwPwCRLp4wDs-7~Wyz?E{QUr={PLcBSM^lW-a>IZ zFZXnQTn`1Uf!DJUn4%Q$SKeiNWRsF7n?sm({2QJ?P8-SeyH-hr^^dcDckOO44IrlF z3B9~U&xjc96tolsPTeg2m!L{%Pp0sY+vFaQ(b7Otc0kHy?(J0datrqJ4sH}a!BjPR zx)|6mQfb4KBLlwYE>P*%pW-Cyua95{V;}QJ#1EIIH%@T4eii{{b2-@ePyc^z@}V{MmW03NI@ z$2DwuD#Kln{m{t?o)Fi0CTIi+GNDF;RC*kz;kejE#BQnHVQ**?(#MDQ`F{v_y{1jG z`s148pY74gjiNX)&4shCXE|_&%oc%97=h?CGO$)I`sfa(HsjKSQD^jBSk9T;l{XOo&@s$#XiRV_N8`LaVi8noNW_69_8dhCywvep`Yu7Vr%(O#Kh?e6qnfYP3S5z?+h z?Sk-gy0qy*`>Zo;X$2P0-F@y3H30`%(tj#wlt=C z@j}aPEZdoNu0LdKZ-;_V1C%h+IG&E~j=`ghj;cp$=0CD2bF-aYK=RQ0?AkhnUV}MH zA8Y^B?pgUy(>VmP%b0*0svYk3#IjhWChNufw-~aFA42lV4>iTIfW`|5D$-!REZ$Ku zh;Blv6s{rgV5^I*%n^}XOanE_ww%&$X{oHrT4(Ib>`8u!$$a5F1Imu^x-U29ZHKj^ zYuEk80pW9W8?0EMqJ5$~RI`F;_K~10c>@;?T)sIll7{c&u;%s<7WH) zwVD&=#FKRRm%!Oqy?dR6WYFf%hE#{Dd?;d|sM1pVn04vs2c^8rb5IBZJ)Ibcu; zO1aJYc}|MY*(GE5fymOQ{KEEQ-fSBRuC+((?Pj?yeoJ91`mk6k7*XU}^`GF#s@wJv z?}`2@xO*}-HPy*B8w=Sfc4g}`j-35jc%S`xA@KUZXWM$Z+W7{{|8TI3xB?O|fORdt zeW0Fst%rVggDwYfFlDW}PfxD#etx^1kJC%{og_lzSP)ljKbyozwWbDR#J6NXqT2h8 z3Mow>$3kg&^K$vLq?v`9qzp*62Xi}PYPbZc3#@A)Qt~Omrhh0UXrUF3V9{tfICo$H zq2nFiB;XGGZZNdT!)N=GrMdK-K3&vdf7Z)J8*qr~<-eq5tp zJnf7$YwB+ocs*^Q8!Wx0A%~5g?0&~4Rr-0sYG^`h9}ug1<8&>cC-0nBpl3jz#Yvry z;7=)*eDGZQx3_hfl<+cgUO@3yF(!&Ji^y&g7=zaG2;#S*#U!ce^)|btu%PrO`;9KX zoV9tnT5iSIZr}WFePW&=tLJlaBOO-4;kW5VCkK$F^d%!pcu*q$6~Z6cq>t39st#tA zIGKSQ>VQSZ1sTSxx^=^Le1(U{vZ`~ESjWn%st2~Ln#s&cAD>vykPIadS^{7tMk4lT zCYImqQPg@m66N+7J5*M3QE_sddYqL-=EGP*RtqF!uB|CK_1?P8|>$dlZm;$}zgZLE-fmZ5a$R$k_)wBLJm&*sd}!V8#{Hk?{zJs>mT z2NsPf23!AC531}5jhsYJfp#Rz%i`~WhB>I$rMKE(y&iH|a&Z=5FzRuSBTWsf=iz}T zSK$Z+E>;R%q7yjMLj%Pmc4UmE4G4tIhq=zd(_)OOwBiXU6MFp!Pcl@}jZtoq1$1BK z)64?=;0nJRJ!`S)KcC|--cB5r?H=O??20UmKci)E>@^!#DDPfbWj3p*w3rMHhck@~ zrS#y&u%8g55*FIslHu2_m3Fq*c6(l=N0LI8M*Vzx>&|Z?#Z006rK0MT7)E^bDUUOV zEAZ()#3ohX3XZgxj^@r<9RvrNa~y$nv9+QY&T_zGB>z!g0udl6ugrvzg?a%1W|4GV zO+-S|Ch0vjE!|bG(+9=pbh5F~rJl5ATyA(by{bFScFAVVp^?Q8K}1b+RgSqCi|HRn z>ipMv0Zjo+F`(xe>}N~QcV|hbpY<$me^b0Y>0cC-vQHBktT$>N9|Z}!`a}-5)}~iH zt3IZZ=w3V2R<2R^1~1;@|3G~HO|v|nMnrx?-4a*z5s8;DBHg@g6yOmXe?zt-Ex8># zUHFPTU~Rea0`rwkv{8b~nA=T7MYM#w3t2c2E`Mq&6m5l6?HW=P_+I&CY3;KQWs7%< zNbhtW=cIQGzDp3r?qlvZyNQEXy?klvfwMBDSyH}ibcq?&0Hek*>=$KJ3$%VuQEGV6 zPOyBZHpV|ji3~wFvT(5xS>Bx$WF6@Gr}3Y?i76^Y?&khiLpe3qlC^93 zUp>8Y{MKiEu(;|8wiE1ToE%QiMl*e6Y6@kXFwbOjeaglU^QT7^WXvQv`C1}afl7D_ zB;<;W7Tl~b{lrvt?^oU)D++`&qJgM+5hL$;zOe2AOFfowWK7>SO2bkr(0W}fNeX|4 z)N>-+gJvx>L6N&Ac*dt;MIf0$Q|7}E{zZQI`E-Is>`jh=8{oedtAgD&b|3CuP2%n9j~|Vr)TT!&)UG3-R}@L z`L9HqUcJybw*!=qT5aWa_n%qhTj)fqj@!vvhY>iu8x@83!?=ykx4XABbA6-z-(qHR zG)V5VXk@qT$l@LG#@{M)J+P{ZYupshzo7)uA(pG~{AV*ek=nfLz&3UG%dYMmO6$E-Vh!J^&!Y?S`d@OHU1l{?)V!EI+ShiPlZ_ z$NFy)fO1>VCF^0KxO+jnxdKbXPROauB!GGm5!v?AuD-|5L$IK+a1;vOCVY@qtpWGF3@bq9P8F}&I|Any*CJxon{MkRlsA-?@_c-iS+Nnq3?k%lBuCr4xms*5HVF`^jQNCM0$49zU-&m_F`@^vEKo3ospk zNPz1CMX2P6j@0YFoJLqm5Rp)TuVUXtsv&j)X$Fk%1K%tSN4s!OAgIM29t2!R>3Faz z4zoN_MkmS{Ul`>fA7}`$>6A?n1~o6o*08W z9J+FTo00HcL+71f(P0Yw_!*vqf9)4v^-V4Cw+bfBVb^ErCukx+3yLaM26UfN1qB|v zdb43M1dMX-6}&qsP3m_R)IWBw-i}&)=I#^jkXo=n%KlEGR5D$l6nP?AY5ZN80=E7S z{~p|ISf(vq3q(7T~CmhOJNZs#3YyobsC$DN5Ft|8|c{bxT-jjn2Jjz@DFM4JW zwvlEN>_>vSKjjOs43?>+0xMaD#R>3hXhhZ=Rdf-I6JRPc<2;}@$in%XLYiOZW*ic^ zJ>_lSohYcsVbT&N57jG^OIFfV!+*F_ycOA^`P@jwYJDVFJYRahUXF9#@rXPj1~Ytn zS$N#Ig1yu(uNDQy6H#0X&=i$5q2y4wqw#^I!e78ecA8|jFlyD zyl2XPOZa)sh8M~gsn7OqMos6ebt+%||K1y(Q1T$uj)9j1FPzAl2kt0eryWAyl1bLN z>Xr^FejvsMJ_-F`g7GUZK@~!b|JZ+rL@6TM_l}=oGlYIR9b9>P-=K&f8zzv$O&bmjUoInhMUQDQ_b9P6u@ ze+ZAh*{1KLk<-?FY0CsOPnbn?-;q2zOv&6?Dp}7I2{dMbt{HlgGcn}0rKZ4kd_1^s zUD6LML!=$$3{~7Z@rWMD_*VDvAGKtVkYNo-7oQ+OjPBam)!Q^KGD5o$BgSp0yC2oSE#p zr{7KG3LCKtF3vkSRZO)((;}D{+>4B9WlZW+{nU?uNjQt)W++S=^4wZ-KJ3+aYy(fVviImKJ&l!(j?Q0I<1L zYTJIjj8;>~sFyI$|6RN@Q*({9Qmz$q4|_F{>AC-MItei^_y5o!#^@FzS%=pP{ZZxn zuMs-l)UQt5IfS1ZC*pNN@90~t3k~A&`XcCJ9GaC}5 zr7@~8*<&D?PXPK8eVzggiobv}@;7m&;U~s!`t+V7Z?|`w7-S*r{?zh)H(3|eTpE8< zUu0o4B_SNHqc9^aF~6wGETNE9mi#RwOfP&Kq!8j-475PnNRB7#E+s3&0qtM4=nASa zvTOYIQ}PQMI$?tVj;1j!>fyE=vGvu5Hp^azsuo8cdH5he&ec@~oEmE#_lEm&DGY2! zQd#13Ykn6&xb;`rP$J*s$e%}-rpNCSwd{q1K7xBG(ucy)wk>=7@R#K$T7d8V-K9?J zW)n&?zJa18I+ctMlrk1s z2nkiG&Iz<(Z_C8vjs%9p7ik1p%kTJNU;+r3gq#rgeqIU!oxkF6vHr_dC5-5nx=@L~ z67mN=*d4}ZQ`k*}GXhOf6oNp^NhJ}P#ZUnHg*q52UUJK|^RVLcPL8m_PrHirPMCx6$N=s)MCdUsxN&YbIi2Kb-4N_{Rq>Mt~n_T}g4Fm7N%JdQ5S zW#YHt1jz$aAJ{}(uDMV+rW6Wc_-ATb}#P?M~o{hq7MU3lxNsgyEi_@Nz zh+4S6UY0L6TwnSShvPUT43K`BhG7o0H8z+0o|dHbx}{lhZjbv|lw>F>#9dpR4OZCFbiv`zu|ET(B_T4T}u^X|Dve z-H@S&xK(T8`O0#$!L|GqpNp$6{XT3`FeHL82HSb0@k$;`%%Aa`rAV4614FjOkWuNL zG(!AaJ9#k#Z<|oXE#gN&-StiGBmb-SCsKD{-kr^n1CHHKwivq8`56UIFo_~uGUei2 zvcEGBY~dvUWF3NVY*BE4GEGE@hSKy8x9wLb+-`W`Qc#7uJcF@B8kNag762^q{yIJL z)zGZ{Rn7CQ(v{=+{?$bOzKK}~C_`w#TdHp$-)wA@N+!cM?h-%~l4UU1N5kt@x0MCS zrJ0XEAUS(c0t_X7BeN;+NJiHF^B3MBq*V_|)YAa+e3pX?Ty@`ycB>{HJ}RTR=8G~G z{4-6U>XG9R+-cG^IdBWTAc{l*>oQs|5NX_#L5z08<69eNJ_Nj|LYSIP2?^@NI(~n_QKna|q#o`zJXDSLnZlwWRovIQmNQ>)V5MTwT}ZZ0AHwrX2C4#lxkt z5kh~&6*0q_JgZ+Ls-^2@2jU>q?T?c1X^f&pSlf?{D9K8gLt_-T`vt==Zs4DgQvRn0 z%PKFhc>Fmspv8!Rl(i1J>=M$ONW!sZ#mg0s&vADpj_soLY7AdFw}S?-DX>^F`9a=K zh%VJ$s^V6SX+p`xEcm7HC{8E`$ccRVR1*wiL zuBuy%%0dYS>wo)4te)vtzG1KfniH)uH#Dx!Dq-+U* z{F!2uf(}OerMd*%iF3yRxstHd`cTz-T@Vk0 z=@yI@BPNp;TgS&2R|n|hSU_F`-mz$Gm=X>>7FIdIM1fbP6EvO>wgcn@6{M zH$r$of&5dQ6W(>5rixV(286_bx;Ww>%$7uD>|%DF_kX9H5_>_C<;|^j+_f3bSl%&R zqNVG9Bnq;>^@NE4OGoaEb~%bn#5()GRVw6yx7`!leAL_CRsJk3oRr^P%-{bl7cadH zt1c8&?fKX-ae&Bi_ze^wN0~rLUjE8+7LHc^DY2@TUHtAr3F`ZdYd9M*_({Zy zvGm^f$n(2^@4WMHwA^!~Zu9+V<8oUrSM{PfnO!t51Iv|6|B%S)x4_ezL80Msl=NjM}Rs+yre3J{6a>JSCb`j%&qS> zvW1~;1p@>|cpUS$iV$l1yPjuk8^*HP?X!g6tDVM|psK{Qbdm-cxHp@m6u6JrX((#sVnlmr# zC{`laZ{BZzqORxu4|zZJI4)rejtyFSL}wv=*)b}koh2`&Xc9C@3gjnBbZu^M@ng-nElv;ODmI@ z^u(9U+?WR`%oDH3h&w#c96pkk9E6weQzW)s5jP^H-lRa7d4aRBmBzNqqR0BAwY3<+ zHK$QJk4e5z<3kmIcghxO9WDxS$XHLAe-z9d%Q%#?doEFFfexmEvgwyPIX`srA23vx zkrq=r-^8dpqqYo41;hN!no&rNL`6z7Nhq51Y3XFu$1X3^b`4w8o2rr}Fhc9sY5ffe zVJsR*>SNNJQ)Z5H5FDqO$qGGy1%=->G`S~c?BNL;)m9D5n7LPqrpuu3hwT#pPj{Hs z9iKJvyT0}Xqe>oU0&I%A!|kNiQo0L&yrZdR)xCuim2(a!*@#8s6j_wZb5odczKPV+ zTA7XxL7mR@??lZe<(hn(Y0vaU#+g%1qn^bwEKWiv*BRwZcz&iE0JQzgcr?I_{Gv02 zBswT*f$5O(g^)4?N=$F;r_YQuv$vb<1SHYAr&`1V>GsVt-$sMtEAYSL?@$_JYR3tx zpMct_kH`ew&RvHDxx)_tMHiUca{cF96V`KT$pO_>nB$9X%=|$=&gHu@(~T9D_iaXU zwq@~C3?2d#XHS&5q5EaDCXr_9TEGyz<9LiN|D@YT2`h%cG@b_XJdW0O=k+Mfa^uin zK?Tu0vOFm{W7{wF#tpEoH_m5|_dgWu2r{Rc*9?7(s~AQhMFUbsf3wVvT5~fIP!GJJ zbKKyNOt!s;2t2tCe$fMKT)U}*HXai18UNT|F`RP>k_KO)Ba!+-qEM=b6-8Yn=cf?P zK&=q++wq7-9O*oQUdfy5Y6f1oWcrmEQm|Eda4Vo%FButkar4aPdK=c%zR*}E!9vcj z8Y=u++Q^zcdV*QOk}2VfHn`Z4@TJPs1szl)nI-Q%tEqN-cTqLhKn?Z+trISs5E7Ta zZEJ8S!&xl63gu`RTNK@PNWA)B)A`h#VI%@d%Zq(;Nro)ar3+fLhsWi2I%fr);8al{ z()K{KX^msi-FqX0Nr6YjrH?J)`LcnMJ^62(gByCCzE_f&Di|RG_%Ff9P~Q+1UxSKK zFSVCylff4qC;1+;!#%S9yIc>9A2JvE@=vxp8<4DfJ=qzr=9|^{@G_CO$iEL;`7v^_ z-)3`rFnHPiw9|h1d6UF2llCJ|l7c zB(Cpl^BU_^=kj^ukr}+9dEdIYssx?%Nx~TBijO0he&~zEX+pUoQIY-VA(7$}I}Xa7 zUlJ9j2sdLR?u=rAABDLZvg)qfbp4`AFM|=ASZGa&v8%3X%gn|sPB;DMUZNkx6tDhijc}#G=LvvVl6h4F^0XqFO}QX{_6OKt8pig*<@x^RYlE~rI4O4 zgoaOGsLK;%u6x>nGl@+dTmp2H4%YQheun^OwQ-Etdy1%KLlZw zge9pO-E;5dAQnqBqE`y(o+v}a6~%=N;wn**v*Ht`=6kzjO8-CY7SOqc0L1^P2mOCs zonv^UZL_XpXX2z|+sVYXZQHhO+qSKVZB3ksZBFc+ckR8_e%JS_pZ?cJANNyr)mhhF zg{|v(s)hg>CU?-%mLE&Y{gpdP=hH+~r!>V|=ld3u#{KvVgMTCP;nI$U)%N*Niwq`MG8&cOx!k`00g$RgC6qV4I|8{ z_tFmEg54WE7*eWXG^TN@RjsD3O7Lsgw6CxbSuka`+}{Zz%w#0Sbp;Jc*ZI@LEE`P3 z#g`zWQZ;S=MOhWlot#)JE+s=r4|+pI6%IHWPHoBzfc7A9Zb^XrRDI z$2{sf)qI8Q7rxFzE{0Z_5)XN#z243yXjbWr#lh<*q$qu6OWXV^n#8qolUhIK^ZR(n zI*zHGkiuHX6bv#&v20O3<^MsF>_AdkSB%xcp9Q6nH67e zcY~+0&1bsAyDPFi?GG8i=hfW5Pb;Q?Wm;T;|60Sum<#{FA(|v>kE_v7)fmoX=(KDm z!@7tSU1IZ{4|N3nf#cOj-D`$JlEggDz~ver=0|@S?h}q!b%XSxxm(+sC#o7}aJv{L z3%(Va%8ytx&UPG$^D>>3M5QkTr^=}(r#WE}3xNaXyCDQHX@uR$kJa(6rN8gPF=#U} zjX#)Wz>YMYkR_B;K#c^C_Q=g1s#GQ;8}VmjSoN!T@v(u(IttQARHeZ7J^N479;K$> zDf}A@C5Rv35JWN%RgEm+uljy2xpnP-_5K~S`x>m`eSb`=aq%NENvxp@Ed3UJHN?t8RAG7tNhygSU)e#-HJIA2`sMMa6Js$ z@?8&V`*_c*cG)H}BX`^M+a!}|2Zcw1jNCdP^@6-fWw~187-r_ZnQ53Y-$#SuJJ|II zw3cMnQ-TM+)&+ks{X+*S^}9d4D!`BZMORFg1^;`LFt6*Kj-8Kb;3xEiOi6=x+vN#1M4%EzHwkJq?5GQ2M;XwK6g5e?`KNNatp6CfqyOtu16&GK_~P7q2}pTfwX zK#*#Rt#W}SE{4K08Mne;RJ!nmSlaI@Nbr=ThrSsY4D;vf+-!)HO*-h85{I++R+ZGF zCN>o12%d6rD{Ijt9&P<8g|@IG^N;U|7cf8R56wp#v#nYCK_BK84V49CWo!Ol-vWd1jlinFp+a4>g#^ZR8py*S2 zko`z?0a^+O#Qlkkzkz$Vc##`FXyj>86e=c26POd^w(e^!c0}kq&TF>mZ>T9&2-XzK zp^5TxdP3nXgy?H!qA-bu0L(VutenDr2%9X1I4SpNCq22WK&j*ur~;-CgjX2!r$hy2 zSm^0uTGX>#&pR{ULup*k&StL@_kIuTuZk``YmK_FN8Fu4P=2QAbQv_u6Y&C|Ob;2S zs!MGNxN>)q7|lv3K5{0ksBDY1uMt(pg1^HI z*>)2cb6hvkI)i4*YZobZ!8Ij3kLkJOSKJ+8CH4r9rdxt67*Oqgw5X^ShtzAmlDz<) z(D+#wtWHScjZVeRh`MF3cV}41+_0;d$-8^^?SHaSO0rseLK73L4iCIPZ-y)Jltu(C zXWUU?*sTf%+NuIDx+~v=r`!lu?PN!`2o~rT%lAXv6~aweH**pPf6z128W5RKFvfgy zcNW{v5wTt-=iQn%Usuj7Uj%=d5A?LGP0ZH=%5&|12W@hRZ%wNTt`N&UeD5otA~=Mv zJ;^IFgXen1=lA{R>4qd|E=XviG{HNZqcV!7;K2S?U6RACsu>%LL<5NRl+sC7P>`UKyMmx4@G;Z-A6N zc$~me#Hzp}0%A|&OI1~rQ6!XcHGhF*k(|MVp%vjVfc0Y91p*D``PDT3w-=xaQjb$J z`IdNXQ!NsVP*mP9+`MGazeJm1=L!^8(?n1#@mWL=1DNcL*7ETg46w^CU_80!~<*V161%I5EIO(vBh_ zEMFkHx>92*Hs6!qECgw4;;1Cu5cRExuYMIVgMY#O_PvXWTi$wWL#TC0`*(8Sz}urA zPf*#-s`Fg$9vRDnLJe;Q&)mEBt9I!nGUL_TblX)g(|9w3>pfN3)@gdRQg!YYh(V0} zB17fqS#x-Wwc6Zn$|2}G@kXKr2NV`p5KrTb++Tc%06~k$5N==-)t*szXh6! zEkz6Ok3vrie@F4Oj2S9UY1-fQc}M09-8V!PUqr>(d)fz@*~)T&jGkY}yV-CgM-?~( zc7Rh5ms;ra`XUNcigC`Or@TID|BO&Q`GRBK9HkIW3U@fdonq+lBkC%{Q1|ES4i^P7 z>U;W4c@{?#D-IA2X6%g70vomcXt~UP~WWybG|8_-j!%$yin9vj2 z)CASzyDJ+NpGNHT5Z zB6u~0I=qrZ&@%`O4X#Y>TW{?aOVjcPPgeU&?WIIn(sslIIsr-mjgxwn36kaMggOTX zfO_IY9MURopG{*4>H1)jeCusY)9E}`>yrBW>YyH49X@2P=(DUMcJtNNOvgnX0&h?p zzNhFdy%R>`!ZqOeB2;GIU;*X9o-2{E*}QGt*`K5(^H`rTQy^~2=`Cc>q_e$5T)y9Ohcn4?WZ z7zj_)5Hoc;lb9KK#leWhGa<4{NOr*_o^oQBAcbOCCY50=b+VQ;p=z3u1N3gHeQIM!~f>zu6~b82Svm;j}eozA_`&k`H7 z*w=;QSxf=Q`^IP-g>AGTN(l0NDsyq30gr;d`5P82kBMDxV+F3K*_oV3gKFr?C2*aI zx53)$d6#|$f3aaNXjTb``kkRDCn9|b(-$=MXo zJi`7_cj(^{LxVq>IHDR0W}?RK?LhO1*fF&r^HGi&UiR%!dbP1peI!BJ_om=j?=_R! z-MFU1v$g44S_q*D5P?`|>ZhiQ@I_ZHGI1s{uZ-RJVkUqLpdf5Lw$|Z2jS!WAum7?A z9?|wf?|fM4~8^M-0UM+B+h;&YSEtZ(sAC^*t>A_gugY6UH1#3vrCB$#M|N( zF#_ptNa{~m_vV%aJEu4%Q?7e_JL(@paMAddmHJ%<8_CPaRug-dYV+imRH?~ZC#Yfh zmiFqL>M+u5fyMY`6QE9JvLD~=DL9^;%3$LJ;2Dhhwpb{AexAVc;1i^vQ&yV}2a+wX zhQoD58ukal0wPw@;CSO;P5Xb#hwl=iv13Rt?mI$Yij1D+R8FbzbyM#w`cvrU2Z=21 zFUqrjiCO(wY05D3-pMfv{3I$U6i5txPC%*i14o-a8Dlc7gSDx@=9r@uSKP+X4`Rc0piKsPw#2ON-~2zzeTt}C{vTxQT(TJeGN+_^(H{_P$`485SeU)Sb#|3 z&pZJHTEdl63b?2{4zlR$`F;?m=e9Fl1`_iA#0rGs`B);+P#D}Vh~kkX%`iYoDmxt@ zCxg7Nyx#r$6{V}jHPM+bHieCbP8ExwtXGWB-0G#F6qgn-#Hnzvc7Tc$z+~jWULZ@0 z#W8fcgsRZU7^qU3C60mcYkg`!v$)pYrCwM#_*@4(7vwBMay8;(O;WG`19P<-UT>sjc&9Y;`K0wvZ8$7OL;Q;M7~b zd{V1c+0}sse;S2HndTwv=|Ixc)$9I6%AcEc6QC62nc=x`9n{cp{aLFc2lvA2lxed4 z{~E*p{UNLMe=W(38!lfiSx0L{vspz~FfGoD^Yh7pi1<4bf|doTKcEX=-}%-ay2j5Q z>YnfAKC{yNUdg|nCVB5ru0KEJdJhv>a3(P2%$jdu^l|#IhW8-VMqb5higFL4O>spR zvON{!X(*y2DJ(jIm;B_-e~L*T`{iB$h^z){^86N@qR0FK_A&HuRs6GU=_?;l>2S1f)O)77ZqhLfo}GvQSc{e z&;-(Nw%>m_r&YBAbn+s8m-ASP+s-$?eh34R1F@v2SC3gC8%)@%C z(-0D_DCbnIf<7_`2*`9xvS_Mcm1@){>i{}WM8{Y(1vGge>ZpsE;#3@@D{dH| zCyPia#m*y*CjsOXVOXkB0s9Sm>S-;%ERFfH8r#usCG5}I-+l}9aQm2pYjV9=c#NV< ze)|Jf7c%x5mOZ_<=NdlzNt@dA5g*>lsULJy!F*MJE371&j0x<-jN)%e+Tk(I6*%UG!(cVA`T-Ct%!)vlZ5B)!38qs$xI6B?p*ZPsMvf2J2!uEdnIM;F|b+EBp z3t9JKGJY>%^gOA3_|BTD4X@I^MUAS?nJF(WxKIMr)LGl(g}!r`_Y!d}_{_!Fr5ex1 z+3?i$jAEzVW(vx=faD7Wy&#iR4Cu&Y$&JvAk}+zMUc#1M3mAfFecr+}ke*&mJ;elR&ayF1K~y0!EiZMv?; zY#l{o-vdt}pqf`fHwL>!_<*+9eVH#Yi@z3INK+7ls_j}nfCArrlm3OfWhP?r!u*we zE=P;Sz9te@YnEyP}_)7#`g)<%a%n&W*ZN-R?1=&LjJ~9u%yMhtbc# zD#>%z)1h+^E?V~)(N=BtDl>M&;Y^uF);JdOQaFL}BvF%UAR+o~*BzI=zQ!!0=o&n> zAERt~VK*Qq98QTC#J_3tVdJZKNkVGtHgOteG2T+ZaKlwWmW)6w3;DVlV7`W3GiBX_v zyzYqy^Y(|7IcGy734FZpFW|}<`m`Nb$Bc#>ik$XBsXG{t2(?=a*`zA07i?<^`Ae)D z8!eL{eNQY?bWpj5q78*@6_F4gw>MUlN5S~a2*irbL@nNv7+Od=ymy4Fc1Pa-P79Ve zYSDQ5R5mkQ=o#!}No2<+%-YI%M~SZnbeJ4NB@cuDe0#SJ9WRz3D*&pkM5XY17`h^a z9U`Sw zUtZpc4xpkd&kamhh7Un#umqO~SJw(m)ygo>Sx6EnAO%)ItD{OGjV(acPoC_)&M`)> zhi1RsgCQpQun9ePugak3l*9n)bi?O$QKkA{n2;!;DfM8rN|-3X>gygO&uXX(U0Jw3 z!Ue-Lb(Zgr-tQAZi}$Ofu6OS%OXHkZR94UTgxPMxI`II;;%#TGlS*+b6C zyc6L7xp>=g@-y3>h-GNRDnEHDSQ9jUiAC}O+-_pt!nnh6q<*W$FJr{Ms9+HDjOyLR zz2<0`n^f|<2-0=&%<;mh5OBM=g70f`8Q{2erzhH_?Wn&4tFIO@RAH0BP)NwZ%`H){ zRk+K`BN-zhi3_*f!4(vgMU?qN;>C%=3-K7qPUchF*M)zlDn&nE`CGDzDL42u2rj!b z-EKC>nK(sdlfzBCHh)tDQ!G!1JiQo4coS5M*H;Ri4Or@zqqN{xn7e zl}^#1h0ujyDJ#fd&2)?7m{M!2ihTuZTnI2N2bLCA^DYO7sAZ`|A|uYc6BuPF*Bj2j z$1AcY$-LyN+qRGj15C3m4}WlqB*IEdxpk!*NO?9~(tzwOkmP2>7A7&3qtaHxMvv-+p)GvWb%H`m3(n?;R#Gy zjK<&btB8Q1q78&d2*OCX=jJO2Aa$uhr?HT9S&#}RrxVEB%|yx2)*|+=24Gva!AgjV z_622Fj4vvW5cp+hsXAW#$9Z##{Kk?r*uYeTnlv1MGw}!zh~**le6_4Pfq%DyL>W-kU%J?AW~K_?)nL?lb?xe7JkCg zNo?J(Rq=Xl53qJExvd4N5l2(23-CTvUvJz$QFH!w0{hdmsr^KoNEQKmINhT$0%4-l zEnz6@U3w+HR``wJQe1&xJ>`6cK90?@dyg~f+TUXGzU|7jnpXDRGQF>NcB@69xFeHa zuRAeqejg-Z01Z;G9vwM(f8c^=O?`1m%GAjD#b9Aha$L@Q3J(hdd@z7uY`>BDE1bZe zg-p##Xg#jxH+VPg9AqbMh;h1nVHXypNup@ zO$89LO*u}lP z!T&gMDmyr@X!MSa&G31m>EMx{AXWVEyTh|@S(iyxE1hGf6E$w#CfYk~P<%14^)r2T zcyid=zK5W3Sd&uRM+$KVvI=VGe~!FIs_Uf0N?eU&(?0u5o@kKuf!>$y{O*v>7pfF= z&6IUL2Vq%#pIBRSrgOKdLT%TNz)MlM{GKq2shkjTzyN6v@EL=J{$d)^b) z^Bg{}xCHz}RO}YdnyPvo$+SsMvJgMks=iL)uitiOdpthIU5Fa7zUMU-*5ycNYO~#f z^=w!6I&+yPy5b_qCWAz&2~4tb0lv{BZ^0q5=?9byA9t+qoZW`QB(CjTpwWW`f95cb ze27VNz|R&z}^*eXEIyRh>^hPPuGH_? zq*R|O<8bdD2*WIFHGPW70y{eWM}-5)UOhYVZSh{Y)J(BWWB-h!gsZ=mm7KkUXFBxy z*?AMu_ca-LaGCqFGf6V=bL*sO*UYGeL21&aMH$Gby$yj+@7e9!7tp79$ID^Jdz>;3 z3MFGGrBj>;)VtX6X6(xmFkp9<$w+{O$8I>REXs#rzhwOGo2}3GzNF!<6l1)r-D!uV z@(=34VvMD`X+{5C6$%n42L99JAAm?Omt?^AYFQu!=4!YtGxP$}ncsZdp*T!B@#lq0 z{j_#1v#{h)eV#HFFOMu_!b$FBhE*=Ks390xK*jN@0whujWRg1FQ;greH&P@LwUQD^ z*aJqDE2TqTV(!*upQ!&X#QsrbEfGq7M3YAa*W0Wg$+&iYJrW!ARTEO+)0KJx;F`q5 zKbKp>5*Cp1PF_Gh7C37vwSBuTFJ{Hs3bl)gPWLnmh^Tx`tt~+dd^zIdHvZ|z432hQ zjsZpUkyK*;l;#=5GWmJwTm&SGj-XwCb#sVq6@xE&=t6URCrL_u%-TD$zIU|Z{TZ{3 zt-~nGH4^s(9>HD<;OY~e7gaFziGg39qfJIJO>Xm^2p{*F1D+K2*M|RrBKa4joz0!b z204>gM4{&ociwID^zP$HzNu!R<7hrO76@NzE#P{6bP*i;XTP~qDY>?J3t<)c+UY@g z(9i)vM56d z?9cea8}SxCQ4a?eiFBCJBrAHZ^ipY!x1fLpFLQmmXqt!H>g-gT+2O^Z&8M|d8w1WC z){+@?n>J_uw)71kWuxyuG_V34rjq_M))*6sg!AC@wh#s$Et^XB;H&=W$RSnNr2G2G zWBIMe>l(}R%9)H%asUx?kpUvyUs?b)1|kg9GY%$Px80NXB*5wZAhd{R3~g8lQ9+?S z%}D}`N0-3AP=HK<$O#GzM0{*xQ$dXF$M+t4 zSuZ!9-iJ4&;&#IreaUhch<>oRs6hHjc}DcgAMKu9di1TU8pbEx9I*%Hi>d4m&U5>Q z2cm+gW`OWz2hu_Xts)5Y>Q*|1E`<5?kY_k=G+`z&TX{)t&r8)Q4lDM?)ue(t5U9kh%4;q_Noj zw(Ap*HnbimvFqthLRfRdk#^5t<5sOKXhSIi#ksv{76YGitJG($fVF=2{Uik2#)JFc>iXRHr` z6?U^R%PB4UgNRD8ltcx~ODw`GSX+_jpP!3dc+}4#o2xy#kv!1l0+(xv6~8V>@{wUn zLsXr$BTkH!nr!=`sf(0ip=w=w#$VNSwZ(+}9*pqJ?0r(}X9}3uzq<7aXkFjPh+3KPy#2xNCnG$H zs8$sc>+=axkBB2hM%xTv_0!e0ka7Lo`xDWj+H zrIL`p&lQx}QJCmn6w0*w<(36O(mqOj%h1Anq9Au?6P?Yelhv2(me)F8qc&Mmed{D^ zN&X)lXSPLUxN{dAVSG%l;3@U>%1lmbm&eaE$on;ZBuU98T!lP5g1~_ZsGVSYzl)Uio!+ zP5070o3oWmc4eXc5zOWT>)wCcTyW!v@&RO;A#mm3?gW;9zCZO_oi-U4@5u$)9LQ^q z{2M)P|2^q_uG+^FHUv>P)entKu%eNaqfUhhjWwP0I{Hh1@PsG=fVbkk#WXp7W4#tT#;b`8#e9oF#tzwW0 zonkT+9~%u^Jwwq(v5LrCo$HDl)d3vHBz(K44s8Q>q9x0QO7rqV21!2p)pItBmB(H! zk&2|2zg^|GIAiD|dy=i8gJ+-WceteJeO7bu3ujFa?93H6N39P% z5EKEi|NLmN=u~AI@Y$9&z0m~(?u5t1h{ej z-N*hJbCB;bQ-fKzJ1<^!)_r>c9A|$tI|DROeKT0fMEOa1N5!-(aCMOpxk?Tix>ZubpB~OU5Sy9M-P?0Tv_S0 z(|?{d37iGqF1uj6k2;DXi_XyE9Q^;Vd z%l=W9X3KpQHBc~4g*=FpHFGDQJN<7jK<{;vx^p>&c1T3N)mavms1#^O6~)i`PW9c3 z3=vo3ZWj=^@Q^xJR%1J>5XdQ7d7R^^dxcJUz#}&O^U$Pgc02^iXh`xEXp8-B`Nfpy zR44DkJmV|jD2fi%NK{rRq6xTs=HN=x@2rfYEkg_5d`1|8D^ZhJ1KP8*S9AfmI7c^@ zQAzWaTe4}O5n)`x5b^Cm-Pa!S_pO3UoVdGLKBu33K`2(Ld+NXt{7Djm5~&XDnq%$1EXD_8wX9~i&UA2b!4Uhf7ae0RH7S6)y z@dUY+2XPU7)^j_GKy_$ZYwHqB2GHpGus-Avpp8wJ04hWwmaxaCu}>}Z5h_9B`++K+v5Tdk;?Z0%>6?!U-d zxA+?6eY{J1AL8qM?)@4f*L@#2*1Pj|BYMmIb*+E)`3q(ZaHf%F#04?Qm`Cqn0gmxo22Ns@pAw%_}+%_+D`Mofxo#Cz_P-!gVp zjj=B=ROHSC-K;&FjqRAW4Bw6(dpK7?x%7Ass2PZuT} z3H5~<9UFV=(7aLK6IrITJTTev3a}gKV~W*^ zP(YD}D)`aNNEp5tiGcYqTP<-NvF;vK_#HuK*4`rB=|{w~-R)FMpI_xxU_d4=4`U;I zqm?ooZgX|Wjibwg9?Zl_=|n^uNRzaz>pk}Uk?zC?80iC%=?4o?&cwXi*pgEY1As`d zd;cfw{Fjm*iXh>7B#RiL%ImpT$?G_{*8Ai`d;#UBQlbd+YXFx9sHm zyv6uPuIyUMM-|!tb^Rc)e~G{s*vp+rVdHkG6**plnyuH*V`}-j*TZ}4Szoq&g2i~> zFROcd3F;#SezWgfc&kz3O@9M6bgZ#_{$tA92rLU4 zS%Ca?LEFJ7YgkQ?BB3wW8o1!usg5qD%_D%Tvb5$HZ+Ltn4m(%#bR#Drzo1o$y0 zmJ=U99vcPYtI?NLpy{Pvo$)y3?Q0F0Jh%kc=@KFx9bl5YHMgADs!UK2OPa9yNbyFb ztJdQ?3M00n`CLzh1cM%eyWcd|xvc49GsTM!z0Q-d*d2P#Wo=WhYDQ7mD*LD<92D(f$QcP@Fdu((=m?T60usIeu z$Pev4HGymxl@dj(Rdb{wNvd#BK-Q9$PQ&=+ztY-2=L`CupoA-&8!~pnHa8ewV2DrG z`1hFCejIE#s=31}h4c`kn#>dNw>>58Zkn-jQ z=*v5U{Alg*nM2F-fP_Bpby7v%YMK0OuD3^X%(Bv7gRXS6S@Y@=5ABbycI!TmoFMO_ zUX0%5qYw2Vkc$8t1Xc$@L}9vxG~G}Uv1k9nk&fqxRONID)EjGl{`T&*@jt`6Yfprc z%@$t2G)#2k78PQ&WXs#2WKJ2&Io9`Nkt1pG#-uEYk*QptQ$(#V8yVN&ey zz-rK!gxBe^?FE~P)l1bqQYM%AuB8EbfQB~!)ezMZ6@baA0tB*yB#9DQ3P%G2q-h%= zvTcxoj+u+h7D@F786=ipR>T66s-F1#Z$=3HjekZ{#`u*N_=AOVKf9tRTXGSu2>Alt zfP|``fSQvl13=|Ei|8{FZEAd{Jb|nXbdX|tIIE^7Hk2KLT{78rtim4W(Wn71kU7h- z-)@%UV9DhR6CR5}rgZ(a_A($CjmO9w;Z`0It`8j1%CdM%rchV_(+{cO@KaBoTfh-V z(+y_igsj+t%!yRqX$(ss9_+s3d~Fr4~qAFoP*2o&MNp8+9KL zL;rUPqbai5gWE-0z%e#1|yBO$orm!@Re1Tv$wlx_ws(I zM#J~$Q|FB_aHt-Q8y=!=ZboWTLst5$V+2@8Fq)c?%TvecB4B5z2)z%}tPTCy)bAvkm0nsIIY=IsQ8mp3E0(IyT>Xa)dL@Tz=iwYvMbsH-N5~>%0Z|cL ztif1CAhu424mBY7wobCK@#n%v*>r1{PHF&%d7G0{;0qza3{^CZlj)rM04j4iI6Bet zYSf|vGz78=Op68@A>Li7JI@tzpv>$eBGO=>zx|fAt*Tbq0hW(N7rSDVoTLm=loX{G-n><05n`+6 zyc!Bma-Xh%!kC(|-;HfwV2Vx}S$zTp4$KG_ZdqJYTJhGZ*Hkk#4IB~gK$KQiZL$@F z3KXm-cqU*cw4&>vsRLI5&g4cm)ZCQSS7gl;Cn;?(vOmz8ywK#{{P;I&*xTa&2R2E| zd%>o3mH!wV`K{R1{o=lsoL`6B(x#yg&{^_0UZ?ZC>!64n>W+K-@dZnewn#4$uh(^9 zME|kwrt@Cvm%b|h3^6un1Oe_}17~-N-(z^wRaSZ9MkLO_Ont~#o854ir~#W6vaO*xAOJ#R9 z2vvepIS<`P8f3)MFV8(@!bL`+EO~_ujp_ZNCLu3k-2Tv3XqIJmVIaJcW;jp?-ZJFj zmBXC^%92B3q|koEgRidFfvT`|PN2S&YM16-V0ZoZTRPG02~!J=P)%q!|Gs!QjPnph z#fn&;fV;WV0nt(nvhWzp>1aeWW@h0bu%`0O@IZJZ#zA(?kJs#sXzl$qX>M`aOv0_A z{Wlk9L>-FK<|a110gct27#h(a>7lqG=2B!b*cY;?az-^V1$E+{9g3iI$u4(geNhl* zPJME;PUEqas+W%Np6<$?bb0wXa!6(vD%R3v?{cnSsdBXp=jXb2A`F|HC>v|`}fWr7qs9tFQeUN034JmPn8x%Czg@+FGm1_p=MRWk;<;;`^@^IWj=ytcE{ZZ%AFJl^+}!*9A|y{1)0Vf=|5Rn>J$p?G9Y^Njge zX}062*%Bq-%p0+cQevY2TOn@I7PAZsrJQEOAYFsD50NUl2Q8g~x<`b~8K5a^!nxaO zXbKm!2bTL~W7g2ClKq!4+rBjW)rE*LA4xtvL%2JgAyKnDfCVI~wBJ+b(qCb_uW{}9 z%wZZ>&(lCO9}+j;W1a^0baE;d_ktW|`#&UJ#Qs0@VtudU+Uqhb?=3;kyE^^NCHVMr zCrs}#GtF7|S$vQVr6IDE%F08<1fGCiGqCuqYw#yFwTsLEwjv);*K_hB@Qo_(}3 zOPUCYEw58-i0wCo-p2~<_a}da@;LBS7LmFfjW}&8{xOnx1&ooAsvedQ<*5_@*whwz zVnpd1_Ee!LlWo&+oV(gt!6nSgw20&PnVjtHb`&vwYBK3%u{l3A}8p}LP}2~O=NFX;iDbespTFkosGtDK~XIf`iqlI99&im4=}xkNx5 zv+g16-VIr>CaZjba{sOjV}QWe4F#Iy3QQnJY85L#1K^op)_3s5j(zu`{cdL6sLdY- zcxHpgDwcRz%eD#R8Sell#NZV>WWsL|a6N(XQu^bU z#V@a>v_ldyRK>ZbKniW>jkz}nlV>`|>9&Qv?odHBdVlv0<4URFp9-5l(JM6`Thlb4 zIW&$O3VLQodEF$L_$h{xq(Wj=4&<1C4b)+~Kw9E|) ztqAT6c={^nC?bSd+`nXEL)Mg(IPeNXL_<8ei-wfNvk<2Pg~3mr!*d z&_zi`hyIv?C-pNS=n*_=7UC`IPlpM;! zivQ(+by(63)sQb7A=`=muY7HX!!p0;F6!RD*|=q$y%7uFqX^zh-6|(01L~q~z^8l< zbmIK>G0JSbyxO1Eum0ZE{TiIriE=>Op-S%f-m8l$kCtCT7RT;FEFn!y{LX>QC*4e$ z7>hO-tRCOeag(m0uL<5tiU!#TJ~M;RwD3StEPM+Un#4~?+PMjXV7@sWwB}|nYi7`V zoogLpcGVsL%jveLKw;lZ*@j!Qnnv5CrnZ_!&s^1=sYh^tr-wvWWypsk9tpIX3oK5)r5G&esIiwajXuelh@2#BN_%M zl(6XMC;@v%LH^%~0t3i+NtDSxA_M-=QY@1(j{GB;kRh!DFlh0+r zm2}vmgb;`zm6qkAYH$N*F#uw*!lvGzyo5{>_vzv{h#K@Unoc9R^>sFjbHqedk0|?k z6ziPAQ*}QbRhW#FAZ%Y;M& zVh!yKS6V)Uk%lb8;1n|XaRkgO7^*lB#;J3++OwE9mKV&ia;7NU1@uSYpGBWiY1>@v zib~EwEs8myjh^e<{Sw`SLmGwnH7eKAWpxXuN98PH3pid44osaAktCy#h{+oA$mSf% z1T_*^d(h2k!q7K=L-c{T;1e@qRqR~2X65k`{sm#cQ5EaP*{}%{JFn~goGhbVBKxnh2j9{F-S=2hJjQ+#*e`GQbCm_{&R0PxyQDQmEjk`sg>$w zJ6mQS*WDKap<>@FjJj~DaG;CJ)o!kKj$%771InqTi?n`UIO3{2NV{i=< z)sZ1vXbnZRaM;f@4y3zii`0GPMU0J!gkSGNAN^wWeUz*@pP8AR?a5#N=E*{@V>Ap~ zXUiey`k;LgFEB_|jbC{?XA(iBB+`qBvA#!OaLAp8l`}otajq zjWmY}L(vFnaz-i;sH7AV=Y>jlPJ9}as3*fp_>xQ`Rx|s%%G#|Fr;P*GK7ET# zlhb8|@u-uR3MWCkAyhtc9B8IKZK4{?5BSa1!Ez>oV2{+Nvb*Nd^CN- z<4eBIJf_{U&pfFb2R{pfCK6!OY{D1FnL&k5`XW`v8IItB8Yb|-9QS@h_qJ^Eews1N zeh~8nfHEL5_(}iXhz8a)g7WQ&0$;BY2`9tDIw};PB2^SPCQqa%(5iwY#MOAB8sTmE$R z6hxU_%L_KE4>vw9yd49Y)K*ixiC|7g>8Le8jS943MsPY8>1^l@V_EaDkL$CE)OkPr zQ8;!mh)UV`F%%_33v7tqa@m3`^TRVp!N)jXQkBxCn{8<>qn3q~Z@E;6GzDpeUx!vR{Ey5i(&r5m6XP@p7MaUbDd)Hxo;Amx8@S&3ribM$CFc?_M0{hSXGU6N1ZrC zb;jd=6;z5@*|g5SZtbr+aMWTcglR-NtD-_nQNS6^xC54-7jffijNusiRuvxe}6-}n@?hi711Y+lv+3w`u7A+|yPr{}B8c;AQ+ ztYt&=b2nO$l|(6d0G7+`cCOUw%*)8c%ua#{kY65J*``whTI_<&C#FZ@Y$+74nIip% zqb>#mNW(QS!v^%V*awR;qEx0-dXC2??|qu5fib227qi7`-k47v6JYG?E|G7d5>_|6 zkK01X_*a^RlY57aN_=!6-UdGuzwtr)5o)gX2?~8rInqEZj=k9cx3Xus?xe+QPC-QibGsz| zfz35<*>A;A#pspsZJLp7PLm}U)3M~}C$QwM=wV6p#{c1D0b!hPoAHpuDK*rhTb?0& zjz6f`W5O%=uk%>jdeZbzM1GtMNv9GkTC9>k6^5wD;$gwdcYyx$8K%jCodU?&!Td*G z6hhiNrh0jS6nG)C^GhsI0*EILT%pzIKim1={;mHUuvnS@;1db8W$*ZDR8I8`R(g5N zY(D?tldO=70I#9~qOv5LyM6ZJ^6p4)Xxg{P%?#8E)ylN}vi)S=43Uw#JhLgZ$rYfv zv_nJ~#c1OeM@?$8KP}ukdhO->oN8IyFZB{BdF$rP(e#my`_%dOm4DMG0Aqd$9U1eV z(mD*zr9&vKVG)~Sx(DB_U$S)}VPX@le#ze-8--rST(qS&d1}=l{5glD@6iF~$2=D= zLmo>1uUg&41wFou&lI;}lkpJECN#cn9UE#L_E|`5b9nh^-cquoM#;6MUMMb&B9*;< zQQ&!9ql$UP4zlIfaXZw4^bO&t(sLb&4GgYPrirvJ!BYy5ght5g>J$fyYC;zz3jTjy zfIFmLZK49e)(Eay^YM2Bt>b8ivTUlkR=R?=V(guiaklc9Sd7s@YI7T7b5Pb_QUSzI z8lNcjQAw{FBzF94yqD%K(O2@pHuxv!R0)&Zb#Be{MI$u*^P=eW^XOc>7$$fnZ9u1t0HJ!n)MPQuk@+m+GgtqA>s*LkhOgw_St>-68vkp1XM z!RXAITE83i@xAI?Tj-4Uzt|X!k!`+u8g#fS4XwTjrEb35-{*T&_YbThx1V11#)qJ| zf*;2_dCA>Y%&CN7ph_eq`%1T%ThWcg(CIvEQg&Xfp{Y!%QYPwDv2N& zipNK`0;ISNUxXK(hlxy(t7v3Q$!@TuPTYyfPuFj~lAk)i2gV`OQ^NJ~bYQY|S6u_o znSms#I?sl!2k9&{&7l9kBKtqsIJw2&a~-nZ^}=(E*uj58%72?JcuRj){eub1hT3^x ziw^0@A;XhEmN@UraBi0O_eKgQZNOesz-u89ilmh%Qm#q&-918cQsBeh5-^CW3@$Y^Lz6<3rkeNZQ-Vk}X(VZ(sxz813fK~8kpl;RM~a!~7f+WBumn(CA;vpdi3MmE z8SP3;)y`pHfmvH^055;VGb+4P=inWnlUS_>utqNB7^~d>fZXlsN%v>XZwtsh=03eLY4&g9%HU`J3rt;pSp*fq6JZW;lfRV^t{Y z6l{J;9LX3GA3R90rwrFP8j&)VxH`6;nMMA|mzOD&(@ut0dtoPQ=1l*ERO?J%Iec6i z$JCg*H>EmbX*77}4ztRNA#gu!Q`jr^lx3uc78 z+zM(Wm`Awxx ze)DSzELUbo;D0+mAcyX}{67|>Kng@M*%7c%g7BD%&-y{&#&3YkpLaJ9%fVS;PNa3-fKA`0HEB;)bKug}Xz` zZE*F+HD;y@)rw-KSN2DBx5vR*|C4ngll{pP$X;!_5{NE>6)&9mt($7By6fe;1}Vl4 znc2t%(fzQsWtsEi8y=Bvv`6+Wv+hL@%A}S!q70EWhb-N8 z!1gXx>R~{7;y<|=^1pXheW^wnLi=oS1oW=ACk?Fe1)Jj9U{hl;j1GPbIB}#cLG|0( zd*0La3L?lw-Gp#w@Q;j~nF4?q$@Pg%pH#6{wN}4Uh(eWZl`IJdDE~+=7=W;b!ZO1n z8@)0@v5THRtdF(3q!&f4CcA3trpbqs3!fsm=?++36m0Y)L4>uu`QklrwUJBl&&5z| zd?U0C_%`}-WQT=DxoGl6d}JpFgfH5pHOI`@7bBvKe`4vi#yc>MsXRcGR`xqhaKLX- zGYt>5CPp#fq0}T0On7Q8A+4M)b-^x8)Xstpj{*(MA@@`v`}paiSYnFf}xGbI|{k>ff{ zI1f)dkNw&Xrq-O51aWCy+xbv82$u{f|7H{aa>Cg|s0s0J43_CVNIbr?lZ)$Igs(it zoa2ZMt+T7|%F>#t@;2$yC3Dn8gUlyI)Q;!eGx#J4s@u=Q_JaPm3WRje9{M-$KgWjC zy}kMS@n2H12{UtFu{;iC-$49lgWYfQ=EM@!o5Xx?>8|*kd+QORkdq5mRgT)@tS9ZkD%Ccr1Ed7V_Wn#d9Pm2C&OK^tSO-KQK03Qt(1XE)FtL%-`99#LPqHKl-985wRs0|6he8GX zHXko)PhCYGECV)(94K(Otd|FxWh=PpyAYm*7yYKfSC9%&3L4bREWmS`2+1=G5eDI3 zj;#mJ19ks>i()nY{xRx2@on;J_nO1n4sFRgYSA@bF1jOP`~7JxTI0swGR{JwfC_Xp zS((rZ1`*&mp!~IEM8oTi{; zS6n;%#s;jW&PHVdbbYW;e1 zrFn~Yoj0+y6(O+C!gi!L%a%yJ1aXVF6~Yzdy%~?n_gW4SN=} zSU~5rbmB#wN3+frSeEgv$gduZYCO{5u`9K-`i6ZcFRq(vgiWfOZV|qa1Dkihk1W5v z2~|qEfz}}`gxe_0#A_TuL@Q&ZTr$HI&Lu?z1m{1NAG*Xo;&*jfoa<)qLT9b73Vy;E9*6 zpyYuRr(q!2s*kCUtrP;;~uJ>#&xNN&Rr;TM1wPG>WVn;4j#r1ki7XsZCqK&O!}A4SBz-eifM zUm3~@{ASc)(%^tF7;!SfaVmBAY|c0QKKJ-!b6qZ3xzIbVWMECEc3tlm3(v*oDvP`| znaruk-3bHUzV2#|GDD`@mDwySnkbeI9=UvW35RHVLIkETEes8p#~Cbx7<{eTpnktF z>OA>P;83-s&Ta*Og$@#tnqN|$%z!0MFD5yKf^Qo}?H6Xm+ye!`VHhV2JNh}(OhOI} zOWszNQTAFW8mQe_g$p@nJuDA@_&XQTyXm^InHQ@TLdA?_)2a!JTaPvo zI24M&t~TTU0yyIG&VACh$jEh;SMDnqJ#wm{)Vr&%V`7^xPm8`+X^5mv1UpQ_$;q;z zi5ijd^WEmz%JD+5lk4CY{m3J+y?m)EQ@V*5{Pd)GbE9Io& zoTwLiWwbC;-L&XEPi3@a;aE%na+KD0h9=c1<-+2N?=J=(Dm2k3va>bw7N~`#CD6qO zwJY*6aGJ_l&y(Wg?pRrs$ksR&dH)=UTt2I>B5BpFsH{47V>Gpa!(ACj8yLNS+A{_l zHqhW(NwsjZ`zyK;aACSb8X`^nMU7^949INVN(&#o;-Vt{G8sg zw;sD;cJ*>!I!^VasWSibXE7JQ0R>kJ(t(P}9hS}p^H)$%BLFNrK|Bys34c2qVS zN?zT7NaJ3nw!d=%Gb?AJ; z?;_?=J1J2aap-mF<-{1LJLhfG3R~%r!4t||lu@;qhbNr*)k0I%D8>{wg|BHs451Px z(-Ndv#v|5!eGH%Q#IA59os>hX^o#FmdHMLjYo`HI)tT(H{HX)1_QXt=_YQuU#b@2W z!Y6ZFf#LkU#hB<%2Aij`3UQcYqSgJ`X`|Jajnt^n{fL7+Q!?}USt$k5`4dWMb%eYj zC4ib{%9+N%O8y*-5E?#IIn&3M zBLM_Oj6+;sbyi-doWFoWaPnEa%2Ck(3bGmkZw5%h)pSW%BUfiY0;l>ZbC zjok_RDKM_%RN4By$nY9pyoyxS9-kd^!qj$9=XKWb3b(qtj5r4;UfEM+0410uGstM| z;%ev&B+q?E%Y=#ArpC$e15ag;szst0WpELGYt&j+M`ooh{horb)g%3P3eq0oOQuDf z$I1>JJmEJ55Dx>{a$ANJF5*AS#zMBr40o3AB_6<18DE;Aqk(YcUJiWQ7c~Vu4*Z!6 zFJ88)KR`2|Jgz*T86ohQ(gFZPptLX~f_14S#S&F|RV{VYoUo1jXaH()%7=f@462S2nDU6Hji2)aa)3nZLyO2zr5 zM$;RUv>j>9&AuVNnef}*@MIh&F!|ZY)fB{$bRVxtO`xdWZesbiAPV|CI+Q$UUzu$I zzp|rbHFh#f%9;t%BQM4Y)ZM~LJ4BXCyx6YPFn>y{!5GK*Z7i) z3dr;9dcEEt4oi_3z_i7D`QYvsh`HekYg9%$7&%D%`i>rbl1zT?z93+6LPG+DaDYS$ zhm-8%z5YI&&oL}>R6}UavvXJ?`J0I-G*PL&3N9BYwFzufuff$OLAJve3#ZPTP&tA; z-Bv_gN$gIc*ckt^rcB*KV;%-P?|DS;#8Afm&1W2{W4SCMA(_OAsFlj;ys<4?5h*)6 zhh99f605O{V0Qu}LjJVJe0q(`KDVbxy>Pf3DD1kO1+$Nsp+(FFm2Ho>1@4x!(&uiO ziBA8w(wd^dk~Eg}*(0iMZDe^i{Nbk^GJb7)|NY}Jk&%`$Yseuo4P)Y8574~sos9Y? zcu1}()X;oUKhTbsk3#d&$vPaC{ps(oQ*y9vBNS$T-QK}2x!I2CPOu)Oxm_S<1aZ2z zG}oT{{AXU#tnYy6iaT9ZES&v^#ipbuN4!fxD0Y~oa)*vnEnK zA)rE|jKHY^M^S-7Xu{TKO<4lsRveDgIlrtpz}eFcn-tn$>S7O>#x|?C;TdSj>Ce~6 z(>dtP*|r3Ms_yNk-2tt`gu(B~3A?hHnn9r#tXg>2a2c5x>*zdcj)_I7|3V~tGJr_- zq7{RhxREgg2J-)2GO5inLd*JP)M_*p@Pj7|^A?Trxc&tN8lD-sBGQG#RIgUUzF?lR zo`(@iW2+HPz*|a~%hMnWtFft6msls(Jqo)VRzR}Wo+8xP;-CB7ncl53k$eAC*aLIq z{p?6WnDFB(mlf4vLusOrAXwvwvQ4Am&j6gN`bC>43>;;7^lCY&yi68ST%$dp0nIWLDTz+n${9pwd{c%ABA!G*A^f2Q`sFls? z%in9ej>FigEv}Dw8=a1q^JtgJ)PduUe5L}*L}1kNy!OqCI$uuN>T!9zF~CdkJ4 z1A4Kc826mf>FU^O7k^wM5}T3P1!80K6Ju%7n$j}+!(6Hg8>`APcdJtW+YMd6+bY`s zg6aPeRW{%2eQDQ+O~ zU#An3>FfG!ABOus?MF{t#D6zb;LrNV>Eyz! zKV>+16S~m$&dDqDItL@uP~spPp`bWJTmn|6_yxe079CQc6PS0LT=uShczdh87ZjT>Jw8@&Z{yR-Is8{u z=DVQpeRh>u_R!vCK*tzDJPW{bCJ|J~gx~souivFN=_Jd;$AF<|K-{?h{o3nLgyi=C zZ_8!BhT!*5auJXBrnIzKuBVO5KP97=ZBR(Z|GrBi0$>zKCL6NfNr=@CO2C6uRRNY9 z3QBkkH)u>b^hdSw4$e0)X6;lW&ySgDvsM((CUR6G`noo$P+*nx>VIy}x?M`)=&|JoX zwka-?pb(6x+43~Hq&)q%=qi3w-1PaEy(JA-$m}1BDLBRMo`6~i0h;q*_&C)2Hh$Y5 zO^@}{PHRQM_k6dMTq=FgsQWG27sgT`me9Rt{w5<0`47|6E_V@5`%NG5d+PsX5m(dy z@xz6aiue<_RDX**Y3s`vJblDh)3dMje+c~u44>F|sGHjKI>3?Nb9oD2zZPN{Tu35y z91JyJgwprgusDYzyBS{8b90`_=)S;9@hRo+DT_3L!r6#kHp6BltCePn{o9jRl<1yP z_QDaX19)1G)4LZs*Djx`7CgNB?&HESa*8Rw-#Si^a?sk$H9mTVk#X}GCWxHzR{O0U zt3Vo5BwQ>O{oX`RN^nH+!{Rt@7pv`eysX{=DgMk3=U3|oPt%RV`|0g4XCXc8k zQ?yWNKy5k3b_q?9&{1ZZ^B z)u?EyB$lKBc?0xN#4iy)qA`=p@ZWwdM(1l99=`M3-xW)e-=<}gI1jYMC9yZW_>Pcl zq2&8j(u6rfYrXCu&tUZ%-y-F+#SY}RqcKF3GcIeRs+(4nkuqBoZt(9~rV$ z?Xq^i;Ik%9WumfnD3z^iO=;!n4D`#~%q(F}efDG~5~)nbfGcM^yn@5oL6h-Gx=q=a z=DT~xyUxX{Tb!@F{4bnC^L#I-)#`!`SzNlzzZf8sw$;Z1RuKfIc|04$D&9C}mF7$7 zEI~0lwhLlCwYhe@J67!|IC)4!0+A20paJB&JIzfT$v1HO%iT#f}bX zww`*Vz^Adb`xq@~+~eT)hixL)|0$0P{xhzQ!B^dVNxtzKd&1IXgTp$d6E7;S_OVC`MxJfC9old?tG|fgepWMI}CWB`!-u zL`)`~DZK+>IxN%dH{Ax$A^VdQm3ehUS+(dj#@4~3_~}O-O&2L3Ke>5K07B-!X-dZO z3l}bV1L%fI(T2&^2|$}B`@^VqHn zoq7qo3N$ z4tl4o+dy|Y+To>9$UBZRyk>jqRAflje`z{QK|2}htgy1YzmhAj7_SOX$TW9EA_mYp zK9EmgH*C!dBQl{n48-5(!0+9`r`Lblx*sA&d>o?__}vmr>{-B-3L^xmMs*wqM@a1rV`)Pn*ophSTGK=Zk?kQ-DLy_D zvn;i9yu=Sub$6;dn32*=ZUc1e5`MAr$oHgedc3kn9$@5!m@@(syGtHFtRgdWzrzYB)YrU=9 zT%p611H514g*tY#sa;IfEoKjhU{h=vNWOAmV8T4 zCI?82XW*$fqIU*NLkop(;Pmx|roP=_< z;tVOWz$#o*`oqQxbAbg|>!JAvzu@)3KBEi_qb784sXcIG7Rx$OCIpYrKe z7fYW>JL{p&Md*e=!>|{$;lao5l~To~%6fOgp6zEj!@_Ps@|Td+J= zCIBEV*KJwc;54C{N?L)6BGC@o!x+#@En~23LYSSQ(oB%{^n5}o^qbH-E_YR0`@?`c z$>c6uZy6=sgTm|Fzb3TY^+^y6xI^pQE?uw7{VG;D#u=5)nAd!86NxI>U%;@}Z+V=+ z{ycqT?@FiST6=^>IV4c|d!o9yYd9Ke#g1g?#eptwsUA|1Ejv!6aoMw94oSv#Cg`Lp z*0%!LEJ)Y*RvPyUQiiUiPQFewfmt-;(lNpwoU_KTxts`qUq(ZQ^I4E?|7B4i*?;Bk zj<@CC`%MZL3vlAlQ1_;Q^Y1uBdNr#5236LnHbS}=AaQ~uPdAPFke91+S+nfVHubs8 z$xOx7Jg^h=L3DGm_{zfD#}}cw*`n+S$!tnf!tBq<^?yk3HAwL*WEF3;8=!l4>aD&s zXfmx*Bcknic3C*N8Ow#D#I0XXJNFR|Czo0;;Ool){XRobAu;m}fCGg!jQ=O5%MJi5 zp0ftlWAl0uY>Rox)uV%vchU{4FHT#wGIuLV6PN|R|H1P7ZwpnthvTnIL~N5t8(=)pUGHkSksbo(?Zx{ z2R36W6KkN%@KKIQbqhWyz{S`YEsLe$U2!MIyu{e`XLv;F${sU~GPPMb-a-4M(`fQn zgOz&ek_kAW^i_Vb-#l4^YP6j1#{z%@pGnz(LWTw-Sac~GnU73rZMgjToeAD$ z@`xOW%Al-H&y9yO;^pM55xH|KzU@T&Nvm~GOsheAu$j+uwup-{Z8D!B|4RW-@vE{s z@f>^4kq5CpPN?~9aPdhmA8GccVXW^wnv1>gDxMSHxV+v%;0|G`2~-4;-=o}29)qy8 z4WUFnJ#3x|!Ma<8(`5;kFy$}hFKE``Aa6vMe!KME^TMx#!0qJ&U2cnAF&$D?=IjA* z*u_#pwdA)H9j6s32c|NHjrlQq%sdqc(e>bI4seRuXJT#1@s9WSb_;()_tTK8Gge<%5@~tqot-vYFKg(~LZ-Svt3?X3taEU#h9V z>4awS-JTEUb_5RVUYoqdKWSst^ly6!JTn9ycqXkDD}B%r+) z9hPyCtz*$)B>Q^~wZH%K7J46#LymPP;y1{JTJetl+WgSutnJPc>Zz>)xoy~Jl(vo0 z<&Ck3Y$v#ihz?C|h1p%aw0#0wyaZ1@uFMMs1cir*6#tzb#-Du_tZivM&3GBGb8ph0 z@U*$OP;2IY_MW+1rM>nD=@Oxf-2iN}nO~!2c6eQFx8LjEokef@>}216bnX3SNrG~K zm|k-tZ#D~-z8lvmZ;`n;+cXpUSPy?D*V6VLA4WVB3M0ok#cE;_>hq*UX^5&(H3uIg zcp zd+P+gyRFp%UNAiZJ;{%Dm?O^t#7f-chd)yWK2gb&MDAn~(N3(x(SI`W0O$LHfi^@E z;tN$X)z1FV{JVc*?g!Upaqi(e8H)E|(&(erGFmGX1LJ0B#!WeQ_ot3R`dbvNTkH%_ zi%480e8AUz0|2LRm0+P`v}H6Y5)ox_0Mnt1fOy|5Z84A3x|WrL(*LW=>2W@2*gd76w7xB7QKa@8XBsyqYt zlsVBGaehu#GE-hW5w|y?J^o2cDbHC{KSvJMYbAgG89=geGA&45Qe()Ba`RI!u$ckn z8Y7-CL9H6H(>?ULQQ3BM&#Pdy9~WgDiB@%hJ1Ofe2DBF{O2q&0byEH|p3h^UG;4m> zoD6Pm693`kYm66LPvBqz)`SOmyXGi}5*yyHpV`yr?H033E1Uf%mUaIhIs+=Uq+;wl ze)o#&=gI-plgJ(^@)D8%LBrgF(h$Qd)?w$O!9C4Q2f^;`tTP7zr5NG#M0I=EYH-yY@y&{F8jpXr5iHvbx8{%Fj!o-j;;!dDf0f}_cfn&Z z1MS7FIOT!8`LN1I5T)@_U72UK^~@wlPMz#tWCY2)K`*ra`*_#^Hf#Q>DAOJ)L+&Su zPud3jH^H&%?A=CkT>v&hqy|=dtXhNTAtrrwREmPK5(yNOmmOgB}Ji(VUaL?`7j47J5}yf>8Kg{>dcQM6fi!l1;T_=#jRKk?=x`=~goO z*Y~Z7VLVLJCr6Mn;xH7O%wPsJ==%?nJ_IW^7FgBYF5bY(F2lGcdT=~4{ii```EJ0= zT#v*V-y&Tf>qwT9u|>RIuokemp&nXdM3c$o-ENWU!|ek5qSc9Ov$3%sGpj4|hO0^a z=gpJ%*gOXxBYlvCTiTNt5x=M47{eE_q2CRucfNAFjT@HCK|Cn%g<_Htt4SU+nx)<3 zi+$3XSfNDLe)HjhbBeht0?-5|a$t6)DZS2ksDjDe?R(!0^#~q@V2d02EolO|)_*oTD!e>;wa{R25x_iDVB!3YVE_7` zagzU*X-w3RAEXjL?#?b&|4hD%7=BIJ0$RUVC2W(|@HKvJ%*fn}GU851^8cquQlEL_ zU&YUcll@QiUe~`;&y3IQX!qkFhG6G)zl_ahz4eHTT$QySg`AW0%!v+zCC6{5y$i($ z&jYq+w#sW4`Qa=hi*NUjz#`rOUn|@iD}zYbAYOQkL;?qU#IAqPG&WZ{L3hP8tu%8t zcf*%K3`cBpVWGh@3*DZ7&1d=>2gf>-$4vHFZ&GYe=c$K|hQ~7va9>+251KYx-2QDd zSrUt^Ohku?BYr&2vP-nSqAzw`vM^>mrMU|{E8=5Xg~w9Gy&v&4r7rCj@!(36IAP%o6=emM$DIAC>GWI5(aMPCGoB(?_y}jK=j&V#Dp&Wg z*5}4sKYNeUAYRq~}sYJ%AmdUNYZ!8P&`Nn@{N11V{17(uSlSFdM zdXPodTCjxBcBO~@da3rd@yB zHokljn^cL%k$dd(mGwFAB0F@jy!v6`u-y@JW`vp3>K?-#Uh9IQWOYmLXfi$*!hqCD z+(;6FmNy8hW<|#FW9TKpN6RcmA)}M|8kih?C8@HyI&v**VO(tz8!>0Y;Uw9%g5vbq z@k;AQ7-4;(u_}_l#M1mGD`fRFxW#1C9AVs88c4_Q#AXGrs=@#RI(w;)IdZG9_bD(Jee+U8dK8eRv{)@e0O5 zZmaj)Pd5BOxxfX6@-oZ->5EBrgXl{JkS{}r+kIlj$F}9!4`W_}_q)}}i7X$i#wMfp zpyA6et=D4~dXJB<+gf_MWpaQ@R1DET$Hk7-mkTMUrAWj8MT2+Z_5i($&h38?W-)98 zN^!}+Cd59w#p@q8y()~^I{tkcvin#=0JwUnrXZ$1QdHXPTweEme{i}+Hz4%)j9eDN zef+xjYryDt9)FoP@gh@}gjG4-1`RChE_`<3@Y~p;-%*-__uNP48KB91?&xk@!`wb; zC4Hd&(=Y7^obfU>0Di@Uoc^@4k;H^vgx{9-KF7aLPF_E4E$`sG%8TVRklujB(;ag? zHdX%HvE^Fj$@fA1bth6Fb-sEfT#5}yK*Wu*1yw2zI|mBW(3+O9S2!_|nmBZbW&xO$ z5U+%|F=6zR+RSLewZN*y(}`2=LyZ2Er#xpKv?O6mbl}=v=e1mFB6djb6<}nc1UHFVM>!SjyQUp zGTW0J7U+i0y^i7vtjd#ED#%@nE3|(36nb3+BVl>iImO82)YnExBGPdK`6NJ^c z_{BbncuV+O56Mn>9<>>g-0HR4!dK#DTGLi_MX0)#^v~t)0FjcS-20T6k`I|?`Pfhs zZ7I5PPghzE$bA30*?+Qe8SIVax-vAvsVH5xA^~!en0B+kY*?9h&ocqy>7We&@fK;z zTo`rTVck%Z+yk!vi`>jH20OpSYjO!5$(t7eEa+G)rO@ZZy#~iHO6%iOE_6Vl~ebDuG9~p1~5O;UxtT3;>-9 zc&~uPa9ECOiqJ#ceUdnDwoZ%7AJg3@U@nYv{+AcX2G&6#<{{L`Jgo8^R$!uTqApXL zH^(}PDK>Yt@1mFF3@|}TmGWhnvD$lP?QOjf5u5ELQq7@#iYy? zV+!X##qtzz%?}pwRyJ~o?5vhj(Axh^`Ge6{Q-t21V|J8VOWVjd!8j#2^K;BjBW*YA zjgFEk(Uf{VF^0rGUHk5`Nl)F>wg33Fj^I;XSc{WO>~2D>;n~h2#my>~@jTmF#S@N`VLpR4m(Cw&LiLBb+&XYJy-rFqaXY6onTpHR;ho5(NmOkZ4y4&)K#SC`Fl^u?sF7 zdp~kKUyt8g6Y6%RraG)v2ch42qBPYV5pnQlsZyHcS7}9AITd`n5uWiYA;w?_xOWP0(3Mubpy`j#wom#Fntjq*VO(G zmtj$n%+&HXmZGy3klL=DR>l>9v0P-OR-2Gb(*&x*W>C(x)pd3+$&DGRT3*z}sj3M% zA2DTeB-+L9l^yzos%ahB*Sq>Wg(luEqE#b0#{NWc!!WecxR{7QlpPRBs*BpX{H@c7 zX@@%D)OnjBPNE4pzpsrUs)-cSSH6_U-5}GuPK7-Ga^^i+ zXFadt?SdGK>V|6spoJ%Z3f|JtO$j|nJkb1`2_R9sylNw|DY$bH*3jLG9RngH|M;bB zO%0RyoKB2$H_yxRd8kTcNSA0bL8q>^=z|_ z$K{hBd%OCN5!J8z4>_J^7Y2Tljhiqnmm%Kxz|!nM8&VLPDRGj*1fM9nd&?B!sF#Ab({>e{LFL#gu* zwOAw>&w+6se(CP|a9MekU%4|Q96)6XMrh5!tdUAQB$LTK;vp#WfU&E1eb?0Bn@%w! ze7(x=yz=CTKW@WEGNVkNCqe8h?Tg>A*;ax&w_FW;dlN9mt4OW1&z%B@pGf8Md(oq- z)KbArY$0WC2^u&Ejf5t(wh%}V1&A&d`HTW&l7uNiF64bS%iOP`EsQ*M&!2klW8ZYs z6>rV-JWxk1wq*;L&@tB_YY}YFPJ=d0i!*SN4A8`KpPA{4M5jCZBn@V;!cQAe!WJ(o ziL@>n<62NM?%29z&g5GiY)^9UfvDQ3)*}^TP29OTUp&)V3_*M`;6{JV@x18-hY)8> zk?n(F57mO_m!u(-DeNa#dqbi!f4$ zDT>eBN8$jt6rPQk?@ifOx^vyWJ%3-r<*a&_Dhx|BzOYW9v1tQ!IizO@ElQiemhd_c zHI}n4t8MBL%?TGDUbnFgQ8f&M2s-aCNFOp%HYBWb`wc>iJAbiH^YiM%5rh)Bs(vrc zewsEiST>_a3SNIpo(j zc%>eb%$x@vx;PAiH1zUSo4;u5-wh=ZG7~TQNx5(HwD^#&n}XLv3j&dgQ@`7-)LiE- zrLKy&bfpac2I)L=osDe~sS$dh(GlLn*t*}X$i5IV#0RTFeDF{(p)1`lW@7rH)ev%*e zwBfMC$dj}HOD=K;+ch?7vXmH;zVM;Sd>*k0wv}T702aTaF=w2?*|N#B>*rR~gnTZx zHbGwF07`RP%ZDrbzn%q2h}X7-BVylBXuxp9(fMU_GpLNN4c4OF+Fu6%2#o-f@2j`p z;%X@lka>9pCql`<5)Y^``RL`$Y7qDSo)_C0A-yt^Cft;$WqmW`edo;pbw)yFj;GA# zNXKErUhWQI85gTETJj&<={%3MQsC>5Gn*o90UE7MzE(M($d)`*N#?~&-Os@QRnbCV z-axJdRV~Kl#y{MQ!-)U-ayH{Wt>CkR zc%T$LcP58LV<8(5N{joHp2qG;U34*IgGM3g*}CO=K211v_4?M#?A0%z{Sw{z`9;X< zW{~7xNaI)OYey&EX9Oju<(|~+$cVNt3w+2m|6GNQ=n&rdK=k##U9MV*zm6cuf8A*P zc=ZH4VJhO+&`h9);zS=L9^#ku>oio_pL;<&C`VOMePROpL>-lpXygCr=wth_VHmE+-Z`8F{>j$IxKLXpY0|;0u-z zL}RjmcU`SA74<~RPo2J*#=U_heg^13a`vts8PW$JRa&L6`XsKW4t2;Db46j&J;_ zt$-D3^72wQc>-(quVM!&0iFQQcY3*WWY?I#CI18+GTjiFqpahaW%KrX)&>7-ha0Y- z#U%l3G%fW_Ugj25THI0ir082A35ZLJNHqj{EO- zLh#>wJKv2zaLYygYeur_knL8Spndp^i-ex2)JKV*R2~i5npjA)>hUyRvtSb2@3r=G z!~D(KSPF_*xS|}Qzk4i=h*(XOzG+e$vgbc>@jGkdTU}*FZ0y^q+M-^;L_YQ%WlebI zM+!Y`C?rqKWqXT_G{WHe&e-B**m>NNY{a;nRdF3D%);iFh?_;5Sx>9?lh!J|@Rz|s z)y@eJAX=mKh4l#TFCu#ckk~X@-{_&vJPyE|uxisIvPkwIjSs_-7vJIPJNi9om`@ed zdLQs4Y)(lFI6lOQzI#Kw+8Bm!0?0Z{iV`WhGA7z`HayqJs;HM52Ndu3r_wU(aizfw z;6qQ+jgEeqae|bDAnfYmh9R)?e#HGAO*5f$HbvH`3@^HzOl>fBA|M&!Hv&}2MhYjR z4T78Q@(UM;E*Bc^48GXf+H=LT*RHy`NoNK?HIR-PK{r241U*UrHVR_YcY4pJyCCdAY1Zz`Za;czQ2GyZPZs<$tsQGPbDtAGy4O`ZOh5wdxlYq!8op$^k>2jZR(?SPM=;5js9_O{P}NQ_-88e6-9g zm?UX?vS%#`Dx5KrD){wl1|+x&uGlokk5VK%uFIyWA|W6E0WRnTreJ|JBCl+Vh{2CG z6T?Dv=;AO+sfq2!5v*HrDH2uKp$HkTdt!0AT)C%1f`<$HmK&jFZxHMwnVgoK2w`{y z?1wJ#JcU_FSevvnwyIb(->mUal+zrz*mJ)dmfFa3VeVjVR8C4KltUjIQL_8ko|9*rGw15obc^Yphfm$~SM#fRl3I7Y z%3=re2dhFGVSy<*Tffyw+VOMzPI+Y))Lkh?fI?Mw51&3o7cM3s!3WD~FaXKp1G>os z=dx?YP8DFftjxG#n6cw^#E6;d$mwrB?X;TRU#UKOgQI_g!+Cf9IXBV%Ob139V><4V zKnH%OF8EfFy=tM6X{tRPf@kg@cWfP)BYwb9R{3G@&`N;r2_Y;LypnoXk;vWZ)p!`~ z`GUDKz{?2{oUHs%5Z>{&j{@C(CEk6Vol*6ebkTJc#U*etgxB$OD(Nj7X`G^ar2m#o zW$WLbCgo$^8ro%QaCPL}kK&HAX*R~ji<^ugHjI>VhjIv?i^<0nA&kKW0ILHxW0j2h zsr6YXaP&Yr^c}}YFaGSt!KcnfT^~K`cpZojGCKEP9p7Q3MOXOTfvs(iv%|w<;cEDcv8o{?A{}whed3pgX$w{4^mnqP8Cb zdo>am%c+nBkyuG*#C~wIXG}x@agK~#pyrLg*`#qBbEv5=L$K@%*n1p|b{rV4Uqb2a zEEO{KucSTA5N*-;M$_r5`d%p5_)WZu4BIiaooLA+5~HmtTE4B$QniUHs}`r;L3(sN6%)`WT)__2YUH|euz*mY6^ zTw@H&Ec`J)pGg&6OA%_4cye-tp8Clwc4i}bHjM@*uLeaG9@ALrJbRnPbYMq( zB=gc4&*oq;ZX-hI97l8*!uoxQeiqi)sva7QyrMiFbKibxeh=3A3kVVjy^dE7fF-mL z%Icdr(q*>kxDdo^MMOnJOGU~X`K7y=+ua+1=YQ*@B8>z8ec^w7#q)DoXQ+O< zT7Lb@!R*@){x}+5xm0EUmyrxc8H%$aAh}3X-AJ6Su`cM^jC~cWxIYqpt;7})c3N=3 zQSb<`>?^n6H&??4xJSCzp60nZ^{>uZd9vE_^^uN9(L|<(#g4W$CDJU#yMmMI5k*p%s4iNmzN^2%dq`necA{iB=NKmMFo!kS#52abkT0qg4C)s;PI3D z9q5cJK#}g{K{1qyp&`4b8^ITlzPmFg9pF*Tf0QWq8aFHe0-q)wPWSHfdW@vBL#T_O z43)HDC?$S=8T6!R+d>H!5=00Vl_BI7)G!@Z8^N-9bVL9Y#K`mOPxQnfIuH(Jp2is^ zM;Ileb_vazvqM0xrR`A#0MjxWB>uFpJ|MHURhm|P0=72iU5eTsIAJjgvJbQW4nhp3 zH>WdE4i!v7lu;#y#VasGdm&K45A_UceNL4%U{zG8 zwh<2u=UK?DfCWw#w)oHNZiTLvrc++*G*s;iD6I9NXUA9IE)74QA0Kvb)>8Ca{JLuX zr2lb5hC;-eTNadPs!^L)IJhVL!YxIJ>j&AQD3)Ds^W+aNXk+FtXquI9Qe6yU{!%Z# z85ZE29;G0ZZ~E=;5sAn2k@J+T+$<&L5LeBHO$I0R!l4V?S zXE2(rg-YQQT~r|hEjAJvl_AN?rq?wEVzI))uv$sd0a)2%hIy?BjfBRTpMq74GZ&^j z=R=Df&blUjd@m|pPQQVCdHdD6A$orPo{*LboaL+}GTj@hNEW1va`&Uf^iWinO=%VQ z!sy?}6In&Qx5rCNA&Thw8uYEhrcXniKsQJH3?+vh%EmzeSA>Q)zNf_>u1tCvk5Ppv zQ#ojq1($Lt7e+cJP_`A_qd0_hHwmJWafVrUGiOJ@K%!8Dv*?4>wL}?CHP$mPBdL*L z*n%JKwjAXG9N%;HsptEttELN|zwrKdDewER{)xYxv}$+W z_nW(qpga2=Rxl&siMCf=t|L7w8t3M5w@++~&*(XyiJkp=ep*w|27;`EFDbOE2DM${ z9ncoAIW9%}eW8`m)IX2bXm$EL(Vq=Rdj;)?ooK!~u4bxCXcI?onwemhOrQrt^A9!o zWXm0DHlV$fPa&~}0kb;AABHC`^)8K&^hPRw?dK^f0~P#FoGH5MLaL@nuRS zhZb6!CX1(ga~hv$uEO_`dWM=>rVlG>$_ zm1|lZYrG;+n_+}OW3a5T2-~Qk{Bw(ka!Tb>!PDING(=4<5$B6IjHn}HNG4A)42?%5 zMIAM5!BP}Tb&8f!zR}~pZY-;+eeGDUzL|#6fTZ6304dbeo)W>Puo`mT9_yW+W%y6x zv&cKM*MQI&$n=*=PdNwNeM#vXaJ7f+ZMkSWuHhHH`AKQqsQZD`PIz^Et1IFMLA?~n zaAomKw46L)qCM!~9VHwyZBuLo(7N0=mqrbGXEs)?E~|kytP(^mBbbI z@D#RNsuRkoDB@IMH7ZTVDfmgeUZ(tLf@nWb)Al8&vUgj}CuZbMqWeW$S}_)EHqF%M zO+fe<$;>tY=WNVKR|7NTo>TPvH{BkRs;g(z9tD!HynpJZ!lWE2BjHgRN0EXe@~l^K zh4vcwJ`64d-0dAy&Bs@ZH=lej2 zQb15niCIAd_fXbnNRA7Z+0A%Pn~Hf`zNNRi)N+4G;Q0u$Jo7(w^!GjGBfjgMri7Fr zujS1utM9`#%*AgXL*3Zep5jW8-wP{LZn69WV@GUrw2h}g7LlJ1#I4+2JfZpO69SWU z-r!KP;zaUd_Vh{BGR;E0{h{SCAz~I_EA7)iq~~H|TcDc~VfJf!bX9Q8&Z(;^vWD!U znX>_It3ALy3?yFPplcwi_G3{V^Q>cxbMki0(@eLAVou!CF?8cGq+HLxPY1r1RT3Da<;Rn@;lQ z*;74rKrZ9Ha~3{qc_yt4gIKB?(FZIX;Yk*2^2nj8HABO9mU3}oiy{>NMFBQVK>NYT zG<8gJe{|)e0dovSaEWS$BUSe3(eDbB^r1%g0S|bI^(0YLS!XH4tCvH~r53%4M-3W@ z^Ngd_Zwmq9tl}y^LFtn2hx>>(24PD0#N*pt5+& zaeYbIu3bla@J|#PLn2g^R*_ld7!(eqGF^`lPgBk5k6I~*pfFi`t**+93;wg$iw(zX zcDt5`5Y$OFnnUU`XzGYGgP&r!kppCPr^$o52&Zat8;Y4dUqi=47{{Uvp-fALkehW&5lay+i#KeXK^_Z@|5i1-qPTcG0o zgJ}nP@_`g8*=5%j4lu434y~*dfxCl#GNi5Oy zE#2lyH@qX~LcdlHTSV>6Swx{|(~STdGhginN?J!6+V^%Y_gb85Txlsaz;?W=e(3t; zwnS8aL&3|ed4Z|d#WQ2@}y@7S6R+h|aSEbluBL5wYD zQ)GTbXg-!WZX@#8!8ylrSV48R9}}41!B66W5-HhqS=bY=pe~X2*$k21?-stqPFI3c zP!x8=rf0-uI*i6mEjS~b7PLgJ?zCXP@IT=c^jSshI9DQQHPPl1k0X>ySGJ!gDOjQn zA0mcl=ur3sox-1P@L%7$|K33*)4@fd9zBo2GJ-W1-Fh!SqbnVlIr4sYyhLw%PvmUX zX1fY`Y$i0%Asyk3EbBW>3B0&(x}GpYcE?~WRAA=uJ;AG=mb6quFD6#b=MQBw;nIXYrbgjP1DO& zdvPjncdn{`R1bfHpu$842s#YH_f6~FU^PRSR~Nrk2HXB+H0P=84A9K|&2JPHrC9ot zFC3y5+cAi6jB@3wC73RR1D2S<7|P_)|25s%BXLG05{6KM1wv9CY3(~}O-0ioSJNT# zUwTfq8V$nNk5%s*?(wR+t(TXI#%V=Wfns(AxjC3`EYOI#K^?v2Y^6ItAflYA@c`$i zj0IvZlitwu^ho4L>K8bW@d0CZrY)CU%R3=K;I8|?3B)wMEaI~Alg#=Dz3H3x+NFOR zx8;xJ-GAPlDSSWrTYtZ0jc%T$eD}I^u}o@IaYH4r#!aI_Z(*EfKXb)_r1FVEVaZ+k z5MBf)tiWWqL%`k9Z1bF5=)OtFHtqeK>vQYhrf{b=w6F|6pWzOl+k$OxYOYtf%W+I9 zsQ%}aLi|fPl&|^Nc{FAzt@)3a%l^lc=)@;}M2j2f8L>I_Q0AR)zXxQNK3Ay1DnnZB zRceV^3@&%NcU<1}3a~V}RE9UmBvn#lm7!MT2EEusjJneYR^1z6Kd7u{Ud1@3v5b&i67 zs3DyqUUX0BG+F9|Q4_ZR{Fx9=5C^77CO-JAhu=e7_|Tr}c#exR*EYQter;#Lt?u}p zPttKa;l1_Lqg(8U$t_c;S3Ckwbm)_QtzF>$_iwna`?lW(B2B~k^o24y>O5+;)3R=H zb_He?AYLxj4T-QZunafCmW`$xv7=?J&DvY?6(0MIvrxmF{-dp`{q_Yf+v8!5Oo%6K zVm~@A=#^aK=qoB}i`8zV&fGH_xnlaP{9rRFqVQ~NDPG^ z7L(gEcdjmJ-^7PqDM^n0(0A_To)G37O*)FgKNV*=KD@Q@psVI+!`F`EfT5%M^)?iRU9h52p0^072!dg#URu@mZE+M^|l0s_Qz%gOM;#x&0 zw2B<{mKO1ewD=kWvtA0K6dZ)NJM)+qr$7Ud`Tv99{{T{Xgd8-X6pP?C`vJi_s^%*% z_YT8-v!Z<7f#32p#izhG+P>x$@&$SeuF$Y*$BkAt)QMba;J92R1)(lp10^Iejkr7y zo7(BUd(-V1JtCnSt};`pp`z`6W#)PFjAl!~Lrg)K`UW@<`GVZ9=U+n}xjtsxQn@zK zw4~Ptl*na53s?L;pA2Om7J>1dZoXW`l`A@_ZPan+E7mv#RAcC(K3874n(U_+I;k(a z;swV>4VJRG3*>8$GP(Qo&z~w$#d1vpUHy8xyri8Xz!mJ8HE4TA*usiJI?bon$s*B1 z;MFAq*35@!L>TAxsi5k8K1ctnR*%Mjac8hR!yN zls_JeCJrwJB4xV`prs_8Gt#M^{Ye|8iE7S?t?hvi=Asaol;A9N`)M=3pQh%DrUMgZ z?>V>^PG?F*#Y+|>Ylmkx#SlJK*E^?gD1->p(l++wVas31JO1n%F8qZP-9#GEy36w; z4?{lxIG@KFSC=KIi6wGMq^zd(>?xGS_VM_nGhuW4nw z3_`C1)f>;>GQ(vLYlpnE@87FC?q!6oSa+xh!R~pcw@Mo)0nS#xbYavp6J#YVIhhRy zwGPa)lV~$P4|W1x%{@ZJfcPl>#zpHTFIiA}%^daS5INS|iZN&!2w$s_SdktSFTAX( zqK5IE0BhwhUU4*wjjWAQ^VR1eIE$#K%g;LvU**2Hf6YnSrOR>?@3v_SEXGxRe4+U` zTL-&A(7OyjAg5;f_fFKi+n}nXKLol`zjMD5I$R|dc|VB!iM*-x1}#^mDD8Iwg&nri z!dlRe3Ou0XX36JZx__a4af6Pl!TXS6KW(-1!xOM|l(c79HzO8fxewz(Qd(-Y7+|Yr zH|YCQ7ZCx#K-zmL`S}$&t`PAeYFAE829x(0NME0vHy?^S$!j>qyZ@QS(u9D(WA8ei zB@f^ICn@MRIhu^|oC_C-wg~~HB9a*YOq%+c`tdh8N@@gw<=Wy2?Z8h-Nl>zNKw*XsO9TETjx1O@r@2vHh5}0v)-M9;^?Z*! zeJW*dQf!eNkGazrFf0l}Fe`|&<@g0SsQ{{>Q)id>25=5Ty9;ax{_m+2|Ht2Q(j*qM z>tmoi1?3&G9`kDmomm zmv}*ph>86oiBgQ0q=|=}k&PWOMU^rY9@$#$mlx#sDO>FXLVoK{LbDz3=L9(~2SOe1 z?Kz%LcPYdw!k$dv?f%-{lOSzkHWvBrG(a50Q9&(nTQN9!r*^)02V+1-8;x5af=w&; zN2#E+CxWh#qfjbM?=e$Ed8ML4kDWN6VVY%f%DBP~&s-n5sUn%i(yWc6kSY+D3Z{TpbCkWt9e@g5M8lN)5~!7 zbmc`6LAhkHGB9y`sU$DmSJ4K!`jDpqdOe zTmL&`=rjF3^Ly&u?59YG?w!|R{{+itqph}$f_fNA+#@E$^f@7bD9VD%hQZ;nc@$7G zWVWR-Xr(3Fir~v1NH$sGw7CX=o47IIpx6&nI|$om{!GJ;I8Gi;)M4d<)Z_NujazNA z!AcVmT`n{t%Y+>D*^7Y#jP8rv5zs1;(P|o1C zTol+OUKQPr4@M-BF9T=YZ|m}hi|cWtP#}tk!sw1Q9N>$Spq8X0mjnWRw&`=@m%D%S z;91Oe|5%}94{LsAv9L)B6x|m@ye9XsqrB2KD)Dc|f@?jB6j z-p~Jh->5d@c7)jjDbQRWDR7^6y>z?0VCj9?FaKD?v1L#S$RqC;5zpL=97HMwIHZ1W zdBppWx4MBRCGmOS%6<|0s%NQp3-rD`eAs;4FzD0d?|Uh%t3&q=dYKX(^9qax)> z>FqAA9@Gw`;lH@>zZ(DcI6KXMgl^|ORLuMWiPbJUAvWN*k39Vm)6H{h&YR$A^3)G* zIhy*oF3j<$?cKJ_T<$Vc`eo0g653uK^S9KTr?D{wmD7OOG>eA|zU8wm$K3h19-bRE zEj(bbCk`6#-3`#4bp}tkB5Umt+;C|ITrglV7mNs9>w(3_BVzf&YrxGss$pp1&Ds}< zn7WpTw%QOH9%j78K7nJ4drC{Ysy&_WJ8ZeBYf!^iQ7}|L$P965kZKrBu=Cw;JHx;z z5r$XGfbNvWBKOB)!IxP2q6kV9f+*#pDpE!9a?q&y(04hLW186rq9GU*>X2GjB2qJ~ zNLn*CLjNM8olaC`LdqCNIiVr+=}I=QD0bPDZ5(zg> z0E5uRX5?34{i`P_nL#*zD6+!a>i@aY%N~;b1n=|(*(o`$cb|8JxTd$=-lF{`T2H2B z2bvjh{r0VyeReaZpB99;s)hb6w0|7MxMx2ilXjb2h6si}m|>%p%bjbtTx{ucznK6d zd~!+F2)Np!l3@}bB{#;xU^O*sn!J>S30*-sQog*{@wKG zz@DW8vh2DRS;%*_zRI%~=fmr9%8UADu-BI`H4uAMFm&^dSN`HJ zR0x%|qo^k%QR(Wz3;3`ie~Uw8R9QI0qMZ5FmL+$H0^0-WW~9byrDGelk+wvG1JfV^ zL##kqqCrYO(2_Bjmqvv`GSDz-B~0 z)0#~mga}fUabdkCZ!z6B0O@@~6i#2rO6}=abeP>(kExNH%!6xe-F@k??B&a8<>xptmoU zL7#!gPQ&&^jX3~0tA!-uCYvHib?a6<{Jg@9O)~jG?=i1jL(VPatFN~T}Qjd@3(am2$+_pmURFR7Zh>h58xX7BRO9pW~BJ3q01w`)K4y|6yp zyzQ~>&9)j*ZPs~CMkfhU&KxBKysxvrzjE$`RzF=cbc?F^k4^XiW+-k{Yi-}_>G(n^hi1VK~UAMIIk}>urWlIp1 z&8xWvg{6GUes0YU!I1s@dvBYDC1E??5HHQ)`m~aU@7@9Q?&$bc*5<@#R2p`IKiWC* zOnoli)4sIfc=+Rnv|QsiIxt~MEnvq{4IUak8-s|2(TW*k5KK4N!OMvtvu4QB)<))# zvk4R(VAM7W^y52cv=}>XizOXE1!Av=L1F(JpsM0VL zGasqn!UKjheikT&v)U=KYeg6xmyv_8#eaTYy-tzMK%fd!vSOjW@0-cf9$7iX+Lt2S z9WYtFw(P`rUr9Y4gDGDeEl}($B$fz|w)8FyCbjag=T=$>N#qx;Spj#`V}!&r3?G;5 zvs-I{kmKfB5l%3exNWO;Y!%iAmh6@ah2};cp$T4ix_o?ATQU+Q)(O}XJR*nf+HN&* zgQUmE_%p-f|BK7|*DR8y`WR%rDcPG`7rF~TRL7!$31)$Kx2klV5_s<#ypeC;w~m1* z5UwTpLW7LKREFmgW*^41p=`g=Fx>`@`<`4-%Wc4wSt??S7r0|YUc!H?T!|#VRs}If zt(5!SkNR`X(g@o@mk%@4@VkR#MF9UC;0|Xxz$V6swlR)`<1>-_-45K z;np@oS7Um7+{bm^)dlm%q)jM|ljvW*`#%*R3ti4%bRLUpixSB@>`h_Kn@jJ?^EiI! z5^$os32fGAYYs9&8>k;&Pj~LGs=6cee1*dK^hTGA^R{Q>Rmdrq{E-fB7p9kpnQKmm z$t3aPR0D6N7ZA zd;G;PR#+N2c2EjfX8T*g;hydZqoH%p?{}*ttmF|40n_1(3za)b6SarIr!nsfsJ#-o z+dXV=$_}ggj;D)aYp2DV%?GEgiNqw$&{C~6ecmP$2|!o~kOE=QbBHv_~37kE8ZIH*HR?xPqCy+?djIz?#m1Br`UU5 z6h*QONC;AWA`~`F%NiQ9U1%&Q^8vX_8`U0OYiVH&uO9>mJF&}5%WbAY^ef_wttqQB zeev+ST)^MDIm@Vr*#Aa4?#GFqBBXEISsFc5Wz5+-@=rQ|(6A0m;!sJl9f_H~^M$Eb z*WlRPoU>w^wQ_UX|2IxCH$$^)Td=kNsnmz_$MrIpsA*z`I2H0ced^ZU|A@xdg%H-+ zUehXf*Ht%!GgSuS&~kLz&Q%CNt7LiS>bdLbua^lobG@|O>gzQYo_ZF}v>Hx5Ed>O83nRyzx?bC z-jk!vzYuroiBNuD1o57`K7~=|AS`g|1_Ta}>w`Qo;J|#!#9rp#fH=u8#prO;d}MZ7 zf?)LcywpC2+Xi0;nkr4aJ(On_x{;FpF{6Ss6!Y0=4f@=4ck*JQS9x~y=xIp2YMl

eR+qRhgMIYfW0~wX?p4*avW+nf8FUIn3o}BsxN~U&FL5kKAw`nhiZaQr(RU zBBJvWdbBJ7;h=dl&dY&Trj3pk_$+c9R)el{HhuR$E$PJ*8{?ICtP@W!4zyN~fH>z` zdVNhf86RE%e9*9B*K#q|?nASz^Gwv#GjtG~h3_Y}%uWG+nNZ%(l@d4*p$ z9D&Xq;K=wtkb`>V*^^giwNY4MASQ*lQ)!3MGowYh3`KY$!tyMccig#0OAYofG=|bn zMAAXOF!(L7O%Zm8GWm}@H+cxSy_KyO-^|cR%qBy%qkre9&cYRFwylj3BTNnoemew? zzmESCTqbA$&5(G{g{wAap?a)G1?$GAB!B;>k3YM*5e0vz|Gp(z>%R+hdvAqz^HCX{%S1~f_s~+Nl727E(JyHy5VJ56rfoFHnHtLf+*|r!4_3tcUEd{* z&Ve5C58KT8f+m+Bt58p-@oIOsbG-8$W^qJ6LvQ`b^c&bo3&N&5<~MD`D%;5-)1#Er zi>ulK)c;m4Vow{UWZv|N^U2VH|mGH0#_}t~PFV<0%H~Yk?dX=|MT-wPFmK zo03-pw`T~76r-%hZO{@d!c4qJ3oIZEN2tP9L%Xk*;+ZjapEXY;aVzZjVu3SA0t9QW#3JlP_X;9*B#_KYQs*`JFATy zlaq66C`~g-L{22GMMgiBBxo#z6DBakc?GY-5serk3P0w0F`K#rpWq!31 zVWc#nw*zSF!&1mfCnen7mkcb+rIbh_YYcD; zJ+`q}tvI`0>?h7zaxw(NJp}x0b17q+0^U#C%~;%qLpKTLRr~DG!GhQE zdZ{5jdojFur{STJQ&OfJ|GUY5LWG~qV&RQN?n-V&Nt&FS$OVEf}q{S&_YgI8^Bw`>D{N(&}}FED~wwN zK4FrnI0NRC+yynG(#qdYF;7jhFnf&uu0(Ms=eaq>9^Mm|nxZ|1_EFw7Sz z2Y>aDQ$_va#xyk`8;Yk)cltpF6a5*;Q44`T0dNRVq?kS24w>_*o5XuoLqU#iq5RlHYUDK)M$cKelRX7k8hA zvpf|CFP~UsO0!|l9AsQkk_P$nqmC&7p$Z&Skd}ld69~Amifp5hb-EKJE|skhtVpG7 zh3V7_HSz9|h$=DMeW@63usYa3Vt8~?Tk{Z%bzE>AN-E#1duN3EzYe20@()o)8K~Jw zic-Kxe+*5@f$#w$moRs;N*0YOX^3RsC{7}38OlBn{m>xv&S-mejy-i6gw62ysBgaR zq%nmYivQh1>Y=v`l7O_Z$D>G@oq$AF9dKbN`x`?BH~oeyM- zl@TDsE@WgN9B6cGhnI#*o zp$ea`@ojIS^AA2L?aCUEMZ97=bd;Zw*m*rw`<`KBcF7(p^-~r5?>062p21e(2qgzomx~@Mg)<2Yv4|WT|oY&*j)I zOo#&M?;Ht1-lMzZ#6M@sX@ssPNns?v)o+J7#(5}nJdKHVQm2Uy5T|aVFy%_#nA(1g zB*De=1sH#W=)hy=z`_ZlgbWMH=cW-gPRe@;9nxwVI0(c3&PI+e;MjtLf@dcfsGV}} zFuz9}R0WWN^l^4TF?VyXrI~Ob$nX^LW-bbgn!^RR5A_@?&pN^y<<5SD_VGu6w%WrJ z4u)#hqRphK3@817v2#X*YgSWyqm;;^$8nLBHa?6PB;ub$iwO(rX1Qm$wShCsOX=$C zKXxCZ5I70BsI!A%F}UG?_N zHE@7Z(}Vy$A^57;bajGNtq1jP<+IArbs2@4eIG6^@8h@I|GIP^6oId2#FN(mB?e3- z!4(sSQI%%rC-=+EHi!*;q+;JfsFSQg{`!8Euzlz4@4dBs{^*22zQwhOAlajf)&V#0 zr6rHMzxk<(K;LIoz59+md6eI)^zhk#K|B5Fsj$p9%2{pVn|RbVlKr3!BfCBc%eH#>DWFnvr165qeB&2HDD@M+6#qAl- zDrJ1b8VBdZm{@#n8Zu)m%l|Dj!Gc?hT*a~#R5x)HS`9t1siRsc@H$?=G z3lN4g9n?vYKY6dgsHvh^GEu2I2r39=M8PUJ;W?s zk3e0+Sg)OxEx#W~il{C`-=b*#Xp5^y(PCp1NYGtM**c|Ot4l0#D@XP*6@E(Bs0>rm z{Hj#;JB5*zU&e^_gx1yII4FLIURBYN;tD1eqhXH|`-QVH$PfHosI5(d#!5m_&BgmGS5u)%CkYthYHk zl=cBbg>gUg)>&T6jyGT6zn@Wuwc{-Ag8xR2TaBoHnoRfb#0Q*1Y^0BmvZVj1_GVSe z6b{r!Z;xuP{hIQWT84I~HA51Xwev8=RvD?*u03QEG<4`Vpp>4e%h!MNos8YGFeE-! z`C&Sz{L~-eRTa=BK-0lo?wH1(?;l@59se{nlcXl?{|3JRLEfL zdb`=Qm-!E(GJE&|S|qOQlr|w5?2*@Y%L-{~XPF&^ABZ{I#LEnS`TR8aWn^OUO7^on zMq3TQ0lt!{2l%A3Ca;AuSQA!&ppW^?8U*zN+y_Zgw&mV+_qO8dkfBw z7tQ+PKD6qt10|D=V9q3aW;GPcxO&RrZO0>f#Si0GQB#kNQzdI~*HXi;p5g}yTMqds z;7qL#(px{NozY(yA_H&gT6Akpu+^|s4pG*qf@RFd!}4pjc7u$ybQ&5bPqW*y z{XGqOx&;&+?}DMv^`jny*SY4n!{h~ejS>?fimPvYUL0++9c{vInj0KeZ^_vM%|%+- zhYS>@-o?3Zxc4V+=K=oe|5$UJfusK3WBk;f!=CC}sILck8{nK&d?kAMYIMACJgcDdxyJFT)BiJ4q=z{!*uz_0y&9HKLF(@kby1)7_}`IpV+I?~5pV zQVmXdAJ*F+%0)eR#%zu5+otueV~H=jryh@S6mTBxik-&gn0?31(SO&Pvc;Kw_MR)Y zf2=&!zw}{$gBd}Y5!{jP>0%jIMOHAGLSH#f<}OV&&pMrVos|;>SYgpSbLX-QqTUb= zMOVvN0=%?Xa)V=;=CNagz}_AJEdJh#@+4{j^q$#Xm)DXJ>x5!@Ta2=u++CM>OnbimRhW9LKD`!)8df=z-;*D4!6Ahg=sWnt$rd809-C1WX55{2BJZv z>mE!Kb&#`|4ZH&yUy)pSQc!ZY)T?TfR(wauwkQsymtq{VghI(rrO>)UDD+6DO`Gv} z((tKhp;co6s~9A$xep^&Sib)v(JGJXOn0@u>yMx*bevEuGoAWmddZ+xB?>aq@@qoz zxGv&GbLH3Z5ebi0IEFaYKpN6T4t#kDeER+e)&YuLZ)L^_{IcRPT~abx6bFwXLdNC7 z9IDGQiq-fDrT(1aoDVLCoA|%q4oh}Wdz1sa;RO9cUVidicVKwnJ5V?b0?uU)N1W*| zmu??b2QDzvhPnJ9Y+$w!b)5g_-#&S8UUmmQknDDu#PV+=cEGKGb%F>FzrWQHbK`+U z00}%6Fz-rYQ>^v!UV28mya7U8$D%n*LmvC9Iq${WuS3XFTuE_(SRe+;kVRXi&vZYFzi7n+>T zR>r|7y-GaqbkUV+cnS}YWSktqB|!GY@M@qHWi2}_Dr=%-cnfSQjR^gQm0E2s0fiC? zyBNrOAIc-*G+#1VsJWf+8Mlaa?ib!#$zW)2eouj{_@eNcCL>>epQEf{4NxhdK>hQ4 z=}JwBj^VR6n5nd0wLJQE1)I9>ZY@zsT5;Qi^+LfTgyC zr^e%kGszqHC(`D16bSF+;o%|K8pN}`CuGML*WLC4XQ#W75F(pE+qaw|e-L!HE%tMU zZl|Sjqffp$)^?Ei5{C$jSIPvS3XQV`!z|dz#UYKm0m-H=8)k2$+4V}wQV$fW8`8x5 zI$1JU@>8(@TNj{dM7@K8Oo}EQ%!XJD0{SoLbdB+ceb@Asb%Bh&n?bZc2qNoyXA$i@ zbfBYPO$mqvUKe3aaNk)K>-Thz>Cv zt)Ex9>d^^jvrS@=#K6XEpS6kiy9hUG=K(;xI)*rK`H+>If_xZD9LRU`_5%>_jQ^JP z+;7(8Liv)wa~(0V9!U&krs${4WBFWN7>pCB4*zWxz}52{fV!>r@X6%ibA5x z_Uo(a_v>)df@dzXY^ob9_K9Hb`{m7s!lFE5|Kqw`(E=iACL^W!C~&`hlqN#9myIXO z^jBX@12NWNqwZ+57fgn~CosyA_A}YE{F2Bp@Dg-jll^;J6&>z4q1NY)OUCwW_#(BQ zqhpQ0dL$srePJck|KaK@quOkjwQ+ZMm*83mUWx{{LMcUpm*VbL+zIX$ti_?YYw;p& zad&r@FYnoVpYxsb=gC_6kv!|3d*+(C#-PF5`(k}S$lZq;P|pCFQ!SYpwrqcYe@x2v z0c*k(O@lGpg;ZKe7?d3)m!1ts+@5uLti+M`?Zt-qfm0WK3`9B}O&}a{Bn{(k+vm2f zeroJH^IPneIWkD>UpB-LEZ6Wc{^{ZqpYBiRJWZ%5{`CP=WWk5S*%@eFxS21=oIZFx zraPDbbyEI~=QN7}n-$F{$7~PqFVk8|%q&&$h@s~UB>}6@6;LqB*<4?-p=ncj41T8a zDm+(s+o{_T!aQb=7oPUPbXGZ&ua?Qbimt#__iv7uD z3|LfJX)L^?!n->%s2iXfVt_JKpD$p0cw}zW_PuJIH@p8=qGecfl(N9QnRyWS>W7TF z0kri?c1N5Qz3V8xV6<~qDI{>WN*sD>OGMJOF?D*&<4`}EUsXyikY{zYt{ zS^27b+PID|At58+g0#-Q?~CowBsEZ&{*uc{q{hs2_!=&RaI$eD2(_eoHhen1v-x-b z7Xvu>Gb9aCo;E_6H{as2$x8Cync>jmL}yS0M(Eo_#gd!iEoSHwTJsMV)OCLdqZ4|HCX9J5v!IKqgO zY%(=2k4A)+i*UMh5J&gj#8T0@6TPHA;7eZiU_P#&LgCJvVj%BLOpG3ja`W<?XmWY#v}j06B{WmxJd80tziRsVOi!{Q?NPc7>hzw8}%J~mwhqFS>TEbAC3 z23H5inB?Vp_AfS$th@TtUdYmfbikg&pC_&OO` z#L#SN70X#_yE8X1gVBpguqwI}3hoL8)kDqrT+1m-u_9AnQwGUTBUx7avm zSbov<`7)bp{1i!OfYc}Ot9u)7WlZ6jZfGWgm79j|x^40*SV&7zaEj4XGX`Gssi&rv~%DvV5A7VZ-v_i_{;1!CIMU%gvE06Y*q~qg#s~M|g zj*YdlwXL=DdwIiD57|BqmXE<-_SEYCCAgbej-*Sd<0i_5sVp)f`o9y1E}lOFU@Dpl z9!!&MCbKS%2!7)USsXV(u!V83_zAH(qNqMM(xwgpv4e?lSO({q_Pne zSVUR~$C&D6u@^Xn#%n`3f@js5g|6(@W7=Y?>s7ae_QOnrv^C45iEiU#K|qSa71E*vY|p|ERZ6I^sZzbU2(+)n#@GCA0O8;a8bG!S5oVie6P z_As=txi%k*SGGSBNB}CtA}n0%CA(LPv4F_l%U^nacxeELiu!uT)c>LG(?5(`pI8w$ zUUA9u^?T*E!33WBdhNS%XST&Q>NLM;bn@v4$^nOAwzgSk6>zU+g(f*0GmX$w=-o4Yp`|CEpy*sv!&ImhqZBf-q@gh-E)=<$9I2V5 z&LsP5DIc?hDYf_)P*&xDcXe*+tN>oX<-!05*kj*&w6@GUBZ0SDjv8D|su%ykZk zD%IjQf%C_X>9VZ!{7)^@aotr_&D5r4U>%SJ96P}g`~FYAe+C$6m1^`hJ3XWDz)_9U z#QcZr|JLyx#eb=Ia7&)O$a6FKF5}Tv?`T!4r-C2!F=g1i^UaFWin0FIebI@*&+Q`>9Vsj42dtAp@7~9fxA$n_cc1P3NbOJ zL}MYXBnKn-f)f;taDbG^rN9wP2mg5s51KfaoO|8*aY>8?PB`k;#s=C&(df&~eh`N)=Y zjH#rK2V>r9IrP&L*cHFw7aJv#;8m7np3&6vZID3DZr=Ay+ z8abgl_Gn9a+_xTbuhcq1A7Q2ehq^1^Bt;nQ!mjITJFRmzMmS@x1%a4}Sgt~dl+QMh z$EfKMdYaACrrqQ=xxq3qSA)qa8bt&T+fCZpn0|@a0Kos4PQC)-j42g$&t6s|0DH1W z%PHF-k@xWZB0;>y>fPI1!1K1~Sy{na(P!UdNps(5jp`#pNl{R6f_wf@KJAfg{~XY9 zY0)(+hE)o@x)646%fflb)q@8+Wd+a!VAj zKh`y^Jhuy5{<{ft`&-hd3mL zLRcuU={d}y7-P7t9A=7v#V=5SFt~5;)h-DN-@k!vY#i4HaN$v2P z36W?PS_1L4spZ&2NX?S_nT2C4voInM;>fm=g+4X|2G4%kcwv5pwq<{&{77@tH}QWG zXD_fuk$>!gxV_ioOm#c%-P||q5DvUYMwO2P8i?{aM$=E)7cX**>qu-)o8r$GB z!khhp*)mkb%VUbV{kluy8u3=x&iJk+PilaQhhU2hr8MG0_m;g(r;XhG@TBi)g% ztH@C+<*Dd#AmNs0_|4lBlGEzW6FIReu~Wn@fl`;~p|qglMV@)5*AXL&IGUH-de|&s zd&`=_ObIJ$nbdq#&-{=Pd_oWvY%vJ|CsHi2O6kskzJ|*CO_d8UpY|AqQ|JJsGa_9+ z8Z&7t24DGPLeXW6k8^p>%;xK$-Ns&XWi}cq?V}2;kmPmigsWq$g~s5C0o2Ny0ZxD= zS*lZqoNQ|2xf(-Aix_bfRP4)Z$hzpGhSnj7iUJt{m3v8^>{%b^&%t;QWGXeR6zk$-HDl%j#fPA|(=^e~?`GD+!TRpk==!JHl z+Q<${NrEOC?5+6Y`NodwE1u6&yt2VUa-a;aB~!~uv1!;EONsRPQ@Ab{=wqUYC~tjr zLYIvBAa6Zkyelog0_tYIebXKYxK2@~^-qMsA z>jk{VF|TQV@9;lXZ@0&9z79l97dg;J`Y2#`h(_`aBe1a8QY$@_BEh<)+LFeK-kMXb zB)C+hKE2AU?_Fuc4AA2frz)qgwhEQa=mI}yY8(gJptt}~^oaN4#(nN)7vt0NM8LU^ zQex=0(d@(esoOn`qJ&^k`7)7{GNF3qKTh6<(l+Q3K_2o!YfQNVfkEcDb>Cg1$f44@Xc=HtSrapHpndH^eGb zgmMmD*;ukgG39=LJ^W1B`{#tH_~Q;=Z0u0tFY6xp&FD9A;<11tFI!E3knb{nC`n(V zB@ULACcx5?qVP+!%Y-<=W@bg$g7(zYc60Fbj2>V?VI$^$>$W)!t~tK^e|dc09e)pq z9a#D9sPYUhbErEd&-D!84+&~V)+)463J2#P1NGTy!Z@Pw;$C!dpbxzW~)?R1^7 z8*{|J<4Q2pve##`2Rtm`%4BT!^8xK5gx}u>5$wIiwG^|%1W*c1%vCKvn&}MSIoL;;**JPKO0JGv=gA>AMx1$9+5lk9-3T(!ej7M13R zp8OU~oimnqzRZyG6^^n%`M!K4O)BCboOpZ+vUCrr6597}6GmMQFCQLt-v4!V)AP{N zyEgN){B|qib6P(k3VYm0`uP35^(jC6*n-jg>hJ!k>q`&2$;?i{P<{6k6_iar7(TY> z2W4o^cDAa`_THYhg873Y{@&#qoqqCQhTZy4;Y*11N2cFnVe8TmdFX!F)IQ5h|&?d8lIw+TJ~g zt=1VHk<5t$!2YS03=4y{c-30q8!7Q;yaXpEiXP#mc9DSNSb-eB3@WA+w-O*24F=5@ z%WQTUB3p=P#M1IA3yh0#k^~^k2{N{JraI_YUW37KHddnkK~Qn6OK&VN3>NE5><pp=m2(MVu?rJk`@i%VC_8Pcv43q{==yfmA^ zq4Y5Piz}dxB2pZ2)Uf8Qi9~_{?Zybti7Jv)3>i0P@?PC<`329OVt*x9k16fEnpMq@ z)Nz&9Ywj&_uD^IQw6cEkRK*w|0ThxJX$-yUoKk7WLlQwv5pL(G54OSi|^cbnt&!sT@>{8qi?8NMQbjjzGBqG#iy(4UB{ z0>!SR%&Tb+sYhbk`R0#$+#V-L_Q$lVj(uvc>zu&%PXPnyR1T|W~BCGzt1+t%sJg{!R zF8H9Mq{)#D7tIUQ3rGd*j1JQJZ~a>97?Kpsp1d64u)xR(O5z&`SNMCmK6P!Y#3*TY z2e+6dA~Ym!x9RWO#ri6f+|S@e&r@LAVAO#B+?XBV^e~I7(${XVV?E4`5LsM;k02l6 z6$T`j>gtIU@0%OnQ1W~FIh9`EGLw~>t|{oMW-dIY(57(!WZiMbB!ZVGjdYyB)3vj8eRrpn5S?56HPki%ol%@igCW0%Nf%?8a-5L=?d?!BxL z#RYizaH&v*F3)7npobn0xjr^FAO3%(N>SS0DEp7#hJErb50bh$I*%sOx*qzMp6Ww# zW3QRcB)9rL&E&#n01i2%w_~72` zTZ&^X+n%}l2^n+Ad-%~#OgrLmSt^AteZaIlcoCB$5`!^$<aXYsY!rJ6DhfFvR& zJ|{`(4r=MKcbja6xV<)E_0yAGsr}NDtgKsiS@uZ?SjMS-Z!=LgeFYtnbUic~kw-Qe z+PTbsz^JT)L`GN|(+xGsPDB&`jG1I$yWr@)X)l>>(?`9wA0#5Ovn5DmoL$r{bh16O z1XF_5@pJ5jPygHWrF;)!?=Abs_-%`OJyteN!aMB0vZr8f;F#b#lAc{X`}jq`#<knpuNvEB z#1fWUsAS&xeQ5Tm1kPOYaph4RZzQ?2HG@6V$$B*%3Trd8hLYv6Qa+>chC~UL9KwpU z@ZqVk=j95g4kg*NnSY&1 zmo8jo5JyK8m@*rhqk}~`yGUI#yB0X@L;;?b^`#H_QIq;$3*iVh?6X@ImUvO#S@pUz z%X)qK$trZ6l>ns!YYl&9qirPxAniBsOY(Q6smFL+&aG?SGz_6Njq$(z=!J@zh%QpVYq+f=mZyK>pA5W|nHI?#7= zVt>eb5h<+rU0hrm1O!;*=Vn$q&DKz9D7bXIUtc=H7!SLC{KpCS_vz~)zYo#;7Xa01 zE}<`Bpa!Xi14Nh}Nk|Ty#`q~GcBo=&RbHpcO*xRN3t=D zU}@6N^h(fll`^2dVoVYEDD|Ffek596hT_fw>=L?fcvk9Ih zRpjR8=hhR~a2xiXe*1cK)D3P-Ev5y^nWmscuq%|6K=19W<<)I%ToizG+#*V=H7J}?n z+ej>Q|Db~YA_~Lb&cEDIBn!jY=YNu+>X^G=r~C@-XgoFe>iltSIJt8OcV5zMD&>2H z7~}>n+-}#U%J;^(3RRMp42~9F(y{h$dCGNZ*J-U+WfgsDavQN{=CMbGMN1mt|0pm1 z5`5E&dv{IvSMjned(jggU|~=0vZVVRZ(qs4=Mi_SFV?pwq{o5jd3IyGiw*E0!(bvd zHbVSV=L!4>&SYj$g$BhOIYgy3^X$FTJpJLhRBz>grF_!>aN=H)U^?IpOE5u@ABxj3 z@mJ4>ILbJ2w@0)1&eOXNgB72n6+7JVymT8#cDse2u^1shcsylwHBwA@v$K*(s5;>qgFhDsrII&dLLr6@;3 z9ZHXygtfLpSDE(%;9tR9q7n~T+ppN3^cr$xX(G?}>&6HU2$Cqi4y*JxeU0j$OfnGH z!UK7bUs}he%>u=2yDaQ%j9Q4Ua=uBaw#+@}b-OT2V0va8;~Kv8S`5;IYYU7=YwkzOY-g68G`#X9=U3Y9Tuwjd5HovDRpQ4=!vT$b&P-ZDYGGUaQEDdO^A&gc8GPHA(}$#=8gMr%^Nt+si~j*)!SUppnpIwVuFppvwq`4D^5 zKQ)Clln!Q(&9IkOVcsLbLQoQqVA+93Dq{tFKx34@s; zi(Pwio&VGV@R<}h8^ka;*$A38>u9*1h@Re#tVL9ZyhN_ zc2TQ+X-#uxJQH0jejlT$&%tD&E!Hes$iXuETJeG|+BN~>zDwXLTxb8y^Yf8Z;uTl7 z0kdC5N5Wv^0)G>{Ls7QaOV1WC>59BNAoc3x2Mx1E+izvT;j;;)5{JP?VPm)=}{iW_v;%Qaj0AmtB{`@KfH&?rRk^z~=EUcjHQm z@>ggzvJsMC_bNg_+C`fg*Xkx_;3?v+Vu3>o-Vn9ceyi-e~B}A+f ztD);Q->W@Ml<{sCSKDjd_zX9BLh8UF9AQ^*(|Uz9%7h_6*xlifRs>{-(*$yj;8Plo zV@j4~Q{k5<0YmWw6;)3mi8b1q2FYjy%s{R42}Se@g>F$D0-s$sQ!P*GJsMf_&eQh^ADc?)p#YceCJQ(xEl#DBKHjDQ7a``QW(K=&m*bNS9yajNskwZ>!DWi!8_2Nyu=iE+kC z`u=dFcw;C?oeSRt&g8KVvLZ`<{ela7Nm^v1j(=WK7;+^;w7!xyS2fhPJ&fi#%%rO{ zO&N5^)4&UA3(7<8+`!tXN`uc!xXOCJfqf$a+Fb@R#Mcl zG`n9RJBT4Q^q&~e9_`J~@^m9WkQ}=vlMufVZ&&jI5}B2$f|$gsmspAVlCQ~aUsKm< zr@=`ErNci@;Y*Pk0L-;fARocn#aJxyh#b&wnI#KU(h-FC}P>j@TkzPAoh-c%iSCF$c zYru~IiVs9*@l1B#?oZN~S8;qFR2ZU-6fY&$2D)Fp=tFOXNAobB?2Xm7`Agzed{8WO z9x^-y&Uk>h_$ULv*G`>w;#%}H8R}k+#7DkY5c+X;N3+ENtv1GqhJq<4`>;2?lGSb% zraT%tW1ZV)zeK={Xhl!ktn=$`^{O*TMo<^} z6WN*X$XeKlMcA=2SKJ-WNayQ|@{=T`+J7UyEgBChjw5RgvFF1}hh#qp{%ApBmr>zk z*f^uDTIFs=-SWH|O}@2C2+;|n;-^BHI(p%C z5j5vnxYz=CX4NHL=t{P9T_qEm0o~Sjx@hwhTUzUv(%jbD4yoJqaEF%}RP|#nBRUR3 zlJH$2Cr^7qf#V3fKCeccU2-T^1e(SL|C@01=t6I{_}x}`)>bw#q1b@6)DBc!+dLyT z|I6zc#N5V(lx3?59riCFkFSIWE{f))m?VsCvf+5i)yimfs=9?qzsWsv(Rd;9jYGkF z5MRvPP%y_@v!M0C9L!D zWRnV5GwJx}1LS=`p}^o8bb$_R#d_(tbNEpcihk09Zk&n?H{%+y6kT`p0)fmuPMaHz}@VC37RwxA)+ zLV%>JG;#GOrQD&BW5nk=QpX?$ET!Ff%I0Pl6N_h0NjaVCNZ9{idDcN$=OuS#R~c&#!*F=cp@ZQ+?_*$f}K#8A&3G*cr!RO93_Q5Ib1yklyF80~_?2S|1jtM=k zGh(;7Pqq|oYZ#xl1(qTf(>~G_k4wf%d=if@ZN_?fORIhHZ~!wVsFQo89I+ZXV*wQ3 z@xU7VdEihS(Zw97PZ@Pp8pmWlfK~6nB-B}@!u{2c3W!7{s{AzO_U!7O0*ge^K{8Qg z2Y)B)7U~prLvkTwO)d2XXV5mBGJXK;tD8nz$lY89;=WTj6O@GPf34L8Lq@(@NT&p(s z@=w%H=#Gdr)7OJrnRTMy4YS(Q3A9~RVR6g9i6_cIYR6q|Zw{>H{gTbjaK={qNqbbY zp{cDkXcFb3jJm1^pKuyAC{eZnh-xRaX`7srQ<<$@#Fv0KJcY@tsL01B#*23_K*}~X zKV|yn9ePU-(;^5&kg8aW`-Zc)fhlb3Af8c#aB`(>o6xwyXQuRZQvpY6-w-#iy}V2x zSW1Sd^z?K1JR!+SztmMX`ml6ylc)2(waaUvYTv(qe!g9pJ!KU07PUgBpNt4wkFQS= z37n*b7OrVxAv2jqY-sM!oaIsf+&uMgPClYrdBLdrpn1FtFf*Sk_{~mz zxVAu|L}SlQay<3u(OLVcPYrl6H)rP;=;n0wunp*372lY8yg~?2Lz2?X;bY%5F_to9 zv)S^L@_V945oUAwvHku}+V7Jt16}R(W5#Z)iiS_qSZA_Is4J{``a>fRwUlHC@y>t` zz5SqL+Z+ZCC)H)nE~UAl`NiY)nJDviN6Y@9VD>m5S6=RI)x+5uG@0LPZeRC>^noucdA96f_|E+ zeyiJ=*A|@L<)7pgA1v3JbR)Fe+5eNTVo!$J=A$sCVWq~TL|G!Pun zN32r;KJw%CYw?k<{1D(Ony9P>IXkYEkhg zv`XIOay6IrjjtQ;I1E}gn$36fM}8}uCSSfG63!75ZWKznmYsI%Hd^eeopRGx|8MWm z0?|{%@zG9w-|%6*JID`)QeJM49<41NP{ZTwarbaqwnQd1zDy9GY+@yu$`6s)oSkD% zMd z%3Qyh{IWvSu5YGe$P{Y>D;%ah`l4r`?dQJhG85Cv>gKY7h)gcu*V{&r-LK8Y_UlJmQA zWUWk&D!!3<{BKO&ElVnq){wSZM%+y4(w`!W^STXvEW0gKGGdwgM16Av8Jms5BI0L# zxIK-_^*c1pk6~J;rBcr%eP5U0ml|KPDq$f9M{TT&M{f6lgT4A6u|@35DX(NbePi9W z*Aiyz2?CI#+Cy11Z2|Pn^AILisWV7l6?Km3!shqt{+DaZ`}e&V!yi~QjNbO#a2J;`n_^4?Yb0TJW7B{r0fIN+VAewPm0VOdYoxn zR5~p-_mUm4n3#E&Bp&HB&&D@?|7s#-tI4tbqd zw>}cL)eg_8AI_u=Uk=e!5gBk2RreWLPlQcF&!#YguhWEsu81UT#;>azdG#!3Mm&w}O1x|P|eIVWo+ME{PYV6XeegkEoUwnz1k*+{*L z?#4x&gj``ao^}Sd>Q;$!{}w58PNCl)PQKa5TlBw`|65w;ulT^PmUQjwDDN$QVq}T3eWknd2gPgpKCi=UrhIaxc0V_^O1ZcWY#tcM6pjp$!#6|Xuak?4$*I7@hbE(= zM#f}29b|4zs8PqMm6LC}bCSZ#JN5knYNRO|&cwAP4i9gU>>jb8XeZV$0ztdvxP^<~ zB8p0>Y+a7Xfda=_&67v}z+SJ@+Mn2EXXSDjc^aaf-Qi;H9I$(*|3}}5<~!g&^5{Ar zXds8=Vz-ldHXf@RT8pG8Pi%Pt4K!d5!cpRHB2TVWm{5R!Ma-PVD;i^^rqow|^j_Rv z&p04`L)*MC8=t&~NRr;&b_>sUcIDj;bsq*+Bd@USM}NoL%rtS%{ZQ|sv3(#jt-IC* zFJ=0uC)6sLaxF8B<@o)0QMi?x@;^l~TIIHIO{@NG>)ZbUH#ijr(9M$AMWW#D;JiVj z9X7SP4ag>2&{WcLH+%|URnx0BwWCIjq45rbj+u}gle4(S8HtTUL04-xU(UYQhC&Xa zU8l&Tg(PRVj+Yve0*L?tKH_+D#HfeH}GuhXfj$(y>uClk<4sPOwsma z?r{2r(JJnRNqfCh%mQ&?PIcb!D4XVk>r2d~I5QR=`d`5~t+v8^+eCc(UU_B$$htP z()Po>(C`L^MC&k_xKTP){?|zlAH;}3 zr1hmjA%dEpP8`~f^Vb7e5}5=ZZ@r~%ohCac{x0YF>9id&GPY&7+m7@3)G1eLVU;on zW5nhV#m)X=kC~>6m|&7+5TW3t!jF491!+w%&|q9*C}o-bm9S^X8<-4b_~A%U7YzM* zV#v#sIo-A<(c0YN9z>(N;(y8Xpmmfi79go{rLLi&G5s z0P>rSFSRIIEr(*T94t<;%bkIP+v+%RY*O-N-}!nhX`jnk$(E4| z_QO$|+f_tTEl&r&SMRmZ_km7wjy&5#1M_j=%g?TF?D{?67oNir{9Xb!%Ik{0a;lJ_ihdm-vM@P$xjf2CRE+aPY zn7L$sZNaugKxKo4A~YGWze2b6YHDQg*@`t-P^ZcYq9YnL1#lE(l-OFWnFv5pbZ-># zFqDYU->K2PgIa<^d}Q}3hVx)W8w+wB3!Kt;(B$ksxs?=v8rfiooh<|bA062pX)8pa ze0XA_S07}^(mGfkO=S3i+A=#+nsm#4Z)t$nZGNKOrHBkmyMH)hZh4S#D5=zkH0HRi zbuZm*g4K`kQu3#zWl*WZ5s4V>H?qxz&F5!VS}PK;cw^qnIQwYUhoMu6nRg(rGqN=g zJ%gT+*19Xt50OI%T^^mt$_qF!R*?@heMBm9Ev_-B>wor(o;hVuYhHB+P2<{41aIw-s%zN z-HKh`5r5+EQZ%_J?YmTm?eLy%#_q)6PXlu_$`5$ElBhXI-)b%wHdo<1=3fT3F_|Qm zZwwEOi$_GA$?kHAQ{QyQYlY-`TwO}m(xiO+|6IMIz4v4uu$1-0JvZosqGLZJ;Dsa94kzTz(;2kZyZ|q%X`8t3jH7Vr|QD4Ua8^pXGbOur6a; z^dKmM#gTyx9$k4ZvV_#cy!^8)3sg}q5I(`@Hd?1%ksZconCEXLkWnzmB=w5WwKGAW zcZlR-NH|pTiBXSo&7&f3CR|lh_XrZ}f4{Lia6EvxgztwTwzg<)S*m&Qy4stjquRTS z$@*{gR|tD)yGm}`i8aYt4lao)d%((k{BE6aj-*VR2Rv51cyL!Rn(U5J|0Tk8yXPx` zz%KE=i>x3x|A3V3=QobV#w!`kkjx+&nJ98v0W$mXk9m%D)dz z3xaO&D*+Y-uT#juNaP6>EuK!^w=6%LCxVIAY7~XQ*_?&V;CyQe1da+K7T5s6tR+E_ z@GL6ml3@8L<8DbY<}Q^xDYOcGyQgM9_@|esGo=fDZX|i>Tzh3Ca7os3Lb_=$xHh2r zbOTL&mwL(j5PsEZh}v;c8=%Rghow9~w)*+8U7<^l+rjp=66%343IDPxP;r5++Jc0@8Lh)rj>$3u!-Y4U7PFDg?a-?5lu$ z0*#R*ah}em|6aRKNufW59OG7=<;FKX|NQ6|IFfnsz1u^nb>QZ6&I!aG3Fbj0T3jMO zi75>odCXUFqv+uVyv1LT2p5RvHG+FuxWLf_t)jJ~d4?V%ONSmSFm>SHVXVE1%6Ls8 zSO&eelcZEva5ct*ya~6nUoovdY$JF3*yXWYBwy(#3vF;U2KWybHo;XVUL|q3eN%2F zZ?2Y4{3M~cfY6?LVHhyXpO#~c=%3(Rb$@74-IhB&|KfJ2^Ls>;e!sX|An3IIdCFq6 zlY)%%i&*M~T({EStP~DB&?Isvt!M1@_JSkwN7sK!b5CQo+U{~Ex!{Q`xk*o~b6XYGyC5Zg%|4Ex>jkRd zq}}3}p$f@f{WuI@uV zF;xtUD?NP?ysh+~{&y^k13*7=Pz>{K+e>6HA;#q9?3HMTIrSpT??!T?7g?Mo52QJAI6rGZ zoW&v6HaoCFH+3|ntJc!5Yu>zCBfZMcx!zUneCYmj!l3UlLWk{h*Ic;4*J_iC)h&aR zlAxcY{(f)MMS?lIlQ_g)@2qx+z2#9pr}Gn6sn_SEA|s}%e`L^_;5Lw)n|LYel{>}E0^|weXYMfn#|De z4YD<8T3qKK(U2&u8`Xz#x*H;*?)M5QP8@Wg+_g0)LlBDzo{BQ@xZd7AOUDapn+%#5 zI#waL@dg~dT%}wY7+6uJMri;V0`}Ia!5o>qe|iC8 zR~JB8MaxI5Yj@kkfsXNSI_y5EKZajhki9Z`xu~$LmA#Q?*NxPS@m3i-O4~dnB*diW zAf3i~Mp|MpDiG*NqMa^NZUmKJLFG?c+}!R zeYD49HO;O}yh@)ph##Pic4;xwII=uNMU)#Yf$MkH~z}F1pKg?~_&(^QV zRTL>&w!GaAPbVJR=CzEy zbb8?n*KoGxkJ1xl)9B?oLcX|%+24QD|HxjH>6;RC&2$hs3ehR+ z2Ic5hO-7-Ex0`>72DSz@VM&uj>PxrjfFHhA?E(ESE5TbOnr=}%~{ag4M zqs26dfxIC@erDx;b(&JU5ggKhPtN<1JeGMBR-U}_zv@6YvCLmmU||$@%?$3^36!F4&o|bw)OvmC~GGSZtBk88%3lYdJ?rvvsHJV!{F_X>3M{!;L(4PawJcM=G)P z|Gn?eYajh>2X5juAGU<*zQy1SFEccoDc==11B?qh6W7=Gp+o;|jE3TaB~8we1W6<1 zkEV`SF)|QKY*$aw+C9;)IERE%0;S#C#W9qlw;)^k=lzmq`z#KFjug5_&K>a&0FJ%$ z_X1n00kPCoJ)@_sN6I<-xxnoWBdNc7#Q*m9H*rvE-0vXbO!BXOcXV2?g?*u76L@n+ zMeCR#*)JjSh06rufQ5C_<&rJ!X?r_Z?a%b!gxFi58rO91LO1gh?m<~^`Lvs-Xd5|m zQWBYK=3iB-)*_n3x>+A}=Ce3HI45Y%D(3f^SOu8KZ*Q{CY@Zo$32-NsB@Qx(q^fnc0a?2{Qtw^4iw#~Le;GPyr4JzMM~`35&g6!o zyv`OEzqXB)@v*QcOF*Ru-p*g)VQnSP@ekp4RQnVC7vT~|uRb&T^o2_g+TXJ7Dn z!NLoJPXBmOHHD`ff7J1;&-n6^bNJQw3#BHaW|tC_F&rp5;x%=-4!A~x#@iB0)iJJa zz3}duEQjgwVPS*%5cIz{7{b{Su6oDW2Q%HTdGqve?a`w*J=u;mH7dcikMP@!`_;^R z+@pa#YIBv$(slWO`31r%y_}5&#+S>Vb=R3>dfeQql3e{#d_(OhQdCgjg`U%$bH+|s zhXy``;S-Fa!0CLTcI}pOpx}<^>)L6rrP@#5g68C_O?b^c3lswiv%6vhE{dM3I#YxwE04h}JUWj~@vk zQ-qMp4=qk)RT4~O6hOX44dX|T z;(glS!Q8!iXr?hbKhemWUCDLP2n?8qW`CTXuWlCY&bZt2miMs@TlWPXg%lyRu9i^unpioa zk{?>q*%9YtTp7Wp;$koe@emPpEaQf_J2>g76(-0lJARykjBu!cE{t$kIc#=53h-Kr zm%-)3>${hDdztF19vI5x9mx5by-PSXJ^5(*jwJLlRmH=?!&%2Giy^F99a>Q1`tOAa z<)<9|H@g!9KuY!=)p-f0Rt5bJe`eQ?r7j13dnTs6P}sZL6gI$pA&@VNjcGE|Mz1eb z%uM#xOSNDk_oHmwpx|VhZn~G#eir_eyFX>>L`O|Y+m<_f8~dkG>~8LCjE-?qzl@p^ zC!%pO`!|Gd3WxD7={7+YlGcsVuVbNIhW=nOxjU4P;OYTHNlfEU>GJ3K55Aq@>;CXW zP?s(L1#P!-~< zEzM8%=hjV|;UvaRUFo()xpMVk)MB|lCQ+qH*)_W~Is`@6tnL7iw6zP2-*eQ${Ul$0 zY+xW61e{eW+P&H+76ANsMhXyL%Gq;a=9=e1g4=HX;t#=L4*+=Eg6_>vWMxzPFffr@3z4m3^j?0law^{*2*vz|%2G`?4Y;1z!EiP$pvV2%`FW2TD`XIAbfO#z)hxqMF5x@Z|X;j61=|A9FU1YGQz>Lw|a6{kz zJkIb14yYN(z)>mo5U8fXb;VEu9CRK|9%)WWIwPqDa~%%6FIt*rA|GE#O^^VHOCFEe ztb@KvD2-a}f?k86kcScnS6kArLI14Nv%i#YCeyQ2k8J{m$H~49ybpgp zP~orlxt0bkf*fcp@>-tj)AAh7e-FcGCYV=}kZRjf)^zDM@3nV9Z!f>anS}ybL;? zaXXIh!5Dz}2Z*Mzmx})*gogqQ6jnS$2--6&sXa7&+3cXz5GKHg9YJkdY0u z#rgB(k1c}ViZ1rofa4dELzzG@x zmk$v+&9;-N2Wh>C#QSlm_!OZR$P;iG>B8nhNDL^qy};`O8($XYX=OLwXvp`15ksfB zhV3pET&CxgoY}C^8{F>z75qV$qC!3lTjZ#R};)fBM8Cu>kgu)w6ikx4K5eMw% zX2N%UWqhdD28gP`*DnYoQ!-`!o(rEtrfgfe0Qq@Vt_nK9){Ic%KK^J)z7>DfPbU4# zoT;*5Z6X${@6uyh1w@gNx0T1=?F`j~_2X6shPa*3W{8$kjS%R_&}T^%3i%Xjsp%Zf zN_m5#7$O2^^|e!k>V84g?cGNL48`E1xR$=Tqi=B;Hisao5ZL;PS0U>S_`RkWT==s| ztK6fs!n~24yHe_(q;iu3-OR z0Y*E<+nHQ&nB^k0#!KoYI1;w-P5J4L!a!}{eUKG=qdPNl)pCww<&tLJ4MnVk8Jvd==F!Por{ejk&w{>TvHsyIR}rc_ zji(f;8Z+nA-{K+brM9nC!Mo?yJV`dGk>0dz3^SmXn(FVGghdQLIQIq7UUe;(aEK4} zL`MM|IYPi|5~v98jdUSoqRd?ZWD1QjQ|0k=OvO8oVS)Ci_X@Kyj*z^{{4kg6wjJH=}}lk zq7c$8>15Gg@^B)*CR$%v|MIv1zOhSe@qfPfo6MP@%Q3McX~#=U=GH0r5;WQ@l;|Im zuHE?}wau=;9KCfg)$JGhPzq%CmYDSQ6nul0J@ra>O|h+`Qf^z?Wed}iRoC%7mK#d% z8}^~PDME5@PiUDtNY-ByedPOmk)jO>`!HRnH5TU?eX36}JexaD|8RFK!9I0(wIp0fSUt@!0*Cr!iI-ekZa)TmU*nNKN1TB*6V8ijZpq zk+^lp#|}AWfhd5zX)geyLG|yI0&eX!2CWr;$RtJpcIip1sPjGoK8%&(uuqCl{2vQ_ zS?~B2O#U8)F&?W#*omZ!!r=JenPj6^BA#JI-M_a#l2!|`_WV) zaV7=d09XXf(v-ysAV&dQ9e-8fb_J0I$f6SOBZlcF>)8jN`N73*df|wE36%4$XPCB5 zv1s7RX7%?EVV)3QlR6nV+b%PS#BpK_ofGyjVuLw=q+cEU)IgV)`xEmBj~2)__(>yt zFIJIT@r)uQLudW_wkV2=LWf7islHZO{Z6Et@lR=aV)nT$cmgqtS#)|OjoV4Ync)uT zeBY6A%qo6zqys8QdF<<%hS%7-j?lwrO(XNJ{pt=Jrcd(;VEqJd zGcaiJOB0NG2n3hjb8Z{;?cH!SSPrsUV7t!_r0l>c7bEd13JKE?POS6}0x8k%G=t3*V|N1)s_c+y z3?qRbGksCL_vZ9s3$~Fhgl^Y$uTB|Oj>E=X)?|T5J-}M^ZyeD2aQLwMP_0>#<_RAm zRpKzocx)B8eeSG37ON--Q-?tMMLIz3d5v5?w3YHOuO#e*X6KSR?eej;R3cV$AtYG4 z^9`gbd#<=Ek}&k*xHoZ1W>BhU=_pDf89P9@KmwAYG40DPxGxaj8;A%6m{$UJR=d;k z+2gsmZtobYnDrah(>Uxdi)IM9hwxIwtFugGQSNNW86Pvm0Su;}i1nv@uXS3agZr22 zT%{7Qh7cK^5M@o$=M`**(PCSV4f~Gvr<+kMCC$epgj0le@CM9*d(DHyxgc1wQ2UtXNvn%~mdW$4Pp&z9`Q2A=m})C`$}k?vwc zqU=l=`<`{nu}2Hdf?Jpx)#3cFl!_S@*>+hdm&&CQ!eMg<#Fo~{gcawrLp17ohIK&F z1Yv^;L`$6_jOQi-Uawtj?9 z-t=3kA{4P-O>_#r8FU56`P&^;vWbWyJc=4;edW7a;|xH}-kYpPh(m>Y>5xz>xs5K-I6kw(=+Es zY^QCbnz;$j{jS}qi@66`r>jhJc#slZ^gL)?dMy^)C;_(vM?9Wu8?u0`d&TdwAbpwV z?hvh2hB=K=3c)tx6~*U~qcIY&97L7=B31ll%n-OVmpjB49VG=**Q^TYyoYakzH)qu zWyhk1DYHyAMr@7hgWmmHSt@hw`8u} znC{*U*c_C!vCuM9L?_eon*4AFO}@XcL@|^d@Ue*cf%W!6^ZuIm&iK8dR^0Jb z(jj{)n|cO*=aO_u?8P+AP@TzfO~~f1z6NLAqWR;P3ZToA8)BFm*$p$sP0xahk)gm! zT>d7yAxZ-p*c~o&vo%ire zo7O$9Fs8C3oVcXlth=9Df5c3Q4=CZnF0!bJahJ{~&=XLwxv%`@p#0MZhz!&2wBJT5 z!5fx88_$7nq7JchR?jW3k-weWcN#iTrGlxt2P2Mn0}8UVIVrol`r8bs+OPN7ou#eP z@H@tL(KKJ1B{r4r!!W>`hsXJlA+b^F8kqHn3fU-%CK#yd~<#pF>vYKEEXM zp6S`pf;xAt8%y`DKYgUF`9_3eO*Un%5F#bA%>HvRLX0veH2^s;UFZEe!i21U=oW!^ zAh_m4aw6R&MtEAtWW<%*B)r?PxKL+WB##JcAP$k ztBPdlejYW%;~Oxr!DglEZ7cx&J1x~;(+Z?mZl@j&Z*Ug#>Tcp$DjWMW?01g9 zFFI{d7H*=6pj!K^vk|x;EBq?V0}x3&jk+ssY1sUvuL~m6dQax;MSj{Jt$%&oe#S}U zVwp~01fMN@Ubyas(jI6`cOkDbG8x(g%@5P;XH#dHxbFMLM()sV-I3VuIFuV=26Je4 z_TETZXC(R2xL9!f5wbS=H?AVTX^Jx7IOxPk zb>BuJeN$wmeL+65J}@6DA4O?!29@4z`w#OmuBr9fvi^&JV$pN(X4u>oL4y6=jj#Aq zS;kR7k7R5Y;S6Ex7U7TPT#rvuv%>eDGge@21kai^X^Wsc3BSD_PD&@dVo!x9(SG{y zuSin)Sbg3ezBGpzaSo;rE(hwnKkL6u+FO`N7Nk&Cgp>E6;a?n4Rvbk{uO1XL6jDGr z>ij+LdC#w%wfGxN>75OMG3*w^_Ym*BWe}Lt5CfkI2 z-uW|{>+ne^^4_!W&>!sT&!tg_hDP*AFAGyCWVL_)vTFAoT^H3uQx1`D+0FR78Z`|2IS23EJY!5vs}gpzi0H;JI#*~Z|{HY=dS3r{!@u9A0^;3%U=9Wq;XCUi$TV)OZfbG)KNtSf! zF3dsJM?yNkxCy-bv^Cj{q%%5o18U8~6?LkRs= z8L@vL#tk~5RBp@ffMV0BBN@2LQ)t0#^pM~jBgEGQp-26eNY!TMk|p?5@w-ohGfQ{I z)U{kB!B}waAzB4Zb|i!niZjVg62z;2G{p!!F(TtDdeLc~nD6pRT7ur&Lm+b1Vv6uq zshsM|UVmnnr?mFCd8?HPnye9>9-{TBh@#>z&o~w-iSlo;wto={B~2O~ z<^m&%JT>U&Tb?~|tf@X^PF*!abmBP3R}j3+yzg~pTb(qW!z19?f^#=XN?^s~NeWMN zwW+w}9J>Mh|G*u&|EsRSZFU&!-+6_mpSVRR)!Bdy;3z?$Ar*i9#HES-ok&$pfTO1~ zlLE->{iQ_ePw$AleW6r7)M|E*x6wVKrWJYIw_H1=Xcg0g0m<)ObB9sKRfOekdVwl(e!2x1v;6vG+{ z?Nw5ui?MQV5X_%+Mt-7I&CN-bN6RTOL1b7nEM2`W?cQ82AqdJ%8zf=lqIMo&*)YK% z{^vE#_^%wC+MUQ7yatF`aK%N1_J??8g)s`we_Mi)?-#K@i*P&`*V&+CterrnLm=u# z(JC86=5_8Kj;0M^_<7EVq*B)$Gx3gB<&i^giuX8=7(5u@0#e1L5_Of+5xh20ugtm&1x2o^rBDE`7iaz5Njz`nU?J0u0XTo79f4M$U+fOX_iYAn0>%^8ibXGJtshG|-3&5*=_-x6D6opdrF-F_Io30zjeWZza408f$k``u&2S}-& zT*e6QU9~kB$tR3P_nCR|zg{F6QZhc&cL3S|7S{dT*#rOpzatS>P12txV2m*`?6dcW zT+n7xi|R@F)xGo=K~Sk)V)M^ttv@T~Qp7LMlZ0)==2vTowPoQeynaMb+PrS2NKyQ069Vp$=SP8DFpnGi-z(*!XL^}=3x30-Iz zkO{;D&e2@Y3<6DnzV{N}C0ghHvGDI=kcl>e2u#X*K3ACtqXJeY&D}UC4MK@)*5T^# zO@)*%Ll@G4vw&IGAt4!hkhdWinCjXd@xVgrP#El;PbcRA@+zUbr~1CbItgrh6>^}6 zgFUZg3(0^%{rJ|hi7RDaHpJpj^CjPEyOo~oj^TlC#AK>(#848}uxIoijBMfTrb69@ zCVjW1rZb}w`<=BUpPAnxUqo?hUU8tUWN4&rRE8gy6c1GqQZn6_+LET0e;T8sD1Vss z?X@@km?8p?IDNP^>ymrr<`0+}Pwi@+ H)SdqW -#include +#include //std::ostream +#include #include namespace Gudhi::multi_persistence { /** - * @brief Simple box in \f$\mathbb R^n\f$ . - * + * @class Box Box.h gudhi/Multi_persistence/Box.h * @ingroup multi_persistence + * + * @brief Simple box in \f$\mathbb R^n\f$ defined by two diametrically opposite corners. + * + * @tparam T Type of the coordinates of the Box. Has to follow the conditions of the template parameter of + * @ref One_critical_filtration "". */ template -class Box { - using point_type = Gudhi::multi_filtration::One_critical_filtration; +class Box +{ + using Point = Gudhi::multi_filtration::One_critical_filtration; /**< Type of a point in \f$\mathbb R^n\f$. */ public: - Box(); - Box(T a, T b, T c, T d) : bottomCorner_({a, b}), upperCorner_({c, d}) {}; - Box(const point_type &bottomCorner, const point_type &upperCorner); - Box(const std::pair &box); - - /* - * Inflates the box by delta - */ - void inflate(T delta); - const point_type &get_bottom_corner() const; - const point_type &get_upper_corner() const; - point_type &get_bottom_corner(); - point_type &get_upper_corner(); /** - * Thresholds a point x to be lower than the top corner of the box + * @brief Default constructor. Constructs a trivial box. */ - inline void threshold_up(point_type &x) const; - /* - * Thresholds a point x to be upper than the bottom corner of the box + Box() {} + + /** + * @brief Constructs a box from the two given corners. Assumes that \f$ lowerCorner \le @p upperCorner \f$ and + * if both are finite values, they have the same dimension. + * + * @param lowerCorner First corner of the box. Has to be smaller than `upperCorner`. + * @param upperCorner Second corner of the box. Has to be greater than `lowerCorner`. */ - inline void threshold_down(point_type &x) const; - bool contains(const point_type &point) const; + Box(const Point &lowerCorner, const Point &upperCorner) + : lowerCorner_(lowerCorner), upperCorner_(upperCorner) + { + GUDHI_CHECK(lowerCorner.size() == upperCorner.size() && lowerCorner <= upperCorner, "This box is trivial !"); + } + /** - * Given a list of points, builds the smallest box containing all of them. + * @brief Constructs a box from the two given corners. Assumes that \f$ box.first \le @p box.second \f$ and + * if both are finite values, they have the same dimension. + * + * @param box Pair of corners defining the wished box. */ - void infer_from_filters(const std::vector &Filters_list); - bool is_trivial() const; - std::pair get_pair() const { return {bottomCorner_, upperCorner_}; } - std::pair get_pair() { return {bottomCorner_, upperCorner_}; } - std::size_t dimension() const { return bottomCorner_.size(); } + Box(const std::pair &box) : lowerCorner_(box.first), upperCorner_(box.second) {} - private: - point_type bottomCorner_; - point_type upperCorner_; -}; + /** + * @brief Inflates the box by delta. + * + * @param delta Inflation coefficient. + */ + void inflate(T delta) + { + lowerCorner_ -= delta; + upperCorner_ += delta; + } -template -inline Box::Box() {} + /** + * @brief Returns the lowest of both defining corners. + */ + const Point &get_lower_corner() const { return lowerCorner_; } -template -inline Box::Box(const point_type &bottomCorner, const point_type &upperCorner) - : bottomCorner_(bottomCorner), upperCorner_(upperCorner) { - GUDHI_CHECK(bottomCorner.size() == upperCorner.size() && bottomCorner <= upperCorner, "This box is trivial !"); -} + /** + * @brief Returns the lowest of both defining corners. + */ + Point &get_lower_corner() { return lowerCorner_; } -template -inline Box::Box(const std::pair &box) : bottomCorner_(box.first), upperCorner_(box.second) {} + /** + * @brief Returns the greatest of both defining corners. + */ + Point &get_upper_corner() { return upperCorner_; } -template -inline void Box::inflate(T delta) { - bottomCorner_ -= delta; - upperCorner_ += delta; -} + /** + * @brief Returns the greatest of both defining corners. + */ + const Point &get_upper_corner() const { return upperCorner_; } -/** - * Define a box containing the filtration values. - */ -template -inline void Box::infer_from_filters(const std::vector &Filters_list) { - int dimension = Filters_list.size(); - int nsplx = Filters_list[0].size(); - std::vector lower(dimension); - std::vector upper(dimension); - for (int i = 0; i < dimension; i++) { - T min = Filters_list[i][0]; - T max = Filters_list[i][0]; - for (int j = 1; j < nsplx; j++) { - min = std::min(min, Filters_list[i][j]); - max = std::max(max, Filters_list[i][j]); + /** + * @brief Returns true if and only if the given point is inside the box. + * If the box is not {-infinity, infinity} and the given point is finite, but has not the same dimension + * than the box, the point is considered outside. + */ + bool contains(const Point &point) const + { + if (point.is_nan() || is_trivial()) return false; + if (point.is_inf()) return upperCorner_.is_inf(); + if (point.is_minus_inf()) return lowerCorner_.is_minus_inf(); + + if ((lowerCorner_.is_finite() && point.size() != lowerCorner_.size()) || + (upperCorner_.is_finite() && point.size() != upperCorner_.size())) { + // TODO: make it a warning, with future GUDHI_CHECK version? + // std::cerr << "Box and point are not of the same dimension." << std::endl; + return false; } - lower[i] = min; - upper[i] = max; - } - bottomCorner_.swap(lower); - upperCorner_.swap(upper); -} -template -inline bool Box::is_trivial() const { - return bottomCorner_.empty() || upperCorner_.empty() || bottomCorner_.size() != upperCorner_.size(); -} - -template -inline const typename Box::point_type &Box::get_bottom_corner() const { - return bottomCorner_; -} - -template -inline const typename Box::point_type &Box::get_upper_corner() const { - return upperCorner_; -} -template -inline typename Box::point_type &Box::get_bottom_corner() { - return bottomCorner_; -} - -template -inline typename Box::point_type &Box::get_upper_corner() { - return upperCorner_; -} + return lowerCorner_ <= point && point <= upperCorner_; + } -template -inline bool Box::contains(const point_type &point) const { - if (point.size() != bottomCorner_.size()) { - std::cerr << "Box and point are not of the same size." << std::endl; - return false; + /** + * @brief Returns true if and only if one of the following is true: + * - one of the corners is empty + * - one of the corners has value NaN + * - both corners have value infinity + * - both corners have value minus infinity + * - both corners are finite but don't have the same dimension. + */ + bool is_trivial() const + { + return lowerCorner_.empty() || upperCorner_.empty() || + lowerCorner_.is_nan() || upperCorner_.is_nan() || + (lowerCorner_.is_inf() && upperCorner_.is_inf()) || + (lowerCorner_.is_minus_inf() && upperCorner_.is_minus_inf()) || + (lowerCorner_.is_finite() && upperCorner_.is_finite() && + lowerCorner_.num_parameters() != upperCorner_.num_parameters()); } - return bottomCorner_ <= point && point <= upperCorner_; -} + /** + * @brief Returns a pair of const references to both defining corners. + */ + std::pair get_bounding_corners() const { return {lowerCorner_, upperCorner_}; } -template -std::ostream &operator<<(std::ostream &os, const Box &box) { - os << "Box -- Bottom corner : "; - os << box.get_bottom_corner(); - os << ", Top corner : "; - os << box.get_upper_corner(); - return os; -} + /** + * @brief Returns a pair of references to both defining corners. + */ + std::pair get_bounding_corners() { return {lowerCorner_, upperCorner_}; } -template -inline void Box::threshold_up(point_type &x) const { - for (auto i = 0u; i < x.size(); i++) { - auto t = upperCorner_[i]; - if (x[i] > t) x[i] = t; + /** + * @brief Returns the dimension of the box. If the box is trivial or both corners are infinite, the dimension is 0. + */ + std::size_t dimension() const { + if (is_trivial()) return 0; + if (lowerCorner_.is_minus_inf() && upperCorner_.is_inf()) return 0; //not so sure what we want to do here + return lowerCorner_.is_finite() ? lowerCorner_.size() : upperCorner_.size(); } - return; -} -template -inline void Box::threshold_down(point_type &x) const { - for (auto i = 0u; i < x.size(); i++) { - auto t = bottomCorner_[i]; - if (x[i] < t) x[i] = t; + + /** + * @brief Outstream operator. + */ + friend std::ostream &operator<<(std::ostream &os, const Box &box) + { + os << "Box -- Bottom corner : "; + os << box.get_lower_corner(); + os << ", Top corner : "; + os << box.get_upper_corner(); + return os; } - return; -} + + private: + Point lowerCorner_; /**< Lowest of defining corners. */ + Point upperCorner_; /**< Greatest of defining corners. */ +}; } // namespace Gudhi::multi_persistence diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index efd077b3b6..b5ba2d85d9 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -5,253 +5,278 @@ * Copyright (C) 2023 Inria * * Modification(s): + * - 2024/08 Hannah Schreiber: doc * - YYYY/MM Author: Description of the modification */ +/** + * @file Line.h + * @author David Loiseaux + * @brief Contains the @ref Gudhi::multi_persistence::Line class. + */ + #ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED #define LINE_FILTRATION_TRANSLATION_H_INCLUDED #include #include +#include +#include #include #include #include namespace Gudhi::multi_persistence { -/* A line in \f$\mathbb R^n\f$, with some helpers to project points on it. - * When the direction is not given, it is assumed to be diagonal. - * As the line has a builtin parametrization, points in \f$\mathbb R^n\f$ - * that are on a line are given a time parameter in \f$\mathbb R\f$. - * The method that end with a 2 returns the time t, while the other - * ones return the full coordinates - * +/** + * @class Line Line.h gudhi/Multi_persistence/Line.h * @ingroup multi_persistence + * + * @brief A line in \f$\mathbb R^n\f$, with some helpers to project points on it. + * + * @tparam T Type of the coordinate values. Has to follow the conditions of the template parameter of + * @ref One_critical_filtration "". */ template -class Line { +class Line +{ public: - using point_type = Gudhi::multi_filtration::One_critical_filtration; - using kcritical_point_type = Gudhi::multi_filtration::Multi_critical_filtration; - /* - * Checks that the argument define a correct, positively slopped line. - */ - bool check_direction() const; - Line(); - Line(const point_type &x); - Line(point_type &&x); - Line(const point_type &x, const point_type &v); - /* - * Returns the point whose intersection is \f$ \min\{ y\ge x \} \cap \mathrm{this}\f$ + /** + * @brief Coordinates in \f$\mathbb R^n\f$. */ - inline point_type push_forward(point_type x) const; - /* - * Retuns the time parameter of the coordinate given by push_forward. - */ - template - inline U push_forward2(const point_type &x) const; - /* - * Retuns the time parameter of the coordinate given by push_forward. - */ - template - inline U push_forward2(const kcritical_point_type &x) const; - /* - * Returns the point whose intersection is \f$ \max\{ y\le x \} \cap \mathrm{this}\f$ + using Point = Gudhi::multi_filtration::One_critical_filtration; + /** + * @brief Set of coordinates in \f$\mathbb R^n\f$. */ - inline point_type push_back(point_type x) const; - /* - * Retuns the time parameter of the coordinate given by push_back. + using K_critical_point = Gudhi::multi_filtration::Multi_critical_filtration; + + /** + * @brief Default constructor. Sets the number of coordinates to 0. */ - template - inline U push_back2(const point_type &x) const; - /* - * Retuns the time parameter of the coordinate given by push_back. + Line() {} + /** + * @brief Constructs a line going through the given point with slope 1. + * + * @param x A point of the line. */ - template - inline U push_back2(const kcritical_point_type &x) const; - inline int get_dim() const; - /* - * Given a box, returns the coordinates of the intersection of this box and `this` as a pair of points (low, high) - * in this line, representing this interval. + Line(const Point &x) : basePoint_(x) {} //default direction + /** + * @brief Constructs a line going through the given point with slope 1. + * + * @param x A point of the line. Will be moved. */ - std::pair get_bounds(const Box &box) const; - /* - * Retuns the times parameter of the coordinates in the pair given by get_bounds. + Line(Point &&x) : basePoint_(std::move(x)) {} //default direction + /** + * @brief Constructs a line going through the given point in the direction of the given vector. + * If the vector has no coordinates, the slope is assumed to be 1. + * Otherwise, the vector has to be non trivial and all its coordinates have to be positive. + * + * @param x A point of the line. + * @param vector Direction of the line. Positive and non trivial. */ - std::pair get_bounds2(const Box &box) const; + Line(const Point &x, const Point &vector) : basePoint_(x), direction_(vector) { check_direction_(); } - // translation - inline friend Line &operator+=(Line &to_translate, const point_type &x) { - to_translate.basepoint_ -= x; - return to_translate; - } + /** + * @brief Returns the coordinates of the point on the line with "time" parameter `t`. That is, the point \f$ x \f$ + * such that \f$ x[i] = base\_point[i] + t \times direction[i] \f$ for all \f$ i \in [0, n - 1] \f$ with \f$ n \f$ + * the number of coordinates. + */ + Point operator[](T t) const + { + Point x(basePoint_.size()); - inline point_type &basepoint() { return basepoint_; } - inline point_type &direction() { return direction_; } - inline const point_type &basepoint() const { return basepoint_; } - inline const point_type &direction() const { return direction_; } + if (direction_.size() > 0) { + for (std::size_t i = 0; i < x.size(); i++) x[i] = basePoint_[i] + t * direction_[i]; + } else + for (std::size_t i = 0; i < x.size(); i++) x[i] = basePoint_[i] + t; - private: - point_type basepoint_; // any point on the line - point_type direction_; // direction of the line -}; -template -inline bool Line::check_direction() const { - bool is_trivial = true; - for (const auto &stuff : basepoint_) { - if (!stuff) { - is_trivial = false; - } - if (stuff < 0) { - throw std::invalid_argument("Direction should have positive entries."); - } + return x; } - if (is_trivial) { - throw std::invalid_argument("Direction should have at least one non-trivial entry."); + + /** + * @brief Translates the given line in the given direction. + */ + friend Line &operator+=(Line &to_translate, const Point &v) + { + to_translate.basePoint_ += v; + return to_translate; } - if (direction_.size() && direction_.size() != basepoint_.size()) - throw std::invalid_argument("The dimensions of basepoint and direction are not equal."); -} -template -Line::Line() {} -template Line::Line(const point_type &x) : basepoint_(x) { check_direction();} + /** + * @brief Returns a reference to the current base point of the line. + */ + Point &base_point() { return basePoint_; } + /** + * @brief Returns a const reference to the current base point of the line. + */ + const Point &base_point() const { return basePoint_; } -template -Line::Line(const point_type &x) : basepoint_(x) { - check_direction(); -} -template -Line::Line(point_type &&x) : basepoint_(std::move(x)) { - check_direction(); -} -template -Line::Line(const point_type &x, const point_type &v) : basepoint_(x), direction_(v) { - check_direction(); -} + /** + * @brief Returns a reference to the direction vector of the line. + */ + Point &direction() { return direction_; } + /** + * @brief Returns a const reference to the direction vector of the line. + */ + const Point &direction() const { return direction_; } -template -inline typename Line::point_type Line::push_forward(point_type x) const { // TODO remove copy - if (x.is_inf() || x.is_nan() || x.is_minus_inf()) return x; - T t = this->push_forward2(x); - if (direction_.size() > 0) { - for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t * direction_[i]; - } else { - for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t; - } - return x; -} -template -template -inline U Line::push_forward2(const point_type &x) const { - constexpr const U inf = - std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf() || x.is_nan()) return inf; - if (x.is_minus_inf()) return -inf; - U t = -inf; - if (direction_.size()) { - for (std::size_t i = 0; i < x.size(); i++) { - if (direction_[i] == 0) [[unlikely]] { - if (x[i] < basepoint_[i]) - continue; - else { - return inf; + // TODO: factorize forward and backward version by adding a `co` to One_critical_filtration? + // Could make problems with One_critical_filtration being the type of basePoint_ and direction_ + + /** + * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ + * of the intersection between the line and the closed positive cone originating at `x`. + * + * @tparam U Type of the time parameter. + * @param x Origin of the closed positive cone. + */ + template + U compute_forward_intersection(const Point &x) const + { + GUDHI_CHECK(direction_.empty() || direction_.size() == x.size(), "x has not as many parameters as the line."); + + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf() || x.is_nan()) return inf; + if (x.is_minus_inf()) return -inf; + U t = -inf; + if (direction_.size()) { + for (std::size_t i = 0; i < x.size(); i++) { + if (direction_[i] == 0) { + if (x[i] > basePoint_[i]) + return inf; + } else { + t = std::max(t, (static_cast(x[i]) - static_cast(basePoint_[i])) / static_cast((direction_[i]))); } - } else [[likely]] { - t = std::max(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast((direction_[i]))); } + } else { + for (std::size_t i = 0; i < x.size(); i++) t = std::max(t, static_cast(x[i]) - static_cast(basePoint_[i])); } - } else { - for (std::size_t i = 0; i < x.size(); i++) t = std::max(t, static_cast(x[i]) - static_cast(basepoint_[i])); - } - return t; -} -template -template -inline U Line::push_forward2(const kcritical_point_type &x) const { - constexpr const U inf = - std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf() || x.is_nan()) return inf; - if (x.is_minus_inf()) return -inf; - U t = inf; - for (const auto &y : x) { - t = std::min(t, this->push_forward2(y)); + return t; } - return t; -} -template -inline typename Line::point_type Line::push_back(point_type x) const { - if (x.is_inf() || x.is_nan() || x.is_minus_inf()) return x; - - T t = this->push_back2(x); - if (direction_.size() > 0) { - for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t * direction_[i]; - } else - for (std::size_t i = 0; i < x.size(); i++) x[i] = basepoint_[i] + t; - - return x; -} + /** + * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ + * of the intersection between the line and the union of closed positive cones originating at the points in `x`. + * + * @tparam U Type of the time parameter. + * @param x Set of origins for the closed positive cones. + */ + template + U compute_forward_intersection(const K_critical_point &x) const + { + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf() || x.is_nan()) return inf; + if (x.is_minus_inf()) return -inf; + U t = inf; + for (const auto &y : x) { + t = std::min(t, compute_forward_intersection(y)); + } + return t; + } -template -template -inline U Line::push_back2(const point_type &x) const { - constexpr const U inf = - std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf()) return inf; - if (x.is_minus_inf() || x.is_nan()) return -inf; - U t = inf; + /** + * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ + * of the intersection between the line and the open negative cone originating at `x`. + * + * @tparam U Type of the time parameter. + * @param x Origin of the open negative cone. + */ + template + U compute_backward_intersection(const Point &x) const + { + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf()) return inf; + if (x.is_minus_inf() || x.is_nan()) return -inf; + U t = inf; - if (direction_.size()) { - for (std::size_t i = 0; i < x.size(); i++) { - if (direction_[i] == 0) [[unlikely]] { - if (x[i] > basepoint_[i]) - continue; - else { - return -inf; + if (direction_.size()) { + for (std::size_t i = 0; i < x.size(); i++) { + if (direction_[i] == 0) { + if (x[i] <= basePoint_[i]) + return -inf; + } else { + t = std::min(t, (static_cast(x[i]) - static_cast(basePoint_[i])) / static_cast(direction_[i])); } - } else [[likely]] { - t = std::min(t, (static_cast(x[i]) - static_cast(basepoint_[i])) / static_cast(direction_[i])); } + } else { + for (std::size_t i = 0; i < x.size(); i++) t = std::min(t, static_cast(x[i] - basePoint_[i])); } - } else { - for (std::size_t i = 0; i < x.size(); i++) t = std::min(t, static_cast(x[i] - basepoint_[i])); + return t; } - return t; -} -template + /** + * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ + * of the intersection between the line and the union of open negative cones originating at the points in `x`. + * + * @tparam U Type of the time parameter. + * @param x Set of origins for the open negative cones. + */ + template + U compute_backward_intersection(const K_critical_point &x) const + { + constexpr const U inf = + std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); + if (x.is_inf()) return inf; + if (x.is_minus_inf() || x.is_nan()) return -inf; + U t = -inf; + for (const auto &y : x) { + t = std::max(t, compute_backward_intersection(y)); + } + return t; + } + + /** + * @brief Given a box, returns the intersection of this box and the line. + * + * @param box Box to intersect. + * @return A pair representing the two bounding points of the intersection, such that the first element is the + * smallest of the two. If the box and the line do not intersect, returns the pair {inf, inf}. + */ + std::pair get_bounds(const Box &box) const + { + if (box.is_trivial()) return {Point::inf(), Point::inf()}; + + T bottom = compute_forward_intersection(box.get_bottom_corner()); + T top = compute_backward_intersection(box.get_upper_corner()); + + if (bottom > top) return {Point::inf(), Point::inf()}; //no intersection -template -inline U Line::push_back2(const kcritical_point_type &x) const { - constexpr const U inf = - std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf()) return inf; - if (x.is_minus_inf() || x.is_nan()) return -inf; - U t = -inf; - for (const auto &y : x) { - t = std::max(t, this->push_back2(y)); + return {(*this)[bottom], (*this)[top]}; } - return t; -} -template -inline int Line::get_dim() const { - return basepoint_.size(); -} + private: + Point basePoint_; /**< Any point on the line. */ + Point direction_; /**< Direction of the line. */ -template -inline std::pair Line::get_bounds2(const Box &box) const { - return {this->push_forward2(box.get_bottom_corner()), this->push_back2(box.get_upper_corner())}; -} + /** + * @brief Checks that the arguments define a correct and positively slopped line. + */ + void check_direction_() const + { + if (direction_.size() == 0) return; //default slope + + bool is_trivial = true; + for (T v : direction_) { + if (v) { + is_trivial = false; + } + if (v < 0) { + throw std::invalid_argument("Direction should have positive entries."); + } + } + if (is_trivial) { + throw std::invalid_argument("Direction should have at least one non-trivial entry."); + } + if (direction_.size() != basePoint_.size()) + throw std::invalid_argument("The dimensions of base point and direction are not equal."); + } +}; -template -inline std::pair::point_type, typename Line::point_type> Line::get_bounds( - const Box &box) const { - return {this->push_forward(box.get_bottom_corner()), this->push_back(box.get_upper_corner())}; -} } // namespace Gudhi::multi_persistence #endif // LINE_FILTRATION_TRANSLATION_H_INCLUDED From 19aba9422ec252d09a49cad9b81c7f21cb540523 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Wed, 4 Sep 2024 18:06:31 +0200 Subject: [PATCH 81/87] unit tests for box and line --- ...ultifiltration_multicritical_unit_test.cpp | 1 - .../multifiltration_onecritical_unit_test.cpp | 1 - .../include/gudhi/Multi_persistence/Box.h | 94 +++++------ .../include/gudhi/Multi_persistence/Line.h | 65 ++++---- src/Multi_persistence/test/CMakeLists.txt | 7 + .../test/multipersistence_box_unit_test.cpp | 140 ++++++++++++++++ .../test/multipersistence_line_unit_test.cpp | 152 ++++++++++++++++++ 7 files changed, 369 insertions(+), 91 deletions(-) create mode 100644 src/Multi_persistence/test/CMakeLists.txt create mode 100644 src/Multi_persistence/test/multipersistence_box_unit_test.cpp create mode 100644 src/Multi_persistence/test/multipersistence_line_unit_test.cpp diff --git a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp index 1fd94bcb80..a57db77185 100644 --- a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp @@ -8,7 +8,6 @@ * - YYYY/MM Author: Description of the modification */ -#include #include #include #include diff --git a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp index dbaf2f036b..db740613b3 100644 --- a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp @@ -8,7 +8,6 @@ * - YYYY/MM Author: Description of the modification */ -#include #include #include diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h index 586e01aa02..e93442db20 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h @@ -30,53 +30,39 @@ namespace Gudhi::multi_persistence { * @ingroup multi_persistence * * @brief Simple box in \f$\mathbb R^n\f$ defined by two diametrically opposite corners. - * + * * @tparam T Type of the coordinates of the Box. Has to follow the conditions of the template parameter of * @ref One_critical_filtration "". */ template -class Box -{ +class Box { + public: using Point = Gudhi::multi_filtration::One_critical_filtration; /**< Type of a point in \f$\mathbb R^n\f$. */ - public: /** - * @brief Default constructor. Constructs a trivial box. + * @brief Default constructor. Constructs a trivial box with corners at minus infinity. */ Box() {} /** * @brief Constructs a box from the two given corners. Assumes that \f$ lowerCorner \le @p upperCorner \f$ and * if both are finite values, they have the same dimension. - * + * * @param lowerCorner First corner of the box. Has to be smaller than `upperCorner`. * @param upperCorner Second corner of the box. Has to be greater than `lowerCorner`. */ - Box(const Point &lowerCorner, const Point &upperCorner) - : lowerCorner_(lowerCorner), upperCorner_(upperCorner) - { + Box(const Point &lowerCorner, const Point &upperCorner) : lowerCorner_(lowerCorner), upperCorner_(upperCorner) { GUDHI_CHECK(lowerCorner.size() == upperCorner.size() && lowerCorner <= upperCorner, "This box is trivial !"); } /** * @brief Constructs a box from the two given corners. Assumes that \f$ box.first \le @p box.second \f$ and * if both are finite values, they have the same dimension. - * + * * @param box Pair of corners defining the wished box. */ Box(const std::pair &box) : lowerCorner_(box.first), upperCorner_(box.second) {} - /** - * @brief Inflates the box by delta. - * - * @param delta Inflation coefficient. - */ - void inflate(T delta) - { - lowerCorner_ -= delta; - upperCorner_ += delta; - } - /** * @brief Returns the lowest of both defining corners. */ @@ -98,25 +84,14 @@ class Box const Point &get_upper_corner() const { return upperCorner_; } /** - * @brief Returns true if and only if the given point is inside the box. - * If the box is not {-infinity, infinity} and the given point is finite, but has not the same dimension - * than the box, the point is considered outside. + * @brief Returns a pair of const references to both defining corners. */ - bool contains(const Point &point) const - { - if (point.is_nan() || is_trivial()) return false; - if (point.is_inf()) return upperCorner_.is_inf(); - if (point.is_minus_inf()) return lowerCorner_.is_minus_inf(); - - if ((lowerCorner_.is_finite() && point.size() != lowerCorner_.size()) || - (upperCorner_.is_finite() && point.size() != upperCorner_.size())) { - // TODO: make it a warning, with future GUDHI_CHECK version? - // std::cerr << "Box and point are not of the same dimension." << std::endl; - return false; - } + std::pair get_bounding_corners() const { return {lowerCorner_, upperCorner_}; } - return lowerCorner_ <= point && point <= upperCorner_; - } + /** + * @brief Returns a pair of references to both defining corners. + */ + std::pair get_bounding_corners() { return {lowerCorner_, upperCorner_}; } /** * @brief Returns true if and only if one of the following is true: @@ -126,10 +101,8 @@ class Box * - both corners have value minus infinity * - both corners are finite but don't have the same dimension. */ - bool is_trivial() const - { - return lowerCorner_.empty() || upperCorner_.empty() || - lowerCorner_.is_nan() || upperCorner_.is_nan() || + bool is_trivial() const { + return lowerCorner_.empty() || upperCorner_.empty() || lowerCorner_.is_nan() || upperCorner_.is_nan() || (lowerCorner_.is_inf() && upperCorner_.is_inf()) || (lowerCorner_.is_minus_inf() && upperCorner_.is_minus_inf()) || (lowerCorner_.is_finite() && upperCorner_.is_finite() && @@ -137,29 +110,48 @@ class Box } /** - * @brief Returns a pair of const references to both defining corners. + * @brief Returns true if and only if the given point is inside the box. + * If the box is not {-infinity, infinity} and the given point is finite, but has not the same dimension + * than the box, the point is considered outside. */ - std::pair get_bounding_corners() const { return {lowerCorner_, upperCorner_}; } + bool contains(const Point &point) const { + if (point.is_nan() || is_trivial()) return false; + if (point.is_inf()) return upperCorner_.is_inf(); + if (point.is_minus_inf()) return lowerCorner_.is_minus_inf(); - /** - * @brief Returns a pair of references to both defining corners. - */ - std::pair get_bounding_corners() { return {lowerCorner_, upperCorner_}; } + if ((lowerCorner_.is_finite() && point.size() != lowerCorner_.size()) || + (upperCorner_.is_finite() && point.size() != upperCorner_.size())) { + // TODO: make it a warning, with future GUDHI_CHECK version? + // std::cerr << "Box and point are not of the same dimension." << std::endl; + return false; + } + + return lowerCorner_ <= point && point <= upperCorner_; + } /** * @brief Returns the dimension of the box. If the box is trivial or both corners are infinite, the dimension is 0. */ std::size_t dimension() const { if (is_trivial()) return 0; - if (lowerCorner_.is_minus_inf() && upperCorner_.is_inf()) return 0; //not so sure what we want to do here + if (lowerCorner_.is_minus_inf() && upperCorner_.is_inf()) return 0; // not so sure what we want to do here return lowerCorner_.is_finite() ? lowerCorner_.size() : upperCorner_.size(); } + /** + * @brief Inflates the box by delta. + * + * @param delta Inflation coefficient. + */ + void inflate(T delta) { + lowerCorner_ -= delta; + upperCorner_ += delta; + } + /** * @brief Outstream operator. */ - friend std::ostream &operator<<(std::ostream &os, const Box &box) - { + friend std::ostream &operator<<(std::ostream &os, const Box &box) { os << "Box -- Bottom corner : "; os << box.get_lower_corner(); os << ", Top corner : "; diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index b5ba2d85d9..4f52d141a1 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -34,13 +34,12 @@ namespace Gudhi::multi_persistence { * @ingroup multi_persistence * * @brief A line in \f$\mathbb R^n\f$, with some helpers to project points on it. - * + * * @tparam T Type of the coordinate values. Has to follow the conditions of the template parameter of * @ref One_critical_filtration "". */ template -class Line -{ +class Line { public: /** * @brief Coordinates in \f$\mathbb R^n\f$. @@ -54,24 +53,24 @@ class Line /** * @brief Default constructor. Sets the number of coordinates to 0. */ - Line() {} + Line() : basePoint_(0), direction_(0) {} // has to be explicitly set to 0, otherwise becomes -inf /** * @brief Constructs a line going through the given point with slope 1. - * + * * @param x A point of the line. */ - Line(const Point &x) : basePoint_(x) {} //default direction + Line(const Point &x) : basePoint_(x), direction_(0) {} // default direction /** * @brief Constructs a line going through the given point with slope 1. - * + * * @param x A point of the line. Will be moved. */ - Line(Point &&x) : basePoint_(std::move(x)) {} //default direction + Line(Point &&x) : basePoint_(std::move(x)), direction_(0) {} // default direction /** * @brief Constructs a line going through the given point in the direction of the given vector. * If the vector has no coordinates, the slope is assumed to be 1. * Otherwise, the vector has to be non trivial and all its coordinates have to be positive. - * + * * @param x A point of the line. * @param vector Direction of the line. Positive and non trivial. */ @@ -82,8 +81,7 @@ class Line * such that \f$ x[i] = base\_point[i] + t \times direction[i] \f$ for all \f$ i \in [0, n - 1] \f$ with \f$ n \f$ * the number of coordinates. */ - Point operator[](T t) const - { + Point operator[](T t) const { Point x(basePoint_.size()); if (direction_.size() > 0) { @@ -97,8 +95,7 @@ class Line /** * @brief Translates the given line in the given direction. */ - friend Line &operator+=(Line &to_translate, const Point &v) - { + friend Line &operator+=(Line &to_translate, const Point &v) { to_translate.basePoint_ += v; return to_translate; } @@ -123,17 +120,16 @@ class Line // TODO: factorize forward and backward version by adding a `co` to One_critical_filtration? // Could make problems with One_critical_filtration being the type of basePoint_ and direction_ - + /** * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ * of the intersection between the line and the closed positive cone originating at `x`. - * + * * @tparam U Type of the time parameter. * @param x Origin of the closed positive cone. */ template - U compute_forward_intersection(const Point &x) const - { + U compute_forward_intersection(const Point &x) const { GUDHI_CHECK(direction_.empty() || direction_.size() == x.size(), "x has not as many parameters as the line."); constexpr const U inf = @@ -144,8 +140,7 @@ class Line if (direction_.size()) { for (std::size_t i = 0; i < x.size(); i++) { if (direction_[i] == 0) { - if (x[i] > basePoint_[i]) - return inf; + if (x[i] > basePoint_[i]) return inf; } else { t = std::max(t, (static_cast(x[i]) - static_cast(basePoint_[i])) / static_cast((direction_[i]))); } @@ -160,13 +155,12 @@ class Line /** * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ * of the intersection between the line and the union of closed positive cones originating at the points in `x`. - * + * * @tparam U Type of the time parameter. * @param x Set of origins for the closed positive cones. */ template - U compute_forward_intersection(const K_critical_point &x) const - { + U compute_forward_intersection(const K_critical_point &x) const { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf() || x.is_nan()) return inf; @@ -181,13 +175,12 @@ class Line /** * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ * of the intersection between the line and the open negative cone originating at `x`. - * + * * @tparam U Type of the time parameter. * @param x Origin of the open negative cone. */ template - U compute_backward_intersection(const Point &x) const - { + U compute_backward_intersection(const Point &x) const { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf()) return inf; @@ -197,8 +190,7 @@ class Line if (direction_.size()) { for (std::size_t i = 0; i < x.size(); i++) { if (direction_[i] == 0) { - if (x[i] <= basePoint_[i]) - return -inf; + if (x[i] <= basePoint_[i]) return -inf; } else { t = std::min(t, (static_cast(x[i]) - static_cast(basePoint_[i])) / static_cast(direction_[i])); } @@ -212,13 +204,12 @@ class Line /** * @brief Computes the "time" parameter \f$ t \f$ of the starting point \f$ p = base\_point + t \times direction \f$ * of the intersection between the line and the union of open negative cones originating at the points in `x`. - * + * * @tparam U Type of the time parameter. * @param x Set of origins for the open negative cones. */ template - U compute_backward_intersection(const K_critical_point &x) const - { + U compute_backward_intersection(const K_critical_point &x) const { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); if (x.is_inf()) return inf; @@ -232,19 +223,18 @@ class Line /** * @brief Given a box, returns the intersection of this box and the line. - * + * * @param box Box to intersect. * @return A pair representing the two bounding points of the intersection, such that the first element is the * smallest of the two. If the box and the line do not intersect, returns the pair {inf, inf}. */ - std::pair get_bounds(const Box &box) const - { + std::pair get_bounds(const Box &box) const { if (box.is_trivial()) return {Point::inf(), Point::inf()}; - T bottom = compute_forward_intersection(box.get_bottom_corner()); + T bottom = compute_forward_intersection(box.get_lower_corner()); T top = compute_backward_intersection(box.get_upper_corner()); - if (bottom > top) return {Point::inf(), Point::inf()}; //no intersection + if (bottom > top) return {Point::inf(), Point::inf()}; // no intersection return {(*this)[bottom], (*this)[top]}; } @@ -256,9 +246,8 @@ class Line /** * @brief Checks that the arguments define a correct and positively slopped line. */ - void check_direction_() const - { - if (direction_.size() == 0) return; //default slope + void check_direction_() const { + if (direction_.size() == 0) return; // default slope bool is_trivial = true; for (T v : direction_) { diff --git a/src/Multi_persistence/test/CMakeLists.txt b/src/Multi_persistence/test/CMakeLists.txt new file mode 100644 index 0000000000..db3e67c346 --- /dev/null +++ b/src/Multi_persistence/test/CMakeLists.txt @@ -0,0 +1,7 @@ +include(GUDHI_boost_test) + +add_executable_with_targets(Multi_persistence_box_unit_test multipersistence_box_unit_test.cpp TBB::tbb) +gudhi_add_boost_test(Multi_persistence_box_unit_test) + +add_executable_with_targets(Multi_persistence_line_unit_test multipersistence_line_unit_test.cpp TBB::tbb) +gudhi_add_boost_test(Multi_persistence_line_unit_test) diff --git a/src/Multi_persistence/test/multipersistence_box_unit_test.cpp b/src/Multi_persistence/test/multipersistence_box_unit_test.cpp new file mode 100644 index 0000000000..5bda24785c --- /dev/null +++ b/src/Multi_persistence/test/multipersistence_box_unit_test.cpp @@ -0,0 +1,140 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2024 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "multi_persistence" +#include +#include +#include + +#include + +using Gudhi::multi_persistence::Box; + +typedef boost::mpl::list list_of_tested_variants; + +BOOST_AUTO_TEST_CASE_TEMPLATE(box_constructors, T, list_of_tested_variants) +{ + Box b; + BOOST_CHECK(b.is_trivial()); + auto bottom = b.get_lower_corner(); + auto top = b.get_upper_corner(); + BOOST_CHECK_EQUAL(bottom.size(), 1); + BOOST_CHECK_EQUAL(top.size(), 1); + BOOST_CHECK(bottom.is_minus_inf()); + BOOST_CHECK(top.is_minus_inf()); + BOOST_CHECK(b.get_bounding_corners().first == bottom); + BOOST_CHECK(b.get_bounding_corners().second == top); + + Box b2({0,1,2}, {4,5,6}); + BOOST_CHECK(!b2.is_trivial()); + bottom = b2.get_lower_corner(); + top = b2.get_upper_corner(); + BOOST_CHECK_EQUAL(bottom.size(), 3); + BOOST_CHECK_EQUAL(top.size(), 3); + BOOST_CHECK_EQUAL(bottom[0], 0); + BOOST_CHECK_EQUAL(bottom[1], 1); + BOOST_CHECK_EQUAL(bottom[2], 2); + BOOST_CHECK_EQUAL(top[0], 4); + BOOST_CHECK_EQUAL(top[1], 5); + BOOST_CHECK_EQUAL(top[2], 6); + BOOST_CHECK(b2.get_bounding_corners().first == bottom); + BOOST_CHECK(b2.get_bounding_corners().second == top); + + Box b3(std::make_pair::Point, typename Box::Point>({0,1,2}, {4,5,6})); + BOOST_CHECK(!b3.is_trivial()); + bottom = b3.get_lower_corner(); + top = b3.get_upper_corner(); + BOOST_CHECK_EQUAL(bottom.size(), 3); + BOOST_CHECK_EQUAL(top.size(), 3); + BOOST_CHECK_EQUAL(bottom[0], 0); + BOOST_CHECK_EQUAL(bottom[1], 1); + BOOST_CHECK_EQUAL(bottom[2], 2); + BOOST_CHECK_EQUAL(top[0], 4); + BOOST_CHECK_EQUAL(top[1], 5); + BOOST_CHECK_EQUAL(top[2], 6); + BOOST_CHECK(b3.get_bounding_corners().first == bottom); + BOOST_CHECK(b3.get_bounding_corners().second == top); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(box_other, T, list_of_tested_variants) +{ + using P = typename Box::Point; + + Box b({0,1,2}, {4,5,6}); + + BOOST_CHECK(b.contains({1, 2, 3})); + BOOST_CHECK(!b.contains({1, 8, 3})); + BOOST_CHECK(!b.contains(P::nan())); + BOOST_CHECK(!b.contains(P::inf())); + BOOST_CHECK(!b.contains(P::minus_inf())); + + BOOST_CHECK_EQUAL(b.dimension(), 3); + + b.inflate(2); + auto& bottom = b.get_lower_corner(); + auto& top = b.get_upper_corner(); + BOOST_CHECK_EQUAL(bottom[0], -2); + BOOST_CHECK_EQUAL(bottom[1], -1); + BOOST_CHECK_EQUAL(bottom[2], 0); + BOOST_CHECK_EQUAL(top[0], 6); + BOOST_CHECK_EQUAL(top[1], 7); + BOOST_CHECK_EQUAL(top[2], 8); + + top = P::inf(); + + BOOST_CHECK(b.contains({1, 2, 3})); + BOOST_CHECK(b.contains({1, 8, 3})); + BOOST_CHECK(!b.contains(P::nan())); + BOOST_CHECK(b.contains(P::inf())); + BOOST_CHECK(!b.contains(P::minus_inf())); + + BOOST_CHECK_EQUAL(b.dimension(), 3); + + b.inflate(2); + BOOST_CHECK_EQUAL(bottom[0], -4); + BOOST_CHECK_EQUAL(bottom[1], -3); + BOOST_CHECK_EQUAL(bottom[2], -2); + BOOST_CHECK(top.is_inf()); + + bottom = P::minus_inf(); + top = {4,5,6}; + + BOOST_CHECK(b.contains({1, 2, 3})); + BOOST_CHECK(!b.contains({1, 8, 3})); + BOOST_CHECK(!b.contains(P::nan())); + BOOST_CHECK(!b.contains(P::inf())); + BOOST_CHECK(b.contains(P::minus_inf())); + + BOOST_CHECK_EQUAL(b.dimension(), 3); + + b.inflate(2); + BOOST_CHECK(bottom.is_minus_inf()); + BOOST_CHECK_EQUAL(top[0], 6); + BOOST_CHECK_EQUAL(top[1], 7); + BOOST_CHECK_EQUAL(top[2], 8); + + top = P::inf(); + + BOOST_CHECK(b.contains({1, 2, 3})); + BOOST_CHECK(b.contains({1, 8, 3})); + BOOST_CHECK(!b.contains(P::nan())); + BOOST_CHECK(b.contains(P::inf())); + BOOST_CHECK(b.contains(P::minus_inf())); + + BOOST_CHECK_EQUAL(b.dimension(), 0); + + b.inflate(2); + BOOST_CHECK(bottom.is_minus_inf()); + BOOST_CHECK(top.is_inf()); +} + + + diff --git a/src/Multi_persistence/test/multipersistence_line_unit_test.cpp b/src/Multi_persistence/test/multipersistence_line_unit_test.cpp new file mode 100644 index 0000000000..8b8344337c --- /dev/null +++ b/src/Multi_persistence/test/multipersistence_line_unit_test.cpp @@ -0,0 +1,152 @@ +/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT. + * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details. + * Author(s): Hannah Schreiber + * + * Copyright (C) 2024 Inria + * + * Modification(s): + * - YYYY/MM Author: Description of the modification + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE "multi_persistence" +#include +#include + +#include + +using Gudhi::multi_persistence::Line; + +typedef boost::mpl::list list_of_tested_variants; + +BOOST_AUTO_TEST_CASE_TEMPLATE(line_constructors, T, list_of_tested_variants) +{ + using P = typename Line::Point; + + Line l; + BOOST_CHECK(l.base_point().empty()); + BOOST_CHECK(l.direction().empty()); + + P x({1,2,3}); + + Line l2(x); + auto bp = l2.base_point(); + BOOST_CHECK(bp.size() == 3); + BOOST_CHECK_EQUAL(bp[0], 1); + BOOST_CHECK_EQUAL(bp[1], 2); + BOOST_CHECK_EQUAL(bp[2], 3); + BOOST_CHECK(l2.direction().empty()); + + Line l3(std::move(x)); + bp = l3.base_point(); + BOOST_CHECK(bp.size() == 3); + BOOST_CHECK_EQUAL(bp[0], 1); + BOOST_CHECK_EQUAL(bp[1], 2); + BOOST_CHECK_EQUAL(bp[2], 3); + BOOST_CHECK(l3.direction().empty()); + + Line l4({1,2,3}, {4,5,6}); + bp = l4.base_point(); + auto dir = l4.direction(); + BOOST_CHECK(bp.size() == 3); + BOOST_CHECK_EQUAL(bp[0], 1); + BOOST_CHECK_EQUAL(bp[1], 2); + BOOST_CHECK_EQUAL(bp[2], 3); + BOOST_CHECK(dir.size() == 3); + BOOST_CHECK_EQUAL(dir[0], 4); + BOOST_CHECK_EQUAL(dir[1], 5); + BOOST_CHECK_EQUAL(dir[2], 6); + + BOOST_CHECK_THROW(Line l5({1,2,3}, {4,-5,6}), std::invalid_argument); + BOOST_CHECK_THROW(Line l6({1,2,3}, {0,0,0}), std::invalid_argument); + BOOST_CHECK_THROW(Line l7({1,2,3}, {1,2,3,4}), std::invalid_argument); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(line_intersections, T, list_of_tested_variants) +{ + using P = typename Line::Point; + using KP = typename Line::K_critical_point; + + const double inf = std::numeric_limits::infinity(); + + Line l({1,2,3}, {4,0,6}); + + double t = l.template compute_forward_intersection(P{2,1,3}); + BOOST_CHECK_EQUAL(t, 0.25); + t = l.template compute_forward_intersection(P{2,3,3}); + BOOST_CHECK_EQUAL(t, inf); + + t = l.template compute_forward_intersection(KP({P{2,1,3}, P{2,3,3}})); + BOOST_CHECK_EQUAL(t, 0.25); + + t = l.template compute_backward_intersection(P{2,3,3}); + BOOST_CHECK_EQUAL(t, 0); + t = l.template compute_backward_intersection(P{2,1,3}); + BOOST_CHECK_EQUAL(t, -inf); + + t = l.template compute_backward_intersection(KP({P{2,1,3}, P{2,3,3}})); + BOOST_CHECK_EQUAL(t, 0); + + std::pair bounds = l.get_bounds({{-10, 0, 10}, {10, 4, 10}}); + auto& bottom = bounds.first; + auto& top = bounds.second; + BOOST_CHECK_EQUAL(bottom.size(), 3); + BOOST_CHECK_EQUAL(bottom[0], T(5. + 2. / 3.)); + BOOST_CHECK_EQUAL(bottom[1], 2); + BOOST_CHECK_EQUAL(bottom[2], T(3. + T(7. / 6.) * 6.)); + BOOST_CHECK_EQUAL(top.size(), 3); + BOOST_CHECK_EQUAL(top[0], T(5. + 2. / 3.)); + BOOST_CHECK_EQUAL(top[1], 2); + BOOST_CHECK_EQUAL(top[2], T(3. + T(7. / 6.) * 6.)); + + bounds = l.get_bounds({{-10, 0, 10}, {10, 1, 10}}); + BOOST_CHECK(bounds.first.is_inf()); + BOOST_CHECK(bounds.second.is_inf()); +} + +BOOST_AUTO_TEST_CASE_TEMPLATE(line_other, T, list_of_tested_variants) +{ + using P = typename Line::Point; + + Line l({1,2,3}, {4,0,6}); + + P x = l[1.25]; + BOOST_CHECK_EQUAL(x.size(), 3); + BOOST_CHECK_EQUAL(x[0], 1. + T(1.25) * 4.); + BOOST_CHECK_EQUAL(x[1], 2); + BOOST_CHECK_EQUAL(x[2], 3. + T(1.25) * 6.); + + x = l[0]; + BOOST_CHECK_EQUAL(x.size(), 3); + BOOST_CHECK_EQUAL(x[0], 1); + BOOST_CHECK_EQUAL(x[1], 2); + BOOST_CHECK_EQUAL(x[2], 3); + + x = l[-3.25]; + BOOST_CHECK_EQUAL(x.size(), 3); + BOOST_CHECK_EQUAL(x[0], 1. + T(-3.25) * 4.); + BOOST_CHECK_EQUAL(x[1], 2); + BOOST_CHECK_EQUAL(x[2], 3. + T(-3.25) * 6.); + + l += {2, 5, 6}; + x = l[1.25]; + BOOST_CHECK_EQUAL(x.size(), 3); + BOOST_CHECK_EQUAL(x[0], 3. + T(1.25) * 4.); + BOOST_CHECK_EQUAL(x[1], 7); + BOOST_CHECK_EQUAL(x[2], 9. + T(1.25) * 6.); + + x = l[0]; + BOOST_CHECK_EQUAL(x.size(), 3); + BOOST_CHECK_EQUAL(x[0], 3); + BOOST_CHECK_EQUAL(x[1], 7); + BOOST_CHECK_EQUAL(x[2], 9); + + x = l[-3.25]; + BOOST_CHECK_EQUAL(x.size(), 3); + BOOST_CHECK_EQUAL(x[0], 3. + T(-3.25) * 4.); + BOOST_CHECK_EQUAL(x[1], 7); + BOOST_CHECK_EQUAL(x[2], 9. + T(-3.25) * 6.); +} + + + From 7925e871d3b8ba948d8a4b2b04ea6722239eabac Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 5 Sep 2024 16:37:22 +0200 Subject: [PATCH 82/87] add sort in multicritical + other small fixes --- .../include/gudhi/Multi_critical_filtration.h | 120 ++++++++++++------ .../include/gudhi/One_critical_filtration.h | 82 +++++------- ...ultifiltration_multicritical_unit_test.cpp | 81 ++++++------ .../multifiltration_onecritical_unit_test.cpp | 30 ++--- .../include/gudhi/Multi_persistence/Box.h | 8 +- .../include/gudhi/Multi_persistence/Line.h | 8 +- .../test/multipersistence_box_unit_test.cpp | 4 +- .../test/multipersistence_line_unit_test.cpp | 4 +- .../test/simplex_tree_multi_unit_test.cpp | 5 +- 9 files changed, 177 insertions(+), 165 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 340f54d9ac..03dac811ee 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -89,27 +89,27 @@ class Multi_critical_filtration { * @brief Default constructor. The constructed value will be either at infinity if `co` is true or at minus infinity * if `co` is false. */ - Multi_critical_filtration() : multi_filtration_(get_default_filtration_value()) {}; + Multi_critical_filtration() : multi_filtration_(_get_default_filtration_value()) {}; /** * @brief Constructs a filtration value with one generator and @p n parameters. * All parameters will be initialized at -inf if `co` is false and at inf if `co` is true. * * @warning The generator `{-inf, -inf, ...}`/`{inf, inf, ...}` with \f$ n > 1 \f$ entries is not considered as - * "(minus) infinity" (the resp. methods @ref is_minus_inf() and @ref is_inf() "", as well as the ones of the + * "(minus) infinity" (the resp. methods @ref is_minus_inf() and @ref is_plus_inf() "", as well as the ones of the * generator, will not return true). The `-inf/inf` are just meant as placeholders, at least one entry should be * modified by the user. * Otherwise, either use the static methods @ref minus_inf() or @ref inf(), or set @p n to 1 instead. * * @param n Number of parameters. */ - Multi_critical_filtration(int n) : multi_filtration_(1, Generator(n, get_default_value())) {}; + Multi_critical_filtration(int n) : multi_filtration_(1, Generator(n, _get_default_value())) {}; /** * @brief Constructs a filtration value with one generator and @p n parameters. All parameters will be initialized * with @p value. * * @warning If @p value is `inf`, `-inf`, or `NaN`, the generator `{value, value, ...}` with \f$ n > 1 \f$ entries * is not wrong but will not be considered as respectively "infinity", "minus infinity" or "NaN" (the corresponding - * methods @ref is_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use + * methods @ref is_plus_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use * the static methods @ref inf(), @ref minus_inf() and @ref nan() instead. * * @param n Number of parameters. @@ -142,13 +142,13 @@ class Multi_critical_filtration { * @pre All generators in the vector have to have the same number of parameters, i.e., size. * Furthermore, the generators have to be a minimal generating set. * - * @warning If the set of generators is not minimal, the behaviour of most methods is undefined. It is possible - * to call @ref simplify() after construction if there is a doubt to ensure this property. + * @warning If the set of generators is not minimal or not sorted, the behaviour of most methods is undefined. + * It is possible to call @ref simplify() after construction if there is a doubt to ensure this property. * * @param v Vector of generators. */ Multi_critical_filtration(const std::vector &v) - : multi_filtration_(v.empty() ? get_default_filtration_value() : v) {}; + : multi_filtration_(v.empty() ? _get_default_filtration_value() : v) {}; /** * @brief Constructs filtration value with as many generators than elements in the given vector and moves those * elements to initialize the generators. @@ -157,13 +157,13 @@ class Multi_critical_filtration { * @pre All generators in the vector have to have the same number of parameters, i.e., size. * Furthermore, the generators have to be a minimal generating set. * - * @warning If the set of generators is not minimal, the behaviour of most methods is undefined. It is possible - * to call @ref simplify() after construction if there is a doubt to ensure this property. + * @warning If the set of generators is not minimal or not sorted, the behaviour of most methods is undefined. + * It is possible to call @ref simplify() after construction if there is a doubt to ensure this property. * * @param v Vector of generators. */ Multi_critical_filtration(std::vector &&v) - : multi_filtration_(v.empty() ? get_default_filtration_value() : std::move(v)) {}; + : multi_filtration_(v.empty() ? _get_default_filtration_value() : std::move(v)) {}; /** * @brief Constructs a filtration value with one generator initialzed by the range given by the begin and end * iterators. @@ -199,11 +199,19 @@ class Multi_critical_filtration { /** * @brief Returns begin iterator of the generator range. + * + * @warning If the generator is modified and the new set of generators is not minimal or not sorted, the behaviour + * of most methods is undefined. It is possible to call @ref simplify() after construction if there is a doubt to + * ensure this property. */ iterator begin() { return multi_filtration_.begin(); } /** * @brief Returns end iterator of the generator range. + * + * @warning If the generator is modified and the new set of generators is not minimal or not sorted, the behaviour + * of most methods is undefined. It is possible to call @ref simplify() after construction if there is a doubt to + * ensure this property. */ iterator end() { return multi_filtration_.end(); } @@ -231,7 +239,7 @@ class Multi_critical_filtration { * @pre The filtration value is 1-critical. If there are more than one generator, only the first will be preserved * and if there is no generator, the method will segfault. */ - operator Generator() const { + operator Generator() { GUDHI_CHECK(num_generators() == 1, "Casting a " + std::to_string(num_generators()) + "-critical filtration value into an 1-critical filtration value."); return multi_filtration_[0]; @@ -257,6 +265,10 @@ class Multi_critical_filtration { /** * @brief Returns a reference to the underlying container storing the generators. + * + * @warning If a generator is modified and the new set of generators is not minimal or not sorted, the behaviour + * of most methods is undefined. It is possible to call @ref simplify() after construction if there is a doubt to + * ensure this property. */ const Generators &get_underlying_container() const { return multi_filtration_; } @@ -271,7 +283,7 @@ class Multi_critical_filtration { std::size_t num_generators() const { return multi_filtration_.size(); } /** - * @brief Returns a filtration value for which @ref is_inf() returns `true`. + * @brief Returns a filtration value for which @ref is_plus_inf() returns `true`. * * @return Infinity. */ @@ -298,7 +310,7 @@ class Multi_critical_filtration { /** * @brief Returns `true` if and only if the filtration value is considered as infinity. */ - bool is_inf() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_inf(); } + bool is_plus_inf() const { return multi_filtration_.size() == 1 && multi_filtration_[0].is_plus_inf(); } /** * @brief Returns `true` if and only if the filtration value is considered as minus infinity. @@ -322,10 +334,6 @@ class Multi_critical_filtration { // COMPARAISON OPERATORS // TODO : this costs a lot... optimize / cheat in some way for python ? - /* - * Checks if `this`, seen as a birth curve is under the `other` birth curve, - * - */ /** * @brief Returns `true` if and only if the positive cones generated by @p b are strictly contained in the @@ -340,7 +348,9 @@ class Multi_critical_filtration { // for each generator in b, verify if it is strictly in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { - // i= b[j][0], than a[j'] can never strictly dominate b[i] for all j' > j. + if (!a.multi_filtration_[j].empty() && !b.is_nan() && a.multi_filtration_[j][0] >= b.multi_filtration_[i][0]) + return false; isContained = _strictly_contains(a.multi_filtration_[j], b.multi_filtration_[i]); } if (!isContained) return false; @@ -370,10 +380,12 @@ class Multi_critical_filtration { // check if this curves is below other's curve // ie for each guy in this, check if there is a guy in other that dominates him for (std::size_t i = 0u; i < b.multi_filtration_.size(); ++i) { - // for each generator in other, verify if it is in the cone of at least one generator of this + // for each generator in b, verify if it is in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { - // i b[j][0], than a[j'] can never dominate b[i] for all j' > j. + if (!a.multi_filtration_[j].empty() && !b.is_nan() && a.multi_filtration_[j][0] > b.multi_filtration_[i][0]) + return false; isContained = _contains(a.multi_filtration_[j], b.multi_filtration_[i]); } if (!isContained) return false; @@ -395,11 +407,8 @@ class Multi_critical_filtration { * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is equal to \f$ b[i] \f$. */ friend bool operator==(const Multi_critical_filtration &a, const Multi_critical_filtration &b) { - if (a.num_generators() != b.num_generators()) return false; - for (auto i = 0u; i < a.num_generators(); i++) { - if (a[i] != b[i]) return false; - } - return true; + // assumes lexicographical order for both + return a.multi_filtration_ == b.multi_filtration_; } /** @@ -419,6 +428,9 @@ class Multi_critical_filtration { * non empty generators in the container. Make sure to fill them with real generators or to remove them before * using those methods. * + * @warning Be sure to call @ref simplify if necessary after setting all the generators. Most methods will have an + * undefined behaviour if the set of generators is not minimal or sorted. + * * @param n New number of generators. */ void set_num_generators(std::size_t n) { @@ -436,12 +448,12 @@ class Multi_critical_filtration { * @param x The target filtration value towards which to push. */ void push_to_least_common_upper_bound(const Generator &x) { - if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; + if (this->is_plus_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; - GUDHI_CHECK(x.is_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), + GUDHI_CHECK(x.is_plus_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), "Pushing to a filtration value with different number of parameters."); - if (x.is_inf() || this->is_minus_inf()) { + if (x.is_plus_inf() || this->is_minus_inf()) { multi_filtration_ = {x}; return; } @@ -463,12 +475,12 @@ class Multi_critical_filtration { * @param x The target filtration value towards which to pull. */ void pull_to_greatest_common_lower_bound(const Generator &x) { - if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; + if (x.is_plus_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; GUDHI_CHECK(x.is_minus_inf() || x.num_parameters() == multi_filtration_[0].num_parameters() || !is_finite(), "Pulling to a filtration value with different number of parameters."); - if (this->is_inf() || x.is_minus_inf()) { + if (this->is_plus_inf() || x.is_minus_inf()) { multi_filtration_ = {x}; return; } @@ -498,6 +510,7 @@ class Multi_critical_filtration { if (_generator_can_be_added(x, 0, end)) { multi_filtration_.resize(end); multi_filtration_.push_back(x); + std::sort(multi_filtration_.begin(), multi_filtration_.end(), Is_strictly_smaller_lexicographically()); return true; } @@ -520,8 +533,10 @@ class Multi_critical_filtration { /** * @brief Projects the filtration value into the given grid. If @p coordinate is false, the entries are set to - * the nearest upper bound value with the same parameter in the grid. Otherwise, the entries are set to the indices - * of those nearest upper bound values. + * the nearest upper bound value with the same parameter in the grid and the new generators are simplified and + * ordered. Otherwise, the entries are set to the indices of those nearest upper bound values. In this case, + * no simplification or sort are done, such that the new coordinates have a one by one correspondence with the + * positions of the old generators. * The grid has to be represented as a vector of ordered ranges of values convertible into `T`. An index * \f$ i \f$ of the vector corresponds to the same parameter as the index \f$ i \f$ in a generator. * The ranges correspond to the possible values of the parameters, ordered by increasing value, forming therefore @@ -557,15 +572,17 @@ class Multi_critical_filtration { multi_filtration_.erase(std::remove_if(multi_filtration_.begin(), multi_filtration_.end(), [include_infinities](const Generator &a) { return a.empty() || - ((include_infinities) && (a.is_inf() || a.is_minus_inf())); + ((include_infinities) && (a.is_plus_inf() || a.is_minus_inf())); }), multi_filtration_.end()); - if (multi_filtration_.empty()) multi_filtration_.push_back(Generator{get_default_value()}); + std::sort(multi_filtration_.begin(), multi_filtration_.end(), Is_strictly_smaller_lexicographically()); + if (multi_filtration_.empty()) multi_filtration_.push_back(Generator{_get_default_value()}); } /** - * @brief Simplifies the current set of generators such that it becomes minimal. Only necessary if generators were - * added "by hand" either trough the constructor or with @ref add_guaranteed_generator "". + * @brief Simplifies the current set of generators such that it becomes minimal. Also orders it in increasing + * lexicographical order. Only necessary if generators were added "by hand" without verification either trough the + * constructor or with @ref add_guaranteed_generator "", etc. */ void simplify() { std::size_t end = 0; @@ -578,6 +595,7 @@ class Multi_critical_filtration { } multi_filtration_.resize(end); + std::sort(multi_filtration_.begin(), multi_filtration_.end(), Is_strictly_smaller_lexicographically()); } // FONCTIONNALITIES @@ -591,7 +609,7 @@ class Multi_critical_filtration { Generator result(f.num_parameters(), Generator::T_inf); for (const auto &g : f) { if (g.is_nan() || g.is_minus_inf()) return g; - if (g.is_inf()) continue; + if (g.is_plus_inf()) continue; for (std::size_t i = 0; i < f.num_parameters(); ++i) { result[i] = std::min(result[i], g[i]); } @@ -607,7 +625,7 @@ class Multi_critical_filtration { if (f.num_generators() == 0) return Generator(); Generator result(f.num_parameters(), -Generator::T_inf); for (auto &g : f) { - if (g.is_nan() || g.is_inf()) return g; + if (g.is_nan() || g.is_plus_inf()) return g; if (g.is_minus_inf()) continue; for (std::size_t i = 0; i < g.num_parameters(); ++i) { result[i] = std::max(result[i], g[i]); @@ -701,7 +719,7 @@ class Multi_critical_filtration { * @brief Outstream operator. */ friend std::ostream &operator<<(std::ostream &stream, const Multi_critical_filtration &f) { - if (f.is_inf()) { + if (f.is_plus_inf()) { stream << "[inf, ..., inf]"; return stream; } @@ -734,9 +752,26 @@ class Multi_critical_filtration { private: Generators multi_filtration_; /**< Container for generators. */ - constexpr static T get_default_value() { return co ? Generator::T_inf : -Generator::T_inf; } + struct Is_strictly_smaller_lexicographically { + //assumes both generators have the same length if not infinite/nan. + bool operator()(const Generator &g1, const Generator &g2) { + if (g1.is_nan() || g2.is_nan()) return !g1.is_nan(); + if (g1.is_plus_inf()) return false; + if (g2.is_plus_inf()) return true; + if (g1.is_minus_inf()) return false; + if (g2.is_minus_inf()) return true; + + // g1 and g2 have to finite and of the same size + for (std::size_t i = 0; i < g1.size(); ++i) { + if (g1[i] != g2[i]) return g1[i] < g2[i]; + } + return false; + } + }; + + constexpr static T _get_default_value() { return co ? Generator::T_inf : -Generator::T_inf; } - constexpr static Generators get_default_filtration_value() { return Generators{Generator{get_default_value()}}; } + constexpr static Generators _get_default_filtration_value() { return Generators{Generator{_get_default_value()}}; } /** * @brief Verifies if @p b is strictly contained in the positive cone originating in `a`. @@ -794,8 +829,9 @@ class Multi_critical_filtration { // assumes between 'curr' and 'end' everything is simplified: // no nan values and if there is an inf/-inf, then 'end - curr == 1' + // modifies multi_filtration_ only if true is returned. bool _generator_can_be_added(const Generator &x, std::size_t curr, std::size_t &end) { - if (x.empty() || x.is_nan() || (x.is_inf() && end - curr != 0)) return false; + if (x.empty() || x.is_nan() || (x.is_plus_inf() && end - curr != 0)) return false; if (x.is_minus_inf()) { if (end - curr == 1 && multi_filtration_[curr].is_minus_inf()) return false; diff --git a/src/Multi_filtration/include/gudhi/One_critical_filtration.h b/src/Multi_filtration/include/gudhi/One_critical_filtration.h index 010c966735..8b44fbfcb0 100644 --- a/src/Multi_filtration/include/gudhi/One_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/One_critical_filtration.h @@ -99,7 +99,7 @@ class One_critical_filtration : public std::vector { * * @warning If @p value is `inf`, `-inf`, or `NaN`, the vector `{value, value, ...}` with \f$ n > 1 \f$ entries * is not wrong but will not be considered as respectively "infinity", "minus infinity" or "NaN" (the corresponding - * methods @ref is_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use + * methods @ref is_plus_inf(), @ref is_minus_inf() and @ref is_nan() will return false). For this purpose, please use * the static methods @ref inf(), @ref minus_inf() and @ref nan() instead. * * @param n Number of parameters. @@ -142,14 +142,6 @@ class One_critical_filtration : public std::vector { typename std::vector::const_iterator it_end) : Base(it_begin, it_end) {}; - /** - * @brief Assign operator. - */ - One_critical_filtration &operator=(const One_critical_filtration &a) { - Base::operator=(a); - return *this; - } - // HERITAGE using std::vector::operator[]; /**< Inheritance of entry access. */ @@ -157,16 +149,6 @@ class One_critical_filtration : public std::vector { // CONVERTERS - /** - * @brief Cast into `std::vector &`. - */ - operator std::vector &() const { return *this; } - - /** - * @brief Cast into `std::vector`. - */ - operator std::vector() const { return static_cast >(*this); } - // like numpy /** * @brief Returns a copy with entries casted into the type given as template parameter. @@ -193,7 +175,7 @@ class One_critical_filtration : public std::vector { std::size_t num_parameters() const { return Base::size(); } /** - * @brief Returns a filtration value for which @ref is_inf() returns `true`. + * @brief Returns a filtration value for which @ref is_plus_inf() returns `true`. * * @return Infinity. */ @@ -226,7 +208,7 @@ class One_critical_filtration : public std::vector { /** * @brief Returns `true` if and only if the filtration value is considered as infinity. */ - bool is_inf() const { + bool is_plus_inf() const { if (Base::size() != 1) return false; return (Base::operator[](0) == T_inf); } @@ -273,8 +255,8 @@ class One_critical_filtration : public std::vector { * does **not** imply \f$ a == b \f$. */ friend bool operator<(const One_critical_filtration &a, const One_critical_filtration &b) { - if (a.is_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; - if (b.is_inf() || a.is_minus_inf()) return true; + if (a.is_plus_inf() || a.is_nan() || b.is_nan() || b.is_minus_inf()) return false; + if (b.is_plus_inf() || a.is_minus_inf()) return true; bool isSame = true; auto n = a.size(); GUDHI_CHECK(a.size() == b.size(), "Two filtration values with different number of parameters are not comparable."); @@ -294,8 +276,8 @@ class One_critical_filtration : public std::vector { */ friend bool operator<=(const One_critical_filtration &a, const One_critical_filtration &b) { if (a.is_nan() || b.is_nan()) return false; - if (b.is_inf() || a.is_minus_inf()) return true; - if (a.is_inf() || b.is_minus_inf()) return false; + if (b.is_plus_inf() || a.is_minus_inf()) return true; + if (a.is_plus_inf() || b.is_minus_inf()) return false; auto n = a.size(); GUDHI_CHECK(a.size() == b.size(), "Two filtration values with different number of parameters are not comparable."); for (std::size_t i = 0u; i < n; ++i) { @@ -326,11 +308,7 @@ class One_critical_filtration : public std::vector { * @brief Returns `true` if and only if for each \f$ i \f$, \f$ a[i] \f$ is equal to \f$ b[i] \f$. */ friend bool operator==(const One_critical_filtration &a, const One_critical_filtration &b) { - if (a.num_parameters() != b.num_parameters()) return false; - for (auto i = 0u; i < a.num_parameters(); i++) { - if (a[i] != b[i]) return false; - } - return true; + return static_cast(a) == static_cast(b); } /** @@ -448,16 +426,16 @@ class One_critical_filtration : public std::vector { const One_critical_filtration &to_subtract) { if (result.empty()) return result; - if (result.is_nan() || to_subtract.is_nan() || (result.is_inf() && to_subtract.is_inf()) || + if (result.is_nan() || to_subtract.is_nan() || (result.is_plus_inf() && to_subtract.is_plus_inf()) || (result.is_minus_inf() && to_subtract.is_minus_inf())) { result = nan(); return result; } - if (result.is_inf() || to_subtract.is_minus_inf()) { + if (result.is_plus_inf() || to_subtract.is_minus_inf()) { result = inf(); return result; } - if (result.is_minus_inf() || to_subtract.is_inf()) { + if (result.is_minus_inf() || to_subtract.is_plus_inf()) { result = minus_inf(); return result; } @@ -488,12 +466,12 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator-=(One_critical_filtration &result, const T &to_subtract) { if (result.empty()) return result; - if (result.is_nan() || is_nan_(to_subtract) || (result.is_inf() && to_subtract == T_inf) || + if (result.is_nan() || is_nan_(to_subtract) || (result.is_plus_inf() && to_subtract == T_inf) || (result.is_minus_inf() && to_subtract == -T_inf)) { result = nan(); return result; } - if (result.is_inf() || to_subtract == -T_inf) { + if (result.is_plus_inf() || to_subtract == -T_inf) { result = inf(); return result; } @@ -583,12 +561,12 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator+=(One_critical_filtration &result, const One_critical_filtration &to_add) { if (result.empty()) return result; - if (result.is_nan() || to_add.is_nan() || (result.is_inf() && to_add.is_minus_inf()) || - (result.is_minus_inf() && to_add.is_inf())) { + if (result.is_nan() || to_add.is_nan() || (result.is_plus_inf() && to_add.is_minus_inf()) || + (result.is_minus_inf() && to_add.is_plus_inf())) { result = nan(); return result; } - if (result.is_inf() || to_add.is_inf()) { + if (result.is_plus_inf() || to_add.is_plus_inf()) { result = inf(); return result; } @@ -621,12 +599,12 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator+=(One_critical_filtration &result, const T &to_add) { if (result.empty()) return result; - if (result.is_nan() || is_nan_(to_add) || (result.is_inf() && to_add == -T_inf) || + if (result.is_nan() || is_nan_(to_add) || (result.is_plus_inf() && to_add == -T_inf) || (result.is_minus_inf() && to_add == T_inf)) { result = nan(); return result; } - if (result.is_inf() || to_add == T_inf) { + if (result.is_plus_inf() || to_add == T_inf) { result = inf(); return result; } @@ -737,8 +715,8 @@ class One_critical_filtration : public std::vector { return result; } - bool res_is_infinite = result.is_inf() || result.is_minus_inf(); - bool to_mul_is_infinite = to_mul.is_inf() || to_mul.is_minus_inf(); + bool res_is_infinite = result.is_plus_inf() || result.is_minus_inf(); + bool to_mul_is_infinite = to_mul.is_plus_inf() || to_mul.is_minus_inf(); if (res_is_infinite && to_mul_is_infinite) { if (to_mul.is_minus_inf()) { @@ -787,7 +765,7 @@ class One_critical_filtration : public std::vector { return result; } - if (result.is_inf() || result.is_minus_inf()) { + if (result.is_plus_inf() || result.is_minus_inf()) { if (to_mul == 0) result = nan(); else if (to_mul < 0) @@ -908,8 +886,8 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator/=(One_critical_filtration &result, const One_critical_filtration &to_div) { if (result.empty()) return result; - bool res_is_infinite = result.is_inf() || result.is_minus_inf(); - bool to_div_is_infinite = to_div.is_inf() || to_div.is_minus_inf(); + bool res_is_infinite = result.is_plus_inf() || result.is_minus_inf(); + bool to_div_is_infinite = to_div.is_plus_inf() || to_div.is_minus_inf(); if (result.is_nan() || to_div.is_nan() || (res_is_infinite && to_div_is_infinite)) { result = nan(); @@ -955,7 +933,7 @@ class One_critical_filtration : public std::vector { friend One_critical_filtration &operator/=(One_critical_filtration &result, const T &to_div) { if (result.empty()) return result; - bool res_is_infinite = result.is_inf() || result.is_minus_inf(); + bool res_is_infinite = result.is_plus_inf() || result.is_minus_inf(); bool to_div_is_infinite = to_div == T_inf || to_div == -T_inf; if (to_div == 0 || is_nan_(to_div) || result.is_nan() || (res_is_infinite && to_div_is_infinite)) { @@ -983,8 +961,8 @@ class One_critical_filtration : public std::vector { * @param x The target filtration value towards which to push. */ void push_to_least_common_upper_bound(const One_critical_filtration &x) { - if (this->is_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; - if (x.is_inf() || this->is_minus_inf()) { + if (this->is_plus_inf() || this->is_nan() || x.is_nan() || x.is_minus_inf()) return; + if (x.is_plus_inf() || this->is_minus_inf()) { *this = x; return; } @@ -1006,8 +984,8 @@ class One_critical_filtration : public std::vector { * @param x The target filtration value towards which to pull. */ void pull_to_greatest_common_lower_bound(const One_critical_filtration &x) { - if (x.is_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; - if (this->is_inf() || x.is_minus_inf()) { + if (x.is_plus_inf() || this->is_nan() || x.is_nan() || this->is_minus_inf()) return; + if (this->is_plus_inf() || x.is_minus_inf()) { *this = x; return; } @@ -1166,7 +1144,7 @@ class One_critical_filtration : public std::vector { * @brief Outstream operator. */ friend std::ostream &operator<<(std::ostream &stream, const One_critical_filtration &f) { - if (f.is_inf()) { + if (f.is_plus_inf()) { stream << "[inf, ..., inf]"; return stream; } @@ -1186,7 +1164,7 @@ class One_critical_filtration : public std::vector { for (std::size_t i = 0; i < f.size() - 1; i++) { stream << f[i] << ", "; } - if (!f.empty()) stream << f.back(); + stream << f.back(); stream << "]"; return stream; } diff --git a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp index a57db77185..8fd28d4f44 100644 --- a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp @@ -121,19 +121,19 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_utilities, T, list_of_te BOOST_CHECK(f2[0][1] == 1.); BOOST_CHECK(f2[0][2] == 2.); - BOOST_CHECK(!f.is_inf()); + BOOST_CHECK(!f.is_plus_inf()); BOOST_CHECK(!f.is_minus_inf()); BOOST_CHECK(!f.is_nan()); BOOST_CHECK(f.is_finite()); Multi_critical_filtration f31; - BOOST_CHECK(!f31.is_inf()); + BOOST_CHECK(!f31.is_plus_inf()); BOOST_CHECK(f31.is_minus_inf()); BOOST_CHECK(!f31.is_nan()); BOOST_CHECK(!f31.is_finite()); Multi_critical_filtration f32; - BOOST_CHECK(f32.is_inf()); + BOOST_CHECK(f32.is_plus_inf()); BOOST_CHECK(!f32.is_minus_inf()); BOOST_CHECK(!f32.is_nan()); BOOST_CHECK(!f32.is_finite()); @@ -142,25 +142,25 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_utilities, T, list_of_te //the idea is just to reserve space and to give the possibility to use `f4[i] =` //if the value should really be -inf, use `f4(1)` or `f4 = minus_inf()` instead. Multi_critical_filtration f4(3); - BOOST_CHECK(!f4.is_inf()); + BOOST_CHECK(!f4.is_plus_inf()); BOOST_CHECK(!f4.is_minus_inf()); BOOST_CHECK(!f4.is_nan()); BOOST_CHECK(f4.is_finite()); Multi_critical_filtration f5(1); - BOOST_CHECK(!f5.is_inf()); + BOOST_CHECK(!f5.is_plus_inf()); BOOST_CHECK(f5.is_minus_inf()); BOOST_CHECK(!f5.is_nan()); BOOST_CHECK(!f5.is_finite()); auto f6 = Multi_critical_filtration::nan(); - BOOST_CHECK(!f6.is_inf()); + BOOST_CHECK(!f6.is_plus_inf()); BOOST_CHECK(!f6.is_minus_inf()); BOOST_CHECK(f6.is_nan()); BOOST_CHECK(!f6.is_finite()); auto f7 = Multi_critical_filtration::inf(); - BOOST_CHECK(f7.is_inf()); + BOOST_CHECK(f7.is_plus_inf()); BOOST_CHECK(!f7.is_minus_inf()); BOOST_CHECK(!f7.is_nan()); BOOST_CHECK(!f7.is_finite()); @@ -168,10 +168,10 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_utilities, T, list_of_te BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_comparators, T, list_of_tested_variants) { - Multi_critical_filtration f1({{0, 1, 2}, {-1, 4, 5}}); - Multi_critical_filtration f2({{-2, 0, 1}, {-5, 0, 0}, {-2, -5, -1}}); + Multi_critical_filtration f1({{-1, 4, 5}, {0, 1, 2}}); + Multi_critical_filtration f2({{-5, 0, 0}, {-2, -5, -1}, {-2, 0, 1}}); Multi_critical_filtration f3({4, 5, 6}); - Multi_critical_filtration f4({{0, 0, 1}, {-4, 5, 6}}); + Multi_critical_filtration f4({{-4, 5, 6}, {0, 0, 1}}); BOOST_CHECK(!(f1 < f1)); BOOST_CHECK(!(f1 < f2)); @@ -224,43 +224,43 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_comparators, T, list_of_ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_modifiers, T, list_of_tested_variants) { - Multi_critical_filtration f({{0, 1, 2}, {-3, 1, 7}}); - BOOST_CHECK_EQUAL(f[0][0], 0); + Multi_critical_filtration f({{-3, 1, 7}, {0, 1, 2}}); + BOOST_CHECK_EQUAL(f[0][0], -3); BOOST_CHECK_EQUAL(f[0][1], 1); - BOOST_CHECK_EQUAL(f[0][2], 2); - BOOST_CHECK_EQUAL(f[1][0], -3); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], 0); BOOST_CHECK_EQUAL(f[1][1], 1); - BOOST_CHECK_EQUAL(f[1][2], 7); + BOOST_CHECK_EQUAL(f[1][2], 2); f.push_to_least_common_upper_bound({-1, 5, 6}); - BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][0], -1); BOOST_CHECK_EQUAL(f[0][1], 5); - BOOST_CHECK_EQUAL(f[0][2], 6); - BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], 0); BOOST_CHECK_EQUAL(f[1][1], 5); - BOOST_CHECK_EQUAL(f[1][2], 7); + BOOST_CHECK_EQUAL(f[1][2], 6); f.push_to_least_common_upper_bound({-1, -5, -6}); - BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][0], -1); BOOST_CHECK_EQUAL(f[0][1], 5); - BOOST_CHECK_EQUAL(f[0][2], 6); - BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], 0); BOOST_CHECK_EQUAL(f[1][1], 5); - BOOST_CHECK_EQUAL(f[1][2], 7); + BOOST_CHECK_EQUAL(f[1][2], 6); f.push_to_least_common_upper_bound(Multi_critical_filtration::Generator::minus_inf()); - BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][0], -1); BOOST_CHECK_EQUAL(f[0][1], 5); - BOOST_CHECK_EQUAL(f[0][2], 6); - BOOST_CHECK_EQUAL(f[1][0], -1); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], 0); BOOST_CHECK_EQUAL(f[1][1], 5); - BOOST_CHECK_EQUAL(f[1][2], 7); + BOOST_CHECK_EQUAL(f[1][2], 6); f.push_to_least_common_upper_bound(Multi_critical_filtration::Generator::inf()); - BOOST_CHECK(f.is_inf()); + BOOST_CHECK(f.is_plus_inf()); f.push_to_least_common_upper_bound(Multi_critical_filtration::Generator::nan()); - BOOST_CHECK(f.is_inf()); + BOOST_CHECK(f.is_plus_inf()); f.pull_to_greatest_common_lower_bound({-1, 5, 6}); BOOST_CHECK_EQUAL(f[0][0], -1); @@ -311,12 +311,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK(res); BOOST_CHECK_EQUAL(f.num_generators(), 2); BOOST_CHECK_EQUAL(f.num_parameters(), 3); - BOOST_CHECK_EQUAL(f[0][0], 0); + BOOST_CHECK_EQUAL(f[0][0], -3); BOOST_CHECK_EQUAL(f[0][1], 1); - BOOST_CHECK_EQUAL(f[0][2], 2); - BOOST_CHECK_EQUAL(f[1][0], -3); + BOOST_CHECK_EQUAL(f[0][2], 7); + BOOST_CHECK_EQUAL(f[1][0], 0); BOOST_CHECK_EQUAL(f[1][1], 1); - BOOST_CHECK_EQUAL(f[1][2], 7); + BOOST_CHECK_EQUAL(f[1][2], 2); res = f.add_generator({-1, -2, -3}); BOOST_CHECK(res); @@ -382,17 +382,16 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f2[0][0], 0); BOOST_CHECK_EQUAL(f2[0][1], 1); BOOST_CHECK_EQUAL(f2[0][2], 2); - BOOST_CHECK(f2[1].is_inf()); - BOOST_CHECK_EQUAL(f2[2][0], 0); - BOOST_CHECK_EQUAL(f2[2][1], 1); - BOOST_CHECK_EQUAL(f2[2][2], 2); + BOOST_CHECK_EQUAL(f2[1][0], 0); + BOOST_CHECK_EQUAL(f2[1][1], 1); + BOOST_CHECK_EQUAL(f2[1][2], 2); + BOOST_CHECK(f2[2].is_minus_inf()); + BOOST_CHECK(f2[3].is_plus_inf()); if constexpr (std::numeric_limits::has_quiet_NaN){ BOOST_CHECK_EQUAL(f2.num_generators(), 5); - BOOST_CHECK(f2[3].is_nan()); - BOOST_CHECK(f2[4].is_minus_inf()); + BOOST_CHECK(f2[4].is_nan()); } else { BOOST_CHECK_EQUAL(f2.num_generators(), 4); - BOOST_CHECK(f2[3].is_minus_inf()); } Multi_critical_filtration f3(v); @@ -455,7 +454,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_friends, T, list_of_test BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_numerical_limits, T, list_of_tested_variants) { BOOST_CHECK(std::numeric_limits >::has_infinity); - BOOST_CHECK(std::numeric_limits >::infinity().is_inf()); + BOOST_CHECK(std::numeric_limits >::infinity().is_plus_inf()); BOOST_CHECK(std::numeric_limits >::quiet_NaN().is_nan()); BOOST_CHECK_THROW(std::numeric_limits >::max(), std::logic_error); auto max = std::numeric_limits >::max(2, 3); diff --git a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp index db740613b3..b7924405be 100644 --- a/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_onecritical_unit_test.cpp @@ -83,13 +83,13 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_utilities, T, list_of_test BOOST_CHECK(f2[1] == 1.); BOOST_CHECK(f2[2] == 2.); - BOOST_CHECK(!f.is_inf()); + BOOST_CHECK(!f.is_plus_inf()); BOOST_CHECK(!f.is_minus_inf()); BOOST_CHECK(!f.is_nan()); BOOST_CHECK(f.is_finite()); One_critical_filtration f3; - BOOST_CHECK(!f3.is_inf()); + BOOST_CHECK(!f3.is_plus_inf()); BOOST_CHECK(f3.is_minus_inf()); BOOST_CHECK(!f3.is_nan()); BOOST_CHECK(!f3.is_finite()); @@ -98,25 +98,25 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_utilities, T, list_of_test //the idea is just to reserve space and to give the possibility to use `f4[i] =` //if the value should really be -inf, use `f4(1)` or `f4 = minus_inf()` instead. One_critical_filtration f4(3); - BOOST_CHECK(!f4.is_inf()); + BOOST_CHECK(!f4.is_plus_inf()); BOOST_CHECK(!f4.is_minus_inf()); BOOST_CHECK(!f4.is_nan()); BOOST_CHECK(f4.is_finite()); One_critical_filtration f5(1); - BOOST_CHECK(!f5.is_inf()); + BOOST_CHECK(!f5.is_plus_inf()); BOOST_CHECK(f5.is_minus_inf()); BOOST_CHECK(!f5.is_nan()); BOOST_CHECK(!f5.is_finite()); auto f6 = One_critical_filtration::nan(); - BOOST_CHECK(!f6.is_inf()); + BOOST_CHECK(!f6.is_plus_inf()); BOOST_CHECK(!f6.is_minus_inf()); BOOST_CHECK(f6.is_nan()); BOOST_CHECK(!f6.is_finite()); auto f7 = One_critical_filtration::inf(); - BOOST_CHECK(f7.is_inf()); + BOOST_CHECK(f7.is_plus_inf()); BOOST_CHECK(!f7.is_minus_inf()); BOOST_CHECK(!f7.is_nan()); BOOST_CHECK(!f7.is_finite()); @@ -192,7 +192,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_operators, T, list_of_test BOOST_CHECK_EQUAL(res[1], 0); BOOST_CHECK_EQUAL(res[2], -1); BOOST_CHECK((-One_critical_filtration::inf()).is_minus_inf()); - BOOST_CHECK((-One_critical_filtration::minus_inf()).is_inf()); + BOOST_CHECK((-One_critical_filtration::minus_inf()).is_plus_inf()); BOOST_CHECK((-One_critical_filtration::nan()).is_nan()); res = f - f2; @@ -221,8 +221,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_operators, T, list_of_test BOOST_CHECK_EQUAL(res[2], -4); BOOST_CHECK((f - One_critical_filtration::inf()).is_minus_inf()); - BOOST_CHECK((One_critical_filtration::inf() - f).is_inf()); - BOOST_CHECK((f - One_critical_filtration::minus_inf()).is_inf()); + BOOST_CHECK((One_critical_filtration::inf() - f).is_plus_inf()); + BOOST_CHECK((f - One_critical_filtration::minus_inf()).is_plus_inf()); BOOST_CHECK((One_critical_filtration::minus_inf() - f).is_minus_inf()); BOOST_CHECK((f - One_critical_filtration::nan()).is_nan()); BOOST_CHECK((One_critical_filtration::nan() - f).is_nan()); @@ -254,8 +254,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_operators, T, list_of_test BOOST_CHECK_EQUAL(res[1], 5); BOOST_CHECK_EQUAL(res[2], 6); - BOOST_CHECK((f + One_critical_filtration::inf()).is_inf()); - BOOST_CHECK((One_critical_filtration::inf() + f).is_inf()); + BOOST_CHECK((f + One_critical_filtration::inf()).is_plus_inf()); + BOOST_CHECK((One_critical_filtration::inf() + f).is_plus_inf()); BOOST_CHECK((f + One_critical_filtration::minus_inf()).is_minus_inf()); BOOST_CHECK((One_critical_filtration::minus_inf() + f).is_minus_inf()); BOOST_CHECK((f + One_critical_filtration::nan()).is_nan()); @@ -330,7 +330,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_operators, T, list_of_test BOOST_CHECK(res.is_nan()); res = f3 * f3; - BOOST_CHECK(res.is_inf()); + BOOST_CHECK(res.is_plus_inf()); res = f3 * f4; BOOST_CHECK(res.is_minus_inf()); @@ -427,10 +427,10 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_modifiers, T, list_of_test BOOST_CHECK_EQUAL(f[2], 6); f.push_to_least_common_upper_bound(One_critical_filtration::inf()); - BOOST_CHECK(f.is_inf()); + BOOST_CHECK(f.is_plus_inf()); f.push_to_least_common_upper_bound(One_critical_filtration::nan()); - BOOST_CHECK(f.is_inf()); + BOOST_CHECK(f.is_plus_inf()); f.pull_to_greatest_common_lower_bound({-1, 5, 6}); BOOST_CHECK_EQUAL(f[0], -1); @@ -493,7 +493,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_friends, T, list_of_tested BOOST_AUTO_TEST_CASE_TEMPLATE(one_critical_filtration_numerical_limits, T, list_of_tested_variants) { BOOST_CHECK(std::numeric_limits >::has_infinity); - BOOST_CHECK(std::numeric_limits >::infinity().is_inf()); + BOOST_CHECK(std::numeric_limits >::infinity().is_plus_inf()); BOOST_CHECK(std::numeric_limits >::quiet_NaN().is_nan()); BOOST_CHECK_THROW(std::numeric_limits >::max(), std::logic_error); auto max = std::numeric_limits >::max(3); diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h index e93442db20..2f90f4d99a 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Box.h @@ -61,7 +61,7 @@ class Box { * * @param box Pair of corners defining the wished box. */ - Box(const std::pair &box) : lowerCorner_(box.first), upperCorner_(box.second) {} + Box(const std::pair &box) : Box(box.first, box.second) {} /** * @brief Returns the lowest of both defining corners. @@ -103,7 +103,7 @@ class Box { */ bool is_trivial() const { return lowerCorner_.empty() || upperCorner_.empty() || lowerCorner_.is_nan() || upperCorner_.is_nan() || - (lowerCorner_.is_inf() && upperCorner_.is_inf()) || + (lowerCorner_.is_plus_inf() && upperCorner_.is_plus_inf()) || (lowerCorner_.is_minus_inf() && upperCorner_.is_minus_inf()) || (lowerCorner_.is_finite() && upperCorner_.is_finite() && lowerCorner_.num_parameters() != upperCorner_.num_parameters()); @@ -116,7 +116,7 @@ class Box { */ bool contains(const Point &point) const { if (point.is_nan() || is_trivial()) return false; - if (point.is_inf()) return upperCorner_.is_inf(); + if (point.is_plus_inf()) return upperCorner_.is_plus_inf(); if (point.is_minus_inf()) return lowerCorner_.is_minus_inf(); if ((lowerCorner_.is_finite() && point.size() != lowerCorner_.size()) || @@ -134,7 +134,7 @@ class Box { */ std::size_t dimension() const { if (is_trivial()) return 0; - if (lowerCorner_.is_minus_inf() && upperCorner_.is_inf()) return 0; // not so sure what we want to do here + if (lowerCorner_.is_minus_inf() && upperCorner_.is_plus_inf()) return 0; // not so sure what we want to do here return lowerCorner_.is_finite() ? lowerCorner_.size() : upperCorner_.size(); } diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index 4f52d141a1..702ab958aa 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -134,7 +134,7 @@ class Line { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf() || x.is_nan()) return inf; + if (x.is_plus_inf() || x.is_nan()) return inf; if (x.is_minus_inf()) return -inf; U t = -inf; if (direction_.size()) { @@ -163,7 +163,7 @@ class Line { U compute_forward_intersection(const K_critical_point &x) const { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf() || x.is_nan()) return inf; + if (x.is_plus_inf() || x.is_nan()) return inf; if (x.is_minus_inf()) return -inf; U t = inf; for (const auto &y : x) { @@ -183,7 +183,7 @@ class Line { U compute_backward_intersection(const Point &x) const { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf()) return inf; + if (x.is_plus_inf()) return inf; if (x.is_minus_inf() || x.is_nan()) return -inf; U t = inf; @@ -212,7 +212,7 @@ class Line { U compute_backward_intersection(const K_critical_point &x) const { constexpr const U inf = std::numeric_limits::has_infinity ? std::numeric_limits::infinity() : std::numeric_limits::max(); - if (x.is_inf()) return inf; + if (x.is_plus_inf()) return inf; if (x.is_minus_inf() || x.is_nan()) return -inf; U t = -inf; for (const auto &y : x) { diff --git a/src/Multi_persistence/test/multipersistence_box_unit_test.cpp b/src/Multi_persistence/test/multipersistence_box_unit_test.cpp index 5bda24785c..353df8aebe 100644 --- a/src/Multi_persistence/test/multipersistence_box_unit_test.cpp +++ b/src/Multi_persistence/test/multipersistence_box_unit_test.cpp @@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(box_other, T, list_of_tested_variants) BOOST_CHECK_EQUAL(bottom[0], -4); BOOST_CHECK_EQUAL(bottom[1], -3); BOOST_CHECK_EQUAL(bottom[2], -2); - BOOST_CHECK(top.is_inf()); + BOOST_CHECK(top.is_plus_inf()); bottom = P::minus_inf(); top = {4,5,6}; @@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(box_other, T, list_of_tested_variants) b.inflate(2); BOOST_CHECK(bottom.is_minus_inf()); - BOOST_CHECK(top.is_inf()); + BOOST_CHECK(top.is_plus_inf()); } diff --git a/src/Multi_persistence/test/multipersistence_line_unit_test.cpp b/src/Multi_persistence/test/multipersistence_line_unit_test.cpp index 8b8344337c..6450fb3854 100644 --- a/src/Multi_persistence/test/multipersistence_line_unit_test.cpp +++ b/src/Multi_persistence/test/multipersistence_line_unit_test.cpp @@ -100,8 +100,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(line_intersections, T, list_of_tested_variants) BOOST_CHECK_EQUAL(top[2], T(3. + T(7. / 6.) * 6.)); bounds = l.get_bounds({{-10, 0, 10}, {10, 1, 10}}); - BOOST_CHECK(bounds.first.is_inf()); - BOOST_CHECK(bounds.second.is_inf()); + BOOST_CHECK(bounds.first.is_plus_inf()); + BOOST_CHECK(bounds.second.is_plus_inf()); } BOOST_AUTO_TEST_CASE_TEMPLATE(line_other, T, list_of_tested_variants) diff --git a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp index 972b34037c..09d21ca145 100644 --- a/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp +++ b/src/Simplex_tree/test/simplex_tree_multi_unit_test.cpp @@ -9,7 +9,6 @@ */ #include -#include #include #include #include // std::pair, std::make_pair @@ -932,7 +931,7 @@ BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi_nan_values) { Stree_multi st; BOOST_CHECK(std::numeric_limits::quiet_NaN().is_nan()); - BOOST_CHECK(std::numeric_limits::infinity().is_inf()); + BOOST_CHECK(std::numeric_limits::infinity().is_plus_inf()); st.insert_simplex_and_subfaces({2, 1, 0}, {1.,2.,3.}); st.insert_simplex_and_subfaces({3, 0}, {1.,2.,3.}); @@ -976,7 +975,7 @@ BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing_on_multi_nan_values) { bool is_zero = dim == 0 && contains0; std::clog << "Filtration: " << filt << std::endl; if (is_zero) BOOST_CHECK(filt.is_nan()); - else if (contains3) BOOST_CHECK(filt.is_inf()); + else if (contains3) BOOST_CHECK(filt.is_plus_inf()); else BOOST_CHECK(filt == OneCriticalFiltration({1.,2.,3.})); } } From c5263dc7b20e3539f30efd58d69a3b2f798968c5 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 5 Sep 2024 17:49:08 +0200 Subject: [PATCH 83/87] doc --- .../include/gudhi/Multi_critical_filtration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 03dac811ee..52ec1bf65b 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -348,7 +348,7 @@ class Multi_critical_filtration { // for each generator in b, verify if it is strictly in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { - // lexicographical order, so if a[j][0] >= b[j][0], than a[j'] can never strictly dominate b[i] for all j' > j. + // lexicographical order, so if a[j][0] >= b[j][0], than a[j'] can never strictly contain b[i] for all j' > j. if (!a.multi_filtration_[j].empty() && !b.is_nan() && a.multi_filtration_[j][0] >= b.multi_filtration_[i][0]) return false; isContained = _strictly_contains(a.multi_filtration_[j], b.multi_filtration_[i]); @@ -383,7 +383,7 @@ class Multi_critical_filtration { // for each generator in b, verify if it is in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { - // lexicographical order, so if a[j][0] > b[j][0], than a[j'] can never dominate b[i] for all j' > j. + // lexicographical order, so if a[j][0] > b[j][0], than a[j'] can never contain b[i] for all j' > j. if (!a.multi_filtration_[j].empty() && !b.is_nan() && a.multi_filtration_[j][0] > b.multi_filtration_[i][0]) return false; isContained = _contains(a.multi_filtration_[j], b.multi_filtration_[i]); From 732c2c398289ec65f953c3d53ca9590d08112c15 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Thu, 5 Sep 2024 18:02:20 +0200 Subject: [PATCH 84/87] co fix --- .../include/gudhi/Multi_critical_filtration.h | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 52ec1bf65b..8e665b47b7 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -348,9 +348,8 @@ class Multi_critical_filtration { // for each generator in b, verify if it is strictly in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { - // lexicographical order, so if a[j][0] >= b[j][0], than a[j'] can never strictly contain b[i] for all j' > j. - if (!a.multi_filtration_[j].empty() && !b.is_nan() && a.multi_filtration_[j][0] >= b.multi_filtration_[i][0]) - return false; + // lexicographical order, so if a[j][0] dom b[j][0], than a[j'] can never strictly contain b[i] for all j' > j. + if (_first_dominates(a.multi_filtration_[j], b.multi_filtration_[i])) return false; isContained = _strictly_contains(a.multi_filtration_[j], b.multi_filtration_[i]); } if (!isContained) return false; @@ -383,9 +382,8 @@ class Multi_critical_filtration { // for each generator in b, verify if it is in the cone of at least one generator of a bool isContained = false; for (std::size_t j = 0u; j < a.multi_filtration_.size() && !isContained; ++j) { - // lexicographical order, so if a[j][0] > b[j][0], than a[j'] can never contain b[i] for all j' > j. - if (!a.multi_filtration_[j].empty() && !b.is_nan() && a.multi_filtration_[j][0] > b.multi_filtration_[i][0]) - return false; + // lexicographical order, so if a[j][0] strictly dom b[j][0], than a[j'] can never contain b[i] for all j' > j. + if (_first_strictly_dominates(a.multi_filtration_[j], b.multi_filtration_[i])) return false; isContained = _contains(a.multi_filtration_[j], b.multi_filtration_[i]); } if (!isContained) return false; @@ -793,6 +791,22 @@ class Multi_critical_filtration { return a <= b; } } + + static bool _first_strictly_dominates(const Generator& a, const Generator& b){ + if constexpr (co){ + return !a.empty() && !b.empty() && a[0] < b[0]; + } else { + return !a.empty() && !b.empty() && a[0] > b[0]; + } + } + + static bool _first_dominates(const Generator& a, const Generator& b){ + if constexpr (co){ + return !a.empty() && !b.empty() && a[0] <= b[0]; + } else { + return !a.empty() && !b.empty() && a[0] >= b[0]; + } + } enum class Rel { EQUAL, DOMINATES, IS_DOMINATED, NONE }; From 0dd084c3271b938e4bd8f83dbf833ced1f523690 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Fri, 6 Sep 2024 16:16:07 +0200 Subject: [PATCH 85/87] minor fixes --- .../include/gudhi/Multi_critical_filtration.h | 6 ++++-- .../include/gudhi/Multi_persistence/Line.h | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 8e665b47b7..3ca198a185 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -240,8 +241,9 @@ class Multi_critical_filtration { * and if there is no generator, the method will segfault. */ operator Generator() { - GUDHI_CHECK(num_generators() == 1, "Casting a " + std::to_string(num_generators()) + - "-critical filtration value into an 1-critical filtration value."); + if (num_generators() != 1) + throw std::logic_error("Casting a " + std::to_string(num_generators()) + + "-critical filtration value into an 1-critical filtration value."); return multi_filtration_[0]; } diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index 702ab958aa..2afdabbbbf 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -82,6 +82,9 @@ class Line { * the number of coordinates. */ Point operator[](T t) const { + GUDHI_CHECK(direction_.empty() || direction_.size() == basePoint_.size(), + "Direction and base point do not have the same dimension."); + Point x(basePoint_.size()); if (direction_.size() > 0) { @@ -227,9 +230,10 @@ class Line { * @param box Box to intersect. * @return A pair representing the two bounding points of the intersection, such that the first element is the * smallest of the two. If the box and the line do not intersect, returns the pair {inf, inf}. + * If the box is trivial, returns {NaN, NaN}. */ std::pair get_bounds(const Box &box) const { - if (box.is_trivial()) return {Point::inf(), Point::inf()}; + if (box.is_trivial()) return {Point::nan(), Point::nan()}; T bottom = compute_forward_intersection(box.get_lower_corner()); T top = compute_backward_intersection(box.get_upper_corner()); From 02cb463db14c5966739d862a5dde1bb7d054ab9e Mon Sep 17 00:00:00 2001 From: hschreiber Date: Tue, 24 Sep 2024 14:04:48 +0200 Subject: [PATCH 86/87] small fixes --- .../include/gudhi/Multi_critical_filtration.h | 53 ++++++++++++++++--- ...ultifiltration_multicritical_unit_test.cpp | 5 ++ .../include/gudhi/Multi_persistence/Line.h | 20 ++++--- .../test/multipersistence_line_unit_test.cpp | 12 +++-- 4 files changed, 71 insertions(+), 19 deletions(-) diff --git a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h index 3ca198a185..5946690962 100644 --- a/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h +++ b/src/Multi_filtration/include/gudhi/Multi_critical_filtration.h @@ -247,6 +247,17 @@ class Multi_critical_filtration { return multi_filtration_[0]; } + /** + * @brief Casts the object into the type of a generator. + * @pre The filtration value is 1-critical. If there are more than one generator, only the first will be preserved + * and if there is no generator, the method will segfault. + */ + operator const Generator() const { + GUDHI_CHECK(num_generators() == 1, "Casting a " + std::to_string(num_generators()) + + "-critical filtration value into an 1-critical filtration value."); + return multi_filtration_[0]; + } + // like numpy /** * @brief Returns a copy with entries casted into the type given as template parameter. @@ -847,14 +858,42 @@ class Multi_critical_filtration { // no nan values and if there is an inf/-inf, then 'end - curr == 1' // modifies multi_filtration_ only if true is returned. bool _generator_can_be_added(const Generator &x, std::size_t curr, std::size_t &end) { - if (x.empty() || x.is_nan() || (x.is_plus_inf() && end - curr != 0)) return false; + if (x.empty() || x.is_nan()) return false; - if (x.is_minus_inf()) { - if (end - curr == 1 && multi_filtration_[curr].is_minus_inf()) return false; - // assumes that everything between curr and end is already simplified - // so, if end - curr != 1, there can be no minus_inf anymore. - end = curr; - return true; + // assumes that everything between curr and end is simplified + // so, only multi_filtration_[curr] can be at inf or -inf. + if constexpr (co) { + if (multi_filtration_[curr].is_plus_inf() || (x.is_minus_inf() && end - curr != 0)) { + return false; + } + if (multi_filtration_[curr].is_minus_inf()) { + if (x.is_minus_inf()) { + return false; + } + end = curr; + return true; + } + if (x.is_plus_inf()) { + if (multi_filtration_[curr].is_plus_inf()) return false; + end = curr; + return true; + } + } else { + if (multi_filtration_[curr].is_minus_inf() || (x.is_plus_inf() && end - curr != 0)) { + return false; + } + if (multi_filtration_[curr].is_plus_inf()) { + if (x.is_plus_inf()) { + return false; + } + end = curr; + return true; + } + if (x.is_minus_inf()) { + if (multi_filtration_[curr].is_minus_inf()) return false; + end = curr; + return true; + } } while (curr != end) { diff --git a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp index 8fd28d4f44..5c18498161 100644 --- a/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp +++ b/src/Multi_filtration/test/multifiltration_multicritical_unit_test.cpp @@ -421,6 +421,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_add, T, list_of_tested_v BOOST_CHECK_EQUAL(f5[0][0], 0); BOOST_CHECK_EQUAL(f5[0][1], 1); BOOST_CHECK_EQUAL(f5[0][2], 2); + + Multi_critical_filtration f6 = Multi_critical_filtration::minus_inf(); + bool change = f6.add_generator(Multi_critical_filtration::inf()); + BOOST_CHECK(change); + BOOST_CHECK(f6.is_plus_inf()); } BOOST_AUTO_TEST_CASE_TEMPLATE(multi_critical_filtration_friends, T, list_of_tested_variants) diff --git a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h index 2afdabbbbf..378e968366 100644 --- a/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h +++ b/src/Multi_persistence/include/gudhi/Multi_persistence/Line.h @@ -18,6 +18,7 @@ #ifndef LINE_FILTRATION_TRANSLATION_H_INCLUDED #define LINE_FILTRATION_TRANSLATION_H_INCLUDED +#include #include #include #include @@ -85,6 +86,12 @@ class Line { GUDHI_CHECK(direction_.empty() || direction_.size() == basePoint_.size(), "Direction and base point do not have the same dimension."); + if constexpr (std::numeric_limits::has_quiet_NaN){ //to avoid windows error + if (std::isnan(t)) return Point::nan(); + } + if (t == Point::T_inf) return Point::inf(); + if (t == -Point::T_inf) return Point::minus_inf(); + Point x(basePoint_.size()); if (direction_.size() > 0) { @@ -225,22 +232,21 @@ class Line { } /** - * @brief Given a box, returns the intersection of this box and the line. + * @brief Given a box, returns "time" parameter of the intersection of this box and the line. * * @param box Box to intersect. * @return A pair representing the two bounding points of the intersection, such that the first element is the - * smallest of the two. If the box and the line do not intersect, returns the pair {inf, inf}. - * If the box is trivial, returns {NaN, NaN}. + * smallest of the two. If the box and the line do not intersect or the box is trivial, returns the pair {inf, -inf}. */ - std::pair get_bounds(const Box &box) const { - if (box.is_trivial()) return {Point::nan(), Point::nan()}; + std::pair get_bounds(const Box &box) const { + if (box.is_trivial()) return {Point::T_inf, -Point::T_inf}; T bottom = compute_forward_intersection(box.get_lower_corner()); T top = compute_backward_intersection(box.get_upper_corner()); - if (bottom > top) return {Point::inf(), Point::inf()}; // no intersection + if (bottom > top) return {Point::T_inf, -Point::T_inf}; // no intersection - return {(*this)[bottom], (*this)[top]}; + return {bottom, top}; } private: diff --git a/src/Multi_persistence/test/multipersistence_line_unit_test.cpp b/src/Multi_persistence/test/multipersistence_line_unit_test.cpp index 6450fb3854..d86db82d1d 100644 --- a/src/Multi_persistence/test/multipersistence_line_unit_test.cpp +++ b/src/Multi_persistence/test/multipersistence_line_unit_test.cpp @@ -87,9 +87,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(line_intersections, T, list_of_tested_variants) t = l.template compute_backward_intersection(KP({P{2,1,3}, P{2,3,3}})); BOOST_CHECK_EQUAL(t, 0); - std::pair bounds = l.get_bounds({{-10, 0, 10}, {10, 4, 10}}); - auto& bottom = bounds.first; - auto& top = bounds.second; + std::pair bounds = l.get_bounds({{-10, 0, 10}, {10, 4, 10}}); + auto bottom = l[bounds.first]; + auto top = l[bounds.second]; BOOST_CHECK_EQUAL(bottom.size(), 3); BOOST_CHECK_EQUAL(bottom[0], T(5. + 2. / 3.)); BOOST_CHECK_EQUAL(bottom[1], 2); @@ -100,8 +100,10 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(line_intersections, T, list_of_tested_variants) BOOST_CHECK_EQUAL(top[2], T(3. + T(7. / 6.) * 6.)); bounds = l.get_bounds({{-10, 0, 10}, {10, 1, 10}}); - BOOST_CHECK(bounds.first.is_plus_inf()); - BOOST_CHECK(bounds.second.is_plus_inf()); + BOOST_CHECK_EQUAL(bounds.first, P::T_inf); + BOOST_CHECK_EQUAL(bounds.second, -P::T_inf); + BOOST_CHECK(l[bounds.first].is_plus_inf()); + BOOST_CHECK(l[bounds.second].is_minus_inf()); } BOOST_AUTO_TEST_CASE_TEMPLATE(line_other, T, list_of_tested_variants) From b752394140a931d8cc2da7f79f7f56bb2660beb7 Mon Sep 17 00:00:00 2001 From: hschreiber Date: Fri, 15 Nov 2024 14:34:11 +0100 Subject: [PATCH 87/87] merge fix --- src/cmake/modules/GUDHI_third_party_libraries.cmake | 3 ++- src/python/CMakeLists.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cmake/modules/GUDHI_third_party_libraries.cmake b/src/cmake/modules/GUDHI_third_party_libraries.cmake index 43ec964976..088ab1b8e5 100644 --- a/src/cmake/modules/GUDHI_third_party_libraries.cmake +++ b/src/cmake/modules/GUDHI_third_party_libraries.cmake @@ -193,10 +193,11 @@ if (WITH_GUDHI_PYTHON) endif() endif() + if(NOT GUDHI_PYTHON_PATH) message(FATAL_ERROR "ERROR: GUDHI_PYTHON_PATH is not valid.") endif(NOT GUDHI_PYTHON_PATH) option(WITH_GUDHI_PYTHON_RUNTIME_LIBRARY_DIRS "Build with setting runtime_library_dirs. Useful when setting rpath is not allowed" ON) -endif (WITH_GUDHI_PYTHON) +endif (WITH_GUDHI_PYTHON) \ No newline at end of file diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index 8a3b6bdd9e..8314661f04 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -131,6 +131,7 @@ if(SCIPY_FOUND) else() disable_python_documentation("scipy") endif() +if(SCIKIT-LEARN_FOUND) add_gudhi_debug_info("Scikit-learn version ${SCIKIT-LEARN_VERSION}") else() disable_python_documentation("scikit-learn") @@ -714,4 +715,4 @@ if(MATPLOTLIB_FOUND) endif() # Set missing or not modules -set(GUDHI_MODULES ${GUDHI_MODULES} "python" CACHE INTERNAL "GUDHI_MODULES") +set(GUDHI_MODULES ${GUDHI_MODULES} "python" CACHE INTERNAL "GUDHI_MODULES") \ No newline at end of file