multipers 2.2.3__cp310-cp310-win_amd64.whl → 2.3.1__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of multipers might be problematic. Click here for more details.
- multipers/__init__.py +33 -31
- multipers/_signed_measure_meta.py +430 -430
- multipers/_slicer_meta.py +211 -212
- multipers/data/MOL2.py +458 -458
- multipers/data/UCR.py +18 -18
- multipers/data/graphs.py +466 -466
- multipers/data/immuno_regions.py +27 -27
- multipers/data/pytorch2simplextree.py +90 -90
- multipers/data/shape3d.py +101 -101
- multipers/data/synthetic.py +113 -111
- multipers/distances.py +198 -198
- multipers/filtration_conversions.pxd.tp +84 -84
- multipers/filtrations/__init__.py +18 -0
- multipers/{ml/convolutions.py → filtrations/density.py} +563 -520
- multipers/filtrations/filtrations.py +289 -0
- multipers/filtrations.pxd +224 -224
- multipers/function_rips.cp310-win_amd64.pyd +0 -0
- multipers/function_rips.pyx +105 -105
- multipers/grids.cp310-win_amd64.pyd +0 -0
- multipers/grids.pyx +350 -350
- multipers/gudhi/Persistence_slices_interface.h +132 -132
- multipers/gudhi/Simplex_tree_interface.h +239 -245
- multipers/gudhi/Simplex_tree_multi_interface.h +516 -561
- multipers/gudhi/cubical_to_boundary.h +59 -59
- multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -450
- multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -1070
- multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -579
- multipers/gudhi/gudhi/Debug_utils.h +45 -45
- multipers/gudhi/gudhi/Fields/Multi_field.h +484 -484
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -455
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -450
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -531
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -507
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -531
- multipers/gudhi/gudhi/Fields/Z2_field.h +355 -355
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -376
- multipers/gudhi/gudhi/Fields/Zp_field.h +420 -420
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -400
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -418
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -337
- multipers/gudhi/gudhi/Matrix.h +2107 -2107
- multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -1038
- multipers/gudhi/gudhi/Multi_persistence/Box.h +171 -171
- multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -282
- multipers/gudhi/gudhi/Off_reader.h +173 -173
- multipers/gudhi/gudhi/One_critical_filtration.h +1433 -1431
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -769
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -686
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -842
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -1350
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -1105
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -859
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -910
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -139
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -230
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -211
- multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -60
- multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -60
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -136
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -190
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -616
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -150
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -106
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -219
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -327
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -1140
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -934
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -934
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -980
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -1092
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -192
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -921
- multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -1093
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -1012
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -1244
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -186
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -164
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -156
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -376
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -540
- multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -118
- multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -173
- multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -128
- multipers/gudhi/gudhi/Persistent_cohomology.h +745 -745
- multipers/gudhi/gudhi/Points_off_io.h +171 -171
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -69
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -463
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -83
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -106
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -277
- multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -62
- multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -27
- multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -62
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -157
- multipers/gudhi/gudhi/Simplex_tree.h +2794 -2794
- multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -163
- multipers/gudhi/gudhi/distance_functions.h +62 -62
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -104
- multipers/gudhi/gudhi/persistence_interval.h +253 -253
- multipers/gudhi/gudhi/persistence_matrix_options.h +170 -170
- multipers/gudhi/gudhi/reader_utils.h +367 -367
- multipers/gudhi/mma_interface_coh.h +256 -255
- multipers/gudhi/mma_interface_h0.h +223 -231
- multipers/gudhi/mma_interface_matrix.h +291 -282
- multipers/gudhi/naive_merge_tree.h +536 -575
- multipers/gudhi/scc_io.h +310 -289
- multipers/gudhi/truc.h +957 -888
- multipers/io.cp310-win_amd64.pyd +0 -0
- multipers/io.pyx +714 -711
- multipers/ml/accuracies.py +90 -90
- multipers/ml/invariants_with_persistable.py +79 -79
- multipers/ml/kernels.py +176 -176
- multipers/ml/mma.py +713 -714
- multipers/ml/one.py +472 -472
- multipers/ml/point_clouds.py +352 -346
- multipers/ml/signed_measures.py +1589 -1589
- multipers/ml/sliced_wasserstein.py +461 -461
- multipers/ml/tools.py +113 -113
- multipers/mma_structures.cp310-win_amd64.pyd +0 -0
- multipers/mma_structures.pxd +127 -127
- multipers/mma_structures.pyx +4 -8
- multipers/mma_structures.pyx.tp +1083 -1085
- multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -93
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -97
- multipers/multi_parameter_rank_invariant/function_rips.h +322 -322
- multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -769
- multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -148
- multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -369
- multipers/multiparameter_edge_collapse.py +41 -41
- multipers/multiparameter_module_approximation/approximation.h +2298 -2295
- multipers/multiparameter_module_approximation/combinatory.h +129 -129
- multipers/multiparameter_module_approximation/debug.h +107 -107
- multipers/multiparameter_module_approximation/format_python-cpp.h +286 -286
- multipers/multiparameter_module_approximation/heap_column.h +238 -238
- multipers/multiparameter_module_approximation/images.h +79 -79
- multipers/multiparameter_module_approximation/list_column.h +174 -174
- multipers/multiparameter_module_approximation/list_column_2.h +232 -232
- multipers/multiparameter_module_approximation/ru_matrix.h +347 -347
- multipers/multiparameter_module_approximation/set_column.h +135 -135
- multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -36
- multipers/multiparameter_module_approximation/unordered_set_column.h +166 -166
- multipers/multiparameter_module_approximation/utilities.h +403 -419
- multipers/multiparameter_module_approximation/vector_column.h +223 -223
- multipers/multiparameter_module_approximation/vector_matrix.h +331 -331
- multipers/multiparameter_module_approximation/vineyards.h +464 -464
- multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -649
- multipers/multiparameter_module_approximation.cp310-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.pyx +218 -217
- multipers/pickle.py +90 -53
- multipers/plots.py +342 -334
- multipers/point_measure.cp310-win_amd64.pyd +0 -0
- multipers/point_measure.pyx +322 -320
- multipers/simplex_tree_multi.cp310-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.pxd +133 -133
- multipers/simplex_tree_multi.pyx +115 -48
- multipers/simplex_tree_multi.pyx.tp +1947 -1935
- multipers/slicer.cp310-win_amd64.pyd +0 -0
- multipers/slicer.pxd +301 -120
- multipers/slicer.pxd.tp +218 -214
- multipers/slicer.pyx +1570 -507
- multipers/slicer.pyx.tp +931 -914
- multipers/tensor/tensor.h +672 -672
- multipers/tensor.pxd +13 -13
- multipers/test.pyx +44 -44
- multipers/tests/__init__.py +57 -57
- multipers/torch/diff_grids.py +217 -217
- multipers/torch/rips_density.py +310 -304
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/LICENSE +21 -21
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/METADATA +21 -11
- multipers-2.3.1.dist-info/RECORD +182 -0
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/WHEEL +1 -1
- multipers/tests/test_diff_helper.py +0 -73
- multipers/tests/test_hilbert_function.py +0 -82
- multipers/tests/test_mma.py +0 -83
- multipers/tests/test_point_clouds.py +0 -49
- multipers/tests/test_python-cpp_conversion.py +0 -82
- multipers/tests/test_signed_betti.py +0 -181
- multipers/tests/test_signed_measure.py +0 -89
- multipers/tests/test_simplextreemulti.py +0 -221
- multipers/tests/test_slicer.py +0 -221
- multipers-2.2.3.dist-info/RECORD +0 -189
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/top_level.txt +0 -0
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
|
|
2
|
-
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
|
|
3
|
-
* Author(s): David Loiseaux
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2023 Inria
|
|
6
|
-
*
|
|
7
|
-
* Modification(s):
|
|
8
|
-
* - 2024/08 Hannah Schreiber: doc
|
|
9
|
-
* - YYYY/MM Author: Description of the modification
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @file Box.h
|
|
14
|
-
* @author David Loiseaux
|
|
15
|
-
* @brief Contains the @ref Gudhi::multi_persistence::Box class.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
#ifndef BOX_H_INCLUDED
|
|
19
|
-
#define BOX_H_INCLUDED
|
|
20
|
-
|
|
21
|
-
#include <ostream> //std::ostream
|
|
22
|
-
|
|
23
|
-
#include <gudhi/Debug_utils.h>
|
|
24
|
-
#include <gudhi/One_critical_filtration.h>
|
|
25
|
-
|
|
26
|
-
namespace Gudhi{
|
|
27
|
-
namespace multi_persistence {
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* @class Box Box.h gudhi/Multi_persistence/Box.h
|
|
31
|
-
* @ingroup multi_persistence
|
|
32
|
-
*
|
|
33
|
-
* @brief Simple box in \f$\mathbb R^n\f$ defined by two diametrically opposite corners.
|
|
34
|
-
*
|
|
35
|
-
* @tparam T Type of the coordinates of the Box. Has to follow the conditions of the template parameter of
|
|
36
|
-
* @ref One_critical_filtration "".
|
|
37
|
-
*/
|
|
38
|
-
template <typename T>
|
|
39
|
-
class Box {
|
|
40
|
-
public:
|
|
41
|
-
using Point = Gudhi::multi_filtration::One_critical_filtration<T>; /**< Type of a point in \f$\mathbb R^n\f$. */
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* @brief Default constructor. Constructs a trivial box with corners at minus infinity.
|
|
45
|
-
*/
|
|
46
|
-
Box() {}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* @brief Constructs a box from the two given corners. Assumes that \f$ lowerCorner \le @p upperCorner \f$ and
|
|
50
|
-
* if both are finite values, they have the same dimension.
|
|
51
|
-
*
|
|
52
|
-
* @param lowerCorner First corner of the box. Has to be smaller than `upperCorner`.
|
|
53
|
-
* @param upperCorner Second corner of the box. Has to be greater than `lowerCorner`.
|
|
54
|
-
*/
|
|
55
|
-
Box(const Point &lowerCorner, const Point &upperCorner) : lowerCorner_(lowerCorner), upperCorner_(upperCorner) {
|
|
56
|
-
GUDHI_CHECK(lowerCorner.size() == upperCorner.size() || !lowerCorner.is_finite() || !upperCorner.is_finite(),
|
|
57
|
-
"The two corners of the box don't have the same dimension.");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* @brief Constructs a box from the two given corners. Assumes that \f$ box.first \le @p box.second \f$ and
|
|
62
|
-
* if both are finite values, they have the same dimension.
|
|
63
|
-
*
|
|
64
|
-
* @param box Pair of corners defining the wished box.
|
|
65
|
-
*/
|
|
66
|
-
Box(const std::pair<Point, Point> &box) : Box(box.first, box.second) {}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* @brief Returns the lowest of both defining corners.
|
|
70
|
-
*/
|
|
71
|
-
const Point &get_lower_corner() const { return lowerCorner_; }
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* @brief Returns the lowest of both defining corners.
|
|
75
|
-
*/
|
|
76
|
-
Point &get_lower_corner() { return lowerCorner_; }
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* @brief Returns the greatest of both defining corners.
|
|
80
|
-
*/
|
|
81
|
-
Point &get_upper_corner() { return upperCorner_; }
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* @brief Returns the greatest of both defining corners.
|
|
85
|
-
*/
|
|
86
|
-
const Point &get_upper_corner() const { return upperCorner_; }
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* @brief Returns a pair of const references to both defining corners.
|
|
90
|
-
*/
|
|
91
|
-
std::pair<const Point &, const Point &> get_bounding_corners() const { return {lowerCorner_, upperCorner_}; }
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* @brief Returns a pair of references to both defining corners.
|
|
95
|
-
*/
|
|
96
|
-
std::pair<Point &, Point &> get_bounding_corners() { return {lowerCorner_, upperCorner_}; }
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* @brief Returns true if and only if one of the following is true:
|
|
100
|
-
* - one of the corners is empty
|
|
101
|
-
* - one of the corners has value NaN
|
|
102
|
-
* - both corners have value infinity
|
|
103
|
-
* - both corners have value minus infinity
|
|
104
|
-
* - both corners are finite but don't have the same dimension.
|
|
105
|
-
*/
|
|
106
|
-
bool is_trivial() const {
|
|
107
|
-
return lowerCorner_.empty() || upperCorner_.empty() || lowerCorner_.is_nan() || upperCorner_.is_nan() ||
|
|
108
|
-
(lowerCorner_.is_plus_inf() && upperCorner_.is_plus_inf()) ||
|
|
109
|
-
(lowerCorner_.is_minus_inf() && upperCorner_.is_minus_inf()) ||
|
|
110
|
-
(lowerCorner_.is_finite() && upperCorner_.is_finite() &&
|
|
111
|
-
lowerCorner_.num_parameters() != upperCorner_.num_parameters());
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* @brief Returns true if and only if the given point is inside the box.
|
|
116
|
-
* If the box is not {-infinity, infinity} and the given point is finite, but has not the same dimension
|
|
117
|
-
* than the box, the point is considered outside.
|
|
118
|
-
*/
|
|
119
|
-
bool contains(const Point &point) const {
|
|
120
|
-
if (point.is_nan() || is_trivial()) return false;
|
|
121
|
-
if (point.is_plus_inf()) return upperCorner_.is_plus_inf();
|
|
122
|
-
if (point.is_minus_inf()) return lowerCorner_.is_minus_inf();
|
|
123
|
-
|
|
124
|
-
if ((lowerCorner_.is_finite() && point.size() != lowerCorner_.size()) ||
|
|
125
|
-
(upperCorner_.is_finite() && point.size() != upperCorner_.size())) {
|
|
126
|
-
// TODO: make it a warning, with future GUDHI_CHECK version?
|
|
127
|
-
// std::cerr << "Box and point are not of the same dimension." << std::endl;
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return lowerCorner_ <= point && point <= upperCorner_;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* @brief Returns the dimension of the box. If the box is trivial or both corners are infinite, the dimension is 0.
|
|
136
|
-
*/
|
|
137
|
-
std::size_t dimension() const {
|
|
138
|
-
if (is_trivial()) return 0;
|
|
139
|
-
if (lowerCorner_.is_minus_inf() && upperCorner_.is_plus_inf()) return 0; // not so sure what we want to do here
|
|
140
|
-
return lowerCorner_.is_finite() ? lowerCorner_.size() : upperCorner_.size();
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* @brief Inflates the box by delta.
|
|
145
|
-
*
|
|
146
|
-
* @param delta Inflation coefficient.
|
|
147
|
-
*/
|
|
148
|
-
void inflate(T delta) {
|
|
149
|
-
lowerCorner_ -= delta;
|
|
150
|
-
upperCorner_ += delta;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* @brief Outstream operator.
|
|
155
|
-
*/
|
|
156
|
-
friend std::ostream &operator<<(std::ostream &os, const Box<T> &box) {
|
|
157
|
-
os << "Box -- Bottom corner : ";
|
|
158
|
-
os << box.get_lower_corner();
|
|
159
|
-
os << ", Top corner : ";
|
|
160
|
-
os << box.get_upper_corner();
|
|
161
|
-
return os;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
private:
|
|
165
|
-
Point lowerCorner_; /**< Lowest of defining corners. */
|
|
166
|
-
Point upperCorner_; /**< Greatest of defining corners. */
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
}} // namespace Gudhi::multi_persistence
|
|
170
|
-
|
|
171
|
-
#endif // BOX_H_INCLUDED
|
|
1
|
+
/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
|
|
2
|
+
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
|
|
3
|
+
* Author(s): David Loiseaux
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2023 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - 2024/08 Hannah Schreiber: doc
|
|
9
|
+
* - YYYY/MM Author: Description of the modification
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @file Box.h
|
|
14
|
+
* @author David Loiseaux
|
|
15
|
+
* @brief Contains the @ref Gudhi::multi_persistence::Box class.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef BOX_H_INCLUDED
|
|
19
|
+
#define BOX_H_INCLUDED
|
|
20
|
+
|
|
21
|
+
#include <ostream> //std::ostream
|
|
22
|
+
|
|
23
|
+
#include <gudhi/Debug_utils.h>
|
|
24
|
+
#include <gudhi/One_critical_filtration.h>
|
|
25
|
+
|
|
26
|
+
namespace Gudhi{
|
|
27
|
+
namespace multi_persistence {
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @class Box Box.h gudhi/Multi_persistence/Box.h
|
|
31
|
+
* @ingroup multi_persistence
|
|
32
|
+
*
|
|
33
|
+
* @brief Simple box in \f$\mathbb R^n\f$ defined by two diametrically opposite corners.
|
|
34
|
+
*
|
|
35
|
+
* @tparam T Type of the coordinates of the Box. Has to follow the conditions of the template parameter of
|
|
36
|
+
* @ref One_critical_filtration "".
|
|
37
|
+
*/
|
|
38
|
+
template <typename T>
|
|
39
|
+
class Box {
|
|
40
|
+
public:
|
|
41
|
+
using Point = Gudhi::multi_filtration::One_critical_filtration<T>; /**< Type of a point in \f$\mathbb R^n\f$. */
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @brief Default constructor. Constructs a trivial box with corners at minus infinity.
|
|
45
|
+
*/
|
|
46
|
+
Box() {}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @brief Constructs a box from the two given corners. Assumes that \f$ lowerCorner \le @p upperCorner \f$ and
|
|
50
|
+
* if both are finite values, they have the same dimension.
|
|
51
|
+
*
|
|
52
|
+
* @param lowerCorner First corner of the box. Has to be smaller than `upperCorner`.
|
|
53
|
+
* @param upperCorner Second corner of the box. Has to be greater than `lowerCorner`.
|
|
54
|
+
*/
|
|
55
|
+
Box(const Point &lowerCorner, const Point &upperCorner) : lowerCorner_(lowerCorner), upperCorner_(upperCorner) {
|
|
56
|
+
GUDHI_CHECK(lowerCorner.size() == upperCorner.size() || !lowerCorner.is_finite() || !upperCorner.is_finite(),
|
|
57
|
+
"The two corners of the box don't have the same dimension.");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @brief Constructs a box from the two given corners. Assumes that \f$ box.first \le @p box.second \f$ and
|
|
62
|
+
* if both are finite values, they have the same dimension.
|
|
63
|
+
*
|
|
64
|
+
* @param box Pair of corners defining the wished box.
|
|
65
|
+
*/
|
|
66
|
+
Box(const std::pair<Point, Point> &box) : Box(box.first, box.second) {}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @brief Returns the lowest of both defining corners.
|
|
70
|
+
*/
|
|
71
|
+
const Point &get_lower_corner() const { return lowerCorner_; }
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @brief Returns the lowest of both defining corners.
|
|
75
|
+
*/
|
|
76
|
+
Point &get_lower_corner() { return lowerCorner_; }
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @brief Returns the greatest of both defining corners.
|
|
80
|
+
*/
|
|
81
|
+
Point &get_upper_corner() { return upperCorner_; }
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @brief Returns the greatest of both defining corners.
|
|
85
|
+
*/
|
|
86
|
+
const Point &get_upper_corner() const { return upperCorner_; }
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @brief Returns a pair of const references to both defining corners.
|
|
90
|
+
*/
|
|
91
|
+
std::pair<const Point &, const Point &> get_bounding_corners() const { return {lowerCorner_, upperCorner_}; }
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @brief Returns a pair of references to both defining corners.
|
|
95
|
+
*/
|
|
96
|
+
std::pair<Point &, Point &> get_bounding_corners() { return {lowerCorner_, upperCorner_}; }
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @brief Returns true if and only if one of the following is true:
|
|
100
|
+
* - one of the corners is empty
|
|
101
|
+
* - one of the corners has value NaN
|
|
102
|
+
* - both corners have value infinity
|
|
103
|
+
* - both corners have value minus infinity
|
|
104
|
+
* - both corners are finite but don't have the same dimension.
|
|
105
|
+
*/
|
|
106
|
+
bool is_trivial() const {
|
|
107
|
+
return lowerCorner_.empty() || upperCorner_.empty() || lowerCorner_.is_nan() || upperCorner_.is_nan() ||
|
|
108
|
+
(lowerCorner_.is_plus_inf() && upperCorner_.is_plus_inf()) ||
|
|
109
|
+
(lowerCorner_.is_minus_inf() && upperCorner_.is_minus_inf()) ||
|
|
110
|
+
(lowerCorner_.is_finite() && upperCorner_.is_finite() &&
|
|
111
|
+
lowerCorner_.num_parameters() != upperCorner_.num_parameters());
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @brief Returns true if and only if the given point is inside the box.
|
|
116
|
+
* If the box is not {-infinity, infinity} and the given point is finite, but has not the same dimension
|
|
117
|
+
* than the box, the point is considered outside.
|
|
118
|
+
*/
|
|
119
|
+
bool contains(const Point &point) const {
|
|
120
|
+
if (point.is_nan() || is_trivial()) return false;
|
|
121
|
+
if (point.is_plus_inf()) return upperCorner_.is_plus_inf();
|
|
122
|
+
if (point.is_minus_inf()) return lowerCorner_.is_minus_inf();
|
|
123
|
+
|
|
124
|
+
if ((lowerCorner_.is_finite() && point.size() != lowerCorner_.size()) ||
|
|
125
|
+
(upperCorner_.is_finite() && point.size() != upperCorner_.size())) {
|
|
126
|
+
// TODO: make it a warning, with future GUDHI_CHECK version?
|
|
127
|
+
// std::cerr << "Box and point are not of the same dimension." << std::endl;
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return lowerCorner_ <= point && point <= upperCorner_;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @brief Returns the dimension of the box. If the box is trivial or both corners are infinite, the dimension is 0.
|
|
136
|
+
*/
|
|
137
|
+
std::size_t dimension() const {
|
|
138
|
+
if (is_trivial()) return 0;
|
|
139
|
+
if (lowerCorner_.is_minus_inf() && upperCorner_.is_plus_inf()) return 0; // not so sure what we want to do here
|
|
140
|
+
return lowerCorner_.is_finite() ? lowerCorner_.size() : upperCorner_.size();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @brief Inflates the box by delta.
|
|
145
|
+
*
|
|
146
|
+
* @param delta Inflation coefficient.
|
|
147
|
+
*/
|
|
148
|
+
void inflate(T delta) {
|
|
149
|
+
lowerCorner_ -= delta;
|
|
150
|
+
upperCorner_ += delta;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @brief Outstream operator.
|
|
155
|
+
*/
|
|
156
|
+
friend std::ostream &operator<<(std::ostream &os, const Box<T> &box) {
|
|
157
|
+
os << "Box -- Bottom corner : ";
|
|
158
|
+
os << box.get_lower_corner();
|
|
159
|
+
os << ", Top corner : ";
|
|
160
|
+
os << box.get_upper_corner();
|
|
161
|
+
return os;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private:
|
|
165
|
+
Point lowerCorner_; /**< Lowest of defining corners. */
|
|
166
|
+
Point upperCorner_; /**< Greatest of defining corners. */
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
}} // namespace Gudhi::multi_persistence
|
|
170
|
+
|
|
171
|
+
#endif // BOX_H_INCLUDED
|