multipers 2.4.0b1__cp312-cp312-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. multipers/.dylibs/libboost_timer.dylib +0 -0
  2. multipers/.dylibs/libc++.1.0.dylib +0 -0
  3. multipers/.dylibs/libtbb.12.17.dylib +0 -0
  4. multipers/__init__.py +33 -0
  5. multipers/_signed_measure_meta.py +426 -0
  6. multipers/_slicer_meta.py +231 -0
  7. multipers/array_api/__init__.py +62 -0
  8. multipers/array_api/numpy.py +124 -0
  9. multipers/array_api/torch.py +133 -0
  10. multipers/data/MOL2.py +458 -0
  11. multipers/data/UCR.py +18 -0
  12. multipers/data/__init__.py +1 -0
  13. multipers/data/graphs.py +466 -0
  14. multipers/data/immuno_regions.py +27 -0
  15. multipers/data/minimal_presentation_to_st_bf.py +0 -0
  16. multipers/data/pytorch2simplextree.py +91 -0
  17. multipers/data/shape3d.py +101 -0
  18. multipers/data/synthetic.py +113 -0
  19. multipers/distances.py +202 -0
  20. multipers/filtration_conversions.pxd +736 -0
  21. multipers/filtration_conversions.pxd.tp +226 -0
  22. multipers/filtrations/__init__.py +21 -0
  23. multipers/filtrations/density.py +529 -0
  24. multipers/filtrations/filtrations.py +480 -0
  25. multipers/filtrations.pxd +534 -0
  26. multipers/filtrations.pxd.tp +332 -0
  27. multipers/function_rips.cpython-312-darwin.so +0 -0
  28. multipers/function_rips.pyx +104 -0
  29. multipers/grids.cpython-312-darwin.so +0 -0
  30. multipers/grids.pyx +538 -0
  31. multipers/gudhi/Persistence_slices_interface.h +213 -0
  32. multipers/gudhi/Simplex_tree_interface.h +274 -0
  33. multipers/gudhi/Simplex_tree_multi_interface.h +648 -0
  34. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
  35. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
  36. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
  37. multipers/gudhi/gudhi/Debug_utils.h +52 -0
  38. multipers/gudhi/gudhi/Degree_rips_bifiltration.h +2307 -0
  39. multipers/gudhi/gudhi/Dynamic_multi_parameter_filtration.h +2524 -0
  40. multipers/gudhi/gudhi/Fields/Multi_field.h +453 -0
  41. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +460 -0
  42. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +444 -0
  43. multipers/gudhi/gudhi/Fields/Multi_field_small.h +584 -0
  44. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +490 -0
  45. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +580 -0
  46. multipers/gudhi/gudhi/Fields/Z2_field.h +391 -0
  47. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +389 -0
  48. multipers/gudhi/gudhi/Fields/Zp_field.h +493 -0
  49. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +384 -0
  50. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +492 -0
  51. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
  52. multipers/gudhi/gudhi/Matrix.h +2200 -0
  53. multipers/gudhi/gudhi/Multi_filtration/Multi_parameter_generator.h +1712 -0
  54. multipers/gudhi/gudhi/Multi_filtration/multi_filtration_conversions.h +237 -0
  55. multipers/gudhi/gudhi/Multi_filtration/multi_filtration_utils.h +225 -0
  56. multipers/gudhi/gudhi/Multi_parameter_filtered_complex.h +485 -0
  57. multipers/gudhi/gudhi/Multi_parameter_filtration.h +2643 -0
  58. multipers/gudhi/gudhi/Multi_persistence/Box.h +233 -0
  59. multipers/gudhi/gudhi/Multi_persistence/Line.h +309 -0
  60. multipers/gudhi/gudhi/Multi_persistence/Multi_parameter_filtered_complex_pcoh_interface.h +268 -0
  61. multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_cohomology.h +159 -0
  62. multipers/gudhi/gudhi/Multi_persistence/Persistence_interface_matrix.h +463 -0
  63. multipers/gudhi/gudhi/Multi_persistence/Point.h +853 -0
  64. multipers/gudhi/gudhi/Off_reader.h +173 -0
  65. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +834 -0
  66. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +838 -0
  67. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +833 -0
  68. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1367 -0
  69. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1157 -0
  70. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +869 -0
  71. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +905 -0
  72. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +122 -0
  73. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +260 -0
  74. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +288 -0
  75. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +170 -0
  76. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +247 -0
  77. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +571 -0
  78. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +182 -0
  79. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +130 -0
  80. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +235 -0
  81. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +312 -0
  82. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1092 -0
  83. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +923 -0
  84. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +914 -0
  85. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +930 -0
  86. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1071 -0
  87. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +203 -0
  88. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +886 -0
  89. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +984 -0
  90. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1213 -0
  91. multipers/gudhi/gudhi/Persistence_matrix/index_mapper.h +58 -0
  92. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +227 -0
  93. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +200 -0
  94. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +166 -0
  95. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +319 -0
  96. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +562 -0
  97. multipers/gudhi/gudhi/Persistence_on_a_line.h +152 -0
  98. multipers/gudhi/gudhi/Persistence_on_rectangle.h +617 -0
  99. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
  100. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
  101. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
  102. multipers/gudhi/gudhi/Persistent_cohomology.h +769 -0
  103. multipers/gudhi/gudhi/Points_off_io.h +171 -0
  104. multipers/gudhi/gudhi/Projective_cover_kernel.h +379 -0
  105. multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
  106. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +559 -0
  107. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
  108. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +121 -0
  109. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
  110. multipers/gudhi/gudhi/Simplex_tree/filtration_value_utils.h +155 -0
  111. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
  112. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
  113. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +60 -0
  114. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +105 -0
  115. multipers/gudhi/gudhi/Simplex_tree.h +3170 -0
  116. multipers/gudhi/gudhi/Slicer.h +848 -0
  117. multipers/gudhi/gudhi/Thread_safe_slicer.h +393 -0
  118. multipers/gudhi/gudhi/distance_functions.h +62 -0
  119. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
  120. multipers/gudhi/gudhi/multi_simplex_tree_helpers.h +147 -0
  121. multipers/gudhi/gudhi/persistence_interval.h +263 -0
  122. multipers/gudhi/gudhi/persistence_matrix_options.h +188 -0
  123. multipers/gudhi/gudhi/reader_utils.h +367 -0
  124. multipers/gudhi/gudhi/simple_mdspan.h +484 -0
  125. multipers/gudhi/gudhi/slicer_helpers.h +779 -0
  126. multipers/gudhi/tmp_h0_pers/mma_interface_h0.h +223 -0
  127. multipers/gudhi/tmp_h0_pers/naive_merge_tree.h +536 -0
  128. multipers/io.cpython-312-darwin.so +0 -0
  129. multipers/io.pyx +472 -0
  130. multipers/ml/__init__.py +0 -0
  131. multipers/ml/accuracies.py +90 -0
  132. multipers/ml/invariants_with_persistable.py +79 -0
  133. multipers/ml/kernels.py +176 -0
  134. multipers/ml/mma.py +713 -0
  135. multipers/ml/one.py +472 -0
  136. multipers/ml/point_clouds.py +352 -0
  137. multipers/ml/signed_measures.py +1667 -0
  138. multipers/ml/sliced_wasserstein.py +461 -0
  139. multipers/ml/tools.py +113 -0
  140. multipers/mma_structures.cpython-312-darwin.so +0 -0
  141. multipers/mma_structures.pxd +134 -0
  142. multipers/mma_structures.pyx +1483 -0
  143. multipers/mma_structures.pyx.tp +1126 -0
  144. multipers/multi_parameter_rank_invariant/diff_helpers.h +85 -0
  145. multipers/multi_parameter_rank_invariant/euler_characteristic.h +95 -0
  146. multipers/multi_parameter_rank_invariant/function_rips.h +317 -0
  147. multipers/multi_parameter_rank_invariant/hilbert_function.h +761 -0
  148. multipers/multi_parameter_rank_invariant/persistence_slices.h +149 -0
  149. multipers/multi_parameter_rank_invariant/rank_invariant.h +350 -0
  150. multipers/multiparameter_edge_collapse.py +41 -0
  151. multipers/multiparameter_module_approximation/approximation.h +2541 -0
  152. multipers/multiparameter_module_approximation/debug.h +107 -0
  153. multipers/multiparameter_module_approximation/format_python-cpp.h +292 -0
  154. multipers/multiparameter_module_approximation/utilities.h +428 -0
  155. multipers/multiparameter_module_approximation.cpython-312-darwin.so +0 -0
  156. multipers/multiparameter_module_approximation.pyx +286 -0
  157. multipers/ops.cpython-312-darwin.so +0 -0
  158. multipers/ops.pyx +231 -0
  159. multipers/pickle.py +89 -0
  160. multipers/plots.py +550 -0
  161. multipers/point_measure.cpython-312-darwin.so +0 -0
  162. multipers/point_measure.pyx +409 -0
  163. multipers/simplex_tree_multi.cpython-312-darwin.so +0 -0
  164. multipers/simplex_tree_multi.pxd +136 -0
  165. multipers/simplex_tree_multi.pyx +11719 -0
  166. multipers/simplex_tree_multi.pyx.tp +2102 -0
  167. multipers/slicer.cpython-312-darwin.so +0 -0
  168. multipers/slicer.pxd +2097 -0
  169. multipers/slicer.pxd.tp +263 -0
  170. multipers/slicer.pyx +13042 -0
  171. multipers/slicer.pyx.tp +1259 -0
  172. multipers/tensor/tensor.h +672 -0
  173. multipers/tensor.pxd +13 -0
  174. multipers/test.pyx +44 -0
  175. multipers/tests/__init__.py +70 -0
  176. multipers/torch/__init__.py +1 -0
  177. multipers/torch/diff_grids.py +240 -0
  178. multipers/torch/rips_density.py +310 -0
  179. multipers/vector_interface.pxd +46 -0
  180. multipers-2.4.0b1.dist-info/METADATA +131 -0
  181. multipers-2.4.0b1.dist-info/RECORD +184 -0
  182. multipers-2.4.0b1.dist-info/WHEEL +6 -0
  183. multipers-2.4.0b1.dist-info/licenses/LICENSE +21 -0
  184. multipers-2.4.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,648 @@
