multipers 2.2.3__cp312-cp312-win_amd64.whl → 2.3.1__cp312-cp312-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.cp312-win_amd64.pyd +0 -0
- multipers/function_rips.pyx +105 -105
- multipers/grids.cp312-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.cp312-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.cp312-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.cp312-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.cp312-win_amd64.pyd +0 -0
- multipers/point_measure.pyx +322 -320
- multipers/simplex_tree_multi.cp312-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.cp312-win_amd64.pyd +0 -0
- multipers/slicer.pxd +281 -100
- 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,347 +1,347 @@
|
|
|
1
|
-
/* This file is part of the MMA Library -
|
|
2
|
-
* https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. See
|
|
3
|
-
* file LICENSE for full license details. Author(s): Hannah Schreiber
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2022 Inria
|
|
6
|
-
*
|
|
7
|
-
* Modification(s):
|
|
8
|
-
* - YYYY/MM Author: Description of the modification
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#ifndef RU_MATRIX_H
|
|
12
|
-
#define RU_MATRIX_H
|
|
13
|
-
|
|
14
|
-
#include <vector>
|
|
15
|
-
|
|
16
|
-
#include "utilities.h" //type definitions
|
|
17
|
-
#include "vector_matrix.h"
|
|
18
|
-
|
|
19
|
-
namespace Gudhi::multiparameter::mma {
|
|
20
|
-
|
|
21
|
-
template <class Column_type> class RU_matrix {
|
|
22
|
-
public:
|
|
23
|
-
RU_matrix();
|
|
24
|
-
RU_matrix(boundary_matrix &orderedBoundaries);
|
|
25
|
-
RU_matrix(int numberOfColumns);
|
|
26
|
-
RU_matrix(RU_matrix &matrixToCopy);
|
|
27
|
-
RU_matrix(RU_matrix &&other) noexcept;
|
|
28
|
-
|
|
29
|
-
void insert_boundary(index columnIndex, boundary_type &boundary);
|
|
30
|
-
dimension_type get_dimension(index index);
|
|
31
|
-
unsigned int get_number_of_simplices();
|
|
32
|
-
|
|
33
|
-
void initialize();
|
|
34
|
-
void vine_swap(index index);
|
|
35
|
-
const barcode_type &get_current_barcode();
|
|
36
|
-
|
|
37
|
-
void print_matrices(); // for debug
|
|
38
|
-
|
|
39
|
-
RU_matrix<Column_type> &operator=(RU_matrix<Column_type> other);
|
|
40
|
-
template <class Friend_column_type>
|
|
41
|
-
friend void swap(RU_matrix<Column_type> &matrix1,
|
|
42
|
-
RU_matrix<Friend_column_type> &matrix2);
|
|
43
|
-
|
|
44
|
-
private:
|
|
45
|
-
Vector_matrix<Column_type> reducedMatrixR_;
|
|
46
|
-
Vector_matrix<Column_type> mirrorMatrixU_;
|
|
47
|
-
barcode_type barcode_;
|
|
48
|
-
std::vector<int> indexToBar_;
|
|
49
|
-
|
|
50
|
-
void _initialize_U();
|
|
51
|
-
void _swap_at_index(index index);
|
|
52
|
-
void _add_to(index sourceIndex, index targetIndex);
|
|
53
|
-
void _positive_vine_swap(index index);
|
|
54
|
-
void _negative_vine_swap(index index);
|
|
55
|
-
void _positive_negative_vine_swap(index index);
|
|
56
|
-
void _negative_positive_vine_swap(index index);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
template <class Column_type> inline RU_matrix<Column_type>::RU_matrix() {}
|
|
60
|
-
|
|
61
|
-
template <class Column_type>
|
|
62
|
-
inline RU_matrix<Column_type>::RU_matrix(boundary_matrix &orderedBoundaries)
|
|
63
|
-
: reducedMatrixR_(orderedBoundaries),
|
|
64
|
-
mirrorMatrixU_(orderedBoundaries.size()) {
|
|
65
|
-
_initialize_U();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
template <class Column_type>
|
|
69
|
-
inline RU_matrix<Column_type>::RU_matrix(int numberOfColumns)
|
|
70
|
-
: reducedMatrixR_(numberOfColumns), mirrorMatrixU_(numberOfColumns) {
|
|
71
|
-
_initialize_U();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
template <class Column_type>
|
|
75
|
-
inline RU_matrix<Column_type>::RU_matrix(RU_matrix &matrixToCopy)
|
|
76
|
-
: reducedMatrixR_(matrixToCopy.reducedMatrixR_),
|
|
77
|
-
mirrorMatrixU_(matrixToCopy.mirrorMatrixU_),
|
|
78
|
-
barcode_(matrixToCopy.barcode_), indexToBar_(matrixToCopy.indexToBar_) {}
|
|
79
|
-
|
|
80
|
-
template <class Column_type>
|
|
81
|
-
inline RU_matrix<Column_type>::RU_matrix(
|
|
82
|
-
RU_matrix<Column_type> &&other) noexcept
|
|
83
|
-
: reducedMatrixR_(std::move(other.reducedMatrixR_)),
|
|
84
|
-
mirrorMatrixU_(std::move(other.mirrorMatrixU_)),
|
|
85
|
-
barcode_(std::move(other.barcode_)),
|
|
86
|
-
indexToBar_(std::move(other.indexToBar_)) {}
|
|
87
|
-
|
|
88
|
-
template <class Column_type>
|
|
89
|
-
inline void RU_matrix<Column_type>::insert_boundary(index columnIndex,
|
|
90
|
-
boundary_type &boundary) {
|
|
91
|
-
reducedMatrixR_.insert_boundary(columnIndex, boundary);
|
|
92
|
-
boundary_type id(1, columnIndex);
|
|
93
|
-
mirrorMatrixU_.insert_column(columnIndex, Column_type(id));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
template <class Column_type>
|
|
97
|
-
inline dimension_type RU_matrix<Column_type>::get_dimension(index index) {
|
|
98
|
-
return reducedMatrixR_.get_column_dimension(index);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
template <class Column_type>
|
|
102
|
-
inline unsigned int RU_matrix<Column_type>::get_number_of_simplices() {
|
|
103
|
-
return reducedMatrixR_.get_number_of_columns();
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
template <class Column_type> inline void RU_matrix<Column_type>::initialize() {
|
|
107
|
-
std::unordered_map<index, index> pivotsToColumn;
|
|
108
|
-
indexToBar_.resize(reducedMatrixR_.get_number_of_columns(), -1);
|
|
109
|
-
|
|
110
|
-
for (unsigned int i = 0; i < reducedMatrixR_.get_number_of_columns(); i++) {
|
|
111
|
-
if (!(reducedMatrixR_.is_zero_column(i))) {
|
|
112
|
-
Column_type &curr = reducedMatrixR_.get_column(i);
|
|
113
|
-
int pivot = curr.get_pivot();
|
|
114
|
-
|
|
115
|
-
while (pivot != -1 &&
|
|
116
|
-
pivotsToColumn.find(pivot) != pivotsToColumn.end()) {
|
|
117
|
-
curr.add(reducedMatrixR_.get_column(pivotsToColumn.at(pivot)));
|
|
118
|
-
mirrorMatrixU_.get_column(pivotsToColumn.at(pivot))
|
|
119
|
-
.add(mirrorMatrixU_.get_column(i));
|
|
120
|
-
pivot = curr.get_pivot();
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (pivot != -1) {
|
|
124
|
-
pivotsToColumn.emplace(pivot, i);
|
|
125
|
-
barcode_.at(indexToBar_.at(pivot)).death = i;
|
|
126
|
-
indexToBar_.at(i) = indexToBar_.at(pivot);
|
|
127
|
-
} else {
|
|
128
|
-
barcode_.push_back(Bar(get_dimension(i), i, -1));
|
|
129
|
-
indexToBar_.at(i) = barcode_.size() - 1;
|
|
130
|
-
}
|
|
131
|
-
} else {
|
|
132
|
-
barcode_.push_back(Bar(get_dimension(i), i, -1));
|
|
133
|
-
indexToBar_.at(i) = barcode_.size() - 1;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
template <class Column_type>
|
|
139
|
-
inline void RU_matrix<Column_type>::vine_swap(index index) {
|
|
140
|
-
if (index >= reducedMatrixR_.get_number_of_columns() - 1)
|
|
141
|
-
return;
|
|
142
|
-
|
|
143
|
-
bool iIsPositive =
|
|
144
|
-
(barcode_.at(indexToBar_.at(index)).birth == static_cast<int>(index));
|
|
145
|
-
bool iiIsPositive = (barcode_.at(indexToBar_.at(index + 1)).birth ==
|
|
146
|
-
static_cast<int>(index) + 1);
|
|
147
|
-
|
|
148
|
-
if (iIsPositive && iiIsPositive)
|
|
149
|
-
_positive_vine_swap(index);
|
|
150
|
-
else if (!iIsPositive && !iiIsPositive)
|
|
151
|
-
_negative_vine_swap(index);
|
|
152
|
-
else if (iIsPositive && !iiIsPositive)
|
|
153
|
-
_positive_negative_vine_swap(index);
|
|
154
|
-
else
|
|
155
|
-
_negative_positive_vine_swap(index);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
template <class Column_type>
|
|
159
|
-
inline const barcode_type &RU_matrix<Column_type>::get_current_barcode() {
|
|
160
|
-
return barcode_;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
template <class Column_type>
|
|
164
|
-
inline void RU_matrix<Column_type>::print_matrices() {
|
|
165
|
-
boundary_type b;
|
|
166
|
-
|
|
167
|
-
std::cout << "R:\n";
|
|
168
|
-
for (unsigned int i = 0; i < reducedMatrixR_.get_number_of_columns(); i++) {
|
|
169
|
-
reducedMatrixR_.get_boundary(i, b);
|
|
170
|
-
if (b.empty()) {
|
|
171
|
-
std::cout << "-\n";
|
|
172
|
-
} else {
|
|
173
|
-
for (unsigned int i : b)
|
|
174
|
-
std::cout << i << " ";
|
|
175
|
-
std::cout << "\n";
|
|
176
|
-
b.clear();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
std::cout << "\n";
|
|
180
|
-
|
|
181
|
-
std::cout << "U:\n";
|
|
182
|
-
for (unsigned int i = 0; i < mirrorMatrixU_.get_number_of_columns(); i++) {
|
|
183
|
-
mirrorMatrixU_.get_boundary(i, b);
|
|
184
|
-
if (b.empty()) {
|
|
185
|
-
std::cout << "-\n";
|
|
186
|
-
} else {
|
|
187
|
-
for (unsigned int i : b)
|
|
188
|
-
std::cout << i << " ";
|
|
189
|
-
std::cout << "\n";
|
|
190
|
-
b.clear();
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
std::cout << "\n";
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
template <class Column_type>
|
|
197
|
-
inline RU_matrix<Column_type> &
|
|
198
|
-
RU_matrix<Column_type>::operator=(RU_matrix<Column_type> other) {
|
|
199
|
-
std::swap(reducedMatrixR_, other.reducedMatrixR_);
|
|
200
|
-
std::swap(mirrorMatrixU_, other.mirrorMatrixU_);
|
|
201
|
-
std::swap(barcode_, other.barcode_);
|
|
202
|
-
std::swap(indexToBar_, other.indexToBar_);
|
|
203
|
-
return *this;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
template <class Column_type>
|
|
207
|
-
inline void RU_matrix<Column_type>::_initialize_U() {
|
|
208
|
-
boundary_type id(1);
|
|
209
|
-
for (unsigned int i = 0; i < reducedMatrixR_.get_number_of_columns(); i++) {
|
|
210
|
-
id.at(0) = i;
|
|
211
|
-
mirrorMatrixU_.insert_column(i, Column_type(id));
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
template <class Column_type>
|
|
216
|
-
inline void RU_matrix<Column_type>::_swap_at_index(index index) {
|
|
217
|
-
reducedMatrixR_.swap_at_indices(index, index + 1);
|
|
218
|
-
mirrorMatrixU_.swap_at_indices(index, index + 1);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
template <class Column_type>
|
|
222
|
-
inline void RU_matrix<Column_type>::_add_to(index sourceIndex,
|
|
223
|
-
index targetIndex) {
|
|
224
|
-
reducedMatrixR_.add_to(sourceIndex, targetIndex);
|
|
225
|
-
mirrorMatrixU_.add_to(targetIndex, sourceIndex);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
template <class Column_type>
|
|
229
|
-
inline void RU_matrix<Column_type>::_positive_vine_swap(index index) {
|
|
230
|
-
int iDeath = barcode_.at(indexToBar_.at(index)).death;
|
|
231
|
-
int iiDeath = barcode_.at(indexToBar_.at(index + 1)).death;
|
|
232
|
-
|
|
233
|
-
if (get_dimension(index) == get_dimension(index + 1)) {
|
|
234
|
-
if (!mirrorMatrixU_.is_zero_cell(index, index + 1))
|
|
235
|
-
mirrorMatrixU_.zero_cell(index, index + 1);
|
|
236
|
-
|
|
237
|
-
if (iDeath != -1 && iiDeath != -1 &&
|
|
238
|
-
!(reducedMatrixR_.is_zero_cell(iiDeath, index))) {
|
|
239
|
-
if (iDeath < iiDeath) {
|
|
240
|
-
_swap_at_index(index);
|
|
241
|
-
_add_to(iDeath, iiDeath);
|
|
242
|
-
|
|
243
|
-
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
244
|
-
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
245
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
246
|
-
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (iiDeath < iDeath) {
|
|
251
|
-
_swap_at_index(index);
|
|
252
|
-
_add_to(iiDeath, iDeath);
|
|
253
|
-
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
_swap_at_index(index);
|
|
259
|
-
|
|
260
|
-
if (iDeath != -1 || iiDeath == -1 ||
|
|
261
|
-
reducedMatrixR_.is_zero_cell(iiDeath, index + 1)) {
|
|
262
|
-
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
263
|
-
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
264
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
_swap_at_index(index);
|
|
271
|
-
|
|
272
|
-
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
273
|
-
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
274
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
template <class Column_type>
|
|
278
|
-
inline void RU_matrix<Column_type>::_negative_vine_swap(index index) {
|
|
279
|
-
if (get_dimension(index) == get_dimension(index + 1) &&
|
|
280
|
-
!mirrorMatrixU_.is_zero_cell(index, index + 1)) {
|
|
281
|
-
_add_to(index, index + 1);
|
|
282
|
-
_swap_at_index(index);
|
|
283
|
-
|
|
284
|
-
if (barcode_.at(indexToBar_.at(index)).birth <
|
|
285
|
-
barcode_.at(indexToBar_.at(index + 1)).birth) {
|
|
286
|
-
barcode_.at(indexToBar_.at(index)).death = index + 1;
|
|
287
|
-
barcode_.at(indexToBar_.at(index + 1)).death = index;
|
|
288
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
289
|
-
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
_add_to(index, index + 1);
|
|
294
|
-
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
_swap_at_index(index);
|
|
299
|
-
|
|
300
|
-
barcode_.at(indexToBar_.at(index)).death = index + 1;
|
|
301
|
-
barcode_.at(indexToBar_.at(index + 1)).death = index;
|
|
302
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
template <class Column_type>
|
|
306
|
-
inline void RU_matrix<Column_type>::_positive_negative_vine_swap(index index) {
|
|
307
|
-
if (get_dimension(index) == get_dimension(index + 1) &&
|
|
308
|
-
!mirrorMatrixU_.is_zero_cell(index, index + 1))
|
|
309
|
-
mirrorMatrixU_.zero_cell(index, index + 1);
|
|
310
|
-
|
|
311
|
-
_swap_at_index(index);
|
|
312
|
-
|
|
313
|
-
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
314
|
-
barcode_.at(indexToBar_.at(index + 1)).death = index;
|
|
315
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
template <class Column_type>
|
|
319
|
-
inline void RU_matrix<Column_type>::_negative_positive_vine_swap(index index) {
|
|
320
|
-
if (get_dimension(index) == get_dimension(index + 1) &&
|
|
321
|
-
!mirrorMatrixU_.is_zero_cell(index, index + 1)) {
|
|
322
|
-
_add_to(index, index + 1);
|
|
323
|
-
_swap_at_index(index);
|
|
324
|
-
_add_to(index, index + 1);
|
|
325
|
-
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
_swap_at_index(index);
|
|
330
|
-
|
|
331
|
-
barcode_.at(indexToBar_.at(index)).death = index + 1;
|
|
332
|
-
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
333
|
-
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
template <class Column_type>
|
|
337
|
-
inline void swap(RU_matrix<Column_type> &matrix1,
|
|
338
|
-
RU_matrix<Column_type> &matrix2) {
|
|
339
|
-
std::swap(matrix1.reducedMatrixR_, matrix2.reducedMatrixR_);
|
|
340
|
-
std::swap(matrix1.mirrorMatrixU_, matrix2.mirrorMatrixU_);
|
|
341
|
-
matrix1.barcode_.swap(matrix2.barcode_);
|
|
342
|
-
matrix1.indexToBar_.swap(matrix2.indexToBar_);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
} // namespace Gudhi::multiparameter::mma
|
|
346
|
-
|
|
347
|
-
#endif // RU_MATRIX_H
|
|
1
|
+
/* This file is part of the MMA Library -
|
|
2
|
+
* https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT. See
|
|
3
|
+
* file LICENSE for full license details. Author(s): Hannah Schreiber
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2022 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#ifndef RU_MATRIX_H
|
|
12
|
+
#define RU_MATRIX_H
|
|
13
|
+
|
|
14
|
+
#include <vector>
|
|
15
|
+
|
|
16
|
+
#include "utilities.h" //type definitions
|
|
17
|
+
#include "vector_matrix.h"
|
|
18
|
+
|
|
19
|
+
namespace Gudhi::multiparameter::mma {
|
|
20
|
+
|
|
21
|
+
template <class Column_type> class RU_matrix {
|
|
22
|
+
public:
|
|
23
|
+
RU_matrix();
|
|
24
|
+
RU_matrix(boundary_matrix &orderedBoundaries);
|
|
25
|
+
RU_matrix(int numberOfColumns);
|
|
26
|
+
RU_matrix(RU_matrix &matrixToCopy);
|
|
27
|
+
RU_matrix(RU_matrix &&other) noexcept;
|
|
28
|
+
|
|
29
|
+
void insert_boundary(index columnIndex, boundary_type &boundary);
|
|
30
|
+
dimension_type get_dimension(index index);
|
|
31
|
+
unsigned int get_number_of_simplices();
|
|
32
|
+
|
|
33
|
+
void initialize();
|
|
34
|
+
void vine_swap(index index);
|
|
35
|
+
const barcode_type &get_current_barcode();
|
|
36
|
+
|
|
37
|
+
void print_matrices(); // for debug
|
|
38
|
+
|
|
39
|
+
RU_matrix<Column_type> &operator=(RU_matrix<Column_type> other);
|
|
40
|
+
template <class Friend_column_type>
|
|
41
|
+
friend void swap(RU_matrix<Column_type> &matrix1,
|
|
42
|
+
RU_matrix<Friend_column_type> &matrix2);
|
|
43
|
+
|
|
44
|
+
private:
|
|
45
|
+
Vector_matrix<Column_type> reducedMatrixR_;
|
|
46
|
+
Vector_matrix<Column_type> mirrorMatrixU_;
|
|
47
|
+
barcode_type barcode_;
|
|
48
|
+
std::vector<int> indexToBar_;
|
|
49
|
+
|
|
50
|
+
void _initialize_U();
|
|
51
|
+
void _swap_at_index(index index);
|
|
52
|
+
void _add_to(index sourceIndex, index targetIndex);
|
|
53
|
+
void _positive_vine_swap(index index);
|
|
54
|
+
void _negative_vine_swap(index index);
|
|
55
|
+
void _positive_negative_vine_swap(index index);
|
|
56
|
+
void _negative_positive_vine_swap(index index);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
template <class Column_type> inline RU_matrix<Column_type>::RU_matrix() {}
|
|
60
|
+
|
|
61
|
+
template <class Column_type>
|
|
62
|
+
inline RU_matrix<Column_type>::RU_matrix(boundary_matrix &orderedBoundaries)
|
|
63
|
+
: reducedMatrixR_(orderedBoundaries),
|
|
64
|
+
mirrorMatrixU_(orderedBoundaries.size()) {
|
|
65
|
+
_initialize_U();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
template <class Column_type>
|
|
69
|
+
inline RU_matrix<Column_type>::RU_matrix(int numberOfColumns)
|
|
70
|
+
: reducedMatrixR_(numberOfColumns), mirrorMatrixU_(numberOfColumns) {
|
|
71
|
+
_initialize_U();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
template <class Column_type>
|
|
75
|
+
inline RU_matrix<Column_type>::RU_matrix(RU_matrix &matrixToCopy)
|
|
76
|
+
: reducedMatrixR_(matrixToCopy.reducedMatrixR_),
|
|
77
|
+
mirrorMatrixU_(matrixToCopy.mirrorMatrixU_),
|
|
78
|
+
barcode_(matrixToCopy.barcode_), indexToBar_(matrixToCopy.indexToBar_) {}
|
|
79
|
+
|
|
80
|
+
template <class Column_type>
|
|
81
|
+
inline RU_matrix<Column_type>::RU_matrix(
|
|
82
|
+
RU_matrix<Column_type> &&other) noexcept
|
|
83
|
+
: reducedMatrixR_(std::move(other.reducedMatrixR_)),
|
|
84
|
+
mirrorMatrixU_(std::move(other.mirrorMatrixU_)),
|
|
85
|
+
barcode_(std::move(other.barcode_)),
|
|
86
|
+
indexToBar_(std::move(other.indexToBar_)) {}
|
|
87
|
+
|
|
88
|
+
template <class Column_type>
|
|
89
|
+
inline void RU_matrix<Column_type>::insert_boundary(index columnIndex,
|
|
90
|
+
boundary_type &boundary) {
|
|
91
|
+
reducedMatrixR_.insert_boundary(columnIndex, boundary);
|
|
92
|
+
boundary_type id(1, columnIndex);
|
|
93
|
+
mirrorMatrixU_.insert_column(columnIndex, Column_type(id));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
template <class Column_type>
|
|
97
|
+
inline dimension_type RU_matrix<Column_type>::get_dimension(index index) {
|
|
98
|
+
return reducedMatrixR_.get_column_dimension(index);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
template <class Column_type>
|
|
102
|
+
inline unsigned int RU_matrix<Column_type>::get_number_of_simplices() {
|
|
103
|
+
return reducedMatrixR_.get_number_of_columns();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
template <class Column_type> inline void RU_matrix<Column_type>::initialize() {
|
|
107
|
+
std::unordered_map<index, index> pivotsToColumn;
|
|
108
|
+
indexToBar_.resize(reducedMatrixR_.get_number_of_columns(), -1);
|
|
109
|
+
|
|
110
|
+
for (unsigned int i = 0; i < reducedMatrixR_.get_number_of_columns(); i++) {
|
|
111
|
+
if (!(reducedMatrixR_.is_zero_column(i))) {
|
|
112
|
+
Column_type &curr = reducedMatrixR_.get_column(i);
|
|
113
|
+
int pivot = curr.get_pivot();
|
|
114
|
+
|
|
115
|
+
while (pivot != -1 &&
|
|
116
|
+
pivotsToColumn.find(pivot) != pivotsToColumn.end()) {
|
|
117
|
+
curr.add(reducedMatrixR_.get_column(pivotsToColumn.at(pivot)));
|
|
118
|
+
mirrorMatrixU_.get_column(pivotsToColumn.at(pivot))
|
|
119
|
+
.add(mirrorMatrixU_.get_column(i));
|
|
120
|
+
pivot = curr.get_pivot();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (pivot != -1) {
|
|
124
|
+
pivotsToColumn.emplace(pivot, i);
|
|
125
|
+
barcode_.at(indexToBar_.at(pivot)).death = i;
|
|
126
|
+
indexToBar_.at(i) = indexToBar_.at(pivot);
|
|
127
|
+
} else {
|
|
128
|
+
barcode_.push_back(Bar(get_dimension(i), i, -1));
|
|
129
|
+
indexToBar_.at(i) = barcode_.size() - 1;
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
barcode_.push_back(Bar(get_dimension(i), i, -1));
|
|
133
|
+
indexToBar_.at(i) = barcode_.size() - 1;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
template <class Column_type>
|
|
139
|
+
inline void RU_matrix<Column_type>::vine_swap(index index) {
|
|
140
|
+
if (index >= reducedMatrixR_.get_number_of_columns() - 1)
|
|
141
|
+
return;
|
|
142
|
+
|
|
143
|
+
bool iIsPositive =
|
|
144
|
+
(barcode_.at(indexToBar_.at(index)).birth == static_cast<int>(index));
|
|
145
|
+
bool iiIsPositive = (barcode_.at(indexToBar_.at(index + 1)).birth ==
|
|
146
|
+
static_cast<int>(index) + 1);
|
|
147
|
+
|
|
148
|
+
if (iIsPositive && iiIsPositive)
|
|
149
|
+
_positive_vine_swap(index);
|
|
150
|
+
else if (!iIsPositive && !iiIsPositive)
|
|
151
|
+
_negative_vine_swap(index);
|
|
152
|
+
else if (iIsPositive && !iiIsPositive)
|
|
153
|
+
_positive_negative_vine_swap(index);
|
|
154
|
+
else
|
|
155
|
+
_negative_positive_vine_swap(index);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
template <class Column_type>
|
|
159
|
+
inline const barcode_type &RU_matrix<Column_type>::get_current_barcode() {
|
|
160
|
+
return barcode_;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
template <class Column_type>
|
|
164
|
+
inline void RU_matrix<Column_type>::print_matrices() {
|
|
165
|
+
boundary_type b;
|
|
166
|
+
|
|
167
|
+
std::cout << "R:\n";
|
|
168
|
+
for (unsigned int i = 0; i < reducedMatrixR_.get_number_of_columns(); i++) {
|
|
169
|
+
reducedMatrixR_.get_boundary(i, b);
|
|
170
|
+
if (b.empty()) {
|
|
171
|
+
std::cout << "-\n";
|
|
172
|
+
} else {
|
|
173
|
+
for (unsigned int i : b)
|
|
174
|
+
std::cout << i << " ";
|
|
175
|
+
std::cout << "\n";
|
|
176
|
+
b.clear();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
std::cout << "\n";
|
|
180
|
+
|
|
181
|
+
std::cout << "U:\n";
|
|
182
|
+
for (unsigned int i = 0; i < mirrorMatrixU_.get_number_of_columns(); i++) {
|
|
183
|
+
mirrorMatrixU_.get_boundary(i, b);
|
|
184
|
+
if (b.empty()) {
|
|
185
|
+
std::cout << "-\n";
|
|
186
|
+
} else {
|
|
187
|
+
for (unsigned int i : b)
|
|
188
|
+
std::cout << i << " ";
|
|
189
|
+
std::cout << "\n";
|
|
190
|
+
b.clear();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
std::cout << "\n";
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
template <class Column_type>
|
|
197
|
+
inline RU_matrix<Column_type> &
|
|
198
|
+
RU_matrix<Column_type>::operator=(RU_matrix<Column_type> other) {
|
|
199
|
+
std::swap(reducedMatrixR_, other.reducedMatrixR_);
|
|
200
|
+
std::swap(mirrorMatrixU_, other.mirrorMatrixU_);
|
|
201
|
+
std::swap(barcode_, other.barcode_);
|
|
202
|
+
std::swap(indexToBar_, other.indexToBar_);
|
|
203
|
+
return *this;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
template <class Column_type>
|
|
207
|
+
inline void RU_matrix<Column_type>::_initialize_U() {
|
|
208
|
+
boundary_type id(1);
|
|
209
|
+
for (unsigned int i = 0; i < reducedMatrixR_.get_number_of_columns(); i++) {
|
|
210
|
+
id.at(0) = i;
|
|
211
|
+
mirrorMatrixU_.insert_column(i, Column_type(id));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
template <class Column_type>
|
|
216
|
+
inline void RU_matrix<Column_type>::_swap_at_index(index index) {
|
|
217
|
+
reducedMatrixR_.swap_at_indices(index, index + 1);
|
|
218
|
+
mirrorMatrixU_.swap_at_indices(index, index + 1);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
template <class Column_type>
|
|
222
|
+
inline void RU_matrix<Column_type>::_add_to(index sourceIndex,
|
|
223
|
+
index targetIndex) {
|
|
224
|
+
reducedMatrixR_.add_to(sourceIndex, targetIndex);
|
|
225
|
+
mirrorMatrixU_.add_to(targetIndex, sourceIndex);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
template <class Column_type>
|
|
229
|
+
inline void RU_matrix<Column_type>::_positive_vine_swap(index index) {
|
|
230
|
+
int iDeath = barcode_.at(indexToBar_.at(index)).death;
|
|
231
|
+
int iiDeath = barcode_.at(indexToBar_.at(index + 1)).death;
|
|
232
|
+
|
|
233
|
+
if (get_dimension(index) == get_dimension(index + 1)) {
|
|
234
|
+
if (!mirrorMatrixU_.is_zero_cell(index, index + 1))
|
|
235
|
+
mirrorMatrixU_.zero_cell(index, index + 1);
|
|
236
|
+
|
|
237
|
+
if (iDeath != -1 && iiDeath != -1 &&
|
|
238
|
+
!(reducedMatrixR_.is_zero_cell(iiDeath, index))) {
|
|
239
|
+
if (iDeath < iiDeath) {
|
|
240
|
+
_swap_at_index(index);
|
|
241
|
+
_add_to(iDeath, iiDeath);
|
|
242
|
+
|
|
243
|
+
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
244
|
+
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
245
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
246
|
+
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (iiDeath < iDeath) {
|
|
251
|
+
_swap_at_index(index);
|
|
252
|
+
_add_to(iiDeath, iDeath);
|
|
253
|
+
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
_swap_at_index(index);
|
|
259
|
+
|
|
260
|
+
if (iDeath != -1 || iiDeath == -1 ||
|
|
261
|
+
reducedMatrixR_.is_zero_cell(iiDeath, index + 1)) {
|
|
262
|
+
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
263
|
+
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
264
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
_swap_at_index(index);
|
|
271
|
+
|
|
272
|
+
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
273
|
+
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
274
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
template <class Column_type>
|
|
278
|
+
inline void RU_matrix<Column_type>::_negative_vine_swap(index index) {
|
|
279
|
+
if (get_dimension(index) == get_dimension(index + 1) &&
|
|
280
|
+
!mirrorMatrixU_.is_zero_cell(index, index + 1)) {
|
|
281
|
+
_add_to(index, index + 1);
|
|
282
|
+
_swap_at_index(index);
|
|
283
|
+
|
|
284
|
+
if (barcode_.at(indexToBar_.at(index)).birth <
|
|
285
|
+
barcode_.at(indexToBar_.at(index + 1)).birth) {
|
|
286
|
+
barcode_.at(indexToBar_.at(index)).death = index + 1;
|
|
287
|
+
barcode_.at(indexToBar_.at(index + 1)).death = index;
|
|
288
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
289
|
+
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
_add_to(index, index + 1);
|
|
294
|
+
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
_swap_at_index(index);
|
|
299
|
+
|
|
300
|
+
barcode_.at(indexToBar_.at(index)).death = index + 1;
|
|
301
|
+
barcode_.at(indexToBar_.at(index + 1)).death = index;
|
|
302
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
template <class Column_type>
|
|
306
|
+
inline void RU_matrix<Column_type>::_positive_negative_vine_swap(index index) {
|
|
307
|
+
if (get_dimension(index) == get_dimension(index + 1) &&
|
|
308
|
+
!mirrorMatrixU_.is_zero_cell(index, index + 1))
|
|
309
|
+
mirrorMatrixU_.zero_cell(index, index + 1);
|
|
310
|
+
|
|
311
|
+
_swap_at_index(index);
|
|
312
|
+
|
|
313
|
+
barcode_.at(indexToBar_.at(index)).birth = index + 1;
|
|
314
|
+
barcode_.at(indexToBar_.at(index + 1)).death = index;
|
|
315
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
template <class Column_type>
|
|
319
|
+
inline void RU_matrix<Column_type>::_negative_positive_vine_swap(index index) {
|
|
320
|
+
if (get_dimension(index) == get_dimension(index + 1) &&
|
|
321
|
+
!mirrorMatrixU_.is_zero_cell(index, index + 1)) {
|
|
322
|
+
_add_to(index, index + 1);
|
|
323
|
+
_swap_at_index(index);
|
|
324
|
+
_add_to(index, index + 1);
|
|
325
|
+
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
_swap_at_index(index);
|
|
330
|
+
|
|
331
|
+
barcode_.at(indexToBar_.at(index)).death = index + 1;
|
|
332
|
+
barcode_.at(indexToBar_.at(index + 1)).birth = index;
|
|
333
|
+
std::swap(indexToBar_.at(index), indexToBar_.at(index + 1));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
template <class Column_type>
|
|
337
|
+
inline void swap(RU_matrix<Column_type> &matrix1,
|
|
338
|
+
RU_matrix<Column_type> &matrix2) {
|
|
339
|
+
std::swap(matrix1.reducedMatrixR_, matrix2.reducedMatrixR_);
|
|
340
|
+
std::swap(matrix1.mirrorMatrixU_, matrix2.mirrorMatrixU_);
|
|
341
|
+
matrix1.barcode_.swap(matrix2.barcode_);
|
|
342
|
+
matrix1.indexToBar_.swap(matrix2.indexToBar_);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
} // namespace Gudhi::multiparameter::mma
|
|
346
|
+
|
|
347
|
+
#endif // RU_MATRIX_H
|