multipers 2.3.3b6__cp310-cp310-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.

Potentially problematic release.


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

Files changed (183) hide show
  1. multipers/.dylibs/libc++.1.0.dylib +0 -0
  2. multipers/.dylibs/libtbb.12.16.dylib +0 -0
  3. multipers/__init__.py +33 -0
  4. multipers/_signed_measure_meta.py +453 -0
  5. multipers/_slicer_meta.py +211 -0
  6. multipers/array_api/__init__.py +45 -0
  7. multipers/array_api/numpy.py +41 -0
  8. multipers/array_api/torch.py +58 -0
  9. multipers/data/MOL2.py +458 -0
  10. multipers/data/UCR.py +18 -0
  11. multipers/data/__init__.py +1 -0
  12. multipers/data/graphs.py +466 -0
  13. multipers/data/immuno_regions.py +27 -0
  14. multipers/data/minimal_presentation_to_st_bf.py +0 -0
  15. multipers/data/pytorch2simplextree.py +91 -0
  16. multipers/data/shape3d.py +101 -0
  17. multipers/data/synthetic.py +113 -0
  18. multipers/distances.py +202 -0
  19. multipers/filtration_conversions.pxd +229 -0
  20. multipers/filtration_conversions.pxd.tp +84 -0
  21. multipers/filtrations/__init__.py +18 -0
  22. multipers/filtrations/density.py +574 -0
  23. multipers/filtrations/filtrations.py +361 -0
  24. multipers/filtrations.pxd +224 -0
  25. multipers/function_rips.cpython-310-darwin.so +0 -0
  26. multipers/function_rips.pyx +105 -0
  27. multipers/grids.cpython-310-darwin.so +0 -0
  28. multipers/grids.pyx +433 -0
  29. multipers/gudhi/Persistence_slices_interface.h +132 -0
  30. multipers/gudhi/Simplex_tree_interface.h +239 -0
  31. multipers/gudhi/Simplex_tree_multi_interface.h +551 -0
  32. multipers/gudhi/cubical_to_boundary.h +59 -0
  33. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
  34. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
  35. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
  36. multipers/gudhi/gudhi/Debug_utils.h +45 -0
  37. multipers/gudhi/gudhi/Fields/Multi_field.h +484 -0
  38. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -0
  39. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -0
  40. multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -0
  41. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -0
  42. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -0
  43. multipers/gudhi/gudhi/Fields/Z2_field.h +355 -0
  44. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -0
  45. multipers/gudhi/gudhi/Fields/Zp_field.h +420 -0
  46. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -0
  47. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -0
  48. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
  49. multipers/gudhi/gudhi/Matrix.h +2107 -0
  50. multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -0
  51. multipers/gudhi/gudhi/Multi_persistence/Box.h +174 -0
  52. multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -0
  53. multipers/gudhi/gudhi/Off_reader.h +173 -0
  54. multipers/gudhi/gudhi/One_critical_filtration.h +1441 -0
  55. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -0
  56. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -0
  57. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -0
  58. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -0
  59. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -0
  60. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -0
  61. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -0
  62. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -0
  63. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -0
  64. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -0
  65. multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -0
  66. multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -0
  67. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -0
  68. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -0
  69. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -0
  70. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -0
  71. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -0
  72. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -0
  73. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -0
  74. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -0
  75. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -0
  76. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -0
  77. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -0
  78. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -0
  79. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -0
  80. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -0
  81. multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -0
  82. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -0
  83. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -0
  84. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -0
  85. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -0
  86. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -0
  87. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -0
  88. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -0
  89. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
  90. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
  91. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
  92. multipers/gudhi/gudhi/Persistent_cohomology.h +745 -0
  93. multipers/gudhi/gudhi/Points_off_io.h +171 -0
  94. multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
  95. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -0
  96. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
  97. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -0
  98. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
  99. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
  100. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
  101. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -0
  102. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -0
  103. multipers/gudhi/gudhi/Simplex_tree.h +2794 -0
  104. multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -0
  105. multipers/gudhi/gudhi/distance_functions.h +62 -0
  106. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
  107. multipers/gudhi/gudhi/persistence_interval.h +253 -0
  108. multipers/gudhi/gudhi/persistence_matrix_options.h +170 -0
  109. multipers/gudhi/gudhi/reader_utils.h +367 -0
  110. multipers/gudhi/mma_interface_coh.h +256 -0
  111. multipers/gudhi/mma_interface_h0.h +223 -0
  112. multipers/gudhi/mma_interface_matrix.h +293 -0
  113. multipers/gudhi/naive_merge_tree.h +536 -0
  114. multipers/gudhi/scc_io.h +310 -0
  115. multipers/gudhi/truc.h +1403 -0
  116. multipers/io.cpython-310-darwin.so +0 -0
  117. multipers/io.pyx +644 -0
  118. multipers/ml/__init__.py +0 -0
  119. multipers/ml/accuracies.py +90 -0
  120. multipers/ml/invariants_with_persistable.py +79 -0
  121. multipers/ml/kernels.py +176 -0
  122. multipers/ml/mma.py +713 -0
  123. multipers/ml/one.py +472 -0
  124. multipers/ml/point_clouds.py +352 -0
  125. multipers/ml/signed_measures.py +1589 -0
  126. multipers/ml/sliced_wasserstein.py +461 -0
  127. multipers/ml/tools.py +113 -0
  128. multipers/mma_structures.cpython-310-darwin.so +0 -0
  129. multipers/mma_structures.pxd +128 -0
  130. multipers/mma_structures.pyx +2786 -0
  131. multipers/mma_structures.pyx.tp +1094 -0
  132. multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -0
  133. multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -0
  134. multipers/multi_parameter_rank_invariant/function_rips.h +322 -0
  135. multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -0
  136. multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -0
  137. multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -0
  138. multipers/multiparameter_edge_collapse.py +41 -0
  139. multipers/multiparameter_module_approximation/approximation.h +2330 -0
  140. multipers/multiparameter_module_approximation/combinatory.h +129 -0
  141. multipers/multiparameter_module_approximation/debug.h +107 -0
  142. multipers/multiparameter_module_approximation/euler_curves.h +0 -0
  143. multipers/multiparameter_module_approximation/format_python-cpp.h +286 -0
  144. multipers/multiparameter_module_approximation/heap_column.h +238 -0
  145. multipers/multiparameter_module_approximation/images.h +79 -0
  146. multipers/multiparameter_module_approximation/list_column.h +174 -0
  147. multipers/multiparameter_module_approximation/list_column_2.h +232 -0
  148. multipers/multiparameter_module_approximation/ru_matrix.h +347 -0
  149. multipers/multiparameter_module_approximation/set_column.h +135 -0
  150. multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -0
  151. multipers/multiparameter_module_approximation/unordered_set_column.h +166 -0
  152. multipers/multiparameter_module_approximation/utilities.h +403 -0
  153. multipers/multiparameter_module_approximation/vector_column.h +223 -0
  154. multipers/multiparameter_module_approximation/vector_matrix.h +331 -0
  155. multipers/multiparameter_module_approximation/vineyards.h +464 -0
  156. multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -0
  157. multipers/multiparameter_module_approximation.cpython-310-darwin.so +0 -0
  158. multipers/multiparameter_module_approximation.pyx +235 -0
  159. multipers/pickle.py +90 -0
  160. multipers/plots.py +456 -0
  161. multipers/point_measure.cpython-310-darwin.so +0 -0
  162. multipers/point_measure.pyx +395 -0
  163. multipers/simplex_tree_multi.cpython-310-darwin.so +0 -0
  164. multipers/simplex_tree_multi.pxd +134 -0
  165. multipers/simplex_tree_multi.pyx +10840 -0
  166. multipers/simplex_tree_multi.pyx.tp +2009 -0
  167. multipers/slicer.cpython-310-darwin.so +0 -0
  168. multipers/slicer.pxd +3034 -0
  169. multipers/slicer.pxd.tp +234 -0
  170. multipers/slicer.pyx +20481 -0
  171. multipers/slicer.pyx.tp +1088 -0
  172. multipers/tensor/tensor.h +672 -0
  173. multipers/tensor.pxd +13 -0
  174. multipers/test.pyx +44 -0
  175. multipers/tests/__init__.py +62 -0
  176. multipers/torch/__init__.py +1 -0
  177. multipers/torch/diff_grids.py +240 -0
  178. multipers/torch/rips_density.py +310 -0
  179. multipers-2.3.3b6.dist-info/METADATA +128 -0
  180. multipers-2.3.3b6.dist-info/RECORD +183 -0
  181. multipers-2.3.3b6.dist-info/WHEEL +6 -0
  182. multipers-2.3.3b6.dist-info/licenses/LICENSE +21 -0
  183. multipers-2.3.3b6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,235 @@