1
+ /* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2
+ * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3
+ * Author(s): Vincent Rouvreau
4
+ *
5
+ * Copyright (C) 2016 Inria
6
+ *
7
+ * Modification(s):
8
+ * - 2022/11 David Loiseaux, Hannah Schreiber : adapt for multipers.
9
+ * - YYYY/MM Author: Description of the modification
10
+ */
11
+
12
+ #pragma once
13
+
14
+ #include <algorithm>
15
+ #include <cstddef>
16
+ #include <cstdint>
17
+ #include <iostream>
18
+ #include <ranges>
19
+ #include <stdexcept>
20
+ #include <type_traits>
21
+ #include <utility> // std::pair
22
+ #include <vector>
23
+ #include <limits> // has_quiet_NaN
24
+
25
+ #include "Simplex_tree_interface.h"
26
+ #include "Persistence_slices_interface.h"
27
+ #include "gudhi/Multi_filtration/multi_filtration_utils.h"
28
+ #include "gudhi/multi_simplex_tree_helpers.h"
29
+ #include "../multiparameter_module_approximation/format_python-cpp.h"
30
+
31
+ namespace Gudhi {
32
+ namespace multiparameter {
33
+ namespace python_interface {
34
+
35
+ // Moved here as it was said unecessary for the gudhi version. TODO: either remove it from multipers if really not
36
+ // necessary, or find a better place for it.
37
+ /**
38
+ * \brief Applies a linear form (given by a scalar product, via Riesz
39
+ * representation) to the filtration values of the multiparameter simplextree to
40
+ * get a 1 parameter simplextree. \ingroup multiparameter \tparam
41
+ * simplextree_std A non-multi simplextree \tparam simplextree_multi A multi
42
+ * simplextree \param st Simplextree, with the same simplicial complex as
43
+ * st_multi, whose filtration has to be filled. \param st_multi Multiparameter
44
+ * simplextree to convert into a 1 parameter simplex tree. \param linear_form
45
+ * the linear form to apply.
46
+ * */
47
+ template <class simplextree_std, class simplextree_multi>
48
+ void linear_projection(simplextree_std &st, simplextree_multi &st_multi, const std::vector<double> &linear_form) {
49
+ static_assert(
50
+ std::is_arithmetic_v<typename simplextree_std::Filtration_value> &&
51
+ Gudhi::multi_filtration::RangeTraits<typename simplextree_multi::Filtration_value>::is_multi_filtration,
52
+ "Can only convert multiparameter to non-multiparameter simplextree.");
53
+ auto sh = st.complex_simplex_range().begin();
54
+ auto sh_multi = st_multi.complex_simplex_range().begin();
55
+ auto end = st.complex_simplex_range().end();
56
+ typename simplextree_multi::Options::Filtration_value multi_filtration;
57
+ for (; sh != end; ++sh, ++sh_multi) {
58
+ multi_filtration = st_multi.filtration(*sh_multi);
59
+ auto projected_filtration = compute_linear_projection(multi_filtration, linear_form);
60
+ st.assign_filtration(*sh, projected_filtration);
61
+ }
62
+ }
63
+
64
+ using interface_std = Simplex_tree<Simplex_tree_options_for_python>; // Interface not necessary
65
+ // (smaller so should do less
66
+ // segfaults)
67
+
68
+ template <class Simplextree_interface>
69
+ Simplextree_interface &get_simplextree_from_pointer(const uintptr_t splxptr) { // DANGER
70
+ Simplextree_interface &st = *(Simplextree_interface *)(splxptr);
71
+ return st;
72
+ }
73
+
74
+ template <typename Filtration,
75
+ typename value_type = typename Filtration::value_type/* ,
76
+ class = std::enable_if_t<Gudhi::multi_filtration::RangeTraits<Filtration>::is_multi_filtration> */>
77
+ class Simplex_tree_multi_interface
78
+ : public Simplex_tree_interface<
79
+ Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>> {
80
+ public:
81
+ using SimplexTreeOptions = Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>;
82
+ // using Python_filtration_type = std::vector<typename SimplexTreeOptions::Filtration_value::value_type>; // TODO :
83
+ // // std::conditional
84
+ using Base = Simplex_tree_interface<SimplexTreeOptions>;
85
+ using Base_tree = Simplex_tree<SimplexTreeOptions>;
86
+ using Filtration_value = Filtration;
87
+ using Vertex_handle = typename Base::Vertex_handle;
88
+ using Simplex_handle = typename Base::Simplex_handle;
89
+ using Insertion_result = typename std::pair<Simplex_handle, bool>;
90
+ using Simplex = std::vector<Vertex_handle>;
91
+ using Simplex_and_filtration = std::pair<Simplex, Filtration_value *>;
92
+ using Filtered_simplices = std::vector<Simplex_and_filtration>;
93
+ using Skeleton_simplex_iterator = typename Base::Skeleton_simplex_iterator;
94
+ using Complex_simplex_iterator = typename Base::Complex_simplex_iterator;
95
+ using Extended_filtration_data = typename Base::Extended_filtration_data;
96
+ using Boundary_simplex_iterator = typename Base::Boundary_simplex_iterator;
97
+ using blocker_func_t = bool (*)(Simplex, void *);
98
+ using euler_chars_type = std::vector<int>;
99
+
100
+ static_assert(std::is_same_v<typename Base::Filtration_value, Filtration_value>,
101
+ "value_type has to be the same as Filtration::value_type. This is only a hack for python");
102
+ Extended_filtration_data efd;
103
+
104
+ Simplex_tree_multi_interface() = default;
105
+ Simplex_tree_multi_interface(const Base& st) : Base(st) {};
106
+ Simplex_tree_multi_interface(const Base_tree& st) : Base(st) {};
107
+ Simplex_tree_multi_interface(Base&& st) : Base(std::move(st)) {};
108
+ Simplex_tree_multi_interface(Base_tree&& st) : Base(std::move(st)) {};
109
+ Simplex_tree_multi_interface& operator=(const Base& st){
110
+ Base::operator=(st);
111
+ return *this;
112
+ }
113
+ Simplex_tree_multi_interface& operator=(const Base_tree& st){
114
+ Base::operator=(st);
115
+ return *this;
116
+ }
117
+ Simplex_tree_multi_interface& operator=(Base&& st){
118
+ Base::operator=(std::move(st));
119
+ return *this;
120
+ }
121
+ Simplex_tree_multi_interface& operator=(Base_tree&& st){
122
+ Base::operator=(std::move(st));
123
+ return *this;
124
+ }
125
+
126
+ bool find_simplex(const Simplex &simplex) { return (Base::find(simplex) != Base::null_simplex()); }
127
+
128
+ int simplex_dimension(const Simplex &simplex) {
129
+ auto sh = Base_tree::find(simplex);
130
+ if (sh == Base_tree::null_simplex()) return -1;
131
+ return Base_tree::dimension(sh);
132
+ }
133
+
134
+ void assign_simplex_filtration(const Simplex &simplex, const Filtration_value &filtration) {
135
+ Base::assign_filtration(Base::find(simplex), filtration);
136
+ Base::clear_filtration();
137
+ }
138
+
139
+ bool insert(const Simplex &simplex, const Filtration_value &filtration) {
140
+ Insertion_result result = Base_tree::insert_simplex_and_subfaces(simplex, filtration, Base::Insertion_strategy::HIGHEST);
141
+ if (result.first != Base::null_simplex()) Base::clear_filtration();
142
+ return (result.second);
143
+ }
144
+
145
+ bool insert_force(const Simplex &simplex, const Filtration_value &filtration) {
146
+ Insertion_result result = Base_tree::insert_simplex_and_subfaces(simplex, filtration, Base::Insertion_strategy::FORCE);
147
+ Base::clear_filtration();
148
+ return (result.second);
149
+ }
150
+
151
+ // Do not interface this function, only used in alpha complex interface for
152
+ // complex creation
153
+ bool insert_simplex(const Simplex &simplex, const Filtration_value &filtration) {
154
+ Insertion_result result = Base_tree::insert_simplex(simplex, filtration);
155
+ return (result.second);
156
+ }
157
+
158
+ // bool insert_simplex(const Simplex &simplex, const Python_filtration_type &filtration) {
159
+ // Filtration_value &filtration_ = *(Filtration_value *)(&filtration); // Jardinage for no copy.
160
+ // Insertion_result result = Base::insert_simplex(simplex, filtration);
161
+ // return (result.second);
162
+ // }
163
+
164
+ // Do not interface this function, only used in interface for complex creation
165
+ bool insert_simplex_and_subfaces(const Simplex &simplex, const Filtration_value &filtration) {
166
+ Insertion_result result = Base_tree::insert_simplex_and_subfaces(simplex, filtration, Base::Insertion_strategy::HIGHEST);
167
+ return (result.second);
168
+ }
169
+
170
+ // bool insert_simplex_and_subfaces(const Simplex &simplex, const Python_filtration_type &filtration) {
171
+ // Filtration_value &filtration_ = *(Filtration_value *)(&filtration); // Jardinage for no copy.
172
+ // Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration, Base::Insertion_strategy::HIGHEST);
173
+ // return (result.second);
174
+ // }
175
+
176
+ // Do not interface this function, only used in strong witness interface for
177
+ // complex creation
178
+ bool insert_simplex(const std::vector<std::size_t> &simplex, const Filtration_value &filtration) {
179
+ Insertion_result result = Base_tree::insert_simplex(simplex, filtration);
180
+ return (result.second);
181
+ }
182
+
183
+ // Do not interface this function, only used in strong witness interface for
184
+ // complex creation
185
+ bool insert_simplex_and_subfaces(const std::vector<std::size_t> &simplex, const Filtration_value &filtration) {
186
+ Insertion_result result = Base_tree::insert_simplex_and_subfaces(simplex, filtration, Base::Insertion_strategy::HIGHEST);
187
+ return (result.second);
188
+ }
189
+
190
+ typename SimplexTreeOptions::Filtration_value *simplex_filtration(const Simplex &simplex) {
191
+ auto &filtration = Base::get_filtration_value(Base::find(simplex));
192
+ return &filtration; // We return the pointer to get a numpy view afterward
193
+ }
194
+
195
+ Simplex_and_filtration get_simplex_and_filtration(Simplex_handle f_simplex) {
196
+ // Simplex simplex;
197
+ // for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
198
+ // // simplex.insert(simplex.begin(), vertex); // why not push back ?
199
+ // }
200
+ auto it = Base::simplex_vertex_range(f_simplex);
201
+ Simplex simplex(it.begin(), it.end());
202
+ std::reverse(simplex.begin(), simplex.end());
203
+ return std::make_pair(std::move(simplex), &Base::get_filtration_value(f_simplex));
204
+ }
205
+
206
+ Filtered_simplices get_star(const Simplex &simplex) {
207
+ Filtered_simplices star;
208
+ for (auto f_simplex : Base::star_simplex_range(Base::find(simplex))) {
209
+ Simplex simplex_star;
210
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
211
+ simplex_star.insert(simplex_star.begin(), vertex);
212
+ }
213
+ star.push_back(std::make_pair(simplex_star, &Base::get_filtration_value(f_simplex)));
214
+ }
215
+ return star;
216
+ }
217
+
218
+ Filtered_simplices get_cofaces(const Simplex &simplex, int dimension) {
219
+ Filtered_simplices cofaces;
220
+ for (auto f_simplex : Base::cofaces_simplex_range(Base::find(simplex), dimension)) {
221
+ Simplex simplex_coface;
222
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
223
+ simplex_coface.insert(simplex_coface.begin(), vertex);
224
+ }
225
+ cofaces.push_back(std::make_pair(simplex_coface, &Base::get_filtration_value(f_simplex)));
226
+ }
227
+ return cofaces;
228
+ }
229
+
230
+ void compute_extended_filtration() { throw std::logic_error("Incompatible with multipers"); }
231
+
232
+ Simplex_tree_multi_interface *collapse_edges([[maybe_unused]] int nb_collapse_iteration) {
233
+ throw std::logic_error("Incompatible with multipers");
234
+ }
235
+
236
+ // ######################## MULTIPERS STUFF
237
+ void set_keys_to_enumerate() {
238
+ int count = 0;
239
+ for (auto sh : Base::filtration_simplex_range()) Base::assign_key(sh, count++);
240
+ }
241
+
242
+ int get_key(const Simplex &simplex) { return Base::key(Base::find(simplex)); }
243
+
244
+ void set_key(const Simplex &simplex, int key) {
245
+ Base::assign_key(Base::find(simplex), key);
246
+ }
247
+
248
+ // Fills a parameter with a lower-star filtration
249
+ void fill_lowerstar(const std::vector<typename Filtration_value::value_type> &filtration, int axis) {
250
+ /* constexpr value_type minus_inf =
251
+ * -1*std::numeric_limits<value_type>::infinity(); */
252
+ std::vector<value_type> filtration_values_of_vertex;
253
+ for (auto &SimplexHandle : Base::complex_simplex_range()) {
254
+ auto &current_birth = Base::get_filtration_value(SimplexHandle);
255
+ /* value_type to_assign = minus_inf; */
256
+ filtration_values_of_vertex.clear();
257
+ for (auto vertex : Base::simplex_vertex_range(SimplexHandle)) {
258
+ if constexpr (std::numeric_limits<typename Filtration_value::value_type>::has_quiet_NaN)
259
+ /* to_assign = std::max(filtration[vertex], to_assign); */
260
+ if (std::isnan(filtration[vertex]))
261
+ std::cerr << "Invalid filtration for vertex " << vertex << " !!" << std::endl;
262
+ filtration_values_of_vertex.push_back(filtration[vertex]);
263
+ }
264
+ value_type to_assign = *std::max_element(filtration_values_of_vertex.begin(), filtration_values_of_vertex.end());
265
+ /* if (to_assign >10 || to_assign < -10 ) */
266
+ /* std::cout <<"to_assign : "<< to_assign << std::endl; */
267
+ current_birth(0, axis) = to_assign;
268
+ // Base::assign_filtration(SimplexHandle, current_birth);
269
+ }
270
+ }
271
+
272
+ // // Fills a parameter with a lower-star filtration
273
+ // void fill_lowerstar(const Filtration_value &filtration, int axis) {
274
+ // /* constexpr value_type minus_inf =
275
+ // * -1*std::numeric_limits<value_type>::infinity(); */
276
+ // std::vector<value_type> filtration_values_of_vertex;
277
+ // for (auto &SimplexHandle : Base::complex_simplex_range()) {
278
+ // auto &current_birth = Base::get_filtration_value(SimplexHandle);
279
+ // /* value_type to_assign = minus_inf; */
280
+ // filtration_values_of_vertex.clear();
281
+ // for (auto vertex : Base::simplex_vertex_range(SimplexHandle)) {
282
+ // if constexpr (std::numeric_limits<typename Filtration_value::value_type>::has_quiet_NaN)
283
+ // /* to_assign = std::max(filtration[vertex], to_assign); */
284
+ // if (std::isnan(filtration(0,vertex)))
285
+ // std::cerr << "Invalid filtration for vertex " << vertex << " !!" << std::endl;
286
+ // filtration_values_of_vertex.push_back(filtration(0,vertex));
287
+ // }
288
+ // value_type to_assign = *std::max_element(filtration_values_of_vertex.begin(), filtration_values_of_vertex.end());
289
+ // /* if (to_assign >10 || to_assign < -10 ) */
290
+ // /* std::cout <<"to_assign : "<< to_assign << std::endl; */
291
+ // current_birth(0, axis) = to_assign;
292
+ // // Base::assign_filtration(SimplexHandle, current_birth);
293
+ // }
294
+ // }
295
+
296
+ using simplices_list = std::vector<int>;
297
+
298
+ simplices_list get_simplices_of_dimension(int dimension) {
299
+ simplices_list simplex_list;
300
+ simplex_list.reserve(Base::num_simplices() * (dimension + 1));
301
+ for (auto simplexhandle : Base::skeleton_simplex_range(dimension)) {
302
+ if (Base::dimension(simplexhandle) == dimension) {
303
+ // std::vector<int> simplex;
304
+ // simplex.reserve(dimension + 1);
305
+ // for (int vertex : Base::simplex_vertex_range(simplexhandle)) simplex.push_back(vertex);
306
+ // simplex_list.push_back(simplex);
307
+ for (int vertex : Base::simplex_vertex_range(simplexhandle)) simplex_list.push_back(vertex);
308
+ }
309
+ }
310
+ /* simplex_list.shrink_to_fit();*/
311
+ return simplex_list;
312
+ }
313
+
314
+ using edge_list = std::vector<std::pair<std::pair<int, int>, std::pair<double, double>>>;
315
+
316
+ edge_list get_edge_list() {
317
+ edge_list simplex_list;
318
+ simplex_list.reserve(Base::num_simplices());
319
+ for (auto &simplexHandle : Base::skeleton_simplex_range(1)) {
320
+ if (Base::dimension(simplexHandle) == 1) {
321
+ std::pair<int, int> simplex;
322
+ auto it = Base::simplex_vertex_range(simplexHandle).begin();
323
+ simplex = {*it, *(++it)};
324
+ const auto &f = Base::filtration(simplexHandle);
325
+ simplex_list.push_back({simplex, {static_cast<double>(f(0, 0)), static_cast<double>(f(0, 1))}});
326
+ }
327
+ }
328
+ return simplex_list;
329
+ }
330
+
331
+ void resize_all_filtrations(int num) {
332
+ if (num < 0) return;
333
+ for (const auto &SimplexHandle : Base::complex_simplex_range()) {
334
+ auto& f = Base::get_filtration_value(SimplexHandle);
335
+ if (f.num_parameters() == static_cast<unsigned int>(num)) {
336
+ if constexpr (Gudhi::multi_filtration::RangeTraits<Filtration_value>::is_dynamic_multi_filtration) {
337
+ for (unsigned int g = 0; g < f.num_generators(); ++g) f.force_generator_size_to_number_of_parameters(g);
338
+ }
339
+ } else {
340
+ std::vector<typename Filtration_value::value_type> values(num * f.num_generators());
341
+ unsigned int i = 0;
342
+ for (unsigned int g = 0; g < f.num_generators(); ++g){
343
+ for (unsigned int p = 0; p < static_cast<unsigned int>(num); ++p){
344
+ if (p < f.num_parameters()) values[i] = f(g, p);
345
+ ++i;
346
+ }
347
+ }
348
+ f = Filtration_value(values.begin(), values.end(), num);
349
+ }
350
+ }
351
+ }
352
+
353
+ void from_std(char *buffer_start, std::size_t buffer_size, int dimension, const Filtration_value &default_values) {
354
+ interface_std st;
355
+ st.deserialize(buffer_start, buffer_size);
356
+ *this = Gudhi::multi_persistence::make_multi_dimensional<SimplexTreeOptions>(st, default_values, dimension);
357
+ }
358
+
359
+ template <typename Line_like>
360
+ void to_std(intptr_t ptr, const Line_like &line, int dimension) {
361
+ auto &st = get_simplextree_from_pointer<interface_std>(ptr);
362
+
363
+ for (const auto &simplex_handle : this->complex_simplex_range()) {
364
+ std::vector<int> simplex;
365
+ for (auto vertex : this->simplex_vertex_range(simplex_handle)) simplex.push_back(vertex);
366
+
367
+ // Filtration as double
368
+ const auto &f = this->filtration(simplex_handle).template as_type<typename interface_std::Filtration_value>();
369
+
370
+ typename interface_std::Filtration_value new_filtration = line[line.compute_forward_intersection(f)][dimension];
371
+ st.insert_simplex(simplex, new_filtration);
372
+ }
373
+ }
374
+
375
+ void to_std_linear_projection(intptr_t ptr, std::vector<double> linear_form) {
376
+ auto &st = get_simplextree_from_pointer<interface_std>(ptr);
377
+ linear_projection(st, *this, linear_form);
378
+ }
379
+
380
+ void squeeze_filtration_inplace(const std::vector<std::vector<double>> &grid, const bool coordinate_values = true) {
381
+ std::size_t num_parameters = Base::num_parameters();
382
+ if (grid.size() != num_parameters) {
383
+ throw std::invalid_argument("Grid and simplextree do not agree on number of parameters.");
384
+ }
385
+ for (const auto &simplex_handle : Base::complex_simplex_range()) {
386
+ auto &simplex_filtration = Base::get_filtration_value(simplex_handle);
387
+ const auto &coords = compute_coordinates_in_grid(simplex_filtration, grid);
388
+ if (coordinate_values)
389
+ simplex_filtration = coords.template as_type<value_type>();
390
+ else
391
+ simplex_filtration = evaluate_coordinates_in_grid(coords, grid).template as_type<value_type>();
392
+ }
393
+ }
394
+
395
+ void unsqueeze_filtration(const intptr_t grid_st_ptr,
396
+ const std::vector<std::vector<double>> &grid) { // TODO : this is const but GUDHI
397
+ constexpr const bool verbose = false;
398
+ using int_fil_type = decltype(std::declval<Filtration_value>().template as_type<std::int32_t>());
399
+ using st_coord_type = Simplex_tree_multi_interface<int_fil_type, int32_t>;
400
+ st_coord_type &grid_st = *(st_coord_type *)grid_st_ptr; // TODO : maybe fix this.
401
+ std::vector<int> simplex_vertex;
402
+ int num_parameters = grid_st.num_parameters();
403
+ for (auto &simplex_handle : grid_st.complex_simplex_range()) {
404
+ const auto &simplex_filtration = grid_st.filtration(simplex_handle);
405
+ // if you can be sure that the used filtration values will always be 1-critical whatever the use,
406
+ // a static_assert/constexpr with condition Filtration_value::ensures_1_criticality() can be used instead.
407
+ if (simplex_filtration.num_generators() > 1) throw std::invalid_argument("Multicritical not supported yet");
408
+ if constexpr (verbose) std::cout << "Filtration_value " << simplex_filtration << "\n";
409
+ Filtration_value splx_filtration(simplex_filtration.num_parameters(), 1.);
410
+ if (simplex_filtration.is_finite()) {
411
+ for (auto i : std::views::iota(num_parameters)) splx_filtration(0,i) = grid[i][simplex_filtration(0,i)];
412
+ } else if (simplex_filtration.is_plus_inf()) {
413
+ splx_filtration = Filtration_value::inf(num_parameters);
414
+ } else if (simplex_filtration.is_minus_inf()) {
415
+ splx_filtration = Filtration_value::minus_inf(num_parameters);
416
+ } else if (simplex_filtration.is_nan()) {
417
+ splx_filtration = Filtration_value::nan(num_parameters);
418
+ }
419
+ if constexpr (verbose) std::cout << "Filtration_value " << splx_filtration << "\n";
420
+ for (const auto s : grid_st.simplex_vertex_range(simplex_handle)) simplex_vertex.push_back(s);
421
+ insert_simplex(simplex_vertex, splx_filtration);
422
+ if constexpr (verbose) std::cout << "Coords in st" << Base::filtration(Base::find(simplex_vertex)) << std::endl;
423
+ simplex_vertex.clear();
424
+ }
425
+ }
426
+
427
+ void squeeze_filtration(const intptr_t outptr,
428
+ const std::vector<std::vector<double>> &grid) { // TODO : this is const but GUDHI
429
+ constexpr const bool verbose = false;
430
+ using int_fil_type = decltype(std::declval<Filtration_value>().template as_type<std::int32_t>());
431
+ using st_coord_type = Simplex_tree_multi_interface<int_fil_type, int32_t>;
432
+ st_coord_type &out = *(st_coord_type *)outptr; // TODO : maybe fix this.
433
+ std::vector<int> simplex_vertex;
434
+ for (const auto &simplex_handle : Base::complex_simplex_range()) {
435
+ // tbb::enumerable_thread_specific<std::vector<int>> simplex_vertex_cache;
436
+ // tbb::parallel_for_each(Base::complex_simplex_range(), [&](const auto& simplex_handle){
437
+ // auto& simplex_vertex = simplex_vertex_cache.local();
438
+ // simplex_vertex.clear();
439
+ const auto &simplex_filtration = Base::filtration(simplex_handle);
440
+ if constexpr (verbose) std::cout << "Filtration_value " << simplex_filtration << "\n";
441
+ const auto &coords = compute_coordinates_in_grid(simplex_filtration, grid);
442
+ if constexpr (verbose) std::cout << "Coords " << coords << "\n";
443
+ for (auto s : Base::simplex_vertex_range(simplex_handle)) simplex_vertex.push_back(s);
444
+ out.insert_simplex(simplex_vertex, coords);
445
+ if constexpr (verbose) std::cout << "Coords in st" << out.filtration(out.find(simplex_vertex)) << std::endl;
446
+ simplex_vertex.clear();
447
+ // });
448
+ }
449
+ }
450
+
451
+ std::vector<std::vector<std::vector<value_type>>> // dim, pts, param
452
+ get_filtration_values(const std::vector<int> &degrees) {
453
+ using multi_filtration_grid = std::vector<std::vector<value_type>>;
454
+ int num_parameters = Base::num_parameters();
455
+ std::vector<multi_filtration_grid> out(degrees.size(), multi_filtration_grid(num_parameters));
456
+ std::vector<int> degree_index(Base::dimension() + 1);
457
+ int count = 0;
458
+ for (auto degree : degrees) {
459
+ degree_index[degree] = count++;
460
+ out[degree_index[degree]].reserve(Base::num_simplices());
461
+ }
462
+
463
+ for (const auto &simplex_handle : Base::complex_simplex_range()) {
464
+ const auto &filtration = Base::filtration(simplex_handle);
465
+ const auto degree = Base::dimension(simplex_handle);
466
+ if (std::find(degrees.begin(), degrees.end(), degree) == degrees.end()) continue;
467
+ // for (int parameter = 0; parameter < num_parameters; parameter++) {
468
+ // out[degree_index[degree]][parameter].push_back(filtration[parameter]);
469
+ // }
470
+ for (std::size_t i = 0; i < filtration.num_generators(); i++)
471
+ for (int parameter = 0; parameter < num_parameters; parameter++)
472
+ out[degree_index[degree]][parameter].push_back(filtration(i, parameter));
473
+ }
474
+ return out;
475
+ }
476
+
477
+ using boundary_type = std::vector<unsigned int>;
478
+ using boundary_matrix = std::vector<boundary_type>;
479
+
480
+ using scc_type = mma::scc_type<SimplexTreeOptions>;
481
+
482
+ scc_type simplextree_to_scc() { return Gudhi::multiparameter::mma::simplextree_to_scc(*this); }
483
+
484
+ using kscc_type = mma::kscc_type<SimplexTreeOptions>;
485
+
486
+ kscc_type kcritical_simplextree_to_scc() {
487
+ return Gudhi::multiparameter::mma::kcritical_simplextree_to_scc(*this);
488
+ }
489
+
490
+ using function_scc_type = std::vector<std::pair<std::vector<std::vector<std::vector<value_type>>>, boundary_matrix>>;
491
+
492
+ function_scc_type function_simplextree_to_scc() {
493
+ return Gudhi::multiparameter::mma::function_simplextree_to_scc(*this);
494
+ }
495
+
496
+ using flattened_scc_type = std::pair<std::vector<std::vector<value_type>>, std::vector<std::vector<unsigned int>>>;
497
+
498
+ flattened_scc_type simplextree_to_ordered_bf() {
499
+ return Gudhi::multiparameter::mma::simplextree_to_ordered_bf<SimplexTreeOptions>(*this);
500
+ }
501
+
502
+ // Diff / grid stuff
503
+
504
+ using idx_map_type = std::vector<std::map<typename Filtration_value::value_type, int32_t>>;
505
+
506
+ idx_map_type build_idx_map(const std::vector<int> &simplices_dimensions) {
507
+ // static_assert(!Filtration_value::is_multi_critical, "Multicritical not supported yet");
508
+ auto num_parameters = Base::num_parameters();
509
+ if (static_cast<int>(simplices_dimensions.size()) < num_parameters) throw;
510
+ int max_dim = *std::ranges::max_element(simplices_dimensions.begin(), simplices_dimensions.end());
511
+ int min_dim = *std::ranges::min_element(simplices_dimensions.begin(), simplices_dimensions.end());
512
+ max_dim = min_dim >= 0 ? max_dim : Base::dimension();
513
+
514
+ idx_map_type idx_map(num_parameters);
515
+ auto splx_idx = 0u;
516
+ for (auto sh : Base::complex_simplex_range()) { // order has to be retrieved later, so I'm
517
+ // not sure that skeleton iterator is well
518
+ // suited
519
+ const auto &splx_filtration = Base::filtration(sh);
520
+ // if you can be sure that the used filtration values will always be 1-critical whatever the use,
521
+ // a static_assert with condition Filtration_value::ensures_1_criticality() can be used instead.
522
+ if (splx_filtration.num_generators() > 1) throw std::invalid_argument("Multicritical not supported yet");
523
+ const auto splx_dim = Base::dimension(sh);
524
+ if (splx_dim <= max_dim)
525
+ for (auto i = 0u; i < splx_filtration.num_parameters(); i++) {
526
+ if (simplices_dimensions[i] != splx_dim && simplices_dimensions[i] != -1) continue;
527
+ auto f = splx_filtration(0, i);
528
+ idx_map[i].try_emplace(f, splx_idx);
529
+ }
530
+ splx_idx++;
531
+ }
532
+ return idx_map;
533
+ };
534
+
535
+ using pts_indices_type = std::vector<std::vector<int32_t>>;
536
+
537
+ static std::pair<pts_indices_type, pts_indices_type> get_pts_indices(
538
+ const idx_map_type &idx_map,
539
+ const std::vector<std::vector<typename Filtration_value::value_type>> &pts) {
540
+ // static_assert(!Filtration_value::is_multi_critical, "Multicritical not supported yet");
541
+ std::size_t num_pts = pts.size();
542
+ std::size_t num_parameters = idx_map.size();
543
+ pts_indices_type out_indices(num_pts,
544
+ std::vector<int32_t>(num_parameters,
545
+ -1)); // -1 to be able from indicies to
546
+ // get if the pt is found or not
547
+ pts_indices_type out_unmapped_values;
548
+ for (auto pt_idx = 0u; pt_idx < num_pts; pt_idx++) {
549
+ auto &pt = pts[pt_idx];
550
+ auto &pt_indices = out_indices[pt_idx];
551
+
552
+ for (std::size_t parameter = 0u; parameter < num_parameters; parameter++) {
553
+ value_type f = pt[parameter];
554
+ const std::map<value_type, int32_t> &parameter_map = idx_map[parameter];
555
+ auto it = parameter_map.find(f);
556
+ if (it == parameter_map.end())
557
+ out_unmapped_values.push_back({static_cast<int32_t>(pt_idx), static_cast<int32_t>(parameter)});
558
+ else
559
+ pt_indices[parameter] = it->second;
560
+ }
561
+ }
562
+ return {out_indices, out_unmapped_values}; // TODO return a ptr for python
563
+ }
564
+
565
+ std::pair<pts_indices_type, pts_indices_type> pts_to_indices(
566
+ const std::vector<std::vector<typename Filtration_value::value_type>> &pts,
567
+ const std::vector<int> &simplices_dimensions) {
568
+ return get_pts_indices(this->build_idx_map(simplices_dimensions), pts);
569
+ }
570
+ };
571
+
572
+ template <typename Filtration>
573
+ using interface_multi = Simplex_tree_multi_interface<
574
+ Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>>;
575
+
576
+ // Wrappers of the functions in Simplex_tree_multi.h, to deal with the "pointer
577
+ // only" python interface
578
+ template <typename Filtration>
579
+ void inline flatten_diag_from_ptr(const uintptr_t splxptr,
580
+ const uintptr_t new_splxptr,
581
+ const std::vector<typename Filtration::value_type> basepoint,
582
+ int dimension) { // for python
583
+ auto &st = get_simplextree_from_pointer<interface_std>(new_splxptr);
584
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(splxptr);
585
+ flatten_diag(st, st_multi, basepoint, dimension);
586
+ }
587
+
588
+ template <typename Filtration>
589
+ void inline multify_from_ptr(uintptr_t splxptr,
590
+ uintptr_t new_splxptr,
591
+ const int dimension,
592
+ const Filtration &default_values) { // for python
593
+ auto &st = get_simplextree_from_pointer<interface_std>(splxptr);
594
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(new_splxptr);
595
+ st_multi = Gudhi::multi_persistence::make_multi_dimensional<typename interface_multi<Filtration>::SimplexTreeOptions>(st, default_values, dimension);
596
+ }
597
+
598
+ template <typename Filtration>
599
+ void inline flatten_from_ptr(uintptr_t splxptr,
600
+ uintptr_t new_splxptr,
601
+ const int dimension = 0) { // for python
602
+ auto &st = get_simplextree_from_pointer<interface_std>(new_splxptr);
603
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(splxptr);
604
+ st = Gudhi::multi_persistence::make_one_dimensional<Simplex_tree_options_for_python>(st_multi, dimension);
605
+ }
606
+
607
+ template <typename Filtration, typename... Args>
608
+ void inline linear_projection_from_ptr(const uintptr_t ptr, const uintptr_t ptr_multi, Args... args) {
609
+ auto &st = get_simplextree_from_pointer<interface_std>(ptr);
610
+ auto &st_multi = get_simplextree_from_pointer<interface_multi<Filtration>>(ptr_multi);
611
+ linear_projection(st, st_multi, args...);
612
+ }
613
+
614
+ template <typename Filtration = multipers::tmp_interface::Filtration_value<float> >
615
+ using options_multi = Gudhi::multi_persistence::Simplex_tree_options_multidimensional_filtration<Filtration>;
616
+
617
+ template <typename Filtration, typename... Args>
618
+ void inline squeeze_filtration_from_ptr(uintptr_t splxptr, Args... args) {
619
+ Simplex_tree<options_multi<Filtration>> &st_multi = *(Gudhi::Simplex_tree<options_multi<Filtration>> *)(splxptr);
620
+ squeeze_filtration(st_multi, args...);
621
+ }
622
+
623
+ template <typename Filtration, typename... Args>
624
+ inline std::vector<std::vector<std::vector<Filtration>>> get_filtration_values_from_ptr(uintptr_t splxptr,
625
+ Args... args) {
626
+ Simplex_tree<options_multi<Filtration>> &st_multi = *(Gudhi::Simplex_tree<options_multi<Filtration>> *)(splxptr);
627
+ return get_filtration_values(st_multi, args...);
628
+ }
629
+
630
+ // Final types
631
+ //
632
+ //
633
+
634
+ template <typename Filtration>
635
+ using Simplex_tree_multi_simplex_handle = typename Simplex_tree_multi_interface<Filtration>::Simplex_handle;
636
+
637
+ template <typename Filtration>
638
+ using Simplex_tree_multi_simplices_iterator =
639
+ typename Simplex_tree_multi_interface<Filtration>::Complex_simplex_iterator;
640
+ template <typename Filtration>
641
+ using Simplex_tree_multi_skeleton_iterator =
642
+ typename Simplex_tree_multi_interface<Filtration>::Skeleton_simplex_iterator;
643
+ template <typename Filtration>
644
+ using Simplex_tree_multi_boundary_iterator =
645
+ typename Simplex_tree_multi_interface<Filtration>::Boundary_simplex_iterator;
646
+ } // namespace python_interface
647
+ } // namespace multiparameter
648
+ } // namespace Gudhi