multipers 2.4.0b1__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.
- multipers/.dylibs/libboost_timer.dylib +0 -0
- multipers/.dylibs/libc++.1.0.dylib +0 -0
- multipers/.dylibs/libtbb.12.17.dylib +0 -0
- multipers/__init__.py +33 -0
- multipers/_signed_measure_meta.py +426 -0
- multipers/_slicer_meta.py +231 -0
- multipers/array_api/__init__.py +62 -0
- multipers/array_api/numpy.py +124 -0
- multipers/array_api/torch.py +133 -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 +736 -0
- multipers/filtration_conversions.pxd.tp +226 -0
- multipers/filtrations/__init__.py +21 -0
- multipers/filtrations/density.py +529 -0
- multipers/filtrations/filtrations.py +480 -0
- multipers/filtrations.pxd +534 -0
- multipers/filtrations.pxd.tp +332 -0
- multipers/function_rips.cpython-312-darwin.so +0 -0
- multipers/function_rips.pyx +104 -0
- multipers/grids.cpython-312-darwin.so +0 -0
- multipers/grids.pyx +538 -0
- multipers/gudhi/Persistence_slices_interface.h +213 -0
- multipers/gudhi/Simplex_tree_interface.h +274 -0
- multipers/gudhi/Simplex_tree_multi_interface.h +648 -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 +52 -0
- multipers/gudhi/gudhi/Degree_rips_bifiltration.h +2307 -0
- multipers/gudhi/gudhi/Dynamic_multi_parameter_filtration.h +2524 -0
- multipers/gudhi/gudhi/Fields/Multi_field.h +453 -0
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +460 -0
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +444 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +584 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +490 -0
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +580 -0
- multipers/gudhi/gudhi/Fields/Z2_field.h +391 -0
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +389 -0
- multipers/gudhi/gudhi/Fields/Zp_field.h +493 -0
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +384 -0
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +492 -0
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
- multipers/gudhi/gudhi/Matrix.h +2200 -0
- multipers/gudhi/gudhi/Multi_filtration/Multi_parameter_generator.h +1712 -0
- multipers/gudhi/gudhi/Multi_filtration/multi_filtration_conversions.h +237 -0
- multipers/gudhi/gudhi/Multi_filtration/multi_filtration_utils.h +225 -0
- multipers/gudhi/gudhi/Multi_parameter_filtered_complex.h +485 -0
- multipers/gudhi/gudhi/Multi_parameter_filtration.h +2643 -0
- multipers/gudhi/gudhi/Multi_persistence/Box.h +233 -0
- multipers/gudhi/gudhi/Multi_persistence/Line.h +309 -0
- multipers/gudhi/gudhi/Multi_persistence/Multi_parameter_filtered_complex_pcoh_interface.h +268 -0
- multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_cohomology.h +159 -0
- multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_matrix.h +463 -0
- multipers/gudhi/gudhi/Multi_persistence/Point.h +853 -0
- multipers/gudhi/gudhi/Off_reader.h +173 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +834 -0
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +838 -0
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +833 -0
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1367 -0
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1157 -0
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +869 -0
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +905 -0
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +122 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +260 -0
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +288 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +170 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +247 -0
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +571 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +182 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +130 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +235 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +312 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1092 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +923 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +914 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +930 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1071 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +203 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +886 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +984 -0
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1213 -0
- multipers/gudhi/gudhi/Persistence_matrix/index_mapper.h +58 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +227 -0
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +200 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +166 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +319 -0
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +562 -0
- multipers/gudhi/gudhi/Persistence_on_a_line.h +152 -0
- multipers/gudhi/gudhi/Persistence_on_rectangle.h +617 -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 +769 -0
- multipers/gudhi/gudhi/Points_off_io.h +171 -0
- multipers/gudhi/gudhi/Projective_cover_kernel.h +379 -0
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +559 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +121 -0
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
- multipers/gudhi/gudhi/Simplex_tree/filtration_value_utils.h +155 -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 +60 -0
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +105 -0
- multipers/gudhi/gudhi/Simplex_tree.h +3170 -0
- multipers/gudhi/gudhi/Slicer.h +848 -0
- multipers/gudhi/gudhi/Thread_safe_slicer.h +393 -0
- multipers/gudhi/gudhi/distance_functions.h +62 -0
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
- multipers/gudhi/gudhi/multi_simplex_tree_helpers.h +147 -0
- multipers/gudhi/gudhi/persistence_interval.h +263 -0
- multipers/gudhi/gudhi/persistence_matrix_options.h +188 -0
- multipers/gudhi/gudhi/reader_utils.h +367 -0
- multipers/gudhi/gudhi/simple_mdspan.h +484 -0
- multipers/gudhi/gudhi/slicer_helpers.h +779 -0
- multipers/gudhi/tmp_h0_pers/mma_interface_h0.h +223 -0
- multipers/gudhi/tmp_h0_pers/naive_merge_tree.h +536 -0
- multipers/io.cpython-312-darwin.so +0 -0
- multipers/io.pyx +472 -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 +1667 -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 +134 -0
- multipers/mma_structures.pyx +1483 -0
- multipers/mma_structures.pyx.tp +1126 -0
- multipers/multi_parameter_rank_invariant/diff_helpers.h +85 -0
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +95 -0
- multipers/multi_parameter_rank_invariant/function_rips.h +317 -0
- multipers/multi_parameter_rank_invariant/hilbert_function.h +761 -0
- multipers/multi_parameter_rank_invariant/persistence_slices.h +149 -0
- multipers/multi_parameter_rank_invariant/rank_invariant.h +350 -0
- multipers/multiparameter_edge_collapse.py +41 -0
- multipers/multiparameter_module_approximation/approximation.h +2541 -0
- multipers/multiparameter_module_approximation/debug.h +107 -0
- multipers/multiparameter_module_approximation/format_python-cpp.h +292 -0
- multipers/multiparameter_module_approximation/utilities.h +428 -0
- multipers/multiparameter_module_approximation.cpython-312-darwin.so +0 -0
- multipers/multiparameter_module_approximation.pyx +286 -0
- multipers/ops.cpython-312-darwin.so +0 -0
- multipers/ops.pyx +231 -0
- multipers/pickle.py +89 -0
- multipers/plots.py +550 -0
- multipers/point_measure.cpython-312-darwin.so +0 -0
- multipers/point_measure.pyx +409 -0
- multipers/simplex_tree_multi.cpython-312-darwin.so +0 -0
- multipers/simplex_tree_multi.pxd +136 -0
- multipers/simplex_tree_multi.pyx +11719 -0
- multipers/simplex_tree_multi.pyx.tp +2102 -0
- multipers/slicer.cpython-312-darwin.so +0 -0
- multipers/slicer.pxd +2097 -0
- multipers/slicer.pxd.tp +263 -0
- multipers/slicer.pyx +13042 -0
- multipers/slicer.pyx.tp +1259 -0
- multipers/tensor/tensor.h +672 -0
- multipers/tensor.pxd +13 -0
- multipers/test.pyx +44 -0
- multipers/tests/__init__.py +70 -0
- multipers/torch/__init__.py +1 -0
- multipers/torch/diff_grids.py +240 -0
- multipers/torch/rips_density.py +310 -0
- multipers/vector_interface.pxd +46 -0
- multipers-2.4.0b1.dist-info/METADATA +131 -0
- multipers-2.4.0b1.dist-info/RECORD +184 -0
- multipers-2.4.0b1.dist-info/WHEEL +6 -0
- multipers-2.4.0b1.dist-info/licenses/LICENSE +21 -0
- multipers-2.4.0b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,170 @@
|
|
|
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 chain_pairing.h
|
|
13
|
+
* @author Hannah Schreiber
|
|
14
|
+
* @brief Contains the @ref Gudhi::persistence_matrix::Chain_pairing class and
|
|
15
|
+
* @ref Gudhi::persistence_matrix::Dummy_chain_pairing structure.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef PM_CHAIN_PAIRING_H
|
|
19
|
+
#define PM_CHAIN_PAIRING_H
|
|
20
|
+
|
|
21
|
+
namespace Gudhi {
|
|
22
|
+
namespace persistence_matrix {
|
|
23
|
+
|
|
24
|
+
template <typename Master_matrix>
|
|
25
|
+
class Chain_barcode_swap;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @ingroup persistence_matrix
|
|
29
|
+
*
|
|
30
|
+
* @brief Empty structure.
|
|
31
|
+
* Inherited instead of @ref Chain_pairing, when the computation of the barcode was not enabled or if the pairing
|
|
32
|
+
* is already managed by the vine update classes.
|
|
33
|
+
*/
|
|
34
|
+
struct Dummy_chain_pairing {
|
|
35
|
+
friend void swap([[maybe_unused]] Dummy_chain_pairing& d1, [[maybe_unused]] Dummy_chain_pairing& d2) noexcept {}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @class Chain_pairing chain_pairing.h gudhi/Persistence_matrix/chain_pairing.h
|
|
40
|
+
* @ingroup persistence_matrix
|
|
41
|
+
*
|
|
42
|
+
* @brief Class managing the barcode for @ref Chain_matrix if the option was enabled.
|
|
43
|
+
*
|
|
44
|
+
* @tparam Master_matrix An instantiation of @ref Matrix from which all types and options are deduced.
|
|
45
|
+
*/
|
|
46
|
+
template <class Master_matrix>
|
|
47
|
+
class Chain_pairing
|
|
48
|
+
{
|
|
49
|
+
public:
|
|
50
|
+
using Barcode = typename Master_matrix::Barcode; /**< Barcode type. */
|
|
51
|
+
using Dimension = typename Master_matrix::Dimension; /**< Dimension value type. */
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @brief Default constructor.
|
|
55
|
+
*/
|
|
56
|
+
Chain_pairing() = default;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @brief Returns the current barcode which is maintained at any insertion, removal or vine swap.
|
|
60
|
+
*
|
|
61
|
+
* @return Const reference to the barcode.
|
|
62
|
+
*/
|
|
63
|
+
const Barcode& get_current_barcode() const;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @brief Swap operator.
|
|
67
|
+
*/
|
|
68
|
+
friend void swap(Chain_pairing& pairing1, Chain_pairing& pairing2) noexcept
|
|
69
|
+
{
|
|
70
|
+
pairing1.barcode_.swap(pairing2.barcode_);
|
|
71
|
+
pairing1.indexToBar_.swap(pairing2.indexToBar_);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
protected:
|
|
75
|
+
using Pos_index = typename Master_matrix::Pos_index;
|
|
76
|
+
using Index = typename Master_matrix::Index;
|
|
77
|
+
|
|
78
|
+
void _update_barcode(Pos_index birth, Pos_index death);
|
|
79
|
+
void _add_bar(Dimension dim, Pos_index birth);
|
|
80
|
+
void _erase_bar(Pos_index event);
|
|
81
|
+
Pos_index _death(Index index) const;
|
|
82
|
+
Pos_index _birth(Index index) const;
|
|
83
|
+
void _reset();
|
|
84
|
+
|
|
85
|
+
private:
|
|
86
|
+
using Dictionary = typename Master_matrix::Bar_dictionary;
|
|
87
|
+
|
|
88
|
+
// could also just mark everything as protected as Chain_barcode_swap inherits from Chain_pairing
|
|
89
|
+
// but this way, it marks a better difference between "class using this mixin" with "class extending this mixin"
|
|
90
|
+
friend Chain_barcode_swap<Master_matrix>;
|
|
91
|
+
|
|
92
|
+
Barcode barcode_; /**< Bar container. */
|
|
93
|
+
Dictionary indexToBar_; /**< Map from @ref MatIdx index to bar index. */
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
template <class Master_matrix>
|
|
97
|
+
inline const typename Chain_pairing<Master_matrix>::Barcode& Chain_pairing<Master_matrix>::get_current_barcode() const
|
|
98
|
+
{
|
|
99
|
+
return barcode_;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
template <class Master_matrix>
|
|
103
|
+
inline void Chain_pairing<Master_matrix>::_update_barcode(Pos_index birth, Pos_index death)
|
|
104
|
+
{
|
|
105
|
+
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
106
|
+
auto& barIt = indexToBar_.at(birth);
|
|
107
|
+
barIt->death = death;
|
|
108
|
+
indexToBar_.try_emplace(death, barIt); // list so iterators are stable
|
|
109
|
+
} else {
|
|
110
|
+
barcode_[indexToBar_[birth]].death = death;
|
|
111
|
+
indexToBar_.push_back(indexToBar_[birth]);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
template <class Master_matrix>
|
|
116
|
+
inline void Chain_pairing<Master_matrix>::_add_bar(Dimension dim, Pos_index birth)
|
|
117
|
+
{
|
|
118
|
+
barcode_.emplace_back(birth, Master_matrix::template get_null_value<Pos_index>(), dim);
|
|
119
|
+
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
120
|
+
indexToBar_.try_emplace(birth, --barcode_.end());
|
|
121
|
+
} else {
|
|
122
|
+
indexToBar_.push_back(barcode_.size() - 1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
template <class Master_matrix>
|
|
127
|
+
inline void Chain_pairing<Master_matrix>::_erase_bar(Pos_index event)
|
|
128
|
+
{
|
|
129
|
+
auto it = indexToBar_.find(event);
|
|
130
|
+
typename Barcode::iterator bar = it->second;
|
|
131
|
+
|
|
132
|
+
if (bar->death == Master_matrix::template get_null_value<Pos_index>())
|
|
133
|
+
barcode_.erase(bar);
|
|
134
|
+
else
|
|
135
|
+
bar->death = Master_matrix::template get_null_value<Pos_index>();
|
|
136
|
+
|
|
137
|
+
indexToBar_.erase(it);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
template <class Master_matrix>
|
|
141
|
+
inline typename Chain_pairing<Master_matrix>::Pos_index Chain_pairing<Master_matrix>::_death(Index index) const
|
|
142
|
+
{
|
|
143
|
+
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
144
|
+
return indexToBar_.at(index)->death;
|
|
145
|
+
} else {
|
|
146
|
+
return barcode_.at(indexToBar_.at(index)).death;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
template <class Master_matrix>
|
|
151
|
+
inline typename Chain_pairing<Master_matrix>::Pos_index Chain_pairing<Master_matrix>::_birth(Index index) const
|
|
152
|
+
{
|
|
153
|
+
if constexpr (Master_matrix::Option_list::has_removable_columns) {
|
|
154
|
+
return indexToBar_.at(index)->birth;
|
|
155
|
+
} else {
|
|
156
|
+
return barcode_.at(indexToBar_.at(index)).birth;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
template <class Master_matrix>
|
|
161
|
+
inline void Chain_pairing<Master_matrix>::_reset()
|
|
162
|
+
{
|
|
163
|
+
barcode_.clear();
|
|
164
|
+
indexToBar_.clear();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
} // namespace persistence_matrix
|
|
168
|
+
} // namespace Gudhi
|
|
169
|
+
|
|
170
|
+
#endif // PM_CHAIN_PAIRING_H
|
|
@@ -0,0 +1,247 @@
|
|
|
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 chain_rep_cycles.h
|
|
13
|
+
* @author Hannah Schreiber
|
|
14
|
+
* @brief Contains the @ref Gudhi::persistence_matrix::Chain_representative_cycles class and
|
|
15
|
+
* @ref Gudhi::persistence_matrix::Dummy_chain_representative_cycles structure.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef PM_CHAIN_REP_CYCLES_H
|
|
19
|
+
#define PM_CHAIN_REP_CYCLES_H
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#ifdef GUDHI_USE_TBB
|
|
24
|
+
#include <tbb/parallel_for.h>
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
#include <gudhi/persistence_matrix_options.h>
|
|
28
|
+
|
|
29
|
+
namespace Gudhi {
|
|
30
|
+
namespace persistence_matrix {
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @ingroup persistence_matrix
|
|
34
|
+
*
|
|
35
|
+
* @brief Empty structure.
|
|
36
|
+
* Inherited instead of @ref Chain_representative_cycles, when the computation of the representative cycles
|
|
37
|
+
* were not enabled.
|
|
38
|
+
*/
|
|
39
|
+
struct Dummy_chain_representative_cycles {
|
|
40
|
+
friend void swap([[maybe_unused]] Dummy_chain_representative_cycles& d1,
|
|
41
|
+
[[maybe_unused]] Dummy_chain_representative_cycles& d2) noexcept
|
|
42
|
+
{}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @class Chain_representative_cycles chain_rep_cycles.h gudhi/Persistence_matrix/chain_rep_cycles.h
|
|
47
|
+
* @ingroup persistence_matrix
|
|
48
|
+
*
|
|
49
|
+
* @brief Class managing the representative cycles for @ref Chain_matrix if the option was enabled.
|
|
50
|
+
*
|
|
51
|
+
* @tparam Master_matrix An instantiation of @ref Matrix from which all types and options are deduced.
|
|
52
|
+
*/
|
|
53
|
+
template <class Master_matrix>
|
|
54
|
+
class Chain_representative_cycles
|
|
55
|
+
{
|
|
56
|
+
public:
|
|
57
|
+
using Bar = typename Master_matrix::Bar; /**< Bar type. */
|
|
58
|
+
using Cycle = typename Master_matrix::Cycle; /**< Cycle type. */
|
|
59
|
+
using Column_container = typename Master_matrix::Column_container; /**< Column container type. */
|
|
60
|
+
using Index = typename Master_matrix::Index; /**< @ref MatIdx index type. */
|
|
61
|
+
using ID_index = typename Master_matrix::ID_index; /**< @ref IDIdx index type. */
|
|
62
|
+
using Dimension = typename Master_matrix::Dimension; /**< Dimension type. */
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @brief Default constructor.
|
|
66
|
+
*/
|
|
67
|
+
Chain_representative_cycles() = default;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @brief Computes the current representative cycles of the matrix.
|
|
71
|
+
*
|
|
72
|
+
* @param dim If different from default value, only the cycles of the given dimension are updated.
|
|
73
|
+
* All others are erased.
|
|
74
|
+
*/
|
|
75
|
+
void update_representative_cycles(Dimension dim = Master_matrix::template get_null_value<Dimension>());
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @brief Computes the current representative cycle of the given bar. All other cycles already computed are left
|
|
79
|
+
* untouched (and therefore they could be unvalid for the current matrix).
|
|
80
|
+
*
|
|
81
|
+
* @note For chain matrices with enabled vine swaps, this method will only be more efficient than
|
|
82
|
+
* @ref update_representative_cycles if not called for too many bars.
|
|
83
|
+
*
|
|
84
|
+
* @param bar Bar corresponding to the wanted representative cycle.
|
|
85
|
+
*/
|
|
86
|
+
void update_representative_cycle(const Bar& bar);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @brief Returns the current representative cycles. If the matrix was modified since the last call,
|
|
90
|
+
* @ref update_representative_cycles has to be called to update the returned cycles.
|
|
91
|
+
*
|
|
92
|
+
* @return A const reference to a vector of @ref Matrix::Cycle containing all representative cycles.
|
|
93
|
+
*/
|
|
94
|
+
const std::vector<Cycle>& get_representative_cycles();
|
|
95
|
+
/**
|
|
96
|
+
* @brief Returns the representative cycle corresponding to the given bar.
|
|
97
|
+
* If the matrix was modified since the last call, @ref update_representative_cycles or
|
|
98
|
+
* @ref update_representative_cycle has to be called to update the returned cycle.
|
|
99
|
+
*
|
|
100
|
+
* @param bar Bar corresponding to the wanted representative cycle.
|
|
101
|
+
* @return A const reference to the representative cycle.
|
|
102
|
+
*/
|
|
103
|
+
const Cycle& get_representative_cycle(const Bar& bar);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @brief Swap operator.
|
|
107
|
+
*/
|
|
108
|
+
friend void swap(Chain_representative_cycles& base1, Chain_representative_cycles& base2) noexcept
|
|
109
|
+
{
|
|
110
|
+
base1.representativeCycles_.swap(base2.representativeCycles_);
|
|
111
|
+
base1.birthToCycle_.swap(base2.birthToCycle_);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
protected:
|
|
115
|
+
void _reset();
|
|
116
|
+
|
|
117
|
+
private:
|
|
118
|
+
using Master_chain_matrix = typename Master_matrix::Master_chain_matrix;
|
|
119
|
+
|
|
120
|
+
std::vector<Cycle> representativeCycles_; /**< Cycle container. */
|
|
121
|
+
std::vector<Index> birthToCycle_; /**< Map from birth index to cycle index. */
|
|
122
|
+
|
|
123
|
+
// access to inheriting Chain_matrix class
|
|
124
|
+
constexpr Master_chain_matrix* _matrix() { return static_cast<Master_chain_matrix*>(this); }
|
|
125
|
+
|
|
126
|
+
constexpr const Master_chain_matrix* _matrix() const { return static_cast<const Master_chain_matrix*>(this); }
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
template <class Master_matrix>
|
|
130
|
+
inline void Chain_representative_cycles<Master_matrix>::update_representative_cycles(Dimension dim)
|
|
131
|
+
{
|
|
132
|
+
Index nberColumns = _matrix()->get_number_of_columns();
|
|
133
|
+
auto get_position = [&](ID_index pivot) {
|
|
134
|
+
if constexpr (Master_matrix::Option_list::has_vine_update) {
|
|
135
|
+
if constexpr (Master_matrix::Option_list::has_map_column_container) {
|
|
136
|
+
return _matrix()->map_.at(pivot);
|
|
137
|
+
} else {
|
|
138
|
+
return _matrix()->map_[pivot];
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
return pivot;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
Index nullValue = Master_matrix::template get_null_value<Index>();
|
|
145
|
+
|
|
146
|
+
birthToCycle_.clear();
|
|
147
|
+
birthToCycle_.resize(nberColumns, nullValue);
|
|
148
|
+
representativeCycles_.clear();
|
|
149
|
+
|
|
150
|
+
#ifdef GUDHI_USE_TBB
|
|
151
|
+
Index c = 0;
|
|
152
|
+
for (Index i = 0; i < nberColumns; i++) {
|
|
153
|
+
auto& col = _matrix()->get_column(_matrix()->get_column_with_pivot(i));
|
|
154
|
+
if ((dim == Master_matrix::template get_null_value<Dimension>() || _matrix()->get_column_dimension(i) == dim) &&
|
|
155
|
+
(!col.is_paired() || get_position(i) < get_position(_matrix()->get_pivot(col.get_paired_chain_index())))) {
|
|
156
|
+
birthToCycle_[get_position(i)] = c;
|
|
157
|
+
++c;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
representativeCycles_.resize(c);
|
|
162
|
+
tbb::parallel_for(static_cast<Index>(0), nberColumns, [&](Index i) {
|
|
163
|
+
auto idx = get_position(i);
|
|
164
|
+
if (birthToCycle_[idx] != nullValue) {
|
|
165
|
+
auto& col = _matrix()->get_column(_matrix()->get_column_with_pivot(i));
|
|
166
|
+
representativeCycles_[birthToCycle_[idx]] =
|
|
167
|
+
Master_matrix::build_cycle_from_range(col.get_non_zero_content_range());
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
#else
|
|
171
|
+
for (ID_index i = 0; i < nberColumns; i++) {
|
|
172
|
+
auto& col = _matrix()->get_column(_matrix()->get_column_with_pivot(i));
|
|
173
|
+
if ((dim == Master_matrix::template get_null_value<Dimension>() || _matrix()->get_column_dimension(i) == dim) &&
|
|
174
|
+
(!col.is_paired() || get_position(i) < get_position(_matrix()->get_pivot(col.get_paired_chain_index())))) {
|
|
175
|
+
representativeCycles_.push_back(Master_matrix::build_cycle_from_range(col.get_non_zero_content_range()));
|
|
176
|
+
birthToCycle_[get_position(i)] = representativeCycles_.size() - 1;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
#endif
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
template <class Master_matrix>
|
|
183
|
+
inline void Chain_representative_cycles<Master_matrix>::update_representative_cycle(const Bar& bar)
|
|
184
|
+
{
|
|
185
|
+
auto nberColumns = _matrix()->get_number_of_columns();
|
|
186
|
+
auto get_position = [&](ID_index pivot) {
|
|
187
|
+
if constexpr (Master_matrix::Option_list::has_vine_update) {
|
|
188
|
+
if constexpr (Master_matrix::Option_list::has_map_column_container) {
|
|
189
|
+
return _matrix()->map_.at(pivot);
|
|
190
|
+
} else {
|
|
191
|
+
return _matrix()->map_[pivot];
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
return pivot;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
Index nullValue = Master_matrix::template get_null_value<Index>();
|
|
199
|
+
|
|
200
|
+
if (birthToCycle_.size() <= bar.birth) {
|
|
201
|
+
birthToCycle_.resize(bar.birth + 1, nullValue);
|
|
202
|
+
}
|
|
203
|
+
if (birthToCycle_[bar.birth] == nullValue) {
|
|
204
|
+
birthToCycle_[bar.birth] = representativeCycles_.size();
|
|
205
|
+
representativeCycles_.resize(representativeCycles_.size() + 1);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if constexpr (Master_matrix::Option_list::has_vine_update) {
|
|
209
|
+
for (ID_index i = 0; i < nberColumns; i++) {
|
|
210
|
+
if (get_position(i) == bar.birth) {
|
|
211
|
+
auto& col = _matrix()->get_column(_matrix()->get_column_with_pivot(i));
|
|
212
|
+
representativeCycles_[birthToCycle_[bar.birth]] =
|
|
213
|
+
Master_matrix::build_cycle_from_range(col.get_non_zero_content_range());
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
auto& col = _matrix()->get_column(_matrix()->get_column_with_pivot(bar.birth));
|
|
218
|
+
representativeCycles_[birthToCycle_[bar.birth]] =
|
|
219
|
+
Master_matrix::build_cycle_from_range(col.get_non_zero_content_range());
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
template <class Master_matrix>
|
|
224
|
+
inline const std::vector<typename Chain_representative_cycles<Master_matrix>::Cycle>&
|
|
225
|
+
Chain_representative_cycles<Master_matrix>::get_representative_cycles()
|
|
226
|
+
{
|
|
227
|
+
return representativeCycles_;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
template <class Master_matrix>
|
|
231
|
+
inline const typename Chain_representative_cycles<Master_matrix>::Cycle&
|
|
232
|
+
Chain_representative_cycles<Master_matrix>::get_representative_cycle(const Bar& bar)
|
|
233
|
+
{
|
|
234
|
+
return representativeCycles_[birthToCycle_[bar.birth]];
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
template <class Master_matrix>
|
|
238
|
+
inline void Chain_representative_cycles<Master_matrix>::_reset()
|
|
239
|
+
{
|
|
240
|
+
representativeCycles_.clear();
|
|
241
|
+
birthToCycle_.clear();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
} // namespace persistence_matrix
|
|
245
|
+
} // namespace Gudhi
|
|
246
|
+
|
|
247
|
+
#endif // PM_CHAIN_REP_CYCLES_H
|