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,230 +1,230 @@
|
|
|
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): Hannah Schreiber
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2022-24 Inria
|
|
6
|
-
*
|
|
7
|
-
* Modification(s):
|
|
8
|
-
* - YYYY/MM Author: Description of the modification
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @file base_pairing.h
|
|
13
|
-
* @author Hannah Schreiber
|
|
14
|
-
* @brief Contains the @ref Gudhi::persistence_matrix::Base_pairing class and
|
|
15
|
-
* @ref Gudhi::persistence_matrix::Dummy_base_pairing structure.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
#ifndef PM_BASE_PAIRING_H
|
|
19
|
-
#define PM_BASE_PAIRING_H
|
|
20
|
-
|
|
21
|
-
#include <utility> //std::swap & std::move
|
|
22
|
-
#include <unordered_map>
|
|
23
|
-
#include <algorithm>
|
|
24
|
-
#include <vector>
|
|
25
|
-
|
|
26
|
-
#include "boundary_cell_position_to_id_mapper.h"
|
|
27
|
-
|
|
28
|
-
namespace Gudhi {
|
|
29
|
-
namespace persistence_matrix {
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @ingroup persistence_matrix
|
|
33
|
-
*
|
|
34
|
-
* @brief Empty structure.
|
|
35
|
-
* Inherited instead of @ref Base_pairing, when the computation of the barcode was not enabled or if the pairing
|
|
36
|
-
* is already managed by the vine update classes.
|
|
37
|
-
*/
|
|
38
|
-
struct Dummy_base_pairing {
|
|
39
|
-
friend void swap([[maybe_unused]] Dummy_base_pairing& d1, [[maybe_unused]] Dummy_base_pairing& d2) {}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @class Base_pairing base_pairing.h gudhi/Persistence_matrix/base_pairing.h
|
|
44
|
-
* @ingroup persistence_matrix
|
|
45
|
-
*
|
|
46
|
-
* @brief Class managing the barcode for @ref Boundary_matrix if the option was enabled.
|
|
47
|
-
*
|
|
48
|
-
* @tparam Master_matrix An instantiation of @ref Matrix from which all types and options are deduced.
|
|
49
|
-
*/
|
|
50
|
-
template <class Master_matrix>
|
|
51
|
-
class Base_pairing : public std::conditional<
|
|
52
|
-
Master_matrix::Option_list::has_removable_columns,
|
|
53
|
-
Cell_position_to_ID_mapper<typename Master_matrix::ID_index, typename Master_matrix::Pos_index>,
|
|
54
|
-
Dummy_pos_mapper
|
|
55
|
-
>::type
|
|
56
|
-
{
|
|
57
|
-
public:
|
|
58
|
-
using Bar = typename Master_matrix::Bar; /**< Bar type. */
|
|
59
|
-
using Barcode = typename Master_matrix::Barcode; /**< Barcode type. */
|
|
60
|
-
using Column_container = typename Master_matrix::Column_container; /**< Column container type. */
|
|
61
|
-
using Index = typename Master_matrix::Index; /**< Container index type. */
|
|
62
|
-
using Dimension = typename Master_matrix::Dimension; /**< Dimension value type. */
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @brief Default constructor.
|
|
66
|
-
*/
|
|
67
|
-
Base_pairing();
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* @brief Reduces the matrix stored in @ref Boundary_matrix and computes the corresponding barcode.
|
|
71
|
-
*
|
|
72
|
-
* @warning The barcode will not be recomputed if the matrix is modified later after calling this method
|
|
73
|
-
* for the first time. So call it only once the matrix is finalized. This behaviour could be changed in the future,
|
|
74
|
-
* if the need is mentioned.
|
|
75
|
-
*
|
|
76
|
-
* @return Const reference to the barcode.
|
|
77
|
-
*/
|
|
78
|
-
const Barcode& get_current_barcode();
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* @brief Swap operator.
|
|
82
|
-
*/
|
|
83
|
-
friend void swap(Base_pairing& pairing1, Base_pairing& pairing2) {
|
|
84
|
-
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
85
|
-
swap(static_cast<Cell_position_to_ID_mapper<ID_index, Pos_index>&>(pairing1),
|
|
86
|
-
static_cast<Cell_position_to_ID_mapper<ID_index, Pos_index>&>(pairing2));
|
|
87
|
-
}
|
|
88
|
-
pairing1.barcode_.swap(pairing2.barcode_);
|
|
89
|
-
pairing1.deathToBar_.swap(pairing2.deathToBar_);
|
|
90
|
-
pairing1.idToPosition_.swap(pairing2.idToPosition_);
|
|
91
|
-
std::swap(pairing1.isReduced_, pairing2.isReduced_);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
protected:
|
|
95
|
-
using Pos_index = typename Master_matrix::Pos_index;
|
|
96
|
-
using ID_index = typename Master_matrix::ID_index;
|
|
97
|
-
using Dictionary = typename Master_matrix::Bar_dictionary;
|
|
98
|
-
using Base_matrix = typename Master_matrix::Master_boundary_matrix;
|
|
99
|
-
//PIDM = Position to ID Map
|
|
100
|
-
using PIDM = typename std::conditional<Master_matrix::Option_list::has_removable_columns,
|
|
101
|
-
Cell_position_to_ID_mapper<ID_index, Pos_index>,
|
|
102
|
-
Dummy_pos_mapper
|
|
103
|
-
>::type;
|
|
104
|
-
|
|
105
|
-
Barcode barcode_; /**< Bar container. */
|
|
106
|
-
Dictionary deathToBar_; /**< Map from death index to bar index. */
|
|
107
|
-
/**
|
|
108
|
-
* @brief Map from cell ID to cell position. Only stores a pair if ID != position.
|
|
109
|
-
*/
|
|
110
|
-
std::unordered_map<ID_index,Pos_index> idToPosition_; //TODO: test other map types
|
|
111
|
-
bool isReduced_; /**< True if `_reduce()` was called. */
|
|
112
|
-
|
|
113
|
-
void _reduce();
|
|
114
|
-
void _remove_last(Pos_index columnIndex);
|
|
115
|
-
|
|
116
|
-
//access to inheriting Boundary_matrix class
|
|
117
|
-
constexpr Base_matrix* _matrix() { return static_cast<Base_matrix*>(this); }
|
|
118
|
-
constexpr const Base_matrix* _matrix() const { return static_cast<const Base_matrix*>(this); }
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
template <class Master_matrix>
|
|
122
|
-
inline Base_pairing<Master_matrix>::Base_pairing() : PIDM(), isReduced_(false)
|
|
123
|
-
{}
|
|
124
|
-
|
|
125
|
-
template <class Master_matrix>
|
|
126
|
-
inline const typename Base_pairing<Master_matrix>::Barcode& Base_pairing<Master_matrix>::get_current_barcode()
|
|
127
|
-
{
|
|
128
|
-
if (!isReduced_) _reduce();
|
|
129
|
-
return barcode_;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
template <class Master_matrix>
|
|
133
|
-
inline void Base_pairing<Master_matrix>::_reduce()
|
|
134
|
-
{
|
|
135
|
-
std::unordered_map<Index, Index> negativeColumns(_matrix()->get_number_of_columns());
|
|
136
|
-
|
|
137
|
-
auto dim = _matrix()->get_max_dimension();
|
|
138
|
-
std::vector<std::vector<Index> > columnsByDim(dim + 1);
|
|
139
|
-
for (unsigned int i = 0; i < _matrix()->get_number_of_columns(); i++) {
|
|
140
|
-
columnsByDim[dim - _matrix()->get_column_dimension(i)].push_back(i);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
for (const auto& cols : columnsByDim) {
|
|
144
|
-
for (Index i : cols) {
|
|
145
|
-
auto& curr = _matrix()->get_column(i);
|
|
146
|
-
if (curr.is_empty()) {
|
|
147
|
-
if (negativeColumns.find(i) == negativeColumns.end()) {
|
|
148
|
-
barcode_.emplace_back(i, -1, dim);
|
|
149
|
-
}
|
|
150
|
-
} else {
|
|
151
|
-
ID_index pivot = curr.get_pivot();
|
|
152
|
-
auto it = idToPosition_.find(pivot);
|
|
153
|
-
Index pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
|
|
154
|
-
auto itNeg = negativeColumns.find(pivotColumnNumber);
|
|
155
|
-
Index pivotKiller = itNeg == negativeColumns.end() ? -1 : itNeg->second;
|
|
156
|
-
|
|
157
|
-
while (pivot != static_cast<ID_index>(-1) && pivotKiller != static_cast<Index>(-1)) {
|
|
158
|
-
if constexpr (Master_matrix::Option_list::is_z2) {
|
|
159
|
-
curr += _matrix()->get_column(pivotKiller);
|
|
160
|
-
} else {
|
|
161
|
-
auto& toadd = _matrix()->get_column(pivotKiller);
|
|
162
|
-
typename Master_matrix::Element coef = toadd.get_pivot_value();
|
|
163
|
-
auto& operators = _matrix()->colSettings_->operators;
|
|
164
|
-
coef = operators.get_inverse(coef);
|
|
165
|
-
operators.multiply_inplace(coef, operators.get_characteristic() - curr.get_pivot_value());
|
|
166
|
-
curr.multiply_source_and_add(toadd, coef);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
pivot = curr.get_pivot();
|
|
170
|
-
it = idToPosition_.find(pivot);
|
|
171
|
-
pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
|
|
172
|
-
itNeg = negativeColumns.find(pivotColumnNumber);
|
|
173
|
-
pivotKiller = itNeg == negativeColumns.end() ? -1 : itNeg->second;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (pivot != static_cast<ID_index>(-1)) {
|
|
177
|
-
negativeColumns.emplace(pivotColumnNumber, i);
|
|
178
|
-
_matrix()->get_column(pivotColumnNumber).clear();
|
|
179
|
-
barcode_.emplace_back(pivotColumnNumber, i, dim - 1);
|
|
180
|
-
} else {
|
|
181
|
-
curr.clear();
|
|
182
|
-
barcode_.emplace_back(i, -1, dim);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
--dim;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
190
|
-
// sort barcode by birth such that a removal is trivial
|
|
191
|
-
std::sort(barcode_.begin(), barcode_.end(), [](const Bar& b1, const Bar& b2) { return b1.birth < b2.birth; });
|
|
192
|
-
// map can only be constructed once barcode is sorted
|
|
193
|
-
for (Index i = 0; i < barcode_.size(); ++i) {
|
|
194
|
-
auto d = barcode_[i].death;
|
|
195
|
-
if (d != static_cast<Pos_index>(-1)) {
|
|
196
|
-
deathToBar_.emplace(d, i);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
isReduced_ = true;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
template <class Master_matrix>
|
|
205
|
-
inline void Base_pairing<Master_matrix>::_remove_last(Pos_index columnIndex)
|
|
206
|
-
{
|
|
207
|
-
static_assert(Master_matrix::Option_list::has_removable_columns, "remove_last not available.");
|
|
208
|
-
|
|
209
|
-
if (isReduced_) {
|
|
210
|
-
auto it = deathToBar_.find(columnIndex);
|
|
211
|
-
|
|
212
|
-
if (it == deathToBar_.end()) { // birth
|
|
213
|
-
barcode_.pop_back(); // sorted by birth and columnIndex has to be the highest one
|
|
214
|
-
} else { // death
|
|
215
|
-
barcode_[it->second].death = -1;
|
|
216
|
-
deathToBar_.erase(it);
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
auto it = PIDM::map_.find(columnIndex);
|
|
221
|
-
if (it != PIDM::map_.end()){
|
|
222
|
-
idToPosition_.erase(it->second);
|
|
223
|
-
PIDM::map_.erase(it);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
} // namespace persistence_matrix
|
|
228
|
-
} // namespace Gudhi
|
|
229
|
-
|
|
230
|
-
#endif // PM_BASE_PAIRING_H
|
|
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): Hannah Schreiber
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2022-24 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @file base_pairing.h
|
|
13
|
+
* @author Hannah Schreiber
|
|
14
|
+
* @brief Contains the @ref Gudhi::persistence_matrix::Base_pairing class and
|
|
15
|
+
* @ref Gudhi::persistence_matrix::Dummy_base_pairing structure.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef PM_BASE_PAIRING_H
|
|
19
|
+
#define PM_BASE_PAIRING_H
|
|
20
|
+
|
|
21
|
+
#include <utility> //std::swap & std::move
|
|
22
|
+
#include <unordered_map>
|
|
23
|
+
#include <algorithm>
|
|
24
|
+
#include <vector>
|
|
25
|
+
|
|
26
|
+
#include "boundary_cell_position_to_id_mapper.h"
|
|
27
|
+
|
|
28
|
+
namespace Gudhi {
|
|
29
|
+
namespace persistence_matrix {
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @ingroup persistence_matrix
|
|
33
|
+
*
|
|
34
|
+
* @brief Empty structure.
|
|
35
|
+
* Inherited instead of @ref Base_pairing, when the computation of the barcode was not enabled or if the pairing
|
|
36
|
+
* is already managed by the vine update classes.
|
|
37
|
+
*/
|
|
38
|
+
struct Dummy_base_pairing {
|
|
39
|
+
friend void swap([[maybe_unused]] Dummy_base_pairing& d1, [[maybe_unused]] Dummy_base_pairing& d2) {}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @class Base_pairing base_pairing.h gudhi/Persistence_matrix/base_pairing.h
|
|
44
|
+
* @ingroup persistence_matrix
|
|
45
|
+
*
|
|
46
|
+
* @brief Class managing the barcode for @ref Boundary_matrix if the option was enabled.
|
|
47
|
+
*
|
|
48
|
+
* @tparam Master_matrix An instantiation of @ref Matrix from which all types and options are deduced.
|
|
49
|
+
*/
|
|
50
|
+
template <class Master_matrix>
|
|
51
|
+
class Base_pairing : public std::conditional<
|
|
52
|
+
Master_matrix::Option_list::has_removable_columns,
|
|
53
|
+
Cell_position_to_ID_mapper<typename Master_matrix::ID_index, typename Master_matrix::Pos_index>,
|
|
54
|
+
Dummy_pos_mapper
|
|
55
|
+
>::type
|
|
56
|
+
{
|
|
57
|
+
public:
|
|
58
|
+
using Bar = typename Master_matrix::Bar; /**< Bar type. */
|
|
59
|
+
using Barcode = typename Master_matrix::Barcode; /**< Barcode type. */
|
|
60
|
+
using Column_container = typename Master_matrix::Column_container; /**< Column container type. */
|
|
61
|
+
using Index = typename Master_matrix::Index; /**< Container index type. */
|
|
62
|
+
using Dimension = typename Master_matrix::Dimension; /**< Dimension value type. */
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @brief Default constructor.
|
|
66
|
+
*/
|
|
67
|
+
Base_pairing();
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @brief Reduces the matrix stored in @ref Boundary_matrix and computes the corresponding barcode.
|
|
71
|
+
*
|
|
72
|
+
* @warning The barcode will not be recomputed if the matrix is modified later after calling this method
|
|
73
|
+
* for the first time. So call it only once the matrix is finalized. This behaviour could be changed in the future,
|
|
74
|
+
* if the need is mentioned.
|
|
75
|
+
*
|
|
76
|
+
* @return Const reference to the barcode.
|
|
77
|
+
*/
|
|
78
|
+
const Barcode& get_current_barcode();
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @brief Swap operator.
|
|
82
|
+
*/
|
|
83
|
+
friend void swap(Base_pairing& pairing1, Base_pairing& pairing2) {
|
|
84
|
+
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
85
|
+
swap(static_cast<Cell_position_to_ID_mapper<ID_index, Pos_index>&>(pairing1),
|
|
86
|
+
static_cast<Cell_position_to_ID_mapper<ID_index, Pos_index>&>(pairing2));
|
|
87
|
+
}
|
|
88
|
+
pairing1.barcode_.swap(pairing2.barcode_);
|
|
89
|
+
pairing1.deathToBar_.swap(pairing2.deathToBar_);
|
|
90
|
+
pairing1.idToPosition_.swap(pairing2.idToPosition_);
|
|
91
|
+
std::swap(pairing1.isReduced_, pairing2.isReduced_);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
protected:
|
|
95
|
+
using Pos_index = typename Master_matrix::Pos_index;
|
|
96
|
+
using ID_index = typename Master_matrix::ID_index;
|
|
97
|
+
using Dictionary = typename Master_matrix::Bar_dictionary;
|
|
98
|
+
using Base_matrix = typename Master_matrix::Master_boundary_matrix;
|
|
99
|
+
//PIDM = Position to ID Map
|
|
100
|
+
using PIDM = typename std::conditional<Master_matrix::Option_list::has_removable_columns,
|
|
101
|
+
Cell_position_to_ID_mapper<ID_index, Pos_index>,
|
|
102
|
+
Dummy_pos_mapper
|
|
103
|
+
>::type;
|
|
104
|
+
|
|
105
|
+
Barcode barcode_; /**< Bar container. */
|
|
106
|
+
Dictionary deathToBar_; /**< Map from death index to bar index. */
|
|
107
|
+
/**
|
|
108
|
+
* @brief Map from cell ID to cell position. Only stores a pair if ID != position.
|
|
109
|
+
*/
|
|
110
|
+
std::unordered_map<ID_index,Pos_index> idToPosition_; //TODO: test other map types
|
|
111
|
+
bool isReduced_; /**< True if `_reduce()` was called. */
|
|
112
|
+
|
|
113
|
+
void _reduce();
|
|
114
|
+
void _remove_last(Pos_index columnIndex);
|
|
115
|
+
|
|
116
|
+
//access to inheriting Boundary_matrix class
|
|
117
|
+
constexpr Base_matrix* _matrix() { return static_cast<Base_matrix*>(this); }
|
|
118
|
+
constexpr const Base_matrix* _matrix() const { return static_cast<const Base_matrix*>(this); }
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
template <class Master_matrix>
|
|
122
|
+
inline Base_pairing<Master_matrix>::Base_pairing() : PIDM(), isReduced_(false)
|
|
123
|
+
{}
|
|
124
|
+
|
|
125
|
+
template <class Master_matrix>
|
|
126
|
+
inline const typename Base_pairing<Master_matrix>::Barcode& Base_pairing<Master_matrix>::get_current_barcode()
|
|
127
|
+
{
|
|
128
|
+
if (!isReduced_) _reduce();
|
|
129
|
+
return barcode_;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
template <class Master_matrix>
|
|
133
|
+
inline void Base_pairing<Master_matrix>::_reduce()
|
|
134
|
+
{
|
|
135
|
+
std::unordered_map<Index, Index> negativeColumns(_matrix()->get_number_of_columns());
|
|
136
|
+
|
|
137
|
+
auto dim = _matrix()->get_max_dimension();
|
|
138
|
+
std::vector<std::vector<Index> > columnsByDim(dim + 1);
|
|
139
|
+
for (unsigned int i = 0; i < _matrix()->get_number_of_columns(); i++) {
|
|
140
|
+
columnsByDim[dim - _matrix()->get_column_dimension(i)].push_back(i);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
for (const auto& cols : columnsByDim) {
|
|
144
|
+
for (Index i : cols) {
|
|
145
|
+
auto& curr = _matrix()->get_column(i);
|
|
146
|
+
if (curr.is_empty()) {
|
|
147
|
+
if (negativeColumns.find(i) == negativeColumns.end()) {
|
|
148
|
+
barcode_.emplace_back(i, -1, dim);
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
ID_index pivot = curr.get_pivot();
|
|
152
|
+
auto it = idToPosition_.find(pivot);
|
|
153
|
+
Index pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
|
|
154
|
+
auto itNeg = negativeColumns.find(pivotColumnNumber);
|
|
155
|
+
Index pivotKiller = itNeg == negativeColumns.end() ? -1 : itNeg->second;
|
|
156
|
+
|
|
157
|
+
while (pivot != static_cast<ID_index>(-1) && pivotKiller != static_cast<Index>(-1)) {
|
|
158
|
+
if constexpr (Master_matrix::Option_list::is_z2) {
|
|
159
|
+
curr += _matrix()->get_column(pivotKiller);
|
|
160
|
+
} else {
|
|
161
|
+
auto& toadd = _matrix()->get_column(pivotKiller);
|
|
162
|
+
typename Master_matrix::Element coef = toadd.get_pivot_value();
|
|
163
|
+
auto& operators = _matrix()->colSettings_->operators;
|
|
164
|
+
coef = operators.get_inverse(coef);
|
|
165
|
+
operators.multiply_inplace(coef, operators.get_characteristic() - curr.get_pivot_value());
|
|
166
|
+
curr.multiply_source_and_add(toadd, coef);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
pivot = curr.get_pivot();
|
|
170
|
+
it = idToPosition_.find(pivot);
|
|
171
|
+
pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
|
|
172
|
+
itNeg = negativeColumns.find(pivotColumnNumber);
|
|
173
|
+
pivotKiller = itNeg == negativeColumns.end() ? -1 : itNeg->second;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (pivot != static_cast<ID_index>(-1)) {
|
|
177
|
+
negativeColumns.emplace(pivotColumnNumber, i);
|
|
178
|
+
_matrix()->get_column(pivotColumnNumber).clear();
|
|
179
|
+
barcode_.emplace_back(pivotColumnNumber, i, dim - 1);
|
|
180
|
+
} else {
|
|
181
|
+
curr.clear();
|
|
182
|
+
barcode_.emplace_back(i, -1, dim);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
--dim;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
190
|
+
// sort barcode by birth such that a removal is trivial
|
|
191
|
+
std::sort(barcode_.begin(), barcode_.end(), [](const Bar& b1, const Bar& b2) { return b1.birth < b2.birth; });
|
|
192
|
+
// map can only be constructed once barcode is sorted
|
|
193
|
+
for (Index i = 0; i < barcode_.size(); ++i) {
|
|
194
|
+
auto d = barcode_[i].death;
|
|
195
|
+
if (d != static_cast<Pos_index>(-1)) {
|
|
196
|
+
deathToBar_.emplace(d, i);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
isReduced_ = true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
template <class Master_matrix>
|
|
205
|
+
inline void Base_pairing<Master_matrix>::_remove_last(Pos_index columnIndex)
|
|
206
|
+
{
|
|
207
|
+
static_assert(Master_matrix::Option_list::has_removable_columns, "remove_last not available.");
|
|
208
|
+
|
|
209
|
+
if (isReduced_) {
|
|
210
|
+
auto it = deathToBar_.find(columnIndex);
|
|
211
|
+
|
|
212
|
+
if (it == deathToBar_.end()) { // birth
|
|
213
|
+
barcode_.pop_back(); // sorted by birth and columnIndex has to be the highest one
|
|
214
|
+
} else { // death
|
|
215
|
+
barcode_[it->second].death = -1;
|
|
216
|
+
deathToBar_.erase(it);
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
auto it = PIDM::map_.find(columnIndex);
|
|
221
|
+
if (it != PIDM::map_.end()){
|
|
222
|
+
idToPosition_.erase(it->second);
|
|
223
|
+
PIDM::map_.erase(it);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
} // namespace persistence_matrix
|
|
228
|
+
} // namespace Gudhi
|
|
229
|
+
|
|
230
|
+
#endif // PM_BASE_PAIRING_H
|