1
+ """!
2
+ @package mma
3
+ @brief Files containing the C++ cythonized functions.
4
+ @author David Loiseaux
5
+ @copyright Copyright (c) 2022 Inria.
6
+ """
7
+
8
+ # distutils: language = c++
9
+
10
+ ###########################################################################
11
+ ## PYTHON LIBRARIES
12
+ import gudhi as gd
13
+ import numpy as np
14
+ from typing import List
15
+ from joblib import Parallel, delayed
16
+ import sys
17
+ from warnings import warn
18
+
19
+ ###########################################################################
20
+ ## CPP CLASSES
21
+ from libc.stdint cimport intptr_t
22
+ from libc.stdint cimport uintptr_t
23
+
24
+ ###########################################################################
25
+ ## CYTHON TYPES
26
+ from libcpp.vector cimport vector
27
+ from libcpp.utility cimport pair
28
+ #from libcpp.list cimport list as clist
29
+ from libcpp cimport bool
30
+ from libcpp cimport int
31
+ from typing import Iterable,Optional, Literal
32
+ from cython.operator import dereference
33
+ #########################################################################
34
+ ## Multipersistence Module Approximation Classes
35
+ from multipers.mma_structures cimport *
36
+ from multipers.filtrations cimport *
37
+ from multipers.filtration_conversions cimport *
38
+ cimport numpy as cnp
39
+
40
+
41
+ #########################################################################
42
+ ## Small hack for typing
43
+ from multipers.simplex_tree_multi import is_simplextree_multi, SimplexTreeMulti_type
44
+ from multipers.slicer import Slicer_type, is_slicer
45
+ from multipers.mma_structures import *
46
+ from multipers.mma_structures import PyModule_type
47
+ from typing import Union
48
+ from multipers.slicer cimport _multiparameter_module_approximation_f32, _multiparameter_module_approximation_f64
49
+
50
+
51
+
52
+ def module_approximation_from_slicer(
53
+ slicer:Slicer_type,
54
+ box:Optional[np.ndarray]=None,
55
+ max_error=-1,
56
+ bool complete=True,
57
+ bool threshold=False,
58
+ bool verbose=False,
59
+ list[float] direction = [],
60
+ bool warnings = True,
61
+ )->PyModule_type:
62
+
63
+ cdef Module[float] mod_f32
64
+ cdef Module[double] mod_f64
65
+ cdef intptr_t ptr
66
+ if not slicer.is_vine:
67
+ if warnings:
68
+ warn(r"(copy warning) Got a non-vine slicer as an input. Use `vineyard=True` to remove this copy.")
69
+ from multipers._slicer_meta import Slicer
70
+ slicer = Slicer(slicer, vineyard=True, backend="matrix")
71
+ if slicer.is_squeezed:
72
+ raise ValueError("Got a squeezed slicer. Should have been unsqueezed before !")
73
+
74
+ direction_ = np.asarray(direction, dtype=slicer.dtype)
75
+ if slicer.dtype == np.float32:
76
+ approx_mod = PyModule_f32()
77
+ if box is None:
78
+ box = slicer.filtration_bounds()
79
+ mod_f32 = _multiparameter_module_approximation_f32(slicer,_py21c_f32(direction_), max_error,Box[float](box),threshold, complete, verbose)
80
+ ptr = <intptr_t>(&mod_f32)
81
+ elif slicer.dtype == np.float64:
82
+ approx_mod = PyModule_f64()
83
+ if box is None:
84
+ box = slicer.filtration_bounds()
85
+ mod_f64 = _multiparameter_module_approximation_f64(slicer,_py21c_f64(direction_), max_error,Box[double](box),threshold, complete, verbose)
86
+ ptr = <intptr_t>(&mod_f64)
87
+ else:
88
+ raise ValueError(f"Slicer must be float-like. Got {slicer.dtype}.")
89
+
90
+ approx_mod._set_from_ptr(ptr)
91
+
92
+ return approx_mod
93
+
94
+ def module_approximation(
95
+ input:Union[SimplexTreeMulti_type,Slicer_type, tuple],
96
+ box:Optional[np.ndarray]=None,
97
+ float max_error=-1,
98
+ int nlines=557,
99
+ slicer_backend:Literal["matrix","clement","graph"]="matrix",
100
+ minpres:Optional[Literal["mpfree"]]=None,
101
+ degree:Optional[int]=None,
102
+ bool complete=True,
103
+ bool threshold=False,
104
+ bool verbose=False,
105
+ bool ignore_warnings=False,
106
+ id="",
107
+ list[float] direction = [],
108
+ list[int] swap_box_coords = [],
109
+ *,
110
+ int n_jobs = -1,
111
+ )->PyModule_type:
112
+ """Computes an interval module approximation of a multiparameter filtration.
113
+
114
+ Parameters
115
+ ----------
116
+ input: SimplexTreeMulti or Slicer-like.
117
+ Holds the multifiltered complex.
118
+ max_error: positive float
119
+ Trade-off between approximation and computational complexity.
120
+ Upper bound of the module approximation, in bottleneck distance,
121
+ for interval-decomposable modules.
122
+ nlines: int = 200
123
+ Alternative to max_error;
124
+ specifies the number of persistence computation used for the approximation.
125
+ box : (Optional) pair of list of floats
126
+ Defines a rectangle on which to compute the approximation.
127
+ Format : [x,y], This defines a rectangle on which we draw the lines,
128
+ uniformly drawn (with a max_error step).
129
+ The first line is `x`.
130
+ **Warning**: For custom boxes, and directions, you **must** ensure
131
+ that the first line captures a generic barcode.
132
+ direction: float[:] = []
133
+ If given, the line are drawn with this angle.
134
+ **Warning**: You must ensure that the first line, defined by box,
135
+ captures a generic barcode.
136
+ slicer_backend: Either "matrix","clement", or "graph".
137
+ If a simplextree is given, it is first converted to this structure,
138
+ with different choices of backends.
139
+ minpres: (Optional) "mpfree" only for the moment.
140
+ If given, and the input is a simplextree,
141
+ computes a minimal presentation before starting the computation.
142
+ A degree has to be given.
143
+ degree: int Only required when minpres is given.
144
+ Homological degree of the minimal degree.
145
+ threshold: bool
146
+ When true, intersects the module support with the box,
147
+ i.e. no more infinite summands.
148
+ verbose: bool
149
+ Prints C++ infos.
150
+ ignore_warning : bool
151
+ Unless set to true, prevents computing on more than 10k lines.
152
+ Useful to prevent a segmentation fault due to "infinite" recursion.
153
+ Returns
154
+ -------
155
+ PyModule
156
+ An interval decomposable module approximation of the module defined by the
157
+ homology of this multi-filtration.
158
+ """
159
+ if isinstance(input, tuple) or isinstance(input, list):
160
+ assert all(s.is_minpres for s in input), "Modules cannot be merged unless they are minimal presentations."
161
+ assert np.unique([s.minpres_degree for s in input]).shape[0] == len(input), "Multiple modules are at the same degree, cannot merge modules"
162
+ if len(input) == 0:
163
+ return PyModule_f64()
164
+ if n_jobs <= 1:
165
+ modules = tuple(module_approximation(slicer, box, max_error, nlines, slicer_backend, minpres, degree, complete, threshold, verbose, ignore_warnings, id, direction, swap_box_coords) for slicer in input)
166
+ else:
167
+ modules = tuple(Parallel(n_jobs=n_jobs, prefer="threads")(
168
+ delayed(module_approximation)(slicer, box, max_error, nlines, slicer_backend, minpres, degree, complete, threshold, verbose, ignore_warnings, id, direction, swap_box_coords)
169
+ for slicer in input
170
+ ))
171
+ box = modules[0].get_box()
172
+ mod = PyModule_f64().set_box(box)
173
+ for i,m in enumerate(modules):
174
+ mod.merge(m, input[i].minpres_degree)
175
+ return mod
176
+ if len(input) == 0:
177
+ return PyModule_f64()
178
+ if input.is_squeezed:
179
+ if not ignore_warnings:
180
+ warn("(copy warning) Got a squeezed input. ")
181
+ input = input.unsqueeze()
182
+
183
+ if box is None:
184
+ if is_simplextree_multi(input):
185
+ box = input.filtration_bounds()
186
+ else:
187
+ box = input.filtration_bounds()
188
+ box = np.asarray(box)
189
+
190
+ # empty coords
191
+ zero_idx = box[1] == box[0]
192
+ if np.any(zero_idx):
193
+ box[1] += zero_idx
194
+
195
+ for i in swap_box_coords:
196
+ box[0,i], box[1,i] = box[1,i], box[0,i]
197
+ num_parameters = box.shape[1]
198
+ if num_parameters <=0:
199
+ num_parameters = box.shape[1]
200
+ assert len(direction) == 0 or len(direction) == len(box[0]), f"Invalid line direction, has to be 0 or {num_parameters=}"
201
+
202
+ prod = sum(np.abs(box[1] - box[0])[:i].prod() * np.abs(box[1] - box[0])[i+1:].prod() for i in range(0,num_parameters))
203
+
204
+ if max_error <= 0:
205
+ max_error = (prod/nlines)**(1/(num_parameters-1))
206
+
207
+ if not ignore_warnings and prod >= 10_000:
208
+ raise ValueError(f"""
209
+ Warning : the number of lines (around {np.round(prod)}) may be too high.
210
+ This may be due to extreme box or filtration bounds :
211
+
212
+ {box=}
213
+
214
+ Try to increase the precision parameter, or set `ignore_warning=True` to compute this module.
215
+ Returning the trivial module.
216
+ """
217
+ )
218
+ if is_simplextree_multi(input):
219
+ from multipers._slicer_meta import Slicer
220
+ input = Slicer(input,backend=slicer_backend, vineyard=True)
221
+ assert is_slicer(input), "First argument must be a simplextree or a slicer !"
222
+ return module_approximation_from_slicer(
223
+ slicer=input,
224
+ box=box,
225
+ max_error=max_error,
226
+ complete=complete,
227
+ threshold=threshold,
228
+ verbose=verbose,
229
+ direction=direction,
230
+ )
231
+
232
+
233
+
234
+
235
+
multipers/pickle.py ADDED
@@ -0,0 +1,90 @@
1
+ import numpy as np
2
+
3
+
4
+ def save_with_axis(path: str, signed_measures):
5
+ np.savez(
6
+ path,
7
+ **{
8
+ f"{i}_{axis}_{degree}": np.c_[
9
+ sm_of_degree[0], sm_of_degree[1][:, np.newaxis]
10
+ ]
11
+ for i, sm in enumerate(signed_measures)
12
+ for axis, sm_of_axis in enumerate(sm)
13
+ for degree, sm_of_degree in enumerate(sm_of_axis)
14
+ },
15
+ )
16
+
17
+
18
+ def save_without_axis(path: str, signed_measures):
19
+ np.savez(
20
+ path,
21
+ **{
22
+ f"{i}_{degree}": np.c_[sm_of_degree[0], sm_of_degree[1][:, np.newaxis]]
23
+ for i, sm in enumerate(signed_measures)
24
+ for degree, sm_of_degree in enumerate(sm)
25
+ },
26
+ )
27
+
28
+
29
+ def get_sm_with_axis(sms, idx, axis, degree):
30
+ sm = sms[f"{idx}_{axis}_{degree}"]
31
+ return (sm[:, :-1], sm[:, -1])
32
+
33
+
34
+ def get_sm_without_axis(sms, idx, degree):
35
+ sm = sms[f"{idx}_{degree}"]
36
+ return (sm[:, :-1], sm[:, -1])
37
+
38
+
39
+ def load_without_axis(sms):
40
+ indices = np.array(
41
+ [[int(i) for i in key.split("_")] for key in sms.keys()], dtype=int
42
+ )
43
+ num_data, num_degrees = indices.max(axis=0) + 1
44
+ signed_measures_reconstructed = [
45
+ [get_sm_without_axis(sms, idx, degree) for degree in range(num_degrees)]
46
+ for idx in range(num_data)
47
+ ]
48
+ return signed_measures_reconstructed
49
+
50
+
51
+ # test : np.all([np.array_equal(a[0],b[0]) and np.array_equal(a[1],b[1]) and len(a) == len(b) == 2 for x,y in zip(signed_measures_reconstructed,signed_measures_reconstructed) for a,b in zip(x,y)])
52
+
53
+
54
+ def load_with_axis(sms):
55
+ indices = np.array(
56
+ [[int(i) for i in key.split("_")] for key in sms.keys()], dtype=int
57
+ )
58
+ num_data, num_axis, num_degrees = indices.max(axis=0) + 1
59
+ signed_measures_reconstructed = [
60
+ [
61
+ [get_sm_with_axis(sms, idx, axis, degree) for degree in range(num_degrees)]
62
+ for axis in range(num_axis)
63
+ ]
64
+ for idx in range(num_data)
65
+ ]
66
+ return signed_measures_reconstructed
67
+
68
+
69
+ def save(path: str, signed_measures):
70
+ if isinstance(signed_measures[0][0], tuple):
71
+ save_without_axis(path=path, signed_measures=signed_measures)
72
+ else:
73
+ save_with_axis(path=path, signed_measures=signed_measures)
74
+
75
+
76
+ def load(path: str):
77
+ sms = np.load(path)
78
+ item = None
79
+ for i in sms.keys():
80
+ item = i
81
+ break
82
+ n = len(item.split("_"))
83
+ match n:
84
+ case 2:
85
+ return load_without_axis(sms)
86
+ case 3:
87
+ return load_with_axis(sms)
88
+ case _:
89
+ raise Exception("Invalid Signed Measure !")
90
+