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.
Files changed (184) hide show
  1. multipers/.dylibs/libboost_timer.dylib +0 -0
  2. multipers/.dylibs/libc++.1.0.dylib +0 -0
  3. multipers/.dylibs/libtbb.12.17.dylib +0 -0
  4. multipers/__init__.py +33 -0
  5. multipers/_signed_measure_meta.py +426 -0
  6. multipers/_slicer_meta.py +231 -0
  7. multipers/array_api/__init__.py +62 -0
  8. multipers/array_api/numpy.py +124 -0
  9. multipers/array_api/torch.py +133 -0
  10. multipers/data/MOL2.py +458 -0
  11. multipers/data/UCR.py +18 -0
  12. multipers/data/__init__.py +1 -0
  13. multipers/data/graphs.py +466 -0
  14. multipers/data/immuno_regions.py +27 -0
  15. multipers/data/minimal_presentation_to_st_bf.py +0 -0
  16. multipers/data/pytorch2simplextree.py +91 -0
  17. multipers/data/shape3d.py +101 -0
  18. multipers/data/synthetic.py +113 -0
  19. multipers/distances.py +202 -0
  20. multipers/filtration_conversions.pxd +736 -0
  21. multipers/filtration_conversions.pxd.tp +226 -0
  22. multipers/filtrations/__init__.py +21 -0
  23. multipers/filtrations/density.py +529 -0
  24. multipers/filtrations/filtrations.py +480 -0
  25. multipers/filtrations.pxd +534 -0
  26. multipers/filtrations.pxd.tp +332 -0
  27. multipers/function_rips.cpython-312-darwin.so +0 -0
  28. multipers/function_rips.pyx +104 -0
  29. multipers/grids.cpython-312-darwin.so +0 -0
  30. multipers/grids.pyx +538 -0
  31. multipers/gudhi/Persistence_slices_interface.h +213 -0
  32. multipers/gudhi/Simplex_tree_interface.h +274 -0
  33. multipers/gudhi/Simplex_tree_multi_interface.h +648 -0
  34. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
  35. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
  36. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
  37. multipers/gudhi/gudhi/Debug_utils.h +52 -0
  38. multipers/gudhi/gudhi/Degree_rips_bifiltration.h +2307 -0
  39. multipers/gudhi/gudhi/Dynamic_multi_parameter_filtration.h +2524 -0
  40. multipers/gudhi/gudhi/Fields/Multi_field.h +453 -0
  41. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +460 -0
  42. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +444 -0
  43. multipers/gudhi/gudhi/Fields/Multi_field_small.h +584 -0
  44. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +490 -0
  45. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +580 -0
  46. multipers/gudhi/gudhi/Fields/Z2_field.h +391 -0
  47. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +389 -0
  48. multipers/gudhi/gudhi/Fields/Zp_field.h +493 -0
  49. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +384 -0
  50. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +492 -0
  51. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
  52. multipers/gudhi/gudhi/Matrix.h +2200 -0
  53. multipers/gudhi/gudhi/Multi_filtration/Multi_parameter_generator.h +1712 -0
  54. multipers/gudhi/gudhi/Multi_filtration/multi_filtration_conversions.h +237 -0
  55. multipers/gudhi/gudhi/Multi_filtration/multi_filtration_utils.h +225 -0
  56. multipers/gudhi/gudhi/Multi_parameter_filtered_complex.h +485 -0
  57. multipers/gudhi/gudhi/Multi_parameter_filtration.h +2643 -0
  58. multipers/gudhi/gudhi/Multi_persistence/Box.h +233 -0
  59. multipers/gudhi/gudhi/Multi_persistence/Line.h +309 -0
  60. multipers/gudhi/gudhi/Multi_persistence/Multi_parameter_filtered_complex_pcoh_interface.h +268 -0
  61. multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_cohomology.h +159 -0
  62. multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_matrix.h +463 -0
  63. multipers/gudhi/gudhi/Multi_persistence/Point.h +853 -0
  64. multipers/gudhi/gudhi/Off_reader.h +173 -0
  65. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +834 -0
  66. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +838 -0
  67. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +833 -0
  68. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1367 -0
  69. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1157 -0
  70. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +869 -0
  71. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +905 -0
  72. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +122 -0
  73. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +260 -0
  74. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +288 -0
  75. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +170 -0
  76. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +247 -0
  77. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +571 -0
  78. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +182 -0
  79. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +130 -0
  80. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +235 -0
  81. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +312 -0
  82. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1092 -0
  83. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +923 -0
  84. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +914 -0
  85. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +930 -0
  86. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1071 -0
  87. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +203 -0
  88. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +886 -0
  89. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +984 -0
  90. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1213 -0
  91. multipers/gudhi/gudhi/Persistence_matrix/index_mapper.h +58 -0
  92. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +227 -0
  93. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +200 -0
  94. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +166 -0
  95. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +319 -0
  96. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +562 -0
  97. multipers/gudhi/gudhi/Persistence_on_a_line.h +152 -0
  98. multipers/gudhi/gudhi/Persistence_on_rectangle.h +617 -0
  99. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
  100. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
  101. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
  102. multipers/gudhi/gudhi/Persistent_cohomology.h +769 -0
  103. multipers/gudhi/gudhi/Points_off_io.h +171 -0
  104. multipers/gudhi/gudhi/Projective_cover_kernel.h +379 -0
  105. multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
  106. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +559 -0
  107. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
  108. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +121 -0
  109. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
  110. multipers/gudhi/gudhi/Simplex_tree/filtration_value_utils.h +155 -0
  111. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
  112. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
  113. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +60 -0
  114. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +105 -0
  115. multipers/gudhi/gudhi/Simplex_tree.h +3170 -0
  116. multipers/gudhi/gudhi/Slicer.h +848 -0
  117. multipers/gudhi/gudhi/Thread_safe_slicer.h +393 -0
  118. multipers/gudhi/gudhi/distance_functions.h +62 -0
  119. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
  120. multipers/gudhi/gudhi/multi_simplex_tree_helpers.h +147 -0
  121. multipers/gudhi/gudhi/persistence_interval.h +263 -0
  122. multipers/gudhi/gudhi/persistence_matrix_options.h +188 -0
  123. multipers/gudhi/gudhi/reader_utils.h +367 -0
  124. multipers/gudhi/gudhi/simple_mdspan.h +484 -0
  125. multipers/gudhi/gudhi/slicer_helpers.h +779 -0
  126. multipers/gudhi/tmp_h0_pers/mma_interface_h0.h +223 -0
  127. multipers/gudhi/tmp_h0_pers/naive_merge_tree.h +536 -0
  128. multipers/io.cpython-312-darwin.so +0 -0
  129. multipers/io.pyx +472 -0
  130. multipers/ml/__init__.py +0 -0
  131. multipers/ml/accuracies.py +90 -0
  132. multipers/ml/invariants_with_persistable.py +79 -0
  133. multipers/ml/kernels.py +176 -0
  134. multipers/ml/mma.py +713 -0
  135. multipers/ml/one.py +472 -0
  136. multipers/ml/point_clouds.py +352 -0
  137. multipers/ml/signed_measures.py +1667 -0
  138. multipers/ml/sliced_wasserstein.py +461 -0
  139. multipers/ml/tools.py +113 -0
  140. multipers/mma_structures.cpython-312-darwin.so +0 -0
  141. multipers/mma_structures.pxd +134 -0
  142. multipers/mma_structures.pyx +1483 -0
  143. multipers/mma_structures.pyx.tp +1126 -0
  144. multipers/multi_parameter_rank_invariant/diff_helpers.h +85 -0
  145. multipers/multi_parameter_rank_invariant/euler_characteristic.h +95 -0
  146. multipers/multi_parameter_rank_invariant/function_rips.h +317 -0
  147. multipers/multi_parameter_rank_invariant/hilbert_function.h +761 -0
  148. multipers/multi_parameter_rank_invariant/persistence_slices.h +149 -0
  149. multipers/multi_parameter_rank_invariant/rank_invariant.h +350 -0
  150. multipers/multiparameter_edge_collapse.py +41 -0
  151. multipers/multiparameter_module_approximation/approximation.h +2541 -0
  152. multipers/multiparameter_module_approximation/debug.h +107 -0
  153. multipers/multiparameter_module_approximation/format_python-cpp.h +292 -0
  154. multipers/multiparameter_module_approximation/utilities.h +428 -0
  155. multipers/multiparameter_module_approximation.cpython-312-darwin.so +0 -0
  156. multipers/multiparameter_module_approximation.pyx +286 -0
  157. multipers/ops.cpython-312-darwin.so +0 -0
  158. multipers/ops.pyx +231 -0
  159. multipers/pickle.py +89 -0
  160. multipers/plots.py +550 -0
  161. multipers/point_measure.cpython-312-darwin.so +0 -0
  162. multipers/point_measure.pyx +409 -0
  163. multipers/simplex_tree_multi.cpython-312-darwin.so +0 -0
  164. multipers/simplex_tree_multi.pxd +136 -0
  165. multipers/simplex_tree_multi.pyx +11719 -0
  166. multipers/simplex_tree_multi.pyx.tp +2102 -0
  167. multipers/slicer.cpython-312-darwin.so +0 -0
  168. multipers/slicer.pxd +2097 -0
  169. multipers/slicer.pxd.tp +263 -0
  170. multipers/slicer.pyx +13042 -0
  171. multipers/slicer.pyx.tp +1259 -0
  172. multipers/tensor/tensor.h +672 -0
  173. multipers/tensor.pxd +13 -0
  174. multipers/test.pyx +44 -0
  175. multipers/tests/__init__.py +70 -0
  176. multipers/torch/__init__.py +1 -0
  177. multipers/torch/diff_grids.py +240 -0
  178. multipers/torch/rips_density.py +310 -0
  179. multipers/vector_interface.pxd +46 -0
  180. multipers-2.4.0b1.dist-info/METADATA +131 -0
  181. multipers-2.4.0b1.dist-info/RECORD +184 -0
  182. multipers-2.4.0b1.dist-info/WHEEL +6 -0
  183. multipers-2.4.0b1.dist-info/licenses/LICENSE +21 -0
  184. 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