multipers 2.2.3__cp312-cp312-win_amd64.whl → 2.3.0__cp312-cp312-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/filtrations/filtrations.py +289 -0
  15. multipers/filtrations.pxd +224 -224
  16. multipers/function_rips.cp312-win_amd64.pyd +0 -0
  17. multipers/function_rips.pyx +105 -105
  18. multipers/grids.cp312-win_amd64.pyd +0 -0
  19. multipers/grids.pyx +350 -350
  20. multipers/gudhi/Persistence_slices_interface.h +132 -132
  21. multipers/gudhi/Simplex_tree_interface.h +239 -245
  22. multipers/gudhi/Simplex_tree_multi_interface.h +516 -561
  23. multipers/gudhi/cubical_to_boundary.h +59 -59
  24. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -450
  25. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -1070
  26. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -579
  27. multipers/gudhi/gudhi/Debug_utils.h +45 -45
  28. multipers/gudhi/gudhi/Fields/Multi_field.h +484 -484
  29. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -455
  30. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -450
  31. multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -531
  32. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -507
  33. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -531
  34. multipers/gudhi/gudhi/Fields/Z2_field.h +355 -355
  35. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -376
  36. multipers/gudhi/gudhi/Fields/Zp_field.h +420 -420
  37. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -400
  38. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -418
  39. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -337
  40. multipers/gudhi/gudhi/Matrix.h +2107 -2107
  41. multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -1038
  42. multipers/gudhi/gudhi/Multi_persistence/Box.h +171 -171
  43. multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -282
  44. multipers/gudhi/gudhi/Off_reader.h +173 -173
  45. multipers/gudhi/gudhi/One_critical_filtration.h +1432 -1431
  46. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -769
  47. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -686
  48. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -842
  49. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -1350
  50. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -1105
  51. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -859
  52. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -910
  53. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -139
  54. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -230
  55. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -211
  56. multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -60
  57. multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -60
  58. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -136
  59. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -190
  60. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -616
  61. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -150
  62. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -106
  63. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -219
  64. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -327
  65. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -1140
  66. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -934
  67. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -934
  68. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -980
  69. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -1092
  70. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -192
  71. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -921
  72. multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -1093
  73. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -1012
  74. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -1244
  75. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -186
  76. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -164
  77. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -156
  78. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -376
  79. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -540
  80. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -118
  81. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -173
  82. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -128
  83. multipers/gudhi/gudhi/Persistent_cohomology.h +745 -745
  84. multipers/gudhi/gudhi/Points_off_io.h +171 -171
  85. multipers/gudhi/gudhi/Simple_object_pool.h +69 -69
  86. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -463
  87. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -83
  88. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -106
  89. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -277
  90. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -62
  91. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -27
  92. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -62
  93. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -157
  94. multipers/gudhi/gudhi/Simplex_tree.h +2794 -2794
  95. multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -163
  96. multipers/gudhi/gudhi/distance_functions.h +62 -62
  97. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -104
  98. multipers/gudhi/gudhi/persistence_interval.h +253 -253
  99. multipers/gudhi/gudhi/persistence_matrix_options.h +170 -170
  100. multipers/gudhi/gudhi/reader_utils.h +367 -367
  101. multipers/gudhi/mma_interface_coh.h +256 -255
  102. multipers/gudhi/mma_interface_h0.h +223 -231
  103. multipers/gudhi/mma_interface_matrix.h +284 -282
  104. multipers/gudhi/naive_merge_tree.h +536 -575
  105. multipers/gudhi/scc_io.h +310 -289
  106. multipers/gudhi/truc.h +890 -888
  107. multipers/io.cp312-win_amd64.pyd +0 -0
  108. multipers/io.pyx +711 -711
  109. multipers/ml/accuracies.py +90 -90
  110. multipers/ml/convolutions.py +520 -520
  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.cp312-win_amd64.pyd +0 -0
  120. multipers/mma_structures.pxd +127 -127
  121. multipers/mma_structures.pyx +4 -4
  122. multipers/mma_structures.pyx.tp +1085 -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 +2296 -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.cp312-win_amd64.pyd +0 -0
  148. multipers/multiparameter_module_approximation.pyx +216 -217
  149. multipers/pickle.py +90 -53
  150. multipers/plots.py +342 -334
  151. multipers/point_measure.cp312-win_amd64.pyd +0 -0
  152. multipers/point_measure.pyx +322 -320
  153. multipers/simplex_tree_multi.cp312-win_amd64.pyd +0 -0
  154. multipers/simplex_tree_multi.pxd +133 -133
  155. multipers/simplex_tree_multi.pyx +18 -15
  156. multipers/simplex_tree_multi.pyx.tp +1939 -1935
  157. multipers/slicer.cp312-win_amd64.pyd +0 -0
  158. multipers/slicer.pxd +81 -20
  159. multipers/slicer.pxd.tp +215 -214
  160. multipers/slicer.pyx +1091 -308
  161. multipers/slicer.pyx.tp +924 -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.0.dist-info}/LICENSE +21 -21
  169. {multipers-2.2.3.dist-info → multipers-2.3.0.dist-info}/METADATA +21 -11
  170. multipers-2.3.0.dist-info/RECORD +182 -0
  171. multipers/tests/test_diff_helper.py +0 -73
  172. multipers/tests/test_hilbert_function.py +0 -82
  173. multipers/tests/test_mma.py +0 -83
  174. multipers/tests/test_point_clouds.py +0 -49
  175. multipers/tests/test_python-cpp_conversion.py +0 -82
  176. multipers/tests/test_signed_betti.py +0 -181
  177. multipers/tests/test_signed_measure.py +0 -89
  178. multipers/tests/test_simplextreemulti.py +0 -221
  179. multipers/tests/test_slicer.py +0 -221
  180. multipers-2.2.3.dist-info/RECORD +0 -189
  181. {multipers-2.2.3.dist-info → multipers-2.3.0.dist-info}/WHEEL +0 -0
  182. {multipers-2.2.3.dist-info → multipers-2.3.0.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(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