multipers 2.3.4__cp311-cp311-win_amd64.whl → 2.3.5b2__cp311-cp311-win_amd64.whl

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

Potentially problematic release.


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

Files changed (32) hide show
  1. multipers/_signed_measure_meta.py +50 -84
  2. multipers/array_api/numpy.py +7 -0
  3. multipers/array_api/torch.py +7 -2
  4. multipers/filtrations/filtrations.py +2 -0
  5. multipers/function_rips.cp311-win_amd64.pyd +0 -0
  6. multipers/grids.cp311-win_amd64.pyd +0 -0
  7. multipers/grids.pyx +57 -19
  8. multipers/io.cp311-win_amd64.pyd +0 -0
  9. multipers/mma_structures.cp311-win_amd64.pyd +0 -0
  10. multipers/multi_parameter_rank_invariant/function_rips.h +1 -1
  11. multipers/multiparameter_module_approximation/approximation.h +8 -2
  12. multipers/multiparameter_module_approximation.cp311-win_amd64.pyd +0 -0
  13. multipers/plots.py +3 -2
  14. multipers/point_measure.cp311-win_amd64.pyd +0 -0
  15. multipers/point_measure.pyx +1 -1
  16. multipers/simplex_tree_multi.cp311-win_amd64.pyd +0 -0
  17. multipers/simplex_tree_multi.pyx +88 -56
  18. multipers/simplex_tree_multi.pyx.tp +23 -7
  19. multipers/slicer.cp311-win_amd64.pyd +0 -0
  20. multipers/slicer.pxd +60 -60
  21. multipers/slicer.pxd.tp +1 -1
  22. multipers/slicer.pyx +2052 -1137
  23. multipers/slicer.pyx.tp +100 -43
  24. multipers/tbb12.dll +0 -0
  25. multipers/tbbbind_2_5.dll +0 -0
  26. multipers/tbbmalloc.dll +0 -0
  27. multipers/tbbmalloc_proxy.dll +0 -0
  28. {multipers-2.3.4.dist-info → multipers-2.3.5b2.dist-info}/METADATA +1 -1
  29. {multipers-2.3.4.dist-info → multipers-2.3.5b2.dist-info}/RECORD +32 -32
  30. {multipers-2.3.4.dist-info → multipers-2.3.5b2.dist-info}/WHEEL +0 -0
  31. {multipers-2.3.4.dist-info → multipers-2.3.5b2.dist-info}/licenses/LICENSE +0 -0
  32. {multipers-2.3.4.dist-info → multipers-2.3.5b2.dist-info}/top_level.txt +0 -0
multipers/slicer.pyx.tp CHANGED
@@ -28,8 +28,8 @@ from multipers.filtrations cimport *
28
28
  from multipers.filtration_conversions cimport *
29
29
  ## TODO: these two are not needed, remove that by updating rank code.
30
30
  from multipers.point_measure import sparsify, rank_decomposition_by_rectangles
31
- from multipers.grids import compute_grid, sanitize_grid, evaluate_in_grid, _push_pts_to_line
32
- from multipers.array_api import api_from_tensor
31
+ from multipers.grids import compute_grid, sanitize_grid, evaluate_in_grid, _push_pts_to_lines, _inf_value
32
+ from multipers.array_api import api_from_tensor, api_from_tensors
33
33
 
34
34
  import numpy as np
35
35
  cimport cython
@@ -37,6 +37,7 @@ from libcpp.string cimport string
37
37
  # python_value_type = np.float32
38
38
  from typing import Union
39
39
  from cython.operator cimport dereference
40
+ import time
40
41
 
41
42
  ## WARNING : This is repeated in the pxd file ...
42
43
  python_indices_type=np.int32
@@ -302,10 +303,8 @@ cdef class {{D['PYTHON_TYPE']}}:
302
303
  def persistence_on_line(self,basepoint,direction=None, bool keep_inf=True, bool full=False, bool ignore_infinite_filtration_values = True):
303
304
  """
304
305
  Computes the persistence on a line L defined by
305
- - a basepoint (num_parameters,) array
306
- - an optional direction (num_parameters,) array
307
-
308
- Warning: This is not parallelizable. Use `persitence_on_lines`.
306
+ - a basepoint (num_parameters,) or (num_basepoints, num_parameters,) array
307
+ - an optional direction (num_parameters,) or (num_basepoints, num_parameters,) array
309
308
  """
310
309
  {{if D['IS_FLOAT']}}
311
310
  self.push_to_line(basepoint,direction)
