multipers 2.3.3b6__cp313-cp313-macosx_10_13_x86_64.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.

Files changed (183) hide show
  1. multipers/.dylibs/libc++.1.0.dylib +0 -0
  2. multipers/.dylibs/libtbb.12.16.dylib +0 -0
  3. multipers/__init__.py +33 -0
  4. multipers/_signed_measure_meta.py +453 -0
  5. multipers/_slicer_meta.py +211 -0
  6. multipers/array_api/__init__.py +45 -0
  7. multipers/array_api/numpy.py +41 -0
  8. multipers/array_api/torch.py +58 -0
  9. multipers/data/MOL2.py +458 -0
  10. multipers/data/UCR.py +18 -0
  11. multipers/data/__init__.py +1 -0
  12. multipers/data/graphs.py +466 -0
  13. multipers/data/immuno_regions.py +27 -0
  14. multipers/data/minimal_presentation_to_st_bf.py +0 -0
  15. multipers/data/pytorch2simplextree.py +91 -0
  16. multipers/data/shape3d.py +101 -0
  17. multipers/data/synthetic.py +113 -0
  18. multipers/distances.py +202 -0
  19. multipers/filtration_conversions.pxd +229 -0
  20. multipers/filtration_conversions.pxd.tp +84 -0
  21. multipers/filtrations/__init__.py +18 -0
  22. multipers/filtrations/density.py +574 -0
  23. multipers/filtrations/filtrations.py +361 -0
  24. multipers/filtrations.pxd +224 -0
  25. multipers/function_rips.cpython-313-darwin.so +0 -0
  26. multipers/function_rips.pyx +105 -0
  27. multipers/grids.cpython-313-darwin.so +0 -0
  28. multipers/grids.pyx +433 -0
  29. multipers/gudhi/Persistence_slices_interface.h +132 -0
  30. multipers/gudhi/Simplex_tree_interface.h +239 -0
  31. multipers/gudhi/Simplex_tree_multi_interface.h +551 -0
  32. multipers/gudhi/cubical_to_boundary.h +59 -0
  33. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
  34. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
  35. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
  36. multipers/gudhi/gudhi/Debug_utils.h +45 -0
  37. multipers/gudhi/gudhi/Fields/Multi_field.h +484 -0
  38. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -0
  39. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -0
  40. multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -0
  41. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -0
  42. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -0
  43. multipers/gudhi/gudhi/Fields/Z2_field.h +355 -0
  44. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -0
  45. multipers/gudhi/gudhi/Fields/Zp_field.h +420 -0
  46. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -0
  47. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -0
  48. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
  49. multipers/gudhi/gudhi/Matrix.h +2107 -0
  50. multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -0
  51. multipers/gudhi/gudhi/Multi_persistence/Box.h +174 -0
  52. multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -0
  53. multipers/gudhi/gudhi/Off_reader.h +173 -0
  54. multipers/gudhi/gudhi/One_critical_filtration.h +1441 -0
  55. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -0
  56. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -0
  57. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -0
  58. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -0
  59. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -0
  60. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -0
  61. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -0
  62. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -0
  63. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -0
  64. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -0
  65. multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -0
  66. multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -0
  67. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -0
  68. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -0
  69. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -0
  70. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -0
  71. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -0
  72. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -0
  73. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -0
  74. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -0
  75. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -0
  76. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -0
  77. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -0
  78. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -0
  79. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -0
  80. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -0
  81. multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -0
  82. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -0
  83. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -0
  84. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -0
  85. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -0
  86. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -0
  87. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -0
  88. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -0
  89. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
  90. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
  91. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
  92. multipers/gudhi/gudhi/Persistent_cohomology.h +745 -0
  93. multipers/gudhi/gudhi/Points_off_io.h +171 -0
  94. multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
  95. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -0
  96. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
  97. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -0
  98. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
  99. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
  100. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
  101. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -0
  102. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -0
  103. multipers/gudhi/gudhi/Simplex_tree.h +2794 -0
  104. multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -0
  105. multipers/gudhi/gudhi/distance_functions.h +62 -0
  106. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
  107. multipers/gudhi/gudhi/persistence_interval.h +253 -0
  108. multipers/gudhi/gudhi/persistence_matrix_options.h +170 -0
  109. multipers/gudhi/gudhi/reader_utils.h +367 -0
  110. multipers/gudhi/mma_interface_coh.h +256 -0
  111. multipers/gudhi/mma_interface_h0.h +223 -0
  112. multipers/gudhi/mma_interface_matrix.h +293 -0
  113. multipers/gudhi/naive_merge_tree.h +536 -0
  114. multipers/gudhi/scc_io.h +310 -0
  115. multipers/gudhi/truc.h +1403 -0
  116. multipers/io.cpython-313-darwin.so +0 -0
  117. multipers/io.pyx +644 -0
  118. multipers/ml/__init__.py +0 -0
  119. multipers/ml/accuracies.py +90 -0
  120. multipers/ml/invariants_with_persistable.py +79 -0
  121. multipers/ml/kernels.py +176 -0
  122. multipers/ml/mma.py +713 -0
  123. multipers/ml/one.py +472 -0
  124. multipers/ml/point_clouds.py +352 -0
  125. multipers/ml/signed_measures.py +1589 -0
  126. multipers/ml/sliced_wasserstein.py +461 -0
  127. multipers/ml/tools.py +113 -0
  128. multipers/mma_structures.cpython-313-darwin.so +0 -0
  129. multipers/mma_structures.pxd +128 -0
  130. multipers/mma_structures.pyx +2786 -0
  131. multipers/mma_structures.pyx.tp +1094 -0
  132. multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -0
  133. multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -0
  134. multipers/multi_parameter_rank_invariant/function_rips.h +322 -0
  135. multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -0
  136. multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -0
  137. multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -0
  138. multipers/multiparameter_edge_collapse.py +41 -0
  139. multipers/multiparameter_module_approximation/approximation.h +2330 -0
  140. multipers/multiparameter_module_approximation/combinatory.h +129 -0
  141. multipers/multiparameter_module_approximation/debug.h +107 -0
  142. multipers/multiparameter_module_approximation/euler_curves.h +0 -0
  143. multipers/multiparameter_module_approximation/format_python-cpp.h +286 -0
  144. multipers/multiparameter_module_approximation/heap_column.h +238 -0
  145. multipers/multiparameter_module_approximation/images.h +79 -0
  146. multipers/multiparameter_module_approximation/list_column.h +174 -0
  147. multipers/multiparameter_module_approximation/list_column_2.h +232 -0
  148. multipers/multiparameter_module_approximation/ru_matrix.h +347 -0
  149. multipers/multiparameter_module_approximation/set_column.h +135 -0
  150. multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -0
  151. multipers/multiparameter_module_approximation/unordered_set_column.h +166 -0
  152. multipers/multiparameter_module_approximation/utilities.h +403 -0
  153. multipers/multiparameter_module_approximation/vector_column.h +223 -0
  154. multipers/multiparameter_module_approximation/vector_matrix.h +331 -0
  155. multipers/multiparameter_module_approximation/vineyards.h +464 -0
  156. multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -0
  157. multipers/multiparameter_module_approximation.cpython-313-darwin.so +0 -0
  158. multipers/multiparameter_module_approximation.pyx +235 -0
  159. multipers/pickle.py +90 -0
  160. multipers/plots.py +456 -0
  161. multipers/point_measure.cpython-313-darwin.so +0 -0
  162. multipers/point_measure.pyx +395 -0
  163. multipers/simplex_tree_multi.cpython-313-darwin.so +0 -0
  164. multipers/simplex_tree_multi.pxd +134 -0
  165. multipers/simplex_tree_multi.pyx +10840 -0
  166. multipers/simplex_tree_multi.pyx.tp +2009 -0
  167. multipers/slicer.cpython-313-darwin.so +0 -0
  168. multipers/slicer.pxd +3034 -0
  169. multipers/slicer.pxd.tp +234 -0
  170. multipers/slicer.pyx +20481 -0
  171. multipers/slicer.pyx.tp +1088 -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 +62 -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-2.3.3b6.dist-info/METADATA +128 -0
  180. multipers-2.3.3b6.dist-info/RECORD +183 -0
  181. multipers-2.3.3b6.dist-info/WHEEL +6 -0
  182. multipers-2.3.3b6.dist-info/licenses/LICENSE +21 -0
  183. multipers-2.3.3b6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,450 @@
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): Pawel Dlotko
4
+ *
5
+ * Copyright (C) 2015 Inria
6
+ *
7
+ * Modification(s):
8
+ * - YYYY/MM Author: Description of the modification
9
+ */
10
+
11
+ #ifndef BITMAP_CUBICAL_COMPLEX_H_
12
+ #define BITMAP_CUBICAL_COMPLEX_H_
13
+
14
+ #include <gudhi/Debug_utils.h>
15
+ #include <gudhi/Bitmap_cubical_complex_base.h>
16
+ #include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
17
+
18
+ #ifdef GUDHI_USE_TBB
19
+ #include <tbb/parallel_sort.h>
20
+ #endif
21
+
22
+ #include <limits>
23
+ #include <utility> // for pair<>
24
+ #include <algorithm> // for sort
25
+ #include <vector>
26
+ #include <numeric> // for iota
27
+ #include <cstddef>
28
+ #include <stdexcept>
29
+
30
+ namespace Gudhi {
31
+
32
+ namespace cubical_complex {
33
+
34
+ template <typename T>
35
+ class is_before_in_filtration;
36
+
37
+ /**
38
+ * @brief Cubical complex represented as a bitmap.
39
+ * @ingroup cubical_complex
40
+ * @details This is a Bitmap_cubical_complex class. It joints a functionalities of Bitmap_cubical_complex_base and
41
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base classes into
42
+ * Gudhi persistent homology engine. It is a template class that inherit from its template parameter. The template
43
+ * parameter is supposed to be either Bitmap_cubical_complex_base or
44
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base class.
45
+ *
46
+ * This class implements the concept `FilteredComplex`.
47
+ **/
48
+ template <typename T>
49
+ class Bitmap_cubical_complex : public T {
50
+ public:
51
+ //*********************************************//
52
+ // Typedefs and typenames
53
+ //*********************************************//
54
+ typedef std::size_t Simplex_key;
55
+ typedef typename T::filtration_type Filtration_value;
56
+ typedef Simplex_key Simplex_handle;
57
+
58
+ //*********************************************//
59
+ // Constructors
60
+ //*********************************************//
61
+ // Over here we need to define various input types. I am proposing the following ones:
62
+ // Perseus style
63
+ // TODO(PD) H5 files?
64
+ // TODO(PD) binary files with little endians / big endians ?
65
+ // TODO(PD) constructor from a vector of elements of a type T. ?
66
+
67
+ /**
68
+ * @param[in] perseus_style_file The name of a \ref FileFormatsPerseus "Perseus-style file".
69
+ **/
70
+ explicit Bitmap_cubical_complex(const char* perseus_style_file)
71
+ : T(perseus_style_file), key_associated_to_simplex(num_simplices()) {
72
+ #ifdef DEBUG_TRACES
73
+ std::clog << "Bitmap_cubical_complex( const char* perseus_style_file )\n";
74
+ #endif
75
+ }
76
+
77
+ /**
78
+ * @param[in] dimensions The shape that should be used to interpret `cells` (in Fortran order).
79
+ * @param[in] cells The filtration values of the top-dimensional cells if `input_top_cells` is `true`,
80
+ * and of the vertices otherwise.
81
+ * @param[in] input_top_cells If `true`, `cells` represents top-dimensional cells. If `false`, it represents vertices.
82
+ **/
83
+ Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
84
+ const std::vector<Filtration_value>& cells,
85
+ bool input_top_cells = true)
86
+ : T(dimensions, cells, input_top_cells), key_associated_to_simplex(num_simplices()) {
87
+ }
88
+
89
+ /**
90
+ * @param[in] dimensions The shape that should be used to interpret `cells` (in Fortran order).
91
+ * @param[in] cells The filtration values of the top-dimensional cells if `input_top_cells` is `true`,
92
+ * and of the vertices otherwise.
93
+ * @param[in] directions_in_which_periodic_b_cond_are_to_be_imposed Specifies for each dimension (as per `dimensions`) if the space is periodic (`true`) or not (`false`), or in other words if the boundaries should be identified.
94
+ * @param[in] input_top_cells If `true`, `cells` represents top-dimensional cells. If `false`, it represents vertices.
95
+ **/
96
+ Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
97
+ const std::vector<Filtration_value>& cells,
98
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed,
99
+ bool input_top_cells = true)
100
+ : T(dimensions, cells, directions_in_which_periodic_b_cond_are_to_be_imposed, input_top_cells),
101
+ key_associated_to_simplex(num_simplices()) {
102
+ }
103
+
104
+ /**
105
+ * Destructor.
106
+ **/
107
+ virtual ~Bitmap_cubical_complex() {}
108
+
109
+ //*********************************************//
110
+ // Other 'easy' functions
111
+ //*********************************************//
112
+
113
+ /**
114
+ * Returns number of all cubes in the complex.
115
+ **/
116
+ std::size_t num_simplices() const { return this->data.size(); }
117
+
118
+ /**
119
+ * Returns a Simplex_handle to a cube that do not exist in this complex.
120
+ **/
121
+ static Simplex_handle null_simplex() {
122
+ #ifdef DEBUG_TRACES
123
+ std::clog << "Simplex_handle null_simplex()\n";
124
+ #endif
125
+ return std::numeric_limits<Simplex_handle>::max();
126
+ }
127
+
128
+ /**
129
+ * Returns dimension of the complex.
130
+ **/
131
+ inline std::size_t dimension() const { return this->sizes.size(); }
132
+
133
+ /**
134
+ * Return dimension of a cell pointed by the Simplex_handle.
135
+ **/
136
+ inline unsigned dimension(Simplex_handle sh) const {
137
+ #ifdef DEBUG_TRACES
138
+ std::clog << "unsigned dimension(const Simplex_handle& sh)\n";
139
+ #endif
140
+ GUDHI_CHECK(sh != null_simplex(), std::logic_error("Only real cells have a dimension"));
141
+ return this->get_dimension_of_a_cell(sh);
142
+ }
143
+
144
+ /**
145
+ * Return the filtration of a cell pointed by the Simplex_handle, or +inf for `null_simplex()`.
146
+ **/
147
+ Filtration_value filtration(Simplex_handle sh) {
148
+ #ifdef DEBUG_TRACES
149
+ std::clog << "Filtration_value filtration(const Simplex_handle& sh)\n";
150
+ #endif
151
+ // Returns the filtration value of a simplex.
152
+ if (sh != null_simplex()) return this->data[sh];
153
+ return std::numeric_limits<Filtration_value>::infinity();
154
+ }
155
+
156
+ /**
157
+ * Return a key which is not a key of any cube in the considered data structure.
158
+ **/
159
+ static Simplex_key null_key() {
160
+ #ifdef DEBUG_TRACES
161
+ std::clog << "Simplex_key null_key()\n";
162
+ #endif
163
+ return std::numeric_limits<Simplex_handle>::max();
164
+ }
165
+
166
+ /**
167
+ * Return the key of a cube pointed by the Simplex_handle.
168
+ **/
169
+ Simplex_key key(Simplex_handle sh) const {
170
+ #ifdef DEBUG_TRACES
171
+ std::clog << "Simplex_key key(const Simplex_handle& sh)\n";
172
+ #endif
173
+ GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("key(null_simplex()) is not supported"));
174
+ return this->key_associated_to_simplex[sh];
175
+ }
176
+
177
+ /**
178
+ * Return the k-th Simplex_handle in filtration order.
179
+ *
180
+ * Only available after initialize_filtration() or filtration_simplex_range() has been called.
181
+ **/
182
+ Simplex_handle simplex(Simplex_key k) {
183
+ #ifdef DEBUG_TRACES
184
+ std::clog << "Simplex_handle simplex(Simplex_key key)\n";
185
+ #endif
186
+ GUDHI_CHECK (k != null_key(), std::invalid_argument("simplex(null_key()) is not supported"));
187
+ GUDHI_CHECK (!sorted_cells.empty(), std::logic_error("initialize_filtration() or filtration_simplex_range() must be called before simplex()"));
188
+ return this->sorted_cells[k];
189
+ }
190
+
191
+ /**
192
+ * Assign key to a cube pointed by the Simplex_handle
193
+ **/
194
+ void assign_key(Simplex_handle sh, Simplex_key key) {
195
+ #ifdef DEBUG_TRACES
196
+ std::clog << "void assign_key(Simplex_handle& sh, Simplex_key key)\n";
197
+ #endif
198
+ GUDHI_CHECK(sh != null_simplex(), std::invalid_argument("assign_key(null_simplex()) is not supported"));
199
+ this->key_associated_to_simplex[sh] = key;
200
+ }
201
+
202
+ /**
203
+ * Precompute a sorted list of the cells for filtration_simplex_range() and simplex().
204
+ * It is automatically called by filtration_simplex_range() if needed, but NOT by simplex().
205
+ **/
206
+ void initialize_filtration();
207
+
208
+ //*********************************************//
209
+ // Iterators
210
+ //*********************************************//
211
+
212
+ /**
213
+ * Boundary_simplex_range class provides ranges for boundary iterators.
214
+ **/
215
+ typedef typename std::vector<Simplex_handle>::iterator Boundary_simplex_iterator;
216
+ typedef typename std::vector<Simplex_handle> Boundary_simplex_range;
217
+
218
+ /**
219
+ * Range of all the cells in filtration order.
220
+ * Secondary criteria for filtration are:
221
+ * (1) Dimension of a cube (lower dimensional comes first).
222
+ * (2) Position in the data structure (the ones that are earliest in the data structure come first).
223
+ **/
224
+ typedef std::vector<Simplex_handle> Filtration_simplex_range;
225
+
226
+ //*********************************************//
227
+ // Methods to access iterators from the container:
228
+
229
+ /**
230
+ * boundary_simplex_range creates an object of a Boundary_simplex_range class
231
+ * that provides ranges for the Boundary_simplex_iterator.
232
+ **/
233
+ Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) { return this->get_boundary_of_a_cell(sh); }
234
+
235
+ /**
236
+ * Range of all the cells in filtration order.
237
+ * Secondary criteria for filtration are:
238
+ * (1) Dimension of a cube (lower dimensional comes first).
239
+ * (2) Position in the data structure (the ones that are earliest in the data structure come first).
240
+ *
241
+ * This implicitly calls initialize_filtration() if it has never been called.
242
+ **/
243
+ Filtration_simplex_range const& filtration_simplex_range() {
244
+ #ifdef DEBUG_TRACES
245
+ std::clog << "Filtration_simplex_range filtration_simplex_range()\n";
246
+ #endif
247
+ if (sorted_cells.empty()) initialize_filtration();
248
+ return sorted_cells;
249
+ }
250
+ //*********************************************//
251
+
252
+ //*********************************************//
253
+ // Elements which are in Gudhi now, but I (and in all the cases I asked also Marc) do not understand why they are
254
+ // there.
255
+ // TODO(PD) the file IndexingTag.h in the Gudhi library contains an empty structure, so
256
+ // I understand that this is something that was planned (for simplicial maps?)
257
+ // but was never finished. The only idea I have here is to use the same empty structure from
258
+ // IndexingTag.h file, but only if the compiler needs it. If the compiler
259
+ // do not need it, then I would rather not add here elements which I do not understand.
260
+ // typedef Indexing_tag
261
+
262
+ /**
263
+ * Returns the extremities of edge `e`
264
+ **/
265
+ std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle e) {
266
+ std::vector<std::size_t> bdry = this->get_boundary_of_a_cell(e);
267
+ #ifdef DEBUG_TRACES
268
+ std::clog << "std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle e )\n";
269
+ std::clog << "bdry.size() : " << bdry.size() << "\n";
270
+ #endif
271
+ if (bdry.size() != 2)
272
+ throw(
273
+ "Error in endpoints in Bitmap_cubical_complex class. The cell is not an edge.");
274
+ return std::make_pair(bdry[0], bdry[1]);
275
+ }
276
+
277
+ class Skeleton_simplex_range;
278
+
279
+ class Skeleton_simplex_iterator {
280
+ // Iterator over all simplices of the complex in the order of the indexing scheme.
281
+ public:
282
+ typedef std::input_iterator_tag iterator_category;
283
+ typedef Simplex_handle value_type;
284
+ typedef std::ptrdiff_t difference_type;
285
+ typedef value_type* pointer;
286
+ typedef value_type reference;
287
+
288
+ Skeleton_simplex_iterator(Bitmap_cubical_complex* b, std::size_t d) : b(b), dimension(d) {
289
+ #ifdef DEBUG_TRACES
290
+ std::clog << "Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , std::size_t d )\n";
291
+ #endif
292
+ // find the position of the first simplex of a dimension d
293
+ this->position = 0;
294
+ while ((this->position != b->data.size()) &&
295
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
296
+ ++this->position;
297
+ }
298
+ }
299
+
300
+ Skeleton_simplex_iterator() : b(NULL), position(0), dimension(0) {}
301
+
302
+ Skeleton_simplex_iterator operator++() {
303
+ #ifdef DEBUG_TRACES
304
+ std::clog << "Skeleton_simplex_iterator operator++()\n";
305
+ #endif
306
+ // increment the position as long as you did not get to the next element of the dimension dimension.
307
+ ++this->position;
308
+ while ((this->position != this->b->data.size()) &&
309
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
310
+ ++this->position;
311
+ }
312
+ return (*this);
313
+ }
314
+
315
+ Skeleton_simplex_iterator operator++(int) {
316
+ Skeleton_simplex_iterator result = *this;
317
+ ++(*this);
318
+ return result;
319
+ }
320
+
321
+ bool operator==(const Skeleton_simplex_iterator& rhs) const {
322
+ #ifdef DEBUG_TRACES
323
+ std::clog << "bool operator ==\n";
324
+ #endif
325
+ return (this->position == rhs.position);
326
+ }
327
+
328
+ bool operator!=(const Skeleton_simplex_iterator& rhs) const {
329
+ #ifdef DEBUG_TRACES
330
+ std::clog << "bool operator != ( const Skeleton_simplex_iterator& rhs )\n";
331
+ #endif
332
+ return !(*this == rhs);
333
+ }
334
+
335
+ Simplex_handle operator*() {
336
+ #ifdef DEBUG_TRACES
337
+ std::clog << "Simplex_handle operator*() \n";
338
+ #endif
339
+ return this->position;
340
+ }
341
+
342
+ friend class Skeleton_simplex_range;
343
+
344
+ private:
345
+ Bitmap_cubical_complex<T>* b;
346
+ std::size_t position;
347
+ unsigned dimension;
348
+ };
349
+
350
+ /**
351
+ * @brief A range containing all the cells of dimension at most k.
352
+ **/
353
+ class Skeleton_simplex_range {
354
+ // Range over the simplices of the complex in the order of the filtration.
355
+ // .begin() and .end() return type Skeleton_simplex_iterator.
356
+ public:
357
+ typedef Skeleton_simplex_iterator const_iterator;
358
+ typedef Skeleton_simplex_iterator iterator;
359
+
360
+ Skeleton_simplex_range(Bitmap_cubical_complex<T>* b, unsigned dimension) : b(b), dimension(dimension) {}
361
+
362
+ Skeleton_simplex_iterator begin() {
363
+ #ifdef DEBUG_TRACES
364
+ std::clog << "Skeleton_simplex_iterator begin()\n";
365
+ #endif
366
+ return Skeleton_simplex_iterator(this->b, this->dimension);
367
+ }
368
+
369
+ Skeleton_simplex_iterator end() {
370
+ #ifdef DEBUG_TRACES
371
+ std::clog << "Skeleton_simplex_iterator end()\n";
372
+ #endif
373
+ Skeleton_simplex_iterator it(this->b, this->dimension);
374
+ it.position = this->b->data.size();
375
+ return it;
376
+ }
377
+
378
+ private:
379
+ Bitmap_cubical_complex<T>* b;
380
+ unsigned dimension;
381
+ };
382
+
383
+ /**
384
+ * Returns a range containing all the cells of dimension at most `dimension`.
385
+ **/
386
+ Skeleton_simplex_range skeleton_simplex_range(unsigned dimension) {
387
+ #ifdef DEBUG_TRACES
388
+ std::clog << "Skeleton_simplex_range skeleton_simplex_range( unsigned dimension )\n";
389
+ #endif
390
+ return Skeleton_simplex_range(this, dimension);
391
+ }
392
+
393
+ friend class is_before_in_filtration<T>;
394
+
395
+ protected:
396
+ std::vector<std::size_t> key_associated_to_simplex;
397
+ std::vector<std::size_t> sorted_cells;
398
+ }; // Bitmap_cubical_complex
399
+
400
+ template <typename T>
401
+ void Bitmap_cubical_complex<T>::initialize_filtration() {
402
+ #ifdef DEBUG_TRACES
403
+ std::clog << "void Bitmap_cubical_complex<T>::initialize_elements_ordered_according_to_filtration() \n";
404
+ #endif
405
+ this->sorted_cells.resize(this->data.size());
406
+ std::iota(std::begin(sorted_cells), std::end(sorted_cells), 0);
407
+ #ifdef GUDHI_USE_TBB
408
+ tbb::parallel_sort(sorted_cells.begin(), sorted_cells.end(),
409
+ is_before_in_filtration<T>(this));
410
+ #else
411
+ std::sort(sorted_cells.begin(), sorted_cells.end(), is_before_in_filtration<T>(this));
412
+ #endif
413
+ }
414
+
415
+ template <typename T>
416
+ class is_before_in_filtration {
417
+ public:
418
+ explicit is_before_in_filtration(Bitmap_cubical_complex<T>* CC) : CC_(CC) {}
419
+
420
+ bool operator()(const typename Bitmap_cubical_complex<T>::Simplex_handle& sh1,
421
+ const typename Bitmap_cubical_complex<T>::Simplex_handle& sh2) const {
422
+ // Not using st_->filtration(sh1) because it uselessly tests for null_simplex.
423
+ typedef typename T::filtration_type Filtration_value;
424
+ Filtration_value fil1 = CC_->data[sh1];
425
+ Filtration_value fil2 = CC_->data[sh2];
426
+ if (fil1 != fil2) {
427
+ return fil1 < fil2;
428
+ }
429
+ // in this case they are on the same filtration level, so the dimension decide.
430
+ std::size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
431
+ std::size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
432
+ if (dim1 != dim2) {
433
+ return dim1 < dim2;
434
+ }
435
+ // in this case both filtration and dimensions of the considered cubes are the same. To have stable sort, we simply
436
+ // compare their positions in the bitmap:
437
+ return sh1 < sh2;
438
+ }
439
+
440
+ protected:
441
+ Bitmap_cubical_complex<T>* CC_;
442
+ };
443
+
444
+ } // namespace cubical_complex
445
+
446
+ namespace Cubical_complex = cubical_complex;
447
+
448
+ } // namespace Gudhi
449
+
450
+ #endif // BITMAP_CUBICAL_COMPLEX_H_