multipers 2.3.3b6__cp312-cp312-macosx_11_0_arm64.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/.dylibs/libc++.1.0.dylib +0 -0
- multipers/.dylibs/libtbb.12.16.dylib +0 -0
- multipers/__init__.py +33 -0
- multipers/_signed_measure_meta.py +453 -0
- multipers/_slicer_meta.py +211 -0
- multipers/array_api/__init__.py +45 -0
- multipers/array_api/numpy.py +41 -0
- multipers/array_api/torch.py +58 -0
- multipers/data/MOL2.py +458 -0
- multipers/data/UCR.py +18 -0
- multipers/data/__init__.py +1 -0
- multipers/data/graphs.py +466 -0
- multipers/data/immuno_regions.py +27 -0
- multipers/data/minimal_presentation_to_st_bf.py +0 -0
- multipers/data/pytorch2simplextree.py +91 -0
- multipers/data/shape3d.py +101 -0
- multipers/data/synthetic.py +113 -0
- multipers/distances.py +202 -0
- multipers/filtration_conversions.pxd +229 -0
- multipers/filtration_conversions.pxd.tp +84 -0
- multipers/filtrations/__init__.py +18 -0
- multipers/filtrations/density.py +574 -0
- multipers/filtrations/filtrations.py +361 -0
- multipers/filtrations.pxd +224 -0
- multipers/function_rips.cpython-312-darwin.so +0 -0
- multipers/function_rips.pyx +105 -0
- multipers/grids.cpython-312-darwin.so +0 -0
- multipers/grids.pyx +433 -0
- multipers/gudhi/Persistence_slices_interface.h +132 -0
- multipers/gudhi/Simplex_tree_interface.h +239 -0
- multipers/gudhi/Simplex_tree_multi_interface.h +551 -0
- multipers/gudhi/cubical_to_boundary.h +59 -0
- multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
- multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
- multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
- multipers/gudhi/gudhi/Debug_utils.h +45 -0
- multipers/gudhi/gudhi/Fields/Multi_field.h +484 -0
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -0
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -0
- multipers/gudhi/gudhi/Fields/Z2_field.h +355 -0
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -0
- multipers/gudhi/gudhi/Fields/Zp_field.h +420 -0
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -0
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -0
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
- multipers/gudhi/gudhi/Matrix.h +2107 -0
- multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -0
- multipers/gudhi/gudhi/Multi_persistence/Box.h +174 -0
- multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -0
- multipers/gudhi/gudhi/Off_reader.h +173 -0
- multipers/gudhi/gudhi/One_critical_filtration.h +1441 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -0
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -0
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -0
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -0
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -0
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -0
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -0
- multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -0
- multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -0
- multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
- multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
- multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
- multipers/gudhi/gudhi/Persistent_cohomology.h +745 -0
- multipers/gudhi/gudhi/Points_off_io.h +171 -0
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
- multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
- multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
- multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -0
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -0
- multipers/gudhi/gudhi/Simplex_tree.h +2794 -0
- multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -0
- multipers/gudhi/gudhi/distance_functions.h +62 -0
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
- multipers/gudhi/gudhi/persistence_interval.h +253 -0
- multipers/gudhi/gudhi/persistence_matrix_options.h +170 -0
- multipers/gudhi/gudhi/reader_utils.h +367 -0
- multipers/gudhi/mma_interface_coh.h +256 -0
- multipers/gudhi/mma_interface_h0.h +223 -0
- multipers/gudhi/mma_interface_matrix.h +293 -0
- multipers/gudhi/naive_merge_tree.h +536 -0
- multipers/gudhi/scc_io.h +310 -0
- multipers/gudhi/truc.h +1403 -0
- multipers/io.cpython-312-darwin.so +0 -0
- multipers/io.pyx +644 -0
- multipers/ml/__init__.py +0 -0
- multipers/ml/accuracies.py +90 -0
- multipers/ml/invariants_with_persistable.py +79 -0
- multipers/ml/kernels.py +176 -0
- multipers/ml/mma.py +713 -0
- multipers/ml/one.py +472 -0
- multipers/ml/point_clouds.py +352 -0
- multipers/ml/signed_measures.py +1589 -0
- multipers/ml/sliced_wasserstein.py +461 -0
- multipers/ml/tools.py +113 -0
- multipers/mma_structures.cpython-312-darwin.so +0 -0
- multipers/mma_structures.pxd +128 -0
- multipers/mma_structures.pyx +2786 -0
- multipers/mma_structures.pyx.tp +1094 -0
- multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -0
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -0
- multipers/multi_parameter_rank_invariant/function_rips.h +322 -0
- multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -0
- multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -0
- multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -0
- multipers/multiparameter_edge_collapse.py +41 -0
- multipers/multiparameter_module_approximation/approximation.h +2330 -0
- multipers/multiparameter_module_approximation/combinatory.h +129 -0
- multipers/multiparameter_module_approximation/debug.h +107 -0
- multipers/multiparameter_module_approximation/euler_curves.h +0 -0
- multipers/multiparameter_module_approximation/format_python-cpp.h +286 -0
- multipers/multiparameter_module_approximation/heap_column.h +238 -0
- multipers/multiparameter_module_approximation/images.h +79 -0
- multipers/multiparameter_module_approximation/list_column.h +174 -0
- multipers/multiparameter_module_approximation/list_column_2.h +232 -0
- multipers/multiparameter_module_approximation/ru_matrix.h +347 -0
- multipers/multiparameter_module_approximation/set_column.h +135 -0
- multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -0
- multipers/multiparameter_module_approximation/unordered_set_column.h +166 -0
- multipers/multiparameter_module_approximation/utilities.h +403 -0
- multipers/multiparameter_module_approximation/vector_column.h +223 -0
- multipers/multiparameter_module_approximation/vector_matrix.h +331 -0
- multipers/multiparameter_module_approximation/vineyards.h +464 -0
- multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -0
- multipers/multiparameter_module_approximation.cpython-312-darwin.so +0 -0
- multipers/multiparameter_module_approximation.pyx +235 -0
- multipers/pickle.py +90 -0
- multipers/plots.py +456 -0
- multipers/point_measure.cpython-312-darwin.so +0 -0
- multipers/point_measure.pyx +395 -0
- multipers/simplex_tree_multi.cpython-312-darwin.so +0 -0
- multipers/simplex_tree_multi.pxd +134 -0
- multipers/simplex_tree_multi.pyx +10840 -0
- multipers/simplex_tree_multi.pyx.tp +2009 -0
- multipers/slicer.cpython-312-darwin.so +0 -0
- multipers/slicer.pxd +3034 -0
- multipers/slicer.pxd.tp +234 -0
- multipers/slicer.pyx +20481 -0
- multipers/slicer.pyx.tp +1088 -0
- multipers/tensor/tensor.h +672 -0
- multipers/tensor.pxd +13 -0
- multipers/test.pyx +44 -0
- multipers/tests/__init__.py +62 -0
- multipers/torch/__init__.py +1 -0
- multipers/torch/diff_grids.py +240 -0
- multipers/torch/rips_density.py +310 -0
- multipers-2.3.3b6.dist-info/METADATA +128 -0
- multipers-2.3.3b6.dist-info/RECORD +183 -0
- multipers-2.3.3b6.dist-info/WHEEL +6 -0
- multipers-2.3.3b6.dist-info/licenses/LICENSE +21 -0
- multipers-2.3.3b6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,139 @@
|
|
|
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) 2024 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @file entry_constructors.h
|
|
13
|
+
* @author Hannah Schreiber
|
|
14
|
+
* @brief Contains different versions of @ref Gudhi::persistence_matrix::Entry factories.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#ifndef PM_COLUMN_ENTRY_CONSTRUCTORS_H
|
|
18
|
+
#define PM_COLUMN_ENTRY_CONSTRUCTORS_H
|
|
19
|
+
|
|
20
|
+
#include <utility> //std::swap
|
|
21
|
+
|
|
22
|
+
#include <gudhi/Simple_object_pool.h>
|
|
23
|
+
|
|
24
|
+
namespace Gudhi {
|
|
25
|
+
namespace persistence_matrix {
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @private
|
|
29
|
+
* @ingroup persistence_matrix
|
|
30
|
+
*
|
|
31
|
+
* @brief @ref Entry factory. Constructs and destroys entry pointers with new and delete.
|
|
32
|
+
*
|
|
33
|
+
* @tparam Entry @ref Entry with the right templates.
|
|
34
|
+
*/
|
|
35
|
+
template <class Entry>
|
|
36
|
+
struct New_entry_constructor
|
|
37
|
+
{
|
|
38
|
+
/**
|
|
39
|
+
* @brief Default constructor.
|
|
40
|
+
*/
|
|
41
|
+
New_entry_constructor() {}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @brief Constructs an entry with the given entry arguments.
|
|
45
|
+
*
|
|
46
|
+
* @param u Arguments forwarded to the @ref Entry constructor.
|
|
47
|
+
* @return @ref Entry pointer.
|
|
48
|
+
*/
|
|
49
|
+
template <class... U>
|
|
50
|
+
Entry* construct(U&&... u) const {
|
|
51
|
+
return new Entry(std::forward<U>(u)...);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @brief Destroys the given entry.
|
|
56
|
+
*
|
|
57
|
+
* @param entry @ref Entry pointer.
|
|
58
|
+
*/
|
|
59
|
+
void destroy(Entry* entry) const { delete entry; }
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @brief Swap operator.
|
|
63
|
+
*/
|
|
64
|
+
friend void swap(New_entry_constructor& col1, New_entry_constructor& col2) {}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @private
|
|
69
|
+
* @ingroup persistence_matrix
|
|
70
|
+
*
|
|
71
|
+
* @brief @ref Entry factory. Uses @ref Gudhi::Simple_object_pool, which is based on boost::object_pool,
|
|
72
|
+
* to construct and destroy entry pointer.
|
|
73
|
+
*
|
|
74
|
+
* @tparam Entry @ref Entry with the right templates.
|
|
75
|
+
*/
|
|
76
|
+
template <class Entry>
|
|
77
|
+
struct Pool_entry_constructor
|
|
78
|
+
{
|
|
79
|
+
public:
|
|
80
|
+
/**
|
|
81
|
+
* @brief Default constructor.
|
|
82
|
+
*
|
|
83
|
+
*/
|
|
84
|
+
Pool_entry_constructor() : entryPool_() {}
|
|
85
|
+
//TODO: what does happen when the pool is copied?
|
|
86
|
+
/**
|
|
87
|
+
* @brief Copy constructor.
|
|
88
|
+
*
|
|
89
|
+
* @param col Factory to copy.
|
|
90
|
+
*/
|
|
91
|
+
Pool_entry_constructor(const Pool_entry_constructor& col) : entryPool_(col.entryPool_) {}
|
|
92
|
+
/**
|
|
93
|
+
* @brief Move constructor.
|
|
94
|
+
*
|
|
95
|
+
* @param col Factory to move.
|
|
96
|
+
*/
|
|
97
|
+
Pool_entry_constructor(Pool_entry_constructor&& col) : entryPool_(std::move(col.entryPool_)) {}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @brief Constructs an entry with the given entry arguments.
|
|
101
|
+
*
|
|
102
|
+
* @param u Arguments forwarded to the @ref Entry constructor.
|
|
103
|
+
* @return @ref Entry pointer.
|
|
104
|
+
*/
|
|
105
|
+
template <class... U>
|
|
106
|
+
Entry* construct(U&&... u) {
|
|
107
|
+
return entryPool_.construct(std::forward<U>(u)...);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @brief Destroys the given entry.
|
|
112
|
+
*
|
|
113
|
+
* @param entry @ref Entry pointer.
|
|
114
|
+
*/
|
|
115
|
+
void destroy(Entry* entry) { entryPool_.destroy(entry); }
|
|
116
|
+
|
|
117
|
+
//TODO: Again, what does it mean to copy the pool?
|
|
118
|
+
/**
|
|
119
|
+
* @brief Assign operator.
|
|
120
|
+
*/
|
|
121
|
+
Pool_entry_constructor& operator=(const Pool_entry_constructor& other) {
|
|
122
|
+
entryPool_ = other.entryPool_;
|
|
123
|
+
return *this;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* @brief Swap operator.
|
|
127
|
+
*/
|
|
128
|
+
friend void swap(Pool_entry_constructor& col1, Pool_entry_constructor& col2) {
|
|
129
|
+
std::swap(col1.entryPool_, col2.entryPool_);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private:
|
|
133
|
+
Simple_object_pool<Entry> entryPool_; /**< Entry pool. */
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
} // namespace persistence_matrix
|
|
137
|
+
} // namespace Gudhi
|
|
138
|
+
|
|
139
|
+
#endif // PM_COLUMN_ENTRY_CONSTRUCTORS_H
|
|
@@ -0,0 +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
|
|
@@ -0,0 +1,211 @@
|
|
|
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-23 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @file base_swap.h
|
|
13
|
+
* @author Hannah Schreiber
|
|
14
|
+
* @brief Contains the @ref Gudhi::persistence_matrix::Base_swap class and
|
|
15
|
+
* @ref Gudhi::persistence_matrix::Dummy_base_swap structure.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef PM_BASE_SWAP_H
|
|
19
|
+
#define PM_BASE_SWAP_H
|
|
20
|
+
|
|
21
|
+
#include <utility> //std::swap, std::move & std::exchange
|
|
22
|
+
#include <algorithm> //std::max
|
|
23
|
+
|
|
24
|
+
namespace Gudhi {
|
|
25
|
+
namespace persistence_matrix {
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @ingroup persistence_matrix
|
|
29
|
+
*
|
|
30
|
+
* @brief Empty structure.
|
|
31
|
+
* Inherited instead of @ref Base_swap, when the column and row swaps are not enabled.
|
|
32
|
+
*/
|
|
33
|
+
struct Dummy_base_swap {
|
|
34
|
+
friend void swap([[maybe_unused]] Dummy_base_swap& d1, [[maybe_unused]] Dummy_base_swap& d2) {}
|
|
35
|
+
|
|
36
|
+
Dummy_base_swap([[maybe_unused]] unsigned int numberOfColumns = 0) {}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @class Base_swap base_swap.h gudhi/Persistence_matrix/base_swap.h
|
|
41
|
+
* @ingroup persistence_matrix
|
|
42
|
+
*
|
|
43
|
+
* @brief Class managing the column and row swaps in @ref Base_matrix and @ref Boundary_matrix.
|
|
44
|
+
*
|
|
45
|
+
* @tparam Master_matrix An instantiation of @ref Matrix from which all types and options are deduced.
|
|
46
|
+
* @tparam Base_matrix Either @ref Base_matrix or @ref Boundary_matrix.
|
|
47
|
+
*/
|
|
48
|
+
template <class Master_matrix, class Base_matrix>
|
|
49
|
+
class Base_swap {
|
|
50
|
+
public:
|
|
51
|
+
using Column_container = typename Master_matrix::Column_container; /**< Column container type. */
|
|
52
|
+
using Index = typename Master_matrix::Index; /**< Container index type. */
|
|
53
|
+
using ID_index = typename Master_matrix::ID_index; /**< @ref IDIdx index type. */
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @brief Default constructor.
|
|
57
|
+
*/
|
|
58
|
+
Base_swap();
|
|
59
|
+
/**
|
|
60
|
+
* @brief As default constructor, but reserves spaces for @p numberOfColumns columns.
|
|
61
|
+
*
|
|
62
|
+
* @param numberOfColumns Number of columns to reserve space for.
|
|
63
|
+
*/
|
|
64
|
+
Base_swap(unsigned int numberOfColumns);
|
|
65
|
+
/**
|
|
66
|
+
* @brief Copy constructor.
|
|
67
|
+
*
|
|
68
|
+
* @param matrixToCopy Matrix to copy.
|
|
69
|
+
*/
|
|
70
|
+
Base_swap(const Base_swap& matrixToCopy) = default;
|
|
71
|
+
/**
|
|
72
|
+
* @brief Move constructor.
|
|
73
|
+
*
|
|
74
|
+
* @param other Matrix to move.
|
|
75
|
+
*/
|
|
76
|
+
Base_swap(Base_swap&& other) noexcept;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @brief Swaps the two columns at given indices in the column container. Does not updates the column index value,
|
|
80
|
+
* potentially stored in the entries. This will be done when calling `_orderRows()`.
|
|
81
|
+
*
|
|
82
|
+
* @param columnIndex1 First @ref MatIdx column index.
|
|
83
|
+
* @param columnIndex2 Second @ref MatIdx column index.
|
|
84
|
+
*/
|
|
85
|
+
void swap_columns(Index columnIndex1, Index columnIndex2);
|
|
86
|
+
/**
|
|
87
|
+
* @brief Swaps the two rows at the given indices, but in a lazy manner. That is, the swap is registered but not
|
|
88
|
+
* executed. The reordering will be done when calling `_orderRows()`.
|
|
89
|
+
*
|
|
90
|
+
* @param rowIndex1 First row index.
|
|
91
|
+
* @param rowIndex2 Second row index.
|
|
92
|
+
*/
|
|
93
|
+
void swap_rows(ID_index rowIndex1, ID_index rowIndex2);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @brief Assign operator.
|
|
97
|
+
*/
|
|
98
|
+
Base_swap& operator=(Base_swap other);
|
|
99
|
+
/**
|
|
100
|
+
* @brief Swap operator.
|
|
101
|
+
*/
|
|
102
|
+
friend void swap(Base_swap& base1, Base_swap& base2) {
|
|
103
|
+
base1.indexToRow_.swap(base2.indexToRow_);
|
|
104
|
+
base1.rowToIndex_.swap(base2.rowToIndex_);
|
|
105
|
+
std::swap(base1.rowSwapped_, base2.rowSwapped_);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
protected:
|
|
109
|
+
using Index_dictionary = typename Master_matrix::template Dictionary<Index>;
|
|
110
|
+
using Row_dictionary = typename Master_matrix::template Dictionary<ID_index>;
|
|
111
|
+
|
|
112
|
+
Index_dictionary indexToRow_; /**< Map from row index to actual index in row container. */
|
|
113
|
+
Row_dictionary rowToIndex_; /**< Map from index in row container to "public" row index. */
|
|
114
|
+
bool rowSwapped_; /**< True if any rows were swapped since last call to `_orderRows()`. */
|
|
115
|
+
|
|
116
|
+
void _orderRows();
|
|
117
|
+
|
|
118
|
+
//access to inheriting matrix class
|
|
119
|
+
constexpr Base_matrix* _matrix() { return static_cast<Base_matrix*>(this); }
|
|
120
|
+
constexpr const Base_matrix* _matrix() const { return static_cast<const Base_matrix*>(this); }
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
template <class Master_matrix, class Base_matrix>
|
|
124
|
+
inline Base_swap<Master_matrix, Base_matrix>::Base_swap() : rowSwapped_(false)
|
|
125
|
+
{}
|
|
126
|
+
|
|
127
|
+
template <class Master_matrix, class Base_matrix>
|
|
128
|
+
inline Base_swap<Master_matrix, Base_matrix>::Base_swap(unsigned int numberOfColumns)
|
|
129
|
+
: indexToRow_(numberOfColumns), rowToIndex_(numberOfColumns), rowSwapped_(false)
|
|
130
|
+
{
|
|
131
|
+
for (Index i = 0; i < numberOfColumns; i++) {
|
|
132
|
+
indexToRow_[i] = i;
|
|
133
|
+
rowToIndex_[i] = i;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
template <class Master_matrix, class Base_matrix>
|
|
138
|
+
inline Base_swap<Master_matrix, Base_matrix>::Base_swap(Base_swap&& other) noexcept
|
|
139
|
+
: indexToRow_(std::move(other.indexToRow_)),
|
|
140
|
+
rowToIndex_(std::move(other.rowToIndex_)),
|
|
141
|
+
rowSwapped_(std::exchange(other.rowSwapped_, 0))
|
|
142
|
+
{}
|
|
143
|
+
|
|
144
|
+
template <class Master_matrix, class Base_matrix>
|
|
145
|
+
inline void Base_swap<Master_matrix, Base_matrix>::swap_columns(Index columnIndex1, Index columnIndex2)
|
|
146
|
+
{
|
|
147
|
+
swap(_matrix()->matrix_.at(columnIndex1), _matrix()->matrix_.at(columnIndex2));
|
|
148
|
+
if constexpr (Master_matrix::Option_list::has_row_access) rowSwapped_ = true; //to update column index in entries.
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
template <class Master_matrix, class Base_matrix>
|
|
152
|
+
inline void Base_swap<Master_matrix, Base_matrix>::swap_rows(ID_index rowIndex1, ID_index rowIndex2)
|
|
153
|
+
{
|
|
154
|
+
rowSwapped_ = true;
|
|
155
|
+
|
|
156
|
+
if constexpr (Master_matrix::Option_list::has_map_column_container) {
|
|
157
|
+
auto it1 = indexToRow_.find(rowIndex1);
|
|
158
|
+
auto it2 = indexToRow_.find(rowIndex2);
|
|
159
|
+
|
|
160
|
+
if (it1 == indexToRow_.end() && it2 == indexToRow_.end()) return;
|
|
161
|
+
|
|
162
|
+
if (it1 == indexToRow_.end()) {
|
|
163
|
+
indexToRow_.emplace(rowIndex1, it2->second);
|
|
164
|
+
rowToIndex_.at(it2->second) = rowIndex1;
|
|
165
|
+
indexToRow_.erase(it2->second);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (it2 == indexToRow_.end()) {
|
|
170
|
+
indexToRow_.emplace(rowIndex2, it1->second);
|
|
171
|
+
rowToIndex_.at(it1->second) = rowIndex2;
|
|
172
|
+
indexToRow_.erase(it1);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
std::swap(rowToIndex_.at(it1->second), rowToIndex_.at(it2->second));
|
|
177
|
+
std::swap(it1->second, it2->second);
|
|
178
|
+
} else {
|
|
179
|
+
for (auto i = indexToRow_.size(); i <= std::max(rowIndex1, rowIndex2); ++i) indexToRow_.push_back(i);
|
|
180
|
+
|
|
181
|
+
std::swap(rowToIndex_[indexToRow_[rowIndex1]], rowToIndex_[indexToRow_[rowIndex2]]);
|
|
182
|
+
std::swap(indexToRow_[rowIndex1], indexToRow_[rowIndex2]);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
template <class Master_matrix, class Base_matrix>
|
|
187
|
+
inline Base_swap<Master_matrix, Base_matrix>& Base_swap<Master_matrix, Base_matrix>::operator=(Base_swap other)
|
|
188
|
+
{
|
|
189
|
+
indexToRow_.swap(other.indexToRow_);
|
|
190
|
+
rowToIndex_.swap(other.rowToIndex_);
|
|
191
|
+
std::swap(rowSwapped_, other.rowSwapped_);
|
|
192
|
+
return *this;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
template <class Master_matrix, class Base_matrix>
|
|
196
|
+
inline void Base_swap<Master_matrix, Base_matrix>::_orderRows()
|
|
197
|
+
{
|
|
198
|
+
for (unsigned int i = 0; i < _matrix()->get_number_of_columns(); i++) {
|
|
199
|
+
_matrix()->matrix_.at(i).reorder(rowToIndex_, i);
|
|
200
|
+
}
|
|
201
|
+
for (Index i = 0; i < _matrix()->get_number_of_columns(); i++) {
|
|
202
|
+
indexToRow_[i] = i;
|
|
203
|
+
rowToIndex_[i] = i;
|
|
204
|
+
}
|
|
205
|
+
rowSwapped_ = false;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
} // namespace persistence_matrix
|
|
209
|
+
} // namespace Gudhi
|
|
210
|
+
|
|
211
|
+
#endif // PM_BASE_SWAP_H
|
|
@@ -0,0 +1,60 @@
|
|
|
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 boundary_cell_position_to_id_mapper.h
|
|
13
|
+
* @author Hannah Schreiber
|
|
14
|
+
* @brief Contains the @ref Gudhi::persistence_matrix::Cell_position_to_ID_mapper class and
|
|
15
|
+
* @ref Gudhi::persistence_matrix::Dummy_pos_mapper structure.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef PM_ID_POS_MAPPER_H
|
|
19
|
+
#define PM_ID_POS_MAPPER_H
|
|
20
|
+
|
|
21
|
+
#include <unordered_map>
|
|
22
|
+
|
|
23
|
+
namespace Gudhi {
|
|
24
|
+
namespace persistence_matrix {
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @private
|
|
28
|
+
* @ingroup persistence_matrix
|
|
29
|
+
*
|
|
30
|
+
* @brief Empty structure.
|
|
31
|
+
* Inherited instead of @ref Cell_position_to_ID_mapper.
|
|
32
|
+
*/
|
|
33
|
+
struct Dummy_pos_mapper {
|
|
34
|
+
friend void swap([[maybe_unused]] Dummy_pos_mapper& d1, [[maybe_unused]] Dummy_pos_mapper& d2) {}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @private
|
|
39
|
+
* @ingroup persistence_matrix
|
|
40
|
+
*
|
|
41
|
+
* @brief Map from cell position to cell ID. Only stores a pair if ID != position and has_removable_column is true.
|
|
42
|
+
*
|
|
43
|
+
* @tparam ID_index @ref IDIdx index type
|
|
44
|
+
* @tparam Pos_index @ref PosIdx index type
|
|
45
|
+
*/
|
|
46
|
+
template<typename ID_index, typename Pos_index>
|
|
47
|
+
struct Cell_position_to_ID_mapper {
|
|
48
|
+
using Index_map = std::unordered_map<Pos_index,ID_index>; //TODO: test other map types
|
|
49
|
+
|
|
50
|
+
Index_map map_;
|
|
51
|
+
|
|
52
|
+
friend void swap(Cell_position_to_ID_mapper& mapper1, Cell_position_to_ID_mapper& mapper2) {
|
|
53
|
+
mapper1.map_.swap(mapper2.map_);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
} // namespace persistence_matrix
|
|
58
|
+
} // namespace Gudhi
|
|
59
|
+
|
|
60
|
+
#endif // PM_ID_POS_MAPPER_H
|
|
@@ -0,0 +1,60 @@
|
|
|
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_ID_POS_MAPPER_H
|
|
19
|
+
#define PM_ID_POS_MAPPER_H
|
|
20
|
+
|
|
21
|
+
#include <unordered_map>
|
|
22
|
+
|
|
23
|
+
namespace Gudhi {
|
|
24
|
+
namespace persistence_matrix {
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @private
|
|
28
|
+
* @ingroup persistence_matrix
|
|
29
|
+
*
|
|
30
|
+
* @brief Empty structure.
|
|
31
|
+
* Inherited instead of @ref Face_position_to_ID_mapper.
|
|
32
|
+
*/
|
|
33
|
+
struct Dummy_pos_mapper {
|
|
34
|
+
friend void swap([[maybe_unused]] Dummy_pos_mapper& d1, [[maybe_unused]] Dummy_pos_mapper& d2) {}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @private
|
|
39
|
+
* @ingroup persistence_matrix
|
|
40
|
+
*
|
|
41
|
+
* @brief Map from face position to face ID. Only stores a pair if ID != position and has_removable_column is true.
|
|
42
|
+
*
|
|
43
|
+
* @tparam ID_index @ref IDIdx index type
|
|
44
|
+
* @tparam Pos_index @ref PosIdx index type
|
|
45
|
+
*/
|
|
46
|
+
template<typename ID_index, typename Pos_index>
|
|
47
|
+
struct Face_position_to_ID_mapper {
|
|
48
|
+
using Index_map = std::unordered_map<Pos_index,ID_index>; //TODO: test other map types
|
|
49
|
+
|
|
50
|
+
Index_map map_;
|
|
51
|
+
|
|
52
|
+
friend void swap(Face_position_to_ID_mapper& mapper1, Face_position_to_ID_mapper& mapper2) {
|
|
53
|
+
mapper1.map_.swap(mapper2.map_);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
} // namespace persistence_matrix
|
|
58
|
+
} // namespace Gudhi
|
|
59
|
+
|
|
60
|
+
#endif // PM_ID_POS_MAPPER_H
|