@@ -320,21 +319,25 @@ cdef class {{D['PYTHON_TYPE']}}:
320
319
  return bcs
321
320
  {{else}}
322
321
  if not self.is_squeezed:
323
- raise ValueError("Unsqueeze tensor, or provide a filtration grid. Cannot slice lines with integers...")
324
- api = api_from_tensor(self.filtration_grid[0])
325
- s = self.unsqueeze()
322
+ raise ValueError("Unsqueeze tensor, or provide a filtration grid. Cannot slice lines with integers.")
323
+ api = api_from_tensors(basepoint, *self.filtration_grid)
324
+ basepoint = api.astensor(basepoint)
326
325
  fil = evaluate_in_grid(np.asarray(self.get_filtrations()), self.filtration_grid)
327
- projected_fil =_push_pts_to_line(fil, basepoint, direction)
328
- s.compute_persistence(projected_fil)
329
- bcs_idx = s.get_barcode_idx()
330
- bcs = tuple(
331
- api.stack([projected_fil[bc[:,0]], projected_fil[bc[:,1]]], axis=1)
332
- if bc.size>0
333
- else api.empty((0,2), dtype = self.filtration_grid[0].dtype)
334
- for bc in bcs_idx
335
- )
326
+ if basepoint.ndim == 0 or basepoint.ndim >2:
327
+ raise ValueError(f"Expected a basepoint shape of the form (num_parameters,). Got {basepoint.shape=}")
328
+ if basepoint.ndim == 1:
329
+ basepoint = basepoint[None]
330
+ if direction is not None:
331
+ direction = api.astensor(direction)
332
+ if direction.ndim == 0 or direction.ndim >2:
333
+ raise ValueError(f"Expected a direction shape of the form (num_parameters,). Got {direction.shape=}")
334
+ if direction.ndim == 1:
335
+ direction = direction[None]
336
+ projected_fil = _push_pts_to_lines(fil, basepoint, direction, api=api)
337
+ bcs = self.compute_persistence(projected_fil, ignore_infinite_filtration_values=ignore_infinite_filtration_values)
336
338
  if full:
337
- bcs = self._bc_to_full(bcs, basepoint, direction)
339
+ _dirs = [None]*len(basepoint) if direction is None else direction
340
+ bcs = tuple({{D['PYTHON_TYPE']}}._bc_to_full(bcs, bp, dir) for bcs, bp, dir in zip(bcs,basepoint,_dirs))
338
341
  return bcs
339
342
  {{endif}}
340
343
 
@@ -412,18 +415,16 @@ cdef class {{D['PYTHON_TYPE']}}:
412
415
 
413
416
 
414
417
 
415
- def compute_persistence(self,one_filtration=None, bool ignore_infinite_filtration_values = True)->tuple:
418
+ def compute_persistence(self,one_filtration=None, bool ignore_infinite_filtration_values = True, bool verbose=False)->tuple:
416
419
  """
417
420
  Computes the current persistence, or the persistence
418
- given by the filtration one_filtration (num_generators,).
421
+ given by the filtration one_filtration (num_generators,) or (num_filtrations, num_generators,).
419
422
  """
420
423
  if one_filtration is not None:
424
+ if verbose:
425
+ print(f"Computing persistence on custom filtration: {one_filtration.shape=} {one_filtration.dtype=}")
421
426
  api = api_from_tensor(one_filtration)
422
427
  one_filtration=api.astensor(one_filtration)
423
- # self.truc.set_one_filtration(one_filtration)
424
- # s = self.unsqueeze()
425
- # fil = evaluate_in_grid(np.asarray(self.get_filtrations()), self.filtration_grid)
426
- # projected_fil =_push_pts_to_line(fil, basepoint, direction)
427
428
  if one_filtration.ndim > 2 or one_filtration.ndim == 0:
428
429
  raise ValueError(f"Expected a filtration shape of the form ((num_1_param), num_generators). Got {one_filtration.shape=}")
429
430
  squeeze = False
@@ -431,16 +432,25 @@ cdef class {{D['PYTHON_TYPE']}}:
431
432
  one_filtration = one_filtration[None]
432
433
  squeeze = True
433
434
 
