multipers 2.2.3__cp311-cp311-win_amd64.whl → 2.3.1__cp311-cp311-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of multipers might be problematic. Click here for more details.

Files changed (182) hide show
  1. multipers/__init__.py +33 -31
  2. multipers/_signed_measure_meta.py +430 -430
  3. multipers/_slicer_meta.py +211 -212
  4. multipers/data/MOL2.py +458 -458
  5. multipers/data/UCR.py +18 -18
  6. multipers/data/graphs.py +466 -466
  7. multipers/data/immuno_regions.py +27 -27
  8. multipers/data/pytorch2simplextree.py +90 -90
  9. multipers/data/shape3d.py +101 -101
  10. multipers/data/synthetic.py +113 -111
  11. multipers/distances.py +198 -198
  12. multipers/filtration_conversions.pxd.tp +84 -84
  13. multipers/filtrations/__init__.py +18 -0
  14. multipers/{ml/convolutions.py → filtrations/density.py} +563 -520
  15. multipers/filtrations/filtrations.py +289 -0
  16. multipers/filtrations.pxd +224 -224
  17. multipers/function_rips.cp311-win_amd64.pyd +0 -0
  18. multipers/function_rips.pyx +105 -105
  19. multipers/grids.cp311-win_amd64.pyd +0 -0
  20. multipers/grids.pyx +350 -350
  21. multipers/gudhi/Persistence_slices_interface.h +132 -132
  22. multipers/gudhi/Simplex_tree_interface.h +239 -245
  23. multipers/gudhi/Simplex_tree_multi_interface.h +516 -561
  24. multipers/gudhi/cubical_to_boundary.h +59 -59
  25. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -450
  26. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -1070
  27. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -579
  28. multipers/gudhi/gudhi/Debug_utils.h +45 -45
  29. multipers/gudhi/gudhi/Fields/Multi_field.h +484 -484
  30. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -455
  31. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -450
  32. multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -531
  33. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -507
  34. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -531
  35. multipers/gudhi/gudhi/Fields/Z2_field.h +355 -355
  36. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -376
  37. multipers/gudhi/gudhi/Fields/Zp_field.h +420 -420
  38. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -400
  39. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -418
  40. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -337
  41. multipers/gudhi/gudhi/Matrix.h +2107 -2107
  42. multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -1038
  43. multipers/gudhi/gudhi/Multi_persistence/Box.h +171 -171
  44. multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -282
  45. multipers/gudhi/gudhi/Off_reader.h +173 -173
  46. multipers/gudhi/gudhi/One_critical_filtration.h +1433 -1431
  47. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -769
  48. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -686
  49. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -842
  50. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -1350
  51. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -1105
  52. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -859
  53. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -910
  54. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -139
  55. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -230
  56. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -211
  57. multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -60
  58. multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -60
  59. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -136
  60. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -190
  61. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -616
  62. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -150
  63. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -106
  64. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -219
  65. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -327
  66. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -1140
  67. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -934
  68. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -934
  69. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -980
  70. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -1092
  71. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -192
  72. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -921
  73. multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -1093
  74. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -1012
  75. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -1244
  76. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -186
  77. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -164
  78. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -156
  79. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -376
  80. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -540
  81. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -118
  82. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -173
  83. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -128
  84. multipers/gudhi/gudhi/Persistent_cohomology.h +745 -745
  85. multipers/gudhi/gudhi/Points_off_io.h +171 -171
  86. multipers/gudhi/gudhi/Simple_object_pool.h +69 -69
  87. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -463
  88. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -83
  89. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -106
  90. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -277
  91. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -62
  92. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -27
  93. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -62
  94. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -157
  95. multipers/gudhi/gudhi/Simplex_tree.h +2794 -2794
  96. multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -163
  97. multipers/gudhi/gudhi/distance_functions.h +62 -62
  98. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -104
  99. multipers/gudhi/gudhi/persistence_interval.h +253 -253
  100. multipers/gudhi/gudhi/persistence_matrix_options.h +170 -170
  101. multipers/gudhi/gudhi/reader_utils.h +367 -367
  102. multipers/gudhi/mma_interface_coh.h +256 -255
  103. multipers/gudhi/mma_interface_h0.h +223 -231
  104. multipers/gudhi/mma_interface_matrix.h +291 -282
  105. multipers/gudhi/naive_merge_tree.h +536 -575
  106. multipers/gudhi/scc_io.h +310 -289
  107. multipers/gudhi/truc.h +957 -888
  108. multipers/io.cp311-win_amd64.pyd +0 -0
  109. multipers/io.pyx +714 -711
  110. multipers/ml/accuracies.py +90 -90
  111. multipers/ml/invariants_with_persistable.py +79 -79
  112. multipers/ml/kernels.py +176 -176
  113. multipers/ml/mma.py +713 -714
  114. multipers/ml/one.py +472 -472
  115. multipers/ml/point_clouds.py +352 -346
  116. multipers/ml/signed_measures.py +1589 -1589
  117. multipers/ml/sliced_wasserstein.py +461 -461
  118. multipers/ml/tools.py +113 -113
  119. multipers/mma_structures.cp311-win_amd64.pyd +0 -0
  120. multipers/mma_structures.pxd +127 -127
  121. multipers/mma_structures.pyx +4 -8
  122. multipers/mma_structures.pyx.tp +1083 -1085
  123. multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -93
  124. multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -97
  125. multipers/multi_parameter_rank_invariant/function_rips.h +322 -322
  126. multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -769
  127. multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -148
  128. multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -369
  129. multipers/multiparameter_edge_collapse.py +41 -41
  130. multipers/multiparameter_module_approximation/approximation.h +2298 -2295
  131. multipers/multiparameter_module_approximation/combinatory.h +129 -129
  132. multipers/multiparameter_module_approximation/debug.h +107 -107
  133. multipers/multiparameter_module_approximation/format_python-cpp.h +286 -286
  134. multipers/multiparameter_module_approximation/heap_column.h +238 -238
  135. multipers/multiparameter_module_approximation/images.h +79 -79
  136. multipers/multiparameter_module_approximation/list_column.h +174 -174
  137. multipers/multiparameter_module_approximation/list_column_2.h +232 -232
  138. multipers/multiparameter_module_approximation/ru_matrix.h +347 -347
  139. multipers/multiparameter_module_approximation/set_column.h +135 -135
  140. multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -36
  141. multipers/multiparameter_module_approximation/unordered_set_column.h +166 -166
  142. multipers/multiparameter_module_approximation/utilities.h +403 -419
  143. multipers/multiparameter_module_approximation/vector_column.h +223 -223
  144. multipers/multiparameter_module_approximation/vector_matrix.h +331 -331
  145. multipers/multiparameter_module_approximation/vineyards.h +464 -464
  146. multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -649
  147. multipers/multiparameter_module_approximation.cp311-win_amd64.pyd +0 -0
  148. multipers/multiparameter_module_approximation.pyx +218 -217
  149. multipers/pickle.py +90 -53
  150. multipers/plots.py +342 -334
  151. multipers/point_measure.cp311-win_amd64.pyd +0 -0
  152. multipers/point_measure.pyx +322 -320
  153. multipers/simplex_tree_multi.cp311-win_amd64.pyd +0 -0
  154. multipers/simplex_tree_multi.pxd +133 -133
  155. multipers/simplex_tree_multi.pyx +115 -48
  156. multipers/simplex_tree_multi.pyx.tp +1947 -1935
  157. multipers/slicer.cp311-win_amd64.pyd +0 -0
  158. multipers/slicer.pxd +301 -120
  159. multipers/slicer.pxd.tp +218 -214
  160. multipers/slicer.pyx +1570 -507
  161. multipers/slicer.pyx.tp +931 -914
  162. multipers/tensor/tensor.h +672 -672
  163. multipers/tensor.pxd +13 -13
  164. multipers/test.pyx +44 -44
  165. multipers/tests/__init__.py +57 -57
  166. multipers/torch/diff_grids.py +217 -217
  167. multipers/torch/rips_density.py +310 -304
  168. {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/LICENSE +21 -21
  169. {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/METADATA +21 -11
  170. multipers-2.3.1.dist-info/RECORD +182 -0
  171. {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/WHEEL +1 -1
  172. multipers/tests/test_diff_helper.py +0 -73
  173. multipers/tests/test_hilbert_function.py +0 -82
  174. multipers/tests/test_mma.py +0 -83
  175. multipers/tests/test_point_clouds.py +0 -49
  176. multipers/tests/test_python-cpp_conversion.py +0 -82
  177. multipers/tests/test_signed_betti.py +0 -181
  178. multipers/tests/test_signed_measure.py +0 -89
  179. multipers/tests/test_simplextreemulti.py +0 -221
  180. multipers/tests/test_slicer.py +0 -221
  181. multipers-2.2.3.dist-info/RECORD +0 -189
  182. {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/top_level.txt +0 -0
@@ -1,561 +1,516 @@
1
- /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which
2
- *is released under MIT. See file LICENSE or go to
3
- *https://gudhi.inria.fr/licensing/ for full license details. Author(s): Vincent
4
- *Rouvreau
5
- *
6
- * Copyright (C) 2016 Inria
7
- *
8
- * Modification(s):
9
- * - 2022/11 David Loiseaux, Hannah Schreiber : adapt for
10
- *multipersistence.
11
- * - YYYY/MM Author: Description of the modification
12
- */
13
-
14
- #pragma once
15
-
16
- #include "Simplex_tree_interface.h"
17
- #include <cstddef>
18
- #include <cstdint>
19
- #include <gudhi/Simplex_tree_multi.h>
20
- // #include <gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h>
21
- #include "multiparameter_module_approximation/format_python-cpp.h"
22
-
23
- #include <iostream>
24
- #include <utility> // std::pair
25
- #include <vector>
26
- #include <limits> // has_quiet_NaN
27
-
28
- namespace Gudhi {
29
- namespace multiparameter {
30
- namespace python_interface {
31
-
32
- using interface_std =
33
- Simplex_tree<Simplex_tree_options_for_python>; // Interface not necessary
34
- // (smaller so should do less
35
- // segfaults)
36
-
37
- template <class simplextreeinterface>
38
- simplextreeinterface &
39
- get_simplextree_from_pointer(const uintptr_t splxptr) { // DANGER
40
- simplextreeinterface &st = *(simplextreeinterface *)(splxptr);
41
- return st;
42
- }
43
- template <typename Filtration, typename value_type = typename Filtration::value_type>
44
- class Simplex_tree_multi_interface
45
- : public Simplex_tree_interface<
46
- Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>> {
47
- public:
48
- using SimplexTreeOptions =
49
- Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>;
50
- using Python_filtration_type =
51
- std::vector<typename SimplexTreeOptions::value_type>; // TODO :
52
- // std::conditional
53
- using Base = Simplex_tree<SimplexTreeOptions>;
54
- using Filtration_value = typename Base::Filtration_value;
55
- using Vertex_handle = typename Base::Vertex_handle;
56
- using Simplex_handle = typename Base::Simplex_handle;
57
- using Insertion_result = typename std::pair<Simplex_handle, bool>;
58
- using Simplex = std::vector<Vertex_handle>;
59
- using Simplex_and_filtration =
60
- std::pair<Simplex, Filtration_value*>;
61
- using Filtered_simplices = std::vector<Simplex_and_filtration>;
62
- using Skeleton_simplex_iterator = typename Base::Skeleton_simplex_iterator;
63
- using Complex_simplex_iterator = typename Base::Complex_simplex_iterator;
64
- using Extended_filtration_data = typename Base::Extended_filtration_data;
65
- using Boundary_simplex_iterator = typename Base::Boundary_simplex_iterator;
66
- typedef bool (*blocker_func_t)(Simplex simplex, void *user_data);
67
- using euler_chars_type = std::vector<int>;
68
-
69
- public:
70
- static_assert(std::is_same<typename Base::Filtration_value, Filtration_value>::value,
71
- "value_type has to be the same as Filtration::value_type. This is only a hack for python");
72
- Extended_filtration_data efd;
73
-
74
- bool find_simplex(const Simplex &simplex) {
75
- return (Base::find(simplex) != Base::null_simplex());
76
- }
77
-
78
- void assign_simplex_filtration(const Simplex &simplex,
79
- const Filtration_value &filtration) {
80
- Base::assign_filtration(Base::find(simplex), filtration);
81
- Base::clear_filtration();
82
- }
83
-
84
- bool insert(const Simplex &simplex, const Filtration_value &filtration) {
85
- Insertion_result result =
86
- Base::insert_simplex_and_subfaces(simplex, filtration);
87
- if (result.first != Base::null_simplex())
88
- Base::clear_filtration();
89
- return (result.second);
90
- }
91
-
92
- // Do not interface this function, only used in alpha complex interface for
93
- // complex creation
94
- bool insert_simplex(const Simplex &simplex,
95
- const Filtration_value &filtration) {
96
- Insertion_result result = Base::insert_simplex(simplex, filtration);
97
- return (result.second);
98
- }
99
- // bool insert_simplex(const Simplex& simplex, const Python_filtration_type&
100
- // filtration ) {
101
- // Filtration_value& filtration_ = *(Filtration_value*)(&filtration); //
102
- // Jardinage for no copy. Insertion_result result =
103
- // Base::insert_simplex(simplex, filtration); return (result.second);
104
- // }
105
-
106
- // Do not interface this function, only used in interface for complex creation
107
- bool insert_simplex_and_subfaces(const Simplex &simplex,
108
- const Filtration_value &filtration) {
109
- Insertion_result result =
110
- Base::insert_simplex_and_subfaces(simplex, filtration);
111
- return (result.second);
112
- }
113
- // bool insert_simplex_and_subfaces(const Simplex& simplex, const
114
- // Python_filtration_type& filtration ) {
115
- // Filtration_value& filtration_ = *(Filtration_value*)(&filtration); //
116
- // Jardinage for no copy. Insertion_result result =
117
- // Base::insert_simplex_and_subfaces(simplex, filtration); return
118
- // (result.second);
119
- // }
120
-
121
- // Do not interface this function, only used in strong witness interface for
122
- // complex creation
123
- bool insert_simplex(const std::vector<std::size_t> &simplex,
124
- const typename Filtration_value::Generator &filtration) {
125
- Insertion_result result = Base::insert_simplex(simplex, filtration);
126
- return (result.second);
127
- }
128
-
129
- // Do not interface this function, only used in strong witness interface for
130
- // complex creation
131
- bool insert_simplex_and_subfaces(const std::vector<std::size_t> &simplex,
132
- const Filtration_value &filtration) {
133
- Insertion_result result =
134
- Base::insert_simplex_and_subfaces(simplex, filtration);
135
- return (result.second);
136
- }
137
- typename SimplexTreeOptions::Filtration_value *
138
- simplex_filtration(const Simplex &simplex) {
139
- auto &filtration = Base::filtration_mutable(Base::find(simplex));
140
- return &filtration; // We return the pointer to get a numpy view
141
- // afterward
142
- }
143
-
144
- Simplex_and_filtration get_simplex_and_filtration(Simplex_handle f_simplex) {
145
- // Simplex simplex;
146
- // for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
147
- // // simplex.insert(simplex.begin(), vertex); // why not push back ?
148
- // }
149
- auto it = Base::simplex_vertex_range(f_simplex);
150
- Simplex simplex(it.begin(), it.end());
151
- std::reverse(simplex.begin(), simplex.end());
152
- return std::make_pair(std::move(simplex),
153
- &Base::filtration_mutable(f_simplex));
154
- }
155
-
156
- Filtered_simplices get_star(const Simplex &simplex) {
157
- Filtered_simplices star;
158
- for (auto f_simplex : Base::star_simplex_range(Base::find(simplex))) {
159
- Simplex simplex_star;
160
- for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
161
- simplex_star.insert(simplex_star.begin(), vertex);
162
- }
163
- star.push_back(std::make_pair(simplex_star,
164
- &Base::filtration_mutable(f_simplex)));
165
- }
166
- return star;
167
- }
168
-
169
- Filtered_simplices get_cofaces(const Simplex &simplex, int dimension) {
170
- Filtered_simplices cofaces;
171
- for (auto f_simplex :
172
- Base::cofaces_simplex_range(Base::find(simplex), dimension)) {
173
- Simplex simplex_coface;
174
- for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
175
- simplex_coface.insert(simplex_coface.begin(), vertex);
176
- }
177
- cofaces.push_back(std::make_pair(
178
- simplex_coface, &Base::filtration_mutable(f_simplex)));
179
- }
180
- return cofaces;
181
- }
182
-
183
- void compute_extended_filtration() {
184
- throw std::logic_error("Incompatible with multipers");
185
- }
186
-
187
- Simplex_tree_multi_interface *collapse_edges(int nb_collapse_iteration) {
188
- throw std::logic_error("Incompatible with multipers");
189
- }
190
-
191
- // ######################## MULTIPERS STUFF
192
- void set_keys_to_enumerate() {
193
- int count = 0;
194
- for (auto sh : Base::filtration_simplex_range())
195
- Base::assign_key(sh, count++);
196
- }
197
-
198
- int get_key(const Simplex &simplex) { return Base::key(Base::find(simplex)); }
199
-
200
- void set_key(const Simplex &simplex, int key) {
201
- Base::assign_key(Base::find(simplex), key);
202
- return;
203
- }
204
-
205
- // Fills a parameter with a lower-star filtration
206
- void
207
- fill_lowerstar(const std::vector<typename Filtration::value_type> &filtration,
208
- int axis) {
209
- /* constexpr value_type minus_inf =
210
- * -1*std::numeric_limits<value_type>::infinity(); */
211
- std::vector<value_type> filtration_values_of_vertex;
212
- for (auto &SimplexHandle : Base::complex_simplex_range()) {
213
- auto &current_birth = Base::filtration_mutable(SimplexHandle);
214
- /* value_type to_assign = minus_inf; */
215
- filtration_values_of_vertex.clear();
216
- for (auto vertex : Base::simplex_vertex_range(SimplexHandle)) {
217
- if constexpr (std::numeric_limits<typename Filtration::value_type>::has_quiet_NaN)
218
- /* to_assign = std::max(filtration[vertex], to_assign); */
219
- if (std::isnan(filtration[vertex]))
220
- std::cerr << "Invalid filtration for vertex " << vertex << " !!"
221
- << std::endl;
222
- filtration_values_of_vertex.push_back(filtration[vertex]);
223
- }
224
- value_type to_assign =
225
- *std::max_element(filtration_values_of_vertex.begin(),
226
- filtration_values_of_vertex.end());
227
- /* if (to_assign >10 || to_assign < -10 ) */
228
- /* std::cout <<"to_assign : "<< to_assign << std::endl; */
229
- current_birth[axis] = to_assign;
230
- // Base::assign_filtration(SimplexHandle, current_birth);
231
- }
232
- }
233
-
234
- using simplices_list = std::vector<std::vector<int>>;
235
- simplices_list get_simplices_of_dimension(int dimension) {
236
- simplices_list simplex_list;
237
- simplex_list.reserve(Base::num_simplices());
238
- for (auto simplexhandle : Base::skeleton_simplex_range(dimension)) {
239
- if (Base::dimension(simplexhandle) == dimension) {
240
- std::vector<int> simplex;
241
- simplex.reserve(dimension + 1);
242
- for (int vertex : Base::simplex_vertex_range(simplexhandle))
243
- simplex.push_back(vertex);
244
- simplex_list.push_back(simplex);
245
- }
246
- }
247
- /* simplex_list.shrink_to_fit();*/
248
- return simplex_list;
249
- }
250
- using edge_list =
251
- std::vector<std::pair<std::pair<int, int>, std::pair<double, double>>>;
252
- edge_list get_edge_list() {
253
- edge_list simplex_list;
254
- simplex_list.reserve(Base::num_simplices());
255
- for (auto &simplexHandle : Base::skeleton_simplex_range(1)) {
256
- if (Base::dimension(simplexHandle) == 1) {
257
- std::pair<int, int> simplex;
258
- auto it = Base::simplex_vertex_range(simplexHandle).begin();
259
- simplex = {*it, *(++it)};
260
- const auto &f = Base::filtration(simplexHandle);
261
- simplex_list.push_back({simplex, {static_cast<double>(f[0]), static_cast<double>(f[1])}});
262
- }
263
- }
264
- return simplex_list;
265
- }
266
- void
267
- resize_all_filtrations(int num) {
268
- if (num < 0)
269
- return;
270
- for (const auto &SimplexHandle : Base::complex_simplex_range()) {
271
- if constexpr (Filtration::is_multi_critical){
272
- for (auto& stuff : Base::filtration_mutable(SimplexHandle))
273
- stuff.resize(num);
274
- }
275
- else
276
- Base::filtration_mutable(SimplexHandle).resize(num);
277
- }
278
- }
279
- void from_std(char* buffer_start, std::size_t buffer_size, int dimension, const Filtration &default_values) {
280
- interface_std st;
281
- st.deserialize(buffer_start, buffer_size);
282
- Gudhi::multi_persistence::multify(st, *this, dimension, default_values);
283
- }
284
- template <typename Line_like>
285
- void to_std(intptr_t ptr, const Line_like &line, int dimension) {
286
- interface_std &st = get_simplextree_from_pointer<interface_std>(ptr);
287
-
288
- for (const auto &simplex_handle : this->complex_simplex_range()) {
289
- std::vector<int> simplex;
290
- for (auto vertex : this->simplex_vertex_range(simplex_handle))
291
- simplex.push_back(vertex);
292
-
293
- // Filtration as double
294
- const auto &f = this->filtration(simplex_handle).template as_type<typename interface_std::Filtration_value>();
295
-
296
- typename interface_std::Filtration_value new_filtration = line[line.compute_forward_intersection(f)][dimension];
297
- st.insert_simplex(simplex, new_filtration);
298
- }
299
- }
300
- void to_std_linear_projection(intptr_t ptr, std::vector<double> linear_form) {
301
- interface_std &st = get_simplextree_from_pointer<interface_std>(ptr);
302
- Gudhi::multi_persistence::linear_projection(st, *this, linear_form);
303
- }
304
-
305
- void squeeze_filtration_inplace(const std::vector<std::vector<double>> &grid,
306
- const bool coordinate_values = true) {
307
- std::size_t num_parameters = this->get_number_of_parameters();
308
- if (grid.size() != num_parameters) {
309
- throw std::invalid_argument(
310
- "Grid and simplextree do not agree on number of parameters.");
311
- }
312
- for (const auto &simplex_handle : this->complex_simplex_range()) {
313
- auto &simplex_filtration = this->filtration_mutable(simplex_handle);
314
- const auto& coords = compute_coordinates_in_grid(simplex_filtration, grid);
315
- if (coordinate_values)
316
- simplex_filtration = coords.template as_type<value_type>();
317
- else
318
- simplex_filtration = evaluate_coordinates_in_grid(coords, grid).template as_type<value_type>();
319
- }
320
- }
321
-
322
- void squeeze_filtration(
323
- const intptr_t outptr,
324
- const std::vector<std::vector<double>> &grid) { // TODO : this is const but GUDHI
325
- constexpr const bool verbose = false;
326
- using int_fil_type = decltype(std::declval<Filtration>().template as_type<std::int32_t>());
327
- using st_coord_type = Simplex_tree_multi_interface<int_fil_type, int32_t>;
328
- st_coord_type& out = *(st_coord_type*) outptr; // TODO : maybe fix this.
329
- std::vector<int> simplex_vertex;
330
- for (const auto &simplex_handle : this->complex_simplex_range()) {
331
- const auto &simplex_filtration = this->filtration(simplex_handle);
332
- if constexpr (verbose)
333
- std::cout << "Filtration " << simplex_filtration << "\n";
334
- const auto& coords = compute_coordinates_in_grid(simplex_filtration, grid);
335
- if constexpr (verbose)
336
- std::cout << "Coords " << coords << "\n";
337
- for (auto s : this->simplex_vertex_range(simplex_handle))
338
- simplex_vertex.push_back(s);
339
- out.insert_simplex(simplex_vertex, coords);
340
- if constexpr (verbose)
341
- std::cout << "Coords in st" << out.filtration(out.find(simplex_vertex)) << std::endl;
342
- simplex_vertex.clear();
343
- }
344
- }
345
-
346
-
347
- std::vector<std::vector<std::vector<value_type>>> // dim, pts, param
348
- get_filtration_values(const std::vector<int> &degrees) {
349
- using multi_filtration_grid = std::vector<std::vector<value_type>>;
350
- int num_parameters = this->get_number_of_parameters();
351
- std::vector<multi_filtration_grid> out(
352
- degrees.size(), multi_filtration_grid(num_parameters));
353
- std::vector<int> degree_index(this->dimension() + 1);
354
- int count = 0;
355
- for (auto degree : degrees) {
356
- degree_index[degree] = count++;
357
- out[degree_index[degree]].reserve(this->num_simplices());
358
- }
359
-
360
- for (const auto &simplex_handle : this->complex_simplex_range()) {
361
- const auto &filtration = this->filtration(simplex_handle);
362
- const auto degree = this->dimension(simplex_handle);
363
- if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end())
364
- continue;
365
- // for (int parameter = 0; parameter < num_parameters; parameter++) {
366
- // out[degree_index[degree]][parameter].push_back(filtration[parameter]);
367
- // }
368
- if constexpr (Filtration::is_multi_critical)
369
- for (std::size_t i = 0; i < filtration.num_generators(); i++)
370
- for (int parameter = 0; parameter < num_parameters; parameter++)
371
- out[degree_index[degree]][parameter].push_back(filtration[i][parameter]);
372
- else
373
- for (int parameter = 0; parameter < num_parameters; parameter++)
374
- out[degree_index[degree]][parameter].push_back(filtration[parameter]);
375
- }
376
- return out;
377
- }
378
-
379
- using boundary_type = std::vector<unsigned int>;
380
- using boundary_matrix = std::vector<boundary_type>;
381
-
382
- using scc_type = mma::scc_type<SimplexTreeOptions>;
383
- scc_type inline simplextree_to_scc() { return Gudhi::multiparameter::mma::simplextree_to_scc(*this); }
384
- using kscc_type = mma::kscc_type<SimplexTreeOptions>;
385
- kscc_type inline kcritical_simplextree_to_scc() {
386
- if constexpr (SimplexTreeOptions::Filtration_value::is_multi_critical)
387
- return Gudhi::multiparameter::mma::kcritical_simplextree_to_scc(*this);
388
- else
389
- return {};
390
- }
391
-
392
- using function_scc_type =
393
- std::vector<std::pair<std::vector<std::vector<std::vector<value_type>>>,
394
- boundary_matrix>>;
395
- function_scc_type inline function_simplextree_to_scc() {
396
- return Gudhi::multiparameter::mma::function_simplextree_to_scc(*this);
397
-
398
- }
399
-
400
-
401
- using flattened_scc_type =
402
- std::pair<std::vector<std::vector<value_type>>,
403
- std::vector<std::vector<unsigned int>>>;
404
-
405
- flattened_scc_type inline simplextree_to_ordered_bf(){
406
- return Gudhi::multiparameter::mma::simplextree_to_ordered_bf(*this);
407
- }
408
-
409
- // Diff / grid stuff
410
-
411
- using idx_map_type = std::vector<std::map<typename Filtration::value_type, int32_t>>;
412
- inline idx_map_type build_idx_map(const std::vector<int> &simplices_dimensions){
413
- static_assert(!Filtration::is_multi_critical, "Multicritical not supported yet");
414
- auto num_parameters = this->get_number_of_parameters();
415
- if (static_cast<int>(simplices_dimensions.size()) < num_parameters)
416
- throw;
417
- int max_dim = *std::max_element(simplices_dimensions.begin(),
418
- simplices_dimensions.end());
419
- int min_dim = *std::min_element(simplices_dimensions.begin(),
420
- simplices_dimensions.end());
421
- max_dim = min_dim >= 0 ? max_dim : this->dimension();
422
-
423
- idx_map_type idx_map(num_parameters);
424
- auto splx_idx = 0u;
425
- for (auto sh :
426
- this->complex_simplex_range()) { // order has to be retrieved later, so I'm
427
- // not sure that skeleton iterator is well
428
- // suited
429
- const auto &splx_filtration = this->filtration(sh);
430
- const auto splx_dim = this->dimension(sh);
431
- if (splx_dim <= max_dim)
432
- for (auto i = 0u; i < splx_filtration.size(); i++) {
433
- if (simplices_dimensions[i] != splx_dim && simplices_dimensions[i] != -1)
434
- continue;
435
- auto f = splx_filtration[i];
436
- idx_map[i].try_emplace(f, splx_idx);
437
- }
438
- splx_idx++;
439
- }
440
- return idx_map;
441
- };
442
-
443
- using pts_indices_type = std::vector<std::vector<int32_t>>;
444
- static std::pair<pts_indices_type, pts_indices_type> inline get_pts_indices(
445
- const idx_map_type &idx_map,
446
- const std::vector<std::vector<typename Filtration::value_type>> &pts) {
447
- static_assert(!Filtration::is_multi_critical, "Multicritical not supported yet");
448
- std::size_t num_pts = pts.size();
449
- std::size_t num_parameters = idx_map.size();
450
- pts_indices_type out_indices(
451
- num_pts, std::vector<int32_t>(num_parameters,
452
- -1)); // -1 to be able from indicies to
453
- // get if the pt is found or not
454
- pts_indices_type out_unmapped_values;
455
- for (auto pt_idx = 0u; pt_idx < num_pts; pt_idx++) {
456
- auto &pt = pts[pt_idx];
457
- auto &pt_indices = out_indices[pt_idx];
458
-
459
- for (std::size_t parameter = 0u; parameter < num_parameters;
460
- parameter++) {
461
- value_type f = pt[parameter];
462
- const std::map<value_type, int32_t> &parameter_map = idx_map[parameter];
463
- auto it = parameter_map.find(f);
464
- if (it == parameter_map.end())
465
- out_unmapped_values.push_back(
466
- {static_cast<int32_t>(pt_idx), static_cast<int32_t>(parameter)});
467
- else
468
- pt_indices[parameter] = it->second;
469
- }
470
- }
471
- return {out_indices, out_unmapped_values}; // TODO return a ptr for python
472
- }
473
-
474
- std::pair<pts_indices_type, pts_indices_type> inline pts_to_indices(
475
- const std::vector<std::vector<typename Filtration::value_type>> &pts,
476
- const std::vector<int> &simplices_dimensions) {
477
- return get_pts_indices(this->build_idx_map(simplices_dimensions), pts);
478
- }
479
- };
480
-
481
- template <typename Filtration>
482
- using interface_multi = Simplex_tree_multi_interface<
483
- Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>>;
484
-
485
- // Wrappers of the functions in Simplex_tree_multi.h, to deal with the "pointer
486
- // only" python interface
487
- template <typename Filtration>
488
- void inline flatten_diag_from_ptr(
489
- const uintptr_t splxptr, const uintptr_t newsplxptr,
490
- const std::vector<typename Filtration::value_type> basepoint,
491
- int dimension) { // for python
492
- auto &st = get_simplextree_from_pointer<interface_std>(newsplxptr);
493
- auto &st_multi =
494
- get_simplextree_from_pointer<interface_multi<Filtration>>(splxptr);
495
- flatten_diag(st, st_multi, basepoint, dimension);
496
- }
497
- template <typename Filtration>
498
- void inline multify_from_ptr(uintptr_t splxptr, uintptr_t newsplxptr,
499
- const int dimension,
500
- const Filtration &default_values) { // for python
501
- auto &st = get_simplextree_from_pointer<interface_std>(splxptr);
502
- auto &st_multi =
503
- get_simplextree_from_pointer<interface_multi<Filtration>>(newsplxptr);
504
- Gudhi::multi_persistence::multify(st, st_multi, dimension, default_values);
505
- }
506
- template <typename Filtration>
507
- void inline flatten_from_ptr(uintptr_t splxptr, uintptr_t newsplxptr,
508
- const int dimension = 0) { // for python
509
- auto &st = get_simplextree_from_pointer<interface_std>(newsplxptr);
510
- auto &st_multi =
511
- get_simplextree_from_pointer<interface_multi<Filtration>>(splxptr);
512
- Gudhi::multi_persistence::flatten(st, st_multi, dimension);
513
- }
514
-
515
- template <typename Filtration, typename... Args>
516
- void inline linear_projection_from_ptr(const uintptr_t ptr,
517
- const uintptr_t ptr_multi,
518
- Args... args) {
519
- auto &st = get_simplextree_from_pointer<interface_std>(ptr);
520
- auto &st_multi =
521
- get_simplextree_from_pointer<interface_multi<Filtration>>(ptr_multi);
522
- Gudhi::multi_persistence::linear_projection(st, st_multi, args...);
523
- }
524
-
525
- template <typename Filtration = typename Gudhi::multi_filtration::One_critical_filtration<float>>
526
- using options_multi = Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>;
527
-
528
- template <typename Filtration, typename... Args>
529
- void inline squeeze_filtration_from_ptr(uintptr_t splxptr, Args... args) {
530
- Simplex_tree<options_multi<Filtration>> &st_multi =
531
- *(Gudhi::Simplex_tree<options_multi<Filtration>> *)(splxptr);
532
- squeeze_filtration(st_multi, args...);
533
- return;
534
- }
535
-
536
- template <typename Filtration, typename... Args>
537
- inline std::vector<std::vector<std::vector<Filtration>>>
538
- get_filtration_values_from_ptr(uintptr_t splxptr, Args... args) {
539
- Simplex_tree<options_multi<Filtration>> &st_multi =
540
- *(Gudhi::Simplex_tree<options_multi<Filtration>> *)(splxptr);
541
- return get_filtration_values(st_multi, args...);
542
- }
543
-
544
- // Final types
545
- //
546
- //
547
-
548
- template <typename Filtration>
549
- using Simplex_tree_multi_simplex_handle = typename
550
- Simplex_tree_multi_interface<Filtration>::Simplex_handle;
551
-
552
- template <typename Filtration>
553
- using Simplex_tree_multi_simplices_iterator = typename
554
- Simplex_tree_multi_interface<Filtration>::Complex_simplex_iterator;
555
- template <typename Filtration>
556
- using Simplex_tree_multi_skeleton_iterator = typename
557
- Simplex_tree_multi_interface<Filtration>::Skeleton_simplex_iterator;
558
- template <typename Filtration>
559
- using Simplex_tree_multi_boundary_iterator = typename
560
- Simplex_tree_multi_interface<Filtration>::Boundary_simplex_iterator;
561
- }}} // namespace Gudhi::multiparameter::python_interface
1
+ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which
2
+ *is released under MIT. See file LICENSE or go to
3
+ *https://gudhi.inria.fr/licensing/ for full license details. Author(s): Vincent
4
+ *Rouvreau
5
+ *
6
+ * Copyright (C) 2016 Inria
7
+ *
8
+ * Modification(s):
9
+ * - 2022/11 David Loiseaux, Hannah Schreiber : adapt for
10
+ *multipersistence.
11
+ * - YYYY/MM Author: Description of the modification
12
+ */
13
+
14
+ #pragma once
15
+
16
+ #include "Simplex_tree_interface.h"
17
+ #include <cstddef>
18
+ #include <cstdint>
19
+ #include <gudhi/Simplex_tree_multi.h>
20
+ // #include <gudhi/Simplex_tree/multi_filtrations/Finitely_critical_filtrations.h>
21
+ #include "multiparameter_module_approximation/format_python-cpp.h"
22
+
23
+ #include <iostream>
24
+ #include <utility> // std::pair
25
+ #include <vector>
26
+ #include <limits> // has_quiet_NaN
27
+
28
+ namespace Gudhi {
29
+ namespace multiparameter {
30
+ namespace python_interface {
31
+
32
+ using interface_std = Simplex_tree<Simplex_tree_options_for_python>; // Interface not necessary
33
+ // (smaller so should do less
34
+ // segfaults)
35
+
36
+ template <class simplextreeinterface>
37
+ simplextreeinterface &get_simplextree_from_pointer(const uintptr_t splxptr) { // DANGER
38
+ simplextreeinterface &st = *(simplextreeinterface *)(splxptr);
39
+ return st;
40
+ }
41
+
42
+ template <typename Filtration, typename value_type = typename Filtration::value_type>
43
+ class Simplex_tree_multi_interface
44
+ : public Simplex_tree_interface<
45
+ Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>> {
46
+ public:
47
+ using SimplexTreeOptions = Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>;
48
+ using Python_filtration_type = std::vector<typename SimplexTreeOptions::value_type>; // TODO :
49
+ // std::conditional
50
+ using Base = Simplex_tree<SimplexTreeOptions>;
51
+ using Filtration_value = typename Base::Filtration_value;
52
+ using Vertex_handle = typename Base::Vertex_handle;
53
+ using Simplex_handle = typename Base::Simplex_handle;
54
+ using Insertion_result = typename std::pair<Simplex_handle, bool>;
55
+ using Simplex = std::vector<Vertex_handle>;
56
+ using Simplex_and_filtration = std::pair<Simplex, Filtration_value *>;
57
+ using Filtered_simplices = std::vector<Simplex_and_filtration>;
58
+ using Skeleton_simplex_iterator = typename Base::Skeleton_simplex_iterator;
59
+ using Complex_simplex_iterator = typename Base::Complex_simplex_iterator;
60
+ using Extended_filtration_data = typename Base::Extended_filtration_data;
61
+ using Boundary_simplex_iterator = typename Base::Boundary_simplex_iterator;
62
+ typedef bool (*blocker_func_t)(Simplex simplex, void *user_data);
63
+ using euler_chars_type = std::vector<int>;
64
+
65
+ public:
66
+ static_assert(std::is_same_v<typename Base::Filtration_value, Filtration_value>,
67
+ "value_type has to be the same as Filtration::value_type. This is only a hack for python");
68
+ Extended_filtration_data efd;
69
+
70
+ bool find_simplex(const Simplex &simplex) { return (Base::find(simplex) != Base::null_simplex()); }
71
+
72
+ void assign_simplex_filtration(const Simplex &simplex, const Filtration_value &filtration) {
73
+ Base::assign_filtration(Base::find(simplex), filtration);
74
+ Base::clear_filtration();
75
+ }
76
+
77
+ bool insert(const Simplex &simplex, const Filtration_value &filtration) {
78
+ Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration);
79
+ if (result.first != Base::null_simplex()) Base::clear_filtration();
80
+ return (result.second);
81
+ }
82
+
83
+ // Do not interface this function, only used in alpha complex interface for
84
+ // complex creation
85
+ bool insert_simplex(const Simplex &simplex, const Filtration_value &filtration) {
86
+ Insertion_result result = Base::insert_simplex(simplex, filtration);
87
+ return (result.second);
88
+ }
89
+
90
+ // bool insert_simplex(const Simplex& simplex, const Python_filtration_type&
91
+ // filtration ) {
92
+ // Filtration_value& filtration_ = *(Filtration_value*)(&filtration); //
93
+ // Jardinage for no copy. Insertion_result result =
94
+ // Base::insert_simplex(simplex, filtration); return (result.second);
95
+ // }
96
+
97
+ // Do not interface this function, only used in interface for complex creation
98
+ bool insert_simplex_and_subfaces(const Simplex &simplex, const Filtration_value &filtration) {
99
+ Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration);
100
+ return (result.second);
101
+ }
102
+
103
+ // bool insert_simplex_and_subfaces(const Simplex& simplex, const
104
+ // Python_filtration_type& filtration ) {
105
+ // Filtration_value& filtration_ = *(Filtration_value*)(&filtration); //
106
+ // Jardinage for no copy. Insertion_result result =
107
+ // Base::insert_simplex_and_subfaces(simplex, filtration); return
108
+ // (result.second);
109
+ // }
110
+
111
+ // Do not interface this function, only used in strong witness interface for
112
+ // complex creation
113
+ bool insert_simplex(const std::vector<std::size_t> &simplex, const typename Filtration_value::Generator &filtration) {
114
+ Insertion_result result = Base::insert_simplex(simplex, filtration);
115
+ return (result.second);
116
+ }
117
+
118
+ // Do not interface this function, only used in strong witness interface for
119
+ // complex creation
120
+ bool insert_simplex_and_subfaces(const std::vector<std::size_t> &simplex, const Filtration_value &filtration) {
121
+ Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration);
122
+ return (result.second);
123
+ }
124
+
125
+ typename SimplexTreeOptions::Filtration_value *simplex_filtration(const Simplex &simplex) {
126
+ auto &filtration = Base::filtration_mutable(Base::find(simplex));
127
+ return &filtration; // We return the pointer to get a numpy view
128
+ // afterward
129
+ }
130
+
131
+ Simplex_and_filtration get_simplex_and_filtration(Simplex_handle f_simplex) {
132
+ // Simplex simplex;
133
+ // for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
134
+ // // simplex.insert(simplex.begin(), vertex); // why not push back ?
135
+ // }
136
+ auto it = Base::simplex_vertex_range(f_simplex);
137
+ Simplex simplex(it.begin(), it.end());
138
+ std::reverse(simplex.begin(), simplex.end());
139
+ return std::make_pair(std::move(simplex), &Base::filtration_mutable(f_simplex));
140
+ }
141
+
142
+ Filtered_simplices get_star(const Simplex &simplex) {
143
+ Filtered_simplices star;
144
+ for (auto f_simplex : Base::star_simplex_range(Base::find(simplex))) {
145
+ Simplex simplex_star;
146
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
147
+ simplex_star.insert(simplex_star.begin(), vertex);
148
+ }
149
+ star.push_back(std::make_pair(simplex_star, &Base::filtration_mutable(f_simplex)));
150
+ }
151
+ return star;
152
+ }
153
+
154
+ Filtered_simplices get_cofaces(const Simplex &simplex, int dimension) {
155
+ Filtered_simplices cofaces;
156
+ for (auto f_simplex : Base::cofaces_simplex_range(Base::find(simplex), dimension)) {
157
+ Simplex simplex_coface;
158
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
159
+ simplex_coface.insert(simplex_coface.begin(), vertex);
160
+ }
161
+ cofaces.push_back(std::make_pair(simplex_coface, &Base::filtration_mutable(f_simplex)));
162
+ }
163
+ return cofaces;
164
+ }
165
+
166
+ void compute_extended_filtration() { throw std::logic_error("Incompatible with multipers"); }
167
+
168
+ Simplex_tree_multi_interface *collapse_edges([[maybe_unused]] int nb_collapse_iteration) {
169
+ throw std::logic_error("Incompatible with multipers");
170
+ }
171
+
172
+ // ######################## MULTIPERS STUFF
173
+ void set_keys_to_enumerate() {
174
+ int count = 0;
175
+ for (auto sh : Base::filtration_simplex_range()) Base::assign_key(sh, count++);
176
+ }
177
+
178
+ int get_key(const Simplex &simplex) { return Base::key(Base::find(simplex)); }
179
+
180
+ void set_key(const Simplex &simplex, int key) {
181
+ Base::assign_key(Base::find(simplex), key);
182
+ return;
183
+ }
184
+
185
+ // Fills a parameter with a lower-star filtration
186
+ void fill_lowerstar(const std::vector<typename Filtration::value_type> &filtration, int axis) {
187
+ /* constexpr value_type minus_inf =
188
+ * -1*std::numeric_limits<value_type>::infinity(); */
189
+ std::vector<value_type> filtration_values_of_vertex;
190
+ for (auto &SimplexHandle : Base::complex_simplex_range()) {
191
+ auto &current_birth = Base::filtration_mutable(SimplexHandle);
192
+ /* value_type to_assign = minus_inf; */
193
+ filtration_values_of_vertex.clear();
194
+ for (auto vertex : Base::simplex_vertex_range(SimplexHandle)) {
195
+ if constexpr (std::numeric_limits<typename Filtration::value_type>::has_quiet_NaN)
196
+ /* to_assign = std::max(filtration[vertex], to_assign); */
197
+ if (std::isnan(filtration[vertex]))
198
+ std::cerr << "Invalid filtration for vertex " << vertex << " !!" << std::endl;
199
+ filtration_values_of_vertex.push_back(filtration[vertex]);
200
+ }
201
+ value_type to_assign = *std::max_element(filtration_values_of_vertex.begin(), filtration_values_of_vertex.end());
202
+ /* if (to_assign >10 || to_assign < -10 ) */
203
+ /* std::cout <<"to_assign : "<< to_assign << std::endl; */
204
+ current_birth[axis] = to_assign;
205
+ // Base::assign_filtration(SimplexHandle, current_birth);
206
+ }
207
+ }
208
+
209
+ using simplices_list = std::vector<std::vector<int>>;
210
+
211
+ simplices_list get_simplices_of_dimension(int dimension) {
212
+ simplices_list simplex_list;
213
+ simplex_list.reserve(Base::num_simplices());
214
+ for (auto simplexhandle : Base::skeleton_simplex_range(dimension)) {
215
+ if (Base::dimension(simplexhandle) == dimension) {
216
+ std::vector<int> simplex;
217
+ simplex.reserve(dimension + 1);
218
+ for (int vertex : Base::simplex_vertex_range(simplexhandle)) simplex.push_back(vertex);
219
+ simplex_list.push_back(simplex);
220
+ }
221
+ }
222
+ /* simplex_list.shrink_to_fit();*/
223
+ return simplex_list;
224
+ }
225
+
226
+ using edge_list = std::vector<std::pair<std::pair<int, int>, std::pair<double, double>>>;
227
+
228
+ edge_list get_edge_list() {
229
+ edge_list simplex_list;
230
+ simplex_list.reserve(Base::num_simplices());
231
+ for (auto &simplexHandle : Base::skeleton_simplex_range(1)) {
232
+ if (Base::dimension(simplexHandle) == 1) {
233
+ std::pair<int, int> simplex;
234
+ auto it = Base::simplex_vertex_range(simplexHandle).begin();
235
+ simplex = {*it, *(++it)};
236
+ const auto &f = Base::filtration(simplexHandle);
237
+ simplex_list.push_back({simplex, {static_cast<double>(f[0]), static_cast<double>(f[1])}});
238
+ }
239
+ }
240
+ return simplex_list;
241
+ }
242
+
243
+ void resize_all_filtrations(int num) {
244
+ if (num < 0) return;
245
+ for (const auto &SimplexHandle : Base::complex_simplex_range()) {
246
+ if constexpr (Filtration::is_multi_critical) {
247
+ for (auto &stuff : Base::filtration_mutable(SimplexHandle)) stuff.resize(num);
248
+ } else
249
+ Base::filtration_mutable(SimplexHandle).resize(num);
250
+ }
251
+ }
252
+
253
+ void from_std(char *buffer_start, std::size_t buffer_size, int dimension, const Filtration &default_values) {
254
+ interface_std st;
255
+ st.deserialize(buffer_start, buffer_size);
256
+ Gudhi::multi_persistence::multify(st, *this, dimension, default_values);
257
+ }
258
+
259
+ template <typename Line_like>
260
+ void to_std(intptr_t ptr, const Line_like &line, int dimension) {
261
+ interface_std &st = get_simplextree_from_pointer<interface_std>(ptr);
262
+
263
+ for (const auto &simplex_handle : this->complex_simplex_range()) {
264
+ std::vector<int> simplex;
265
+ for (auto vertex : this->simplex_vertex_range(simplex_handle)) simplex.push_back(vertex);
266
+
267
+ // Filtration as double
268
+ const auto &f = this->filtration(simplex_handle).template as_type<typename interface_std::Filtration_value>();
269
+
270
+ typename interface_std::Filtration_value new_filtration = line[line.compute_forward_intersection(f)][dimension];
271
+ st.insert_simplex(simplex, new_filtration);
272
+ }
273
+ }
274
+
275
+ void to_std_linear_projection(intptr_t ptr, std::vector<double> linear_form) {
276
+ interface_std &st = get_simplextree_from_pointer<interface_std>(ptr);
277
+ Gudhi::multi_persistence::linear_projection(st, *this, linear_form);
278
+ }
279
+
280
+ void squeeze_filtration_inplace(const std::vector<std::vector<double>> &grid, const bool coordinate_values = true) {
281
+ std::size_t num_parameters = this->get_number_of_parameters();
282
+ if (grid.size() != num_parameters) {
283
+ throw std::invalid_argument("Grid and simplextree do not agree on number of parameters.");
284
+ }
285
+ for (const auto &simplex_handle : this->complex_simplex_range()) {
286
+ auto &simplex_filtration = this->filtration_mutable(simplex_handle);
287
+ const auto &coords = compute_coordinates_in_grid(simplex_filtration, grid);
288
+ if (coordinate_values)
289
+ simplex_filtration = coords.template as_type<value_type>();
290
+ else
291
+ simplex_filtration = evaluate_coordinates_in_grid(coords, grid).template as_type<value_type>();
292
+ }
293
+ }
294
+
295
+ void squeeze_filtration(const intptr_t outptr,
296
+ const std::vector<std::vector<double>> &grid) { // TODO : this is const but GUDHI
297
+ constexpr const bool verbose = false;
298
+ using int_fil_type = decltype(std::declval<Filtration>().template as_type<std::int32_t>());
299
+ using st_coord_type = Simplex_tree_multi_interface<int_fil_type, int32_t>;
300
+ st_coord_type &out = *(st_coord_type *)outptr; // TODO : maybe fix this.
301
+ std::vector<int> simplex_vertex;
302
+ for (const auto &simplex_handle : this->complex_simplex_range()) {
303
+ const auto &simplex_filtration = this->filtration(simplex_handle);
304
+ if constexpr (verbose) std::cout << "Filtration " << simplex_filtration << "\n";
305
+ const auto &coords = compute_coordinates_in_grid(simplex_filtration, grid);
306
+ if constexpr (verbose) std::cout << "Coords " << coords << "\n";
307
+ for (auto s : this->simplex_vertex_range(simplex_handle)) simplex_vertex.push_back(s);
308
+ out.insert_simplex(simplex_vertex, coords);
309
+ if constexpr (verbose) std::cout << "Coords in st" << out.filtration(out.find(simplex_vertex)) << std::endl;
310
+ simplex_vertex.clear();
311
+ }
312
+ }
313
+
314
+ std::vector<std::vector<std::vector<value_type>>> // dim, pts, param
315
+ get_filtration_values(const std::vector<int> &degrees) {
316
+ using multi_filtration_grid = std::vector<std::vector<value_type>>;
317
+ int num_parameters = this->get_number_of_parameters();
318
+ std::vector<multi_filtration_grid> out(degrees.size(), multi_filtration_grid(num_parameters));
319
+ std::vector<int> degree_index(this->dimension() + 1);
320
+ int count = 0;
321
+ for (auto degree : degrees) {
322
+ degree_index[degree] = count++;
323
+ out[degree_index[degree]].reserve(this->num_simplices());
324
+ }
325
+
326
+ for (const auto &simplex_handle : this->complex_simplex_range()) {
327
+ const auto &filtration = this->filtration(simplex_handle);
328
+ const auto degree = this->dimension(simplex_handle);
329
+ if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end()) continue;
330
+ // for (int parameter = 0; parameter < num_parameters; parameter++) {
331
+ // out[degree_index[degree]][parameter].push_back(filtration[parameter]);
332
+ // }
333
+ if constexpr (Filtration::is_multi_critical)
334
+ for (std::size_t i = 0; i < filtration.num_generators(); i++)
335
+ for (int parameter = 0; parameter < num_parameters; parameter++)
336
+ out[degree_index[degree]][parameter].push_back(filtration[i][parameter]);
337
+ else
338
+ for (int parameter = 0; parameter < num_parameters; parameter++)
339
+ out[degree_index[degree]][parameter].push_back(filtration[parameter]);
340
+ }
341
+ return out;
342
+ }
343
+
344
+ using boundary_type = std::vector<unsigned int>;
345
+ using boundary_matrix = std::vector<boundary_type>;
346
+
347
+ using scc_type = mma::scc_type<SimplexTreeOptions>;
348
+
349
+ scc_type inline simplextree_to_scc() { return Gudhi::multiparameter::mma::simplextree_to_scc(*this); }
350
+
351
+ using kscc_type = mma::kscc_type<SimplexTreeOptions>;
352
+
353
+ kscc_type inline kcritical_simplextree_to_scc() {
354
+ if constexpr (SimplexTreeOptions::Filtration_value::is_multi_critical)
355
+ return Gudhi::multiparameter::mma::kcritical_simplextree_to_scc(*this);
356
+ else
357
+ return {};
358
+ }
359
+
360
+ using function_scc_type = std::vector<std::pair<std::vector<std::vector<std::vector<value_type>>>, boundary_matrix>>;
361
+
362
+ function_scc_type inline function_simplextree_to_scc() {
363
+ return Gudhi::multiparameter::mma::function_simplextree_to_scc(*this);
364
+ }
365
+
366
+ using flattened_scc_type = std::pair<std::vector<std::vector<value_type>>, std::vector<std::vector<unsigned int>>>;
367
+
368
+ flattened_scc_type inline simplextree_to_ordered_bf() {
369
+ return Gudhi::multiparameter::mma::simplextree_to_ordered_bf(*this);
370
+ }
371
+
372
+ // Diff / grid stuff
373
+
374
+ using idx_map_type = std::vector<std::map<typename Filtration::value_type, int32_t>>;
375
+
376
+ inline idx_map_type build_idx_map(const std::vector<int> &simplices_dimensions) {
377
+ static_assert(!Filtration::is_multi_critical, "Multicritical not supported yet");
378
+ auto num_parameters = this->get_number_of_parameters();
379
+ if (static_cast<int>(simplices_dimensions.size()) < num_parameters) throw;
380
+ int max_dim = *std::max_element(simplices_dimensions.begin(), simplices_dimensions.end());
381
+ int min_dim = *std::min_element(simplices_dimensions.begin(), simplices_dimensions.end());
382
+ max_dim = min_dim >= 0 ? max_dim : this->dimension();
383
+
384
+ idx_map_type idx_map(num_parameters);
385
+ auto splx_idx = 0u;
386
+ for (auto sh : this->complex_simplex_range()) { // order has to be retrieved later, so I'm
387
+ // not sure that skeleton iterator is well
388
+ // suited
389
+ const auto &splx_filtration = this->filtration(sh);
390
+ const auto splx_dim = this->dimension(sh);
391
+ if (splx_dim <= max_dim)
392
+ for (auto i = 0u; i < splx_filtration.size(); i++) {
393
+ if (simplices_dimensions[i] != splx_dim && simplices_dimensions[i] != -1) continue;
394
+ auto f = splx_filtration[i];
395
+ idx_map[i].try_emplace(f, splx_idx);
396
+ }
397
+ splx_idx++;
398
+ }
399
+ return idx_map;
400
+ };
401
+
402
+ using pts_indices_type = std::vector<std::vector<int32_t>>;
403
+
404
+ static std::pair<pts_indices_type, pts_indices_type> inline get_pts_indices(
405
+ const idx_map_type &idx_map,
406
+ const std::vector<std::vector<typename Filtration::value_type>> &pts) {
407
+ static_assert(!Filtration::is_multi_critical, "Multicritical not supported yet");
408
+ std::size_t num_pts = pts.size();
409
+ std::size_t num_parameters = idx_map.size();
410
+ pts_indices_type out_indices(num_pts,
411
+ std::vector<int32_t>(num_parameters,
412
+ -1)); // -1 to be able from indicies to
413
+ // get if the pt is found or not
414
+ pts_indices_type out_unmapped_values;
415
+ for (auto pt_idx = 0u; pt_idx < num_pts; pt_idx++) {
416
+ auto &pt = pts[pt_idx];
417
+ auto &pt_indices = out_indices[pt_idx];
418
+
419
+ for (std::size_t parameter = 0u; parameter < num_parameters; parameter++) {
420
+ value_type f = pt[parameter];
421
+ const std::map<value_type, int32_t> &parameter_map = idx_map[parameter];
422
+ auto it = parameter_map.find(f);
423
+ if (it == parameter_map.end())
424
+ out_unmapped_values.push_back({static_cast<int32_t>(pt_idx), static_cast<int32_t>(parameter)});
425
+ else
426
+ pt_indices[parameter] = it->second;
427
+ }
428
+ }
429
+ return {out_indices, out_unmapped_values}; // TODO return a ptr for python
430
+ }
431
+
432
+ std::pair<pts_indices_type, pts_indices_type> inline pts_to_indices(
433
+ const std::vector<std::vector<typename Filtration::value_type>> &pts,
434
+ const std::vector<int> &simplices_dimensions) {
435
+ return get_pts_indices(this->build_idx_map(simplices_dimensions), pts);
436
+ }
437
+ };
438
+
439
+ template <typename Filtration>
440
+ using interface_multi = Simplex_tree_multi_interface<
441
+ Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>>;
442
+
443
+ // Wrappers of the functions in Simplex_tree_multi.h, to deal with the "pointer
444
+ // only" python interface
445
+ template <typename Filtration>
446
+ void inline flatten_diag_from_ptr(const uintptr_t splxptr,
447
+ const uintptr_t newsplxptr,
448
+ const std::vector<typename Filtration::value_type> basepoint,
449
+ int dimension) { // for python
450
+ auto &st = get_simplextree_from_pointer<interface_std>(newsplxptr);
451
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(splxptr);
452
+ flatten_diag(st, st_multi, basepoint, dimension);
453
+ }
454
+
455
+ template <typename Filtration>
456
+ void inline multify_from_ptr(uintptr_t splxptr,
457
+ uintptr_t newsplxptr,
458
+ const int dimension,
459
+ const Filtration &default_values) { // for python
460
+ auto &st = get_simplextree_from_pointer<interface_std>(splxptr);
461
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(newsplxptr);
462
+ Gudhi::multi_persistence::multify(st, st_multi, dimension, default_values);
463
+ }
464
+
465
+ template <typename Filtration>
466
+ void inline flatten_from_ptr(uintptr_t splxptr,
467
+ uintptr_t newsplxptr,
468
+ const int dimension = 0) { // for python
469
+ auto &st = get_simplextree_from_pointer<interface_std>(newsplxptr);
470
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(splxptr);
471
+ Gudhi::multi_persistence::flatten(st, st_multi, dimension);
472
+ }
473
+
474
+ template <typename Filtration, typename... Args>
475
+ void inline linear_projection_from_ptr(const uintptr_t ptr, const uintptr_t ptr_multi, Args... args) {
476
+ auto &st = get_simplextree_from_pointer<interface_std>(ptr);
477
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(ptr_multi);
478
+ Gudhi::multi_persistence::linear_projection(st, st_multi, args...);
479
+ }
480
+
481
+ template <typename Filtration = typename Gudhi::multi_filtration::One_critical_filtration<float>>
482
+ using options_multi = Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>;
483
+
484
+ template <typename Filtration, typename... Args>
485
+ void inline squeeze_filtration_from_ptr(uintptr_t splxptr, Args... args) {
486
+ Simplex_tree<options_multi<Filtration>> &st_multi = *(Gudhi::Simplex_tree<options_multi<Filtration>> *)(splxptr);
487
+ squeeze_filtration(st_multi, args...);
488
+ return;
489
+ }
490
+
491
+ template <typename Filtration, typename... Args>
492
+ inline std::vector<std::vector<std::vector<Filtration>>> get_filtration_values_from_ptr(uintptr_t splxptr,
493
+ Args... args) {
494
+ Simplex_tree<options_multi<Filtration>> &st_multi = *(Gudhi::Simplex_tree<options_multi<Filtration>> *)(splxptr);
495
+ return get_filtration_values(st_multi, args...);
496
+ }
497
+
498
+ // Final types
499
+ //
500
+ //
501
+
502
+ template <typename Filtration>
503
+ using Simplex_tree_multi_simplex_handle = typename Simplex_tree_multi_interface<Filtration>::Simplex_handle;
504
+
505
+ template <typename Filtration>
506
+ using Simplex_tree_multi_simplices_iterator =
507
+ typename Simplex_tree_multi_interface<Filtration>::Complex_simplex_iterator;
508
+ template <typename Filtration>
509
+ using Simplex_tree_multi_skeleton_iterator =
510
+ typename Simplex_tree_multi_interface<Filtration>::Skeleton_simplex_iterator;
511
+ template <typename Filtration>
512
+ using Simplex_tree_multi_boundary_iterator =
513
+ typename Simplex_tree_multi_interface<Filtration>::Boundary_simplex_iterator;
514
+ } // namespace python_interface
515
+ } // namespace multiparameter
516
+ } // namespace Gudhi