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,223 +1,223 @@
|
|
|
1
|
-
/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT.
|
|
2
|
-
* See file LICENSE for full license details.
|
|
3
|
-
* 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 VECTORCOLUMN_H
|
|
12
|
-
#define VECTORCOLUMN_H
|
|
13
|
-
|
|
14
|
-
#include <iostream>
|
|
15
|
-
#include <list>
|
|
16
|
-
#include <unordered_set>
|
|
17
|
-
|
|
18
|
-
#include "utilities.h"
|
|
19
|
-
|
|
20
|
-
namespace Vineyard {
|
|
21
|
-
|
|
22
|
-
class Vector_column
|
|
23
|
-
{
|
|
24
|
-
public:
|
|
25
|
-
Vector_column();
|
|
26
|
-
Vector_column(boundary_type& boundary);
|
|
27
|
-
Vector_column(Vector_column& column);
|
|
28
|
-
Vector_column(Vector_column&& column) noexcept;
|
|
29
|
-
|
|
30
|
-
void get_content(boundary_type& container);
|
|
31
|
-
bool contains(unsigned int value) const;
|
|
32
|
-
bool is_empty();
|
|
33
|
-
dimension_type get_dimension() const;
|
|
34
|
-
int get_pivot();
|
|
35
|
-
void clear();
|
|
36
|
-
void clear(unsigned int value);
|
|
37
|
-
void reorder(std::vector<index>& valueMap);
|
|
38
|
-
void add(Vector_column& column);
|
|
39
|
-
|
|
40
|
-
Vector_column& operator=(Vector_column other);
|
|
41
|
-
|
|
42
|
-
friend void swap(Vector_column& col1, Vector_column& col2);
|
|
43
|
-
|
|
44
|
-
private:
|
|
45
|
-
int dim_;
|
|
46
|
-
std::vector<unsigned int> column_;
|
|
47
|
-
std::unordered_set<unsigned int> erasedValues_;
|
|
48
|
-
|
|
49
|
-
void _cleanValues();
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
inline Vector_column::Vector_column() : dim_(0)
|
|
53
|
-
{}
|
|
54
|
-
|
|
55
|
-
inline Vector_column::Vector_column(boundary_type &boundary)
|
|
56
|
-
: dim_(boundary.size() == 0 ? 0 : boundary.size() - 1),
|
|
57
|
-
column_(boundary)
|
|
58
|
-
{}
|
|
59
|
-
|
|
60
|
-
inline Vector_column::Vector_column(Vector_column &column)
|
|
61
|
-
: dim_(column.dim_),
|
|
62
|
-
column_(column.column_),
|
|
63
|
-
erasedValues_(column.erasedValues_)
|
|
64
|
-
{}
|
|
65
|
-
|
|
66
|
-
inline Vector_column::Vector_column(Vector_column &&column) noexcept
|
|
67
|
-
: dim_(std::exchange(column.dim_, 0)),
|
|
68
|
-
column_(std::move(column.column_)),
|
|
69
|
-
erasedValues_(std::move(column.erasedValues_))
|
|
70
|
-
{}
|
|
71
|
-
|
|
72
|
-
inline void Vector_column::get_content(boundary_type &container)
|
|
73
|
-
{
|
|
74
|
-
_cleanValues();
|
|
75
|
-
std::copy(column_.begin(), column_.end(), std::back_inserter(container));
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
inline bool Vector_column::contains(unsigned int value) const
|
|
79
|
-
{
|
|
80
|
-
if (erasedValues_.find(value) != erasedValues_.end()) return false;
|
|
81
|
-
|
|
82
|
-
for (unsigned int v : column_){
|
|
83
|
-
if (v == value) return true;
|
|
84
|
-
}
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
inline bool Vector_column::is_empty()
|
|
89
|
-
{
|
|
90
|
-
_cleanValues();
|
|
91
|
-
return column_.empty();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
inline dimension_type Vector_column::get_dimension() const
|
|
95
|
-
{
|
|
96
|
-
return dim_;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
inline int Vector_column::get_pivot()
|
|
100
|
-
{
|
|
101
|
-
while (!column_.empty() &&
|
|
102
|
-
erasedValues_.find(column_.back()) != erasedValues_.end()) {
|
|
103
|
-
erasedValues_.erase(column_.back());
|
|
104
|
-
column_.pop_back();
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (column_.empty()) return -1;
|
|
108
|
-
|
|
109
|
-
return column_.back();
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
inline void Vector_column::clear()
|
|
113
|
-
{
|
|
114
|
-
column_.clear();
|
|
115
|
-
erasedValues_.clear();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
inline void Vector_column::clear(unsigned int value)
|
|
119
|
-
{
|
|
120
|
-
erasedValues_.insert(value);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
inline void Vector_column::reorder(std::vector<index> &valueMap)
|
|
124
|
-
{
|
|
125
|
-
std::vector<unsigned int> newColumn;
|
|
126
|
-
for (unsigned int& v : column_) {
|
|
127
|
-
if (erasedValues_.find(v) == erasedValues_.end())
|
|
128
|
-
newColumn.push_back(valueMap.at(v));
|
|
129
|
-
}
|
|
130
|
-
std::sort(newColumn.begin(), newColumn.end());
|
|
131
|
-
erasedValues_.clear();
|
|
132
|
-
column_.swap(newColumn);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
inline void Vector_column::add(Vector_column &column)
|
|
136
|
-
{
|
|
137
|
-
if (column.is_empty()) return;
|
|
138
|
-
if (column_.empty()){
|
|
139
|
-
std::copy(column.column_.begin(), column.column_.end(), std::back_inserter(column_));
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
std::vector<unsigned int> newColumn;
|
|
144
|
-
|
|
145
|
-
std::vector<unsigned int>::iterator itToAdd = column.column_.begin();
|
|
146
|
-
std::vector<unsigned int>::iterator itTarget = column_.begin();
|
|
147
|
-
unsigned int valToAdd = *itToAdd;
|
|
148
|
-
unsigned int valTarget = *itTarget;
|
|
149
|
-
|
|
150
|
-
while (itToAdd != column.column_.end() && itTarget != column_.end())
|
|
151
|
-
{
|
|
152
|
-
while (itToAdd != column.column_.end() &&
|
|
153
|
-
column.erasedValues_.find(valToAdd) != column.erasedValues_.end()) {
|
|
154
|
-
itToAdd++;
|
|
155
|
-
valToAdd = *itToAdd;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
while (itTarget != column_.end() &&
|
|
159
|
-
erasedValues_.find(valTarget) != erasedValues_.end()) {
|
|
160
|
-
itTarget++;
|
|
161
|
-
valTarget = *itTarget;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (itToAdd != column.column_.end() && itTarget != column_.end()){
|
|
165
|
-
if (valToAdd == valTarget){
|
|
166
|
-
itTarget++;
|
|
167
|
-
itToAdd++;
|
|
168
|
-
} else if (valToAdd < valTarget){
|
|
169
|
-
newColumn.push_back(valToAdd);
|
|
170
|
-
itToAdd++;
|
|
171
|
-
} else {
|
|
172
|
-
newColumn.push_back(valTarget);
|
|
173
|
-
itTarget++;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
valToAdd = *itToAdd;
|
|
178
|
-
valTarget = *itTarget;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
while (itToAdd != column.column_.end()){
|
|
182
|
-
newColumn.push_back(*itToAdd);
|
|
183
|
-
itToAdd++;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
while (itTarget != column_.end()){
|
|
187
|
-
newColumn.push_back(*itTarget);
|
|
188
|
-
itTarget++;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
column_.swap(newColumn);
|
|
192
|
-
erasedValues_.clear();
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
inline Vector_column &Vector_column::operator=(Vector_column other)
|
|
196
|
-
{
|
|
197
|
-
std::swap(dim_, other.dim_);
|
|
198
|
-
std::swap(column_, other.column_);
|
|
199
|
-
std::swap(erasedValues_, other.erasedValues_);
|
|
200
|
-
return *this;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
inline void Vector_column::_cleanValues()
|
|
204
|
-
{
|
|
205
|
-
std::vector<unsigned int> newColumn;
|
|
206
|
-
for (unsigned int v : column_){
|
|
207
|
-
if (erasedValues_.find(v) == erasedValues_.end())
|
|
208
|
-
newColumn.push_back(v);
|
|
209
|
-
}
|
|
210
|
-
erasedValues_.clear();
|
|
211
|
-
column_.swap(newColumn);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
inline void swap(Vector_column& col1, Vector_column& col2)
|
|
215
|
-
{
|
|
216
|
-
std::swap(col1.dim_, col2.dim_);
|
|
217
|
-
col1.column_.swap(col2.column_);
|
|
218
|
-
std::swap(col1.erasedValues_, col2.erasedValues_);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
} //namespace Vineyard
|
|
222
|
-
|
|
223
|
-
#endif // VECTORCOLUMN_H
|
|
1
|
+
/* This file is part of the MMA Library - https://gitlab.inria.fr/dloiseau/multipers - which is released under MIT.
|
|
2
|
+
* See file LICENSE for full license details.
|
|
3
|
+
* 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 VECTORCOLUMN_H
|
|
12
|
+
#define VECTORCOLUMN_H
|
|
13
|
+
|
|
14
|
+
#include <iostream>
|
|
15
|
+
#include <list>
|
|
16
|
+
#include <unordered_set>
|
|
17
|
+
|
|
18
|
+
#include "utilities.h"
|
|
19
|
+
|
|
20
|
+
namespace Vineyard {
|
|
21
|
+
|
|
22
|
+
class Vector_column
|
|
23
|
+
{
|
|
24
|
+
public:
|
|
25
|
+
Vector_column();
|
|
26
|
+
Vector_column(boundary_type& boundary);
|
|
27
|
+
Vector_column(Vector_column& column);
|
|
28
|
+
Vector_column(Vector_column&& column) noexcept;
|
|
29
|
+
|
|
30
|
+
void get_content(boundary_type& container);
|
|
31
|
+
bool contains(unsigned int value) const;
|
|
32
|
+
bool is_empty();
|
|
33
|
+
dimension_type get_dimension() const;
|
|
34
|
+
int get_pivot();
|
|
35
|
+
void clear();
|
|
36
|
+
void clear(unsigned int value);
|
|
37
|
+
void reorder(std::vector<index>& valueMap);
|
|
38
|
+
void add(Vector_column& column);
|
|
39
|
+
|
|
40
|
+
Vector_column& operator=(Vector_column other);
|
|
41
|
+
|
|
42
|
+
friend void swap(Vector_column& col1, Vector_column& col2);
|
|
43
|
+
|
|
44
|
+
private:
|
|
45
|
+
int dim_;
|
|
46
|
+
std::vector<unsigned int> column_;
|
|
47
|
+
std::unordered_set<unsigned int> erasedValues_;
|
|
48
|
+
|
|
49
|
+
void _cleanValues();
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
inline Vector_column::Vector_column() : dim_(0)
|
|
53
|
+
{}
|
|
54
|
+
|
|
55
|
+
inline Vector_column::Vector_column(boundary_type &boundary)
|
|
56
|
+
: dim_(boundary.size() == 0 ? 0 : boundary.size() - 1),
|
|
57
|
+
column_(boundary)
|
|
58
|
+
{}
|
|
59
|
+
|
|
60
|
+
inline Vector_column::Vector_column(Vector_column &column)
|
|
61
|
+
: dim_(column.dim_),
|
|
62
|
+
column_(column.column_),
|
|
63
|
+
erasedValues_(column.erasedValues_)
|
|
64
|
+
{}
|
|
65
|
+
|
|
66
|
+
inline Vector_column::Vector_column(Vector_column &&column) noexcept
|
|
67
|
+
: dim_(std::exchange(column.dim_, 0)),
|
|
68
|
+
column_(std::move(column.column_)),
|
|
69
|
+
erasedValues_(std::move(column.erasedValues_))
|
|
70
|
+
{}
|
|
71
|
+
|
|
72
|
+
inline void Vector_column::get_content(boundary_type &container)
|
|
73
|
+
{
|
|
74
|
+
_cleanValues();
|
|
75
|
+
std::copy(column_.begin(), column_.end(), std::back_inserter(container));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
inline bool Vector_column::contains(unsigned int value) const
|
|
79
|
+
{
|
|
80
|
+
if (erasedValues_.find(value) != erasedValues_.end()) return false;
|
|
81
|
+
|
|
82
|
+
for (unsigned int v : column_){
|
|
83
|
+
if (v == value) return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
inline bool Vector_column::is_empty()
|
|
89
|
+
{
|
|
90
|
+
_cleanValues();
|
|
91
|
+
return column_.empty();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
inline dimension_type Vector_column::get_dimension() const
|
|
95
|
+
{
|
|
96
|
+
return dim_;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
inline int Vector_column::get_pivot()
|
|
100
|
+
{
|
|
101
|
+
while (!column_.empty() &&
|
|
102
|
+
erasedValues_.find(column_.back()) != erasedValues_.end()) {
|
|
103
|
+
erasedValues_.erase(column_.back());
|
|
104
|
+
column_.pop_back();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (column_.empty()) return -1;
|
|
108
|
+
|
|
109
|
+
return column_.back();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
inline void Vector_column::clear()
|
|
113
|
+
{
|
|
114
|
+
column_.clear();
|
|
115
|
+
erasedValues_.clear();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
inline void Vector_column::clear(unsigned int value)
|
|
119
|
+
{
|
|
120
|
+
erasedValues_.insert(value);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
inline void Vector_column::reorder(std::vector<index> &valueMap)
|
|
124
|
+
{
|
|
125
|
+
std::vector<unsigned int> newColumn;
|
|
126
|
+
for (unsigned int& v : column_) {
|
|
127
|
+
if (erasedValues_.find(v) == erasedValues_.end())
|
|
128
|
+
newColumn.push_back(valueMap.at(v));
|
|
129
|
+
}
|
|
130
|
+
std::sort(newColumn.begin(), newColumn.end());
|
|
131
|
+
erasedValues_.clear();
|
|
132
|
+
column_.swap(newColumn);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
inline void Vector_column::add(Vector_column &column)
|
|
136
|
+
{
|
|
137
|
+
if (column.is_empty()) return;
|
|
138
|
+
if (column_.empty()){
|
|
139
|
+
std::copy(column.column_.begin(), column.column_.end(), std::back_inserter(column_));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
std::vector<unsigned int> newColumn;
|
|
144
|
+
|
|
145
|
+
std::vector<unsigned int>::iterator itToAdd = column.column_.begin();
|
|
146
|
+
std::vector<unsigned int>::iterator itTarget = column_.begin();
|
|
147
|
+
unsigned int valToAdd = *itToAdd;
|
|
148
|
+
unsigned int valTarget = *itTarget;
|
|
149
|
+
|
|
150
|
+
while (itToAdd != column.column_.end() && itTarget != column_.end())
|
|
151
|
+
{
|
|
152
|
+
while (itToAdd != column.column_.end() &&
|
|
153
|
+
column.erasedValues_.find(valToAdd) != column.erasedValues_.end()) {
|
|
154
|
+
itToAdd++;
|
|
155
|
+
valToAdd = *itToAdd;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
while (itTarget != column_.end() &&
|
|
159
|
+
erasedValues_.find(valTarget) != erasedValues_.end()) {
|
|
160
|
+
itTarget++;
|
|
161
|
+
valTarget = *itTarget;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (itToAdd != column.column_.end() && itTarget != column_.end()){
|
|
165
|
+
if (valToAdd == valTarget){
|
|
166
|
+
itTarget++;
|
|
167
|
+
itToAdd++;
|
|
168
|
+
} else if (valToAdd < valTarget){
|
|
169
|
+
newColumn.push_back(valToAdd);
|
|
170
|
+
itToAdd++;
|
|
171
|
+
} else {
|
|
172
|
+
newColumn.push_back(valTarget);
|
|
173
|
+
itTarget++;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
valToAdd = *itToAdd;
|
|
178
|
+
valTarget = *itTarget;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
while (itToAdd != column.column_.end()){
|
|
182
|
+
newColumn.push_back(*itToAdd);
|
|
183
|
+
itToAdd++;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
while (itTarget != column_.end()){
|
|
187
|
+
newColumn.push_back(*itTarget);
|
|
188
|
+
itTarget++;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
column_.swap(newColumn);
|
|
192
|
+
erasedValues_.clear();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
inline Vector_column &Vector_column::operator=(Vector_column other)
|
|
196
|
+
{
|
|
197
|
+
std::swap(dim_, other.dim_);
|
|
198
|
+
std::swap(column_, other.column_);
|
|
199
|
+
std::swap(erasedValues_, other.erasedValues_);
|
|
200
|
+
return *this;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
inline void Vector_column::_cleanValues()
|
|
204
|
+
{
|
|
205
|
+
std::vector<unsigned int> newColumn;
|
|
206
|
+
for (unsigned int v : column_){
|
|
207
|
+
if (erasedValues_.find(v) == erasedValues_.end())
|
|
208
|
+
newColumn.push_back(v);
|
|
209
|
+
}
|
|
210
|
+
erasedValues_.clear();
|
|
211
|
+
column_.swap(newColumn);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
inline void swap(Vector_column& col1, Vector_column& col2)
|
|
215
|
+
{
|
|
216
|
+
std::swap(col1.dim_, col2.dim_);
|
|
217
|
+
col1.column_.swap(col2.column_);
|
|
218
|
+
std::swap(col1.erasedValues_, col2.erasedValues_);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
} //namespace Vineyard
|
|
222
|
+
|
|
223
|
+
#endif // VECTORCOLUMN_H
|