434
- bcs = self._custom_persistences_idx(api.asnumpy(one_filtration),ignore_infinite_filtration_values)
435
-
435
+ if self.is_squeezed:
436
+ if verbose:
437
+ print(f"Input is squeezed. Unsqueezing it for the line projection.")
438
+ temp = self.unsqueeze() ## TODO : optimize
439
+ bcs = temp._custom_persistences_idx(api.asnumpy(one_filtration),ignore_infinite_filtration_values)
440
+ else:
441
+ bcs = self._custom_persistences_idx(api.asnumpy(one_filtration),ignore_infinite_filtration_values)
442
+
443
+ num_filtrations = one_filtration.shape[0]
436
444
  bcs = tuple(tuple(
437
- api.stack([F[bc[:,0]], F[bc[:,1]]], axis=1)
438
- if bc.size>0
439
- else api.empty((0,2), dtype = F.dtype)
440
- for bc in bcs_idx
441
- )
442
- for bcs_idx,F in zip(bcs,one_filtration)
445
+ evaluate_in_grid(
446
+ np.asarray(bcs[i][j]) if len(bcs[i][j]) else np.empty((0,2), dtype=np.int32),
447
+ [one_filtration[i]]*2, # 2 bc of 1d barcode
448
+ input_inf_value=-1,
449
+ )
450
+ for j in range(len(bcs[i])))
451
+ for i in range(num_filtrations)
443
452
  )
453
+
444
454
  return bcs[0] if squeeze else bcs
445
455
 
446
456
  # TODO: Later
@@ -449,7 +459,6 @@ cdef class {{D['PYTHON_TYPE']}}:
449
459
  # else:
450
460
  # self.truc.compute_persistence()
451
461
  self.truc.compute_persistence(ignore_infinite_filtration_values)
452
- # return self
453
462
  return self.get_barcode()
454
463
  def get_barcode(self):
455
464
  """
@@ -496,14 +505,21 @@ cdef class {{D['PYTHON_TYPE']}}:
496
505
  strategy=grid_strategy,
497
506
  **infer_grid_kwargs,
498
507
  )
499
- def get_filtrations(self):
508
+ def get_filtrations(self, bool unsqueeze = False):
500
509
  """
501
510
  Returns a view of the filtration values, as a list of numpy arrays.
502
511
  """
503
512
  {{if D['IS_KCRITICAL']}}
513
+ if unsqueeze:
514
+ raise NotImplementedError("Unsqueezed version not implemented for multicritical filtrations.")
504
515
  return _vff2kcview_{{D['SHORT_VALUE_TYPE']}}(self.truc.get_filtrations(), copy=False, duplicate=self.num_parameters)
505
516
  {{else}}
506
- return _vff21cview_{{D['SHORT_VALUE_TYPE']}}(self.truc.get_filtrations(), copy=False, duplicate=self.num_parameters)
517
+ out = _vff21cview_{{D['SHORT_VALUE_TYPE']}}(self.truc.get_filtrations(), copy=False, duplicate=self.num_parameters)
518
+ if not unsqueeze:
519
+ return out
520
+ if not self.is_squeezed:
521
+ raise ValueError(f"Already unsqueezed. Got {unsqueeze=}")
522
+ return evaluate_in_grid(np.asarray(out), self.filtration_grid)
507
523
  {{endif}}
508
524
 
509
525
  def get_dimensions(self)-> np.ndarray:
@@ -523,6 +539,35 @@ cdef class {{D['PYTHON_TYPE']}}:
523
539
  """
524
540
  self.truc.prune_above_dimension(max_dimension)
525
541
  return self
542
+ {{if not D["IS_KCRITICAL"]}}
543
+ def make_filtration_non_decreasing(self, bool safe=True):
544
+ if self.is_squeezed and safe:
545
+ for i_ in range(self.num_parameters):
546
+ F = self.filtration_grid[i_]
547
+ if not (F[1:]>=F[:-1]).all():
548
+ raise ValueError("Found non-sorted grid.")
549
+
550
+ cdef int i = 0
551
+ cdef int N = len(self)
552
+ cdef vector[int] dims = self.truc.get_dimensions()
553
+ cdef Py_ssize_t num_parameters = self.num_parameters
554
+ cdef vector[vector[unsigned int]] B = self.truc.get_boundaries() # const issues, I was lazy
555
+
556
+ with nogil:
557
+ for i in range(N):
558
+ for b in B[i]:
559
+ for j in range(num_parameters):
560
+ self.truc.get_filtrations()[b][j] = max(
561
+ self.truc.get_filtrations()[b][j],
562
+ self.truc.get_filtrations()[i][j]
563
+ )
564
+ return self
565
+
566
+
567
+
568
+
569
+ {{endif}}
570
+
526
571
  def get_boundaries(self)->tuple[tuple]:
527
572
  """
528
573
  Returns the boundaries of the generators.
@@ -686,8 +731,6 @@ cdef class {{D['PYTHON_TYPE']}}:
686
731
  return self
687
732
 
688
733
  def unsqueeze(self, grid=None)->{{D['PYTHON_TYPE'][:-3]+"f64"}}:
689
- from multipers.grids import evaluate_in_grid, sanitize_grid
690
- from multipers import Slicer
691
734
  grid = self.filtration_grid if grid is None else grid
692
735
  grid = sanitize_grid(grid, numpyfy=True)
693
736
  new_filtrations = evaluate_in_grid(np.asarray(self.get_filtrations(), dtype=np.int32), grid)
@@ -1049,7 +1092,11 @@ def _rank_from_slicer(
1049
1092
  grid_shape_with_degree = np.asarray(np.concatenate([[len(degrees)], grid_shape, grid_shape]), dtype=python_indices_type)
1050
1093
  if verbose:
1051
1094
  print("Container shape: ", grid_shape_with_degree)
1095
+ print("Mallocing...", end="", flush=True)
1096
+ t0 = time.time()
1052
1097
  container_array = np.ascontiguousarray(np.zeros(grid_shape_with_degree, dtype=python_tensor_dtype).ravel())
1098
+ if verbose:
1099
+ print(f" Done. ({time.time()-t0:.3f}s).")
1053
1100
  assert len(container_array) < np.iinfo(python_indices_type).max, "Too large container. Raise an issue on github if you encounter this issue. (Due to tensor's operator[])"
1054
1101
  # if zero_pad:
1055
1102
  # grid_shape_with_degree[1:] -= 1
@@ -1059,20 +1106,25 @@ def _rank_from_slicer(
1059
1106
 
1060
1107
  ## SLICERS
1061
1108
  if verbose:
1062
- print("Computing rank invariant...", end="")
1109
+ print("Computing rank invariant...", end="", flush=True)
1110
+ t0 = time.time()
1063
1111
  _compute_rank_invariant(slicer, container_ptr, c_grid_shape, degrees, n_jobs, ignore_inf)
1064
1112
  if verbose:
1065
- print("Done.")
1113
+ print(f" Done. ({time.time()-t0:.3f}s).")
1066
1114
 
1067
1115
  if verbose:
1068
- print("Computing Möbius inversion...", end="")
1116
+ print("Computing Möbius inversion...", end="", flush=True)
1117
+ t0 = time.time()
1069
1118
  # if zero_pad:
1070
1119
  # grid_shape_with_degree[1:] += 1
1071
1120
  rank = container_array.reshape(grid_shape_with_degree)
1072
1121
  rank = tuple(rank_decomposition_by_rectangles(rank_of_degree, threshold=zero_pad) for rank_of_degree in rank)
1122
+ if verbose:
1123
+ print(f" Done. ({time.time()-t0:.3f}s).")
1124
+
1073
1125
  if return_raw:
1074
1126
  return rank
1075
- out = []
1127
+
1076
1128
  def clean_rank(rank_decomposition):
1077
1129
  (coords, weights) = sparsify(np.ascontiguousarray(rank_decomposition))
1078
1130
  births = coords[:,:num_parameters]
@@ -1082,7 +1134,12 @@ def _rank_from_slicer(
1082
1134
  weights = weights[correct_indices]
1083
1135
  return coords, weights
1084
1136
 
1137
+ if verbose:
1138
+ print("Cleaning output...", end="", flush=True)
1139
+ t0 = time.time()
1085
1140
  out = tuple(clean_rank(rank_decomposition) for rank_decomposition in rank)
1086
1141
  if verbose:
1087
- print("Done.")
1142
+ print(f" Done. ({time.time()-t0:.3f}s).")
1088
1143
  return out
1144
+ # %%
1145
+
multipers/tbb12.dll CHANGED
Binary file
multipers/tbbbind_2_5.dll CHANGED
Binary file
multipers/tbbmalloc.dll CHANGED
Binary file
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multipers
3
- Version: 2.3.4
3
+ Version: 2.3.5b2
4
4
  Summary: Multiparameter Topological Persistence for Machine Learning
5
5
  Author-email: David Loiseaux <david.lapous@proton.me>, Hannah Schreiber <hannah.schreiber@inria.fr>
6
6
  Maintainer-email: David Loiseaux <david.lapous@proton.me>
@@ -1,45 +1,45 @@
1
1
  multipers/__init__.py,sha256=y4BfbXAY2M2yZYob758IegZHwIbRgmKrph6lwe6WR6Q,733
2
- multipers/_signed_measure_meta.py,sha256=YgGhy6miY2sagJMzV8JAfos-aoR4JV6F7RUNjpmT3nU,17676
2
+ multipers/_signed_measure_meta.py,sha256=A7Zwd47qvL55xQjBebo9ZE9XI4tmnoKn3Ue-FM34vno,16460
3
3
  multipers/_slicer_meta.py,sha256=mjIGR-B6HnQLSiMowEQ8EWQkD_IF3bBnDVzvwrZugZ4,7203
4
4
  multipers/distances.py,sha256=uAZj2GtUQp50OxN2qU7sl2JqsmJ74IG9j5tZapLO2Us,6220
5
5
  multipers/filtration_conversions.pxd,sha256=Je7a3F4zS1PQn6Ul1YCXgA6p39X2FouStru-XtN-aOw,10800
6
6
  multipers/filtration_conversions.pxd.tp,sha256=_9tUvZVUA7J_RUM3q7BxY48fYgDHCUA7Xhy4nBfLLs0,3309
7
7
  multipers/filtrations.pxd,sha256=08ONkZNCjs8Nme8lcD9myPz-K662sA-EDpSwzgC2_ts,9461
8
- multipers/function_rips.cp311-win_amd64.pyd,sha256=H-hLVIEsjBDHcLWrdIb8OP4Ou2we8seQLFyYb2Z8u0w,329216
8
+ multipers/function_rips.cp311-win_amd64.pyd,sha256=EpJS_BfE8XkFp0wldk8agQ_sD-DPmI34Kq9GzEPy3wM,329728
9
9
  multipers/function_rips.pyx,sha256=j5NjbK3YrAv_2s8YHB1JB0k6m9NC7RQCSFlJe-w_kgE,5252
10
- multipers/grids.cp311-win_amd64.pyd,sha256=ZcqWM80HdwoweLREhvKfL6wHaQhTuwkDEd8bjPJAoEk,472576
11
- multipers/grids.pyx,sha256=ezPMhBKlo9uVGKl5czzoSfOrByThUNup9f8l7ed_poM,18347
12
- multipers/io.cp311-win_amd64.pyd,sha256=vDwTPsCA7ahWOTPXdwoaeXWsWiyWvd2hiEvb_0EMaXU,223232
10
+ multipers/grids.cp311-win_amd64.pyd,sha256=7w-gWvqGhFR5tbafTMXQCc4Z9QdirrNS1pDDON1lIsw,477184
11
+ multipers/grids.pyx,sha256=8iHLcwm5f4PXJkt6DS81RgiXgyNp5VF4KayF1vBRV4k,19521
12
+ multipers/io.cp311-win_amd64.pyd,sha256=qpBRC2xAJWYwuaWJJDj--qtFc-KWCjNMAF1htYVkhko,221696
13
13
  multipers/io.pyx,sha256=pQBH_rSqaCZqDSxTLnhlyECP3fLbX2tR_RKJHydHm_0,22210
14
- multipers/mma_structures.cp311-win_amd64.pyd,sha256=cuWqpQM9hS8vQraIXXAEqp_0fROGr1U-FgQy3R1HKDU,1325056
14
+ multipers/mma_structures.cp311-win_amd64.pyd,sha256=HzwL8GOCxEe2dz17QSX-7BgT0nmAY8k4Qc1H5R_3mq8,1323520
15
15
  multipers/mma_structures.pxd,sha256=jh1QnQRidt_VK0CK7losQi6rAl_1qG5DNuR23J42pUA,6595
16
16
  multipers/mma_structures.pyx,sha256=1FQ_sqkpHHkCyCLLKkR9lUgZKDZFt-YgjnDd8NGmw6Q,109526
17
17
  multipers/mma_structures.pyx.tp,sha256=QLo4ZZDnFuWNot771jYkYHc9ZQq6CJIpkRkeRwGi7XA,42297
18
18
  multipers/multiparameter_edge_collapse.py,sha256=MFt0eKQQSv2354omeIqOmzASYTKIMsYdxZHFZauQr8g,1229
19
- multipers/multiparameter_module_approximation.cp311-win_amd64.pyd,sha256=V97xdna4tP9kyfa5rIXevVIjEpTj0oCA3TiJab12168,446976
19
+ multipers/multiparameter_module_approximation.cp311-win_amd64.pyd,sha256=1UIH-77AS_Pj_zOXv1V4LqOK2JDGrCkBIL0zTnco1qY,445952
20
20
  multipers/multiparameter_module_approximation.pyx,sha256=wp7la7Z9wBngnfw6WOVddf93mPyXf4HfNT6dKW2Z0r0,9030
21
21
  multipers/pickle.py,sha256=YYVt4iHiD16E1x5Yn_4mX6P5P8rKi56pNGjJo5IzPhc,2579
22
- multipers/plots.py,sha256=E1_O6A8335pr87nFkwgKD0DesEw94hk3iIih1Eh5Cxk,15383
23
- multipers/point_measure.cp311-win_amd64.pyd,sha256=KkMI1OhURBgt0okLVFWeRp-7Jx9CvifCa63Vbwit1T4,621056
24
- multipers/point_measure.pyx,sha256=ovpyvjMdOPBOK_0TT0VoK4b2t8m5InFdKmRBB6biTts,14077
25
- multipers/simplex_tree_multi.cp311-win_amd64.pyd,sha256=QFA6MKVWcZQlAQEftzZXlSJ36k-X1y3l6Qe6uQCSmF8,3798528
22
+ multipers/plots.py,sha256=jXENhITNIbLcLpIKibn5MXzxaeq8DEr1WLAoEU3fmTQ,15436
23
+ multipers/point_measure.cp311-win_amd64.pyd,sha256=LVIX6u8qr-o4HXdi_0rT6u5wc4I0NRbxeeFl5EgdtzQ,620544
24
+ multipers/point_measure.pyx,sha256=AzlAz1C0TW6jxPllbhMxG38ISlSE7h4U-y0mT7Uzndc,14084
25
+ multipers/simplex_tree_multi.cp311-win_amd64.pyd,sha256=G2eica-DZ9vDu_kKAOmI0lrEpnSziJfxOXru_1WB6N4,3812352
26
26
  multipers/simplex_tree_multi.pxd,sha256=KBX_vcNgtBjNHThUUOXp0r4HWj3EX1DGa6cX9mDi6aI,6649
27
- multipers/simplex_tree_multi.pyx,sha256=hUNgepiG0Dw6f2_9oPZm8YUcyDtB4P_Wk_ChuzvIOOY,504888
28
- multipers/simplex_tree_multi.pyx.tp,sha256=HYxL1AmtsS-HRpBJa5JtPqX73k2Xkqopn8OYZRb397Q,89276
29
- multipers/slicer.cp311-win_amd64.pyd,sha256=Me-BkTwV0hF_c3yePnNRQ53IrOb1_0sarrR5W-2kfgg,11618816
30
- multipers/slicer.pxd,sha256=bHcV5COzDcjhaVcL3bWSHivUYtdkSx4bdj24fVOe_DU,185230
31
- multipers/slicer.pxd.tp,sha256=fLOUPtPGqiY9o1fPDyc_whBrgKLh_6HVfvl7OtE-34Y,10243
32
- multipers/slicer.pyx,sha256=I0pqvRIJqCj326lcTlSHBHhEiV0lXxaIOgQCQCowJKM,894493
33
- multipers/slicer.pyx.tp,sha256=GCL7xUZccfmnIoY4bk05L5ODkSNzEzXgodp0VkH-xT8,44584
34
- multipers/tbb12.dll,sha256=flSoIAkNVECA5vNkh5jLn1jcZNxTw3yb2tuTtxn6oEE,344576
35
- multipers/tbbbind_2_5.dll,sha256=4JWlgl4aJJ3m5NIE85AgQi46REU3UkIJwNsKnh9aK_c,23552
36
- multipers/tbbmalloc.dll,sha256=r9y_3nR6Rpc68g1F7Oci8EpunjWIJQU-zjLIVXc9SDY,113664
37
- multipers/tbbmalloc_proxy.dll,sha256=5vcuiOpM9KTAY7daWxCsAc2MU_l8K3TWpw0kz-Xh0sk,30720
27
+ multipers/simplex_tree_multi.pyx,sha256=lzxlJnkgv43N6gZsYthIuoYKT45jaah9ogUdO1nvWBk,506429
28
+ multipers/simplex_tree_multi.pyx.tp,sha256=_UCL4n9P0gdqccJPx05dC6lwZFlP64M4WVX0uu6gTlA,90051
29
+ multipers/slicer.cp311-win_amd64.pyd,sha256=_6RxVTWeSUXHSCWbApH7_0Nb93-AeCVvZuvUTILsrko,11885056
30
+ multipers/slicer.pxd,sha256=RB0W089T2sFVJGdD1N9C274_GqLPqPH0Hb2nEj2WEwM,185510
31
+ multipers/slicer.pxd.tp,sha256=z-fdpEJWiDncVCFcwVh5Gr_MtRjIV8ln8xOPmd1B1-s,10250
32
+ multipers/slicer.pyx,sha256=GO_Y0JQMmpJNjindQSmCPT2AiluzzOGdbYctMv7wTsQ,947463
33
+ multipers/slicer.pyx.tp,sha256=9qgb4CYhZ-hEEF42mLgfbRNbfr5CconsimVnXInDWRQ,47254
34
+ multipers/tbb12.dll,sha256=M6QIBW4AdNhi0lTMy6FcxTPR_BaOYLcQquMZ5YZ6MD8,344576
35
+ multipers/tbbbind_2_5.dll,sha256=Mys6mt1_Yc4-n0XrKLY4BTPD6QwsqSpbiQHrg5Yk0Bo,23552
36
+ multipers/tbbmalloc.dll,sha256=DkUcOTkoUlc5bwSWW-KF3Vzdm9lL6EVA_D_SebFH_q4,113664
37
+ multipers/tbbmalloc_proxy.dll,sha256=n_GlUK8IfYnRz0Piuw2mN4HmPHtyBtqDsrqoFkKyCb4,30720
38
38
  multipers/tensor.pxd,sha256=MSmaMU0sOP9CHLmg4dym7nOGaI1S4cOdM01TQ9flI54,417
39
39
  multipers/test.pyx,sha256=-g7WU-jKrZK8H0c-6eAPsfrApjvTKrUoswVYFu8LoV4,1798
40
40
  multipers/array_api/__init__.py,sha256=jyvi7Gzd7Si_imgaodz80fcA-68MikAGk8g79_vj6yo,1545
41
- multipers/array_api/numpy.py,sha256=5XfqM4_ykFtCsn0Rel0qPceEXyzhu-6ekkbsM_94kM8,2439
42
- multipers/array_api/torch.py,sha256=cTtwOhZXT-UWYnQJe3rVPcs0f0jm6saxdMmWEmr9I5Q,2553
41
+ multipers/array_api/numpy.py,sha256=0Ln_jY891Jei_HQlWY9S_1-lLPYYOzXRyZknPO5ZYTc,2518
42
+ multipers/array_api/torch.py,sha256=B5ukw4m2OeHLTLaHSytTKDqdcJ4BwV8nKK3JREJAjuQ,2613
43
43
  multipers/data/MOL2.py,sha256=nLZHy2OSFN9Z2uJKsbqWOEG2R7G-uH6dCLHG48UjvR4,15428
44
44
  multipers/data/UCR.py,sha256=PuT8l3i26y0goBzIESwdgJAe6YFCyDiWSoxECcP5rhs,798
45
45
  multipers/data/__init__.py,sha256=w7uUe4LOHbdbKU4R8MNs7em65wZJN0v5ukoG1otFanQ,24
@@ -51,7 +51,7 @@ multipers/data/shape3d.py,sha256=AE-vvjKrhKxOwMo-lurUsFqqLjIg5obo-RTbRZF_5Mk,389
51
51
  multipers/data/synthetic.py,sha256=RvLWIBE5j99kJSt-D7cnPGI3c7skD4p8_qofJbMIXM0,3078
52
52
  multipers/filtrations/__init__.py,sha256=Lg0EHe2cxT32UQAg0kr_Vpua-xPBZxGol8VIfz8UwWk,319
53
53
  multipers/filtrations/density.py,sha256=XNPHCwyC8FwAdSfNp1ofxcxfP5ZFGZ6K-DUeXsfM4eg,18155
54
- multipers/filtrations/filtrations.py,sha256=O2WK3KBmClYvQH4Hr-9rsq3RJqcPjP8Q3Sjsi7Un6jU,13378
54
+ multipers/filtrations/filtrations.py,sha256=5d-i6JfxM5_WzteVkBHtTelZvD1lsL9hsHBYvbeY8FM,13454
55
55
  multipers/gudhi/Persistence_slices_interface.h,sha256=QnUeCCKi9K8CfqI3W5i3Ra1Jy2Z1IIivr3MIpnBsnYU,6562
56
56
  multipers/gudhi/Simplex_tree_interface.h,sha256=kkq8pE3jKGLY1dK7sYpb_uERHaWGurrRXfaw_ygs-mY,10217
57
57
  multipers/gudhi/Simplex_tree_multi_interface.h,sha256=7D9EqyO9dgi-VMTf-O8SR2UMQL95q_TL9ApmmN4ggFw,25484
@@ -151,11 +151,11 @@ multipers/ml/sliced_wasserstein.py,sha256=jgq4ND3EWwwJBopqRvfJLsoOptiMHjS3zEAENB
151
151
  multipers/ml/tools.py,sha256=DOPcqmvZP2bA7M08GrwccdebwDq1HEwYdhNRGT7eZMI,3453
152
152
  multipers/multi_parameter_rank_invariant/diff_helpers.h,sha256=wMCOhAewWd6-lulLND0y8M0MZoru6zn_8J3qfXDjLds,3477
153
153
  multipers/multi_parameter_rank_invariant/euler_characteristic.h,sha256=gLzz-VCY2xPW11Fmi1kG_On33h7EHFmW1TdsVWdzovA,3295
154
- multipers/multi_parameter_rank_invariant/function_rips.h,sha256=aUox99Y4X5kRgQ-nfpDApX2VC5iV0NJMyLBV-C7glo0,13505
154
+ multipers/multi_parameter_rank_invariant/function_rips.h,sha256=Fl-CqyQ3PGKjHWZbFa_aBh6-vmR8RKOFliC--Ho_2yo,13507
155
155
  multipers/multi_parameter_rank_invariant/hilbert_function.h,sha256=S_LRkNSU_bjjcPRS1pWpVHWOLMFQIAYa9dbAhwz0W8c,36412
156
156
  multipers/multi_parameter_rank_invariant/persistence_slices.h,sha256=oVMsNkn_VB5lQ_2qsKw5ydPoHnMuGbtvrIN_ga7XnGQ,5986
157
157
  multipers/multi_parameter_rank_invariant/rank_invariant.h,sha256=-W_ai4I_wkAIodU3Ubgvuc5cD_VLJzB4479EsVSynsM,16371
158
- multipers/multiparameter_module_approximation/approximation.h,sha256=WoTIj3TsTikKtLb5WzrQ3hNBPdZBbtt0VQ1rwqVIi_c,96821
158
+ multipers/multiparameter_module_approximation/approximation.h,sha256=VbVNRdxvNqrSJKfszPwbYK4Fyxfox8S-rstVRRDdz6s,96988
159
159
  multipers/multiparameter_module_approximation/combinatory.h,sha256=Ck-VKQ56wsXCgQvIbpfTnBOweSBRm4rnChLfHf6JWlc,3605
160
160
  multipers/multiparameter_module_approximation/debug.h,sha256=yy7miaqw-Lj8u1yMB9HmtJL02abf3K6JlqS6LbkUVfI,2692
161
161
  multipers/multiparameter_module_approximation/euler_curves.h,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -178,8 +178,8 @@ multipers/tests/__init__.py,sha256=-7Fj-zFAfBJv18trg0CPglQTmYu_ehySZGqtJzPlN8U,1
178
178
  multipers/torch/__init__.py,sha256=OLxIiZ389uCqehpUxBPUI_x1SYu531onc4tiTscAuIw,27
179
179
  multipers/torch/diff_grids.py,sha256=2YK-c351tBpj8sfzjf26fbE1l0xlWse7oVVfDHD3zwM,7492
180
180
  multipers/torch/rips_density.py,sha256=H-kmSzY8hXhmVn15Oltc71DHs1IUHg5oPRgNyWW8L4Q,11706
181
- multipers-2.3.4.dist-info/licenses/LICENSE,sha256=UsQRnvlo_9wpQS9DNt52GEraERHwK2GIRwuqr2Yv5JI,1071
182
- multipers-2.3.4.dist-info/METADATA,sha256=yKi_0X_lBr3ivsS1mxPrZzR-lpR3myBPemRiMBAadOg,9823
183
- multipers-2.3.4.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
184
- multipers-2.3.4.dist-info/top_level.txt,sha256=L9e0AGmhRzrNw9FpuUx-zlqi5NcBOmrI9wYY8kYWr8A,10
185
- multipers-2.3.4.dist-info/RECORD,,
181
+ multipers-2.3.5b2.dist-info/licenses/LICENSE,sha256=UsQRnvlo_9wpQS9DNt52GEraERHwK2GIRwuqr2Yv5JI,1071
182
+ multipers-2.3.5b2.dist-info/METADATA,sha256=KHctITvlAapkwilssVT9VkgDMeuatKEzPNZOU62f5Ik,9825
183
+ multipers-2.3.5b2.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
184
+ multipers-2.3.5b2.dist-info/top_level.txt,sha256=L9e0AGmhRzrNw9FpuUx-zlqi5NcBOmrI9wYY8kYWr8A,10
185
+ multipers-2.3.5b2.dist-info/RECORD,,