multipers 2.3.2b1__cp313-cp313-win_amd64.whl → 2.3.3b1__cp313-cp313-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.
- multipers/function_rips.cp313-win_amd64.pyd +0 -0
- multipers/grids.cp313-win_amd64.pyd +0 -0
- multipers/io.cp313-win_amd64.pyd +0 -0
- multipers/ml/mma.py +1 -1
- multipers/mma_structures.cp313-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.cp313-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.pyx +2 -1
- multipers/plots.py +88 -2
- multipers/point_measure.cp313-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.cp313-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.pyx +72 -28
- multipers/simplex_tree_multi.pyx.tp +15 -4
- multipers/slicer.cp313-win_amd64.pyd +0 -0
- multipers/slicer.pxd +20 -20
- multipers/slicer.pyx +19 -16
- multipers/slicer.pyx.tp +3 -0
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b1.dist-info}/METADATA +1 -1
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b1.dist-info}/RECORD +21 -21
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b1.dist-info}/WHEEL +1 -1
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b1.dist-info}/licenses/LICENSE +0 -0
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b1.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
multipers/io.cp313-win_amd64.pyd
CHANGED
|
Binary file
|
multipers/ml/mma.py
CHANGED
|
@@ -478,7 +478,7 @@ class MMAFormatter(BaseEstimator, TransformerMixin):
|
|
|
478
478
|
if self.weights is None
|
|
479
479
|
else np.asarray(self.weights)
|
|
480
480
|
)
|
|
481
|
-
standard_box =
|
|
481
|
+
standard_box = np.array([[0] * self._num_parameters, w])
|
|
482
482
|
|
|
483
483
|
X_copy = [
|
|
484
484
|
[
|
|
Binary file
|
|
Binary file
|
|
@@ -168,7 +168,8 @@ def module_approximation(
|
|
|
168
168
|
delayed(module_approximation)(slicer, box, max_error, nlines, slicer_backend, minpres, degree, complete, threshold, verbose, ignore_warnings, id, direction, swap_box_coords)
|
|
169
169
|
for slicer in input
|
|
170
170
|
))
|
|
171
|
-
|
|
171
|
+
box = modules[0].get_box()
|
|
172
|
+
mod = PyModule_f64().set_box(box)
|
|
172
173
|
for i,m in enumerate(modules):
|
|
173
174
|
mod.merge(m, input[i].minpres_degree)
|
|
174
175
|
return mod
|
multipers/plots.py
CHANGED
|
@@ -2,13 +2,16 @@ from typing import Optional
|
|
|
2
2
|
|
|
3
3
|
import matplotlib.pyplot as plt
|
|
4
4
|
import numpy as np
|
|
5
|
+
from numpy.typing import ArrayLike
|
|
5
6
|
|
|
6
7
|
try:
|
|
7
8
|
import torch
|
|
9
|
+
|
|
8
10
|
istensor = torch.is_tensor
|
|
9
11
|
except ImportError:
|
|
10
12
|
istensor = lambda x: False
|
|
11
13
|
|
|
14
|
+
|
|
12
15
|
def _plot_rectangle(rectangle: np.ndarray, weight, **plt_kwargs):
|
|
13
16
|
rectangle = np.asarray(rectangle)
|
|
14
17
|
x_axis = rectangle[[0, 2]]
|
|
@@ -137,7 +140,9 @@ def plot_signed_measure(signed_measure, threshold=None, ax=None, **plt_kwargs):
|
|
|
137
140
|
else:
|
|
138
141
|
pts_ = pts
|
|
139
142
|
threshold = np.max(np.ma.masked_invalid(pts_), axis=0)
|
|
140
|
-
threshold = np.max(
|
|
143
|
+
threshold = np.max(
|
|
144
|
+
[threshold, [plt.gca().get_xlim()[1], plt.gca().get_ylim()[1]]], axis=0
|
|
145
|
+
)
|
|
141
146
|
if isinstance(pts, np.ndarray):
|
|
142
147
|
pass
|
|
143
148
|
else:
|
|
@@ -255,7 +260,7 @@ def plot2d_PyModule(
|
|
|
255
260
|
dimension=-1,
|
|
256
261
|
separated=False,
|
|
257
262
|
min_persistence=0,
|
|
258
|
-
alpha
|
|
263
|
+
alpha=0.8,
|
|
259
264
|
verbose=False,
|
|
260
265
|
save=False,
|
|
261
266
|
dpi=200,
|
|
@@ -341,3 +346,84 @@ def plot2d_PyModule(
|
|
|
341
346
|
if dimension >= 0:
|
|
342
347
|
plt.title(rf"$H_{dimension}$ $2$-persistence")
|
|
343
348
|
return
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def plot_simplicial_complex(
|
|
352
|
+
st, pts: ArrayLike, x: float, y: float, mma=None, degree=None
|
|
353
|
+
):
|
|
354
|
+
"""
|
|
355
|
+
Scatters the points, with the simplices in the filtration at coordinates (x,y).
|
|
356
|
+
if an mma module is given, plots it in a second axis
|
|
357
|
+
"""
|
|
358
|
+
if mma is not None:
|
|
359
|
+
fig, (a, b) = plt.subplots(ncols=2, figsize=(15, 5))
|
|
360
|
+
plt.sca(a)
|
|
361
|
+
plot_simplicial_complex(st, pts, x, y)
|
|
362
|
+
plt.sca(b)
|
|
363
|
+
mma.plot(degree=degree)
|
|
364
|
+
box = mma.get_box()
|
|
365
|
+
a, b, c, d = box.ravel()
|
|
366
|
+
mma.plot(degree=1, min_persistence=0.01)
|
|
367
|
+
plt.vlines(x, b, d, color="k", linestyle="--")
|
|
368
|
+
plt.hlines(y, a, c, color="k", linestyle="--")
|
|
369
|
+
plt.scatter([x], [y], c="r", zorder=10)
|
|
370
|
+
plt.text(x + 0.01 * (b - a), y + 0.01 * (d - c), f"({x},{y})")
|
|
371
|
+
return
|
|
372
|
+
|
|
373
|
+
pts = np.asarray(pts)
|
|
374
|
+
values = np.array([-f[1] for s, f in st.get_skeleton(0)])
|
|
375
|
+
qs = np.quantile(values, np.linspace(0, 1, 100))
|
|
376
|
+
color_idx = lambda d: np.searchsorted(qs, d) / 100
|
|
377
|
+
|
|
378
|
+
from matplotlib.pyplot import get_cmap
|
|
379
|
+
|
|
380
|
+
color = lambda d: get_cmap("viridis")([0, color_idx(d), 1])[1]
|
|
381
|
+
cols_pc = np.asarray([color(v) for v in values])
|
|
382
|
+
ax = plt.gca()
|
|
383
|
+
for s, f in st: ## simplexe, filtration
|
|
384
|
+
density = -f[1]
|
|
385
|
+
if len(s) <= 1 or f[0] > x or density < -y: ## simplexe = point
|
|
386
|
+
continue
|
|
387
|
+
if len(s) == 2: ## simplexe = segment
|
|
388
|
+
xx = np.array([pts[a, 0] for a in s])
|
|
389
|
+
yy = np.array([pts[a, 1] for a in s])
|
|
390
|
+
plt.plot(xx, yy, c=color(density), alpha=1, zorder=10 * density, lw=1.5)
|
|
391
|
+
if len(s) == 3: ## simplexe = triangle
|
|
392
|
+
xx = np.array([pts[a, 0] for a in s])
|
|
393
|
+
yy = np.array([pts[a, 1] for a in s])
|
|
394
|
+
_c = color(density)
|
|
395
|
+
ax.fill(xx, yy, c=_c, alpha=0.3, zorder=0)
|
|
396
|
+
out = plt.scatter(pts[:, 0], pts[:, 1], c=cols_pc, zorder=10, s=10)
|
|
397
|
+
ax.set_aspect(1)
|
|
398
|
+
return out
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def plot_point_cloud(pts, function, x, y, mma=None, degree=None):
|
|
402
|
+
if mma is not None:
|
|
403
|
+
fig, (a, b) = plt.subplots(ncols=2, figsize=(15, 5))
|
|
404
|
+
plt.sca(a)
|
|
405
|
+
plot_point_cloud(pts, function, x, y)
|
|
406
|
+
plt.sca(b)
|
|
407
|
+
mma.plot(degree=degree)
|
|
408
|
+
box = mma.get_box()
|
|
409
|
+
a, b, c, d = box.ravel()
|
|
410
|
+
mma.plot(degree=1, min_persistence=0.01)
|
|
411
|
+
plt.vlines(x, b, d, color="k", linestyle="--")
|
|
412
|
+
plt.hlines(y, a, c, color="k", linestyle="--")
|
|
413
|
+
plt.scatter([x], [y], c="r", zorder=10)
|
|
414
|
+
plt.text(x + 0.01 * (b - a), y + 0.01 * (d - c), f"({x},{y})")
|
|
415
|
+
return
|
|
416
|
+
values = 1 - function
|
|
417
|
+
qs = np.quantile(values, np.linspace(0, 1, 100))
|
|
418
|
+
color_idx = lambda d: np.searchsorted(qs, d) / 100
|
|
419
|
+
from matplotlib.pyplot import get_cmap
|
|
420
|
+
from matplotlib.collections import PatchCollection
|
|
421
|
+
|
|
422
|
+
color = lambda d: get_cmap("viridis")([0, color_idx(d), 1])[1]
|
|
423
|
+
ax = plt.gca()
|
|
424
|
+
idx = function <= y
|
|
425
|
+
circles = [plt.Circle(pt, x, color=color(c)) for pt, c in zip(pts[idx], function)]
|
|
426
|
+
pc = PatchCollection(circles, alpha=0.3)
|
|
427
|
+
ax.add_collection(pc)
|
|
428
|
+
plt.scatter(*pts.T, c=-function, s=20)
|
|
429
|
+
ax.set_aspect(1)
|
|
Binary file
|
|
Binary file
|
multipers/simplex_tree_multi.pyx
CHANGED
|
@@ -881,10 +881,10 @@ cdef class SimplexTreeMulti_KFi32:
|
|
|
881
881
|
self,
|
|
882
882
|
filtration_grid:np.ndarray|list|None=None,
|
|
883
883
|
bool coordinate_values=True,
|
|
884
|
-
force=False,
|
|
885
|
-
strategy:_available_strategies = "exact",
|
|
884
|
+
bool force=False,
|
|
885
|
+
str strategy:_available_strategies = "exact",
|
|
886
886
|
grid_strategy=None,
|
|
887
|
-
inplace=False,
|
|
887
|
+
bool inplace=False,
|
|
888
888
|
**filtration_grid_kwargs
|
|
889
889
|
)->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFi32:
|
|
890
890
|
"""
|
|
@@ -1982,7 +1982,16 @@ cdef class SimplexTreeMulti_Fi32:
|
|
|
1982
1982
|
out = self.get_ptr().get_edge_list()
|
|
1983
1983
|
return out
|
|
1984
1984
|
|
|
1985
|
-
def collapse_edges(
|
|
1985
|
+
def collapse_edges(
|
|
1986
|
+
self,
|
|
1987
|
+
int num=1,
|
|
1988
|
+
int max_dimension = 0,
|
|
1989
|
+
bool progress=False,
|
|
1990
|
+
bool strong=True,
|
|
1991
|
+
bool full=False,
|
|
1992
|
+
bool ignore_warning=False,
|
|
1993
|
+
bool auto_clean=True,
|
|
1994
|
+
)->SimplexTreeMulti_Fi32:
|
|
1986
1995
|
"""Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
|
|
1987
1996
|
It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
|
|
1988
1997
|
|
|
@@ -2032,6 +2041,8 @@ cdef class SimplexTreeMulti_Fi32:
|
|
|
2032
2041
|
edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
|
|
2033
2042
|
# Retrieves the collapsed simplicial complex
|
|
2034
2043
|
self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
|
|
2044
|
+
if self.is_squeezed and auto_clean:
|
|
2045
|
+
self._clean_filtration_grid()
|
|
2035
2046
|
return self
|
|
2036
2047
|
|
|
2037
2048
|
@cython.inline
|
|
@@ -2309,10 +2320,10 @@ cdef class SimplexTreeMulti_Fi32:
|
|
|
2309
2320
|
self,
|
|
2310
2321
|
filtration_grid:np.ndarray|list|None=None,
|
|
2311
2322
|
bool coordinate_values=True,
|
|
2312
|
-
force=False,
|
|
2313
|
-
strategy:_available_strategies = "exact",
|
|
2323
|
+
bool force=False,
|
|
2324
|
+
str strategy:_available_strategies = "exact",
|
|
2314
2325
|
grid_strategy=None,
|
|
2315
|
-
inplace=False,
|
|
2326
|
+
bool inplace=False,
|
|
2316
2327
|
**filtration_grid_kwargs
|
|
2317
2328
|
)->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Fi32:
|
|
2318
2329
|
"""
|
|
@@ -3458,10 +3469,10 @@ cdef class SimplexTreeMulti_KFi64:
|
|
|
3458
3469
|
self,
|
|
3459
3470
|
filtration_grid:np.ndarray|list|None=None,
|
|
3460
3471
|
bool coordinate_values=True,
|
|
3461
|
-
force=False,
|
|
3462
|
-
strategy:_available_strategies = "exact",
|
|
3472
|
+
bool force=False,
|
|
3473
|
+
str strategy:_available_strategies = "exact",
|
|
3463
3474
|
grid_strategy=None,
|
|
3464
|
-
inplace=False,
|
|
3475
|
+
bool inplace=False,
|
|
3465
3476
|
**filtration_grid_kwargs
|
|
3466
3477
|
)->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFi64:
|
|
3467
3478
|
"""
|
|
@@ -4559,7 +4570,16 @@ cdef class SimplexTreeMulti_Fi64:
|
|
|
4559
4570
|
out = self.get_ptr().get_edge_list()
|
|
4560
4571
|
return out
|
|
4561
4572
|
|
|
4562
|
-
def collapse_edges(
|
|
4573
|
+
def collapse_edges(
|
|
4574
|
+
self,
|
|
4575
|
+
int num=1,
|
|
4576
|
+
int max_dimension = 0,
|
|
4577
|
+
bool progress=False,
|
|
4578
|
+
bool strong=True,
|
|
4579
|
+
bool full=False,
|
|
4580
|
+
bool ignore_warning=False,
|
|
4581
|
+
bool auto_clean=True,
|
|
4582
|
+
)->SimplexTreeMulti_Fi64:
|
|
4563
4583
|
"""Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
|
|
4564
4584
|
It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
|
|
4565
4585
|
|
|
@@ -4609,6 +4629,8 @@ cdef class SimplexTreeMulti_Fi64:
|
|
|
4609
4629
|
edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
|
|
4610
4630
|
# Retrieves the collapsed simplicial complex
|
|
4611
4631
|
self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
|
|
4632
|
+
if self.is_squeezed and auto_clean:
|
|
4633
|
+
self._clean_filtration_grid()
|
|
4612
4634
|
return self
|
|
4613
4635
|
|
|
4614
4636
|
@cython.inline
|
|
@@ -4886,10 +4908,10 @@ cdef class SimplexTreeMulti_Fi64:
|
|
|
4886
4908
|
self,
|
|
4887
4909
|
filtration_grid:np.ndarray|list|None=None,
|
|
4888
4910
|
bool coordinate_values=True,
|
|
4889
|
-
force=False,
|
|
4890
|
-
strategy:_available_strategies = "exact",
|
|
4911
|
+
bool force=False,
|
|
4912
|
+
str strategy:_available_strategies = "exact",
|
|
4891
4913
|
grid_strategy=None,
|
|
4892
|
-
inplace=False,
|
|
4914
|
+
bool inplace=False,
|
|
4893
4915
|
**filtration_grid_kwargs
|
|
4894
4916
|
)->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Fi64:
|
|
4895
4917
|
"""
|
|
@@ -6035,10 +6057,10 @@ cdef class SimplexTreeMulti_KFf32:
|
|
|
6035
6057
|
self,
|
|
6036
6058
|
filtration_grid:np.ndarray|list|None=None,
|
|
6037
6059
|
bool coordinate_values=True,
|
|
6038
|
-
force=False,
|
|
6039
|
-
strategy:_available_strategies = "exact",
|
|
6060
|
+
bool force=False,
|
|
6061
|
+
str strategy:_available_strategies = "exact",
|
|
6040
6062
|
grid_strategy=None,
|
|
6041
|
-
inplace=False,
|
|
6063
|
+
bool inplace=False,
|
|
6042
6064
|
**filtration_grid_kwargs
|
|
6043
6065
|
)->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFf32:
|
|
6044
6066
|
"""
|
|
@@ -7136,7 +7158,16 @@ cdef class SimplexTreeMulti_Ff32:
|
|
|
7136
7158
|
out = self.get_ptr().get_edge_list()
|
|
7137
7159
|
return out
|
|
7138
7160
|
|
|
7139
|
-
def collapse_edges(
|
|
7161
|
+
def collapse_edges(
|
|
7162
|
+
self,
|
|
7163
|
+
int num=1,
|
|
7164
|
+
int max_dimension = 0,
|
|
7165
|
+
bool progress=False,
|
|
7166
|
+
bool strong=True,
|
|
7167
|
+
bool full=False,
|
|
7168
|
+
bool ignore_warning=False,
|
|
7169
|
+
bool auto_clean=True,
|
|
7170
|
+
)->SimplexTreeMulti_Ff32:
|
|
7140
7171
|
"""Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
|
|
7141
7172
|
It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
|
|
7142
7173
|
|
|
@@ -7186,6 +7217,8 @@ cdef class SimplexTreeMulti_Ff32:
|
|
|
7186
7217
|
edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
|
|
7187
7218
|
# Retrieves the collapsed simplicial complex
|
|
7188
7219
|
self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
|
|
7220
|
+
if self.is_squeezed and auto_clean:
|
|
7221
|
+
self._clean_filtration_grid()
|
|
7189
7222
|
return self
|
|
7190
7223
|
|
|
7191
7224
|
@cython.inline
|
|
@@ -7463,10 +7496,10 @@ cdef class SimplexTreeMulti_Ff32:
|
|
|
7463
7496
|
self,
|
|
7464
7497
|
filtration_grid:np.ndarray|list|None=None,
|
|
7465
7498
|
bool coordinate_values=True,
|
|
7466
|
-
force=False,
|
|
7467
|
-
strategy:_available_strategies = "exact",
|
|
7499
|
+
bool force=False,
|
|
7500
|
+
str strategy:_available_strategies = "exact",
|
|
7468
7501
|
grid_strategy=None,
|
|
7469
|
-
inplace=False,
|
|
7502
|
+
bool inplace=False,
|
|
7470
7503
|
**filtration_grid_kwargs
|
|
7471
7504
|
)->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Ff32:
|
|
7472
7505
|
"""
|
|
@@ -8612,10 +8645,10 @@ cdef class SimplexTreeMulti_KFf64:
|
|
|
8612
8645
|
self,
|
|
8613
8646
|
filtration_grid:np.ndarray|list|None=None,
|
|
8614
8647
|
bool coordinate_values=True,
|
|
8615
|
-
force=False,
|
|
8616
|
-
strategy:_available_strategies = "exact",
|
|
8648
|
+
bool force=False,
|
|
8649
|
+
str strategy:_available_strategies = "exact",
|
|
8617
8650
|
grid_strategy=None,
|
|
8618
|
-
inplace=False,
|
|
8651
|
+
bool inplace=False,
|
|
8619
8652
|
**filtration_grid_kwargs
|
|
8620
8653
|
)->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFf64:
|
|
8621
8654
|
"""
|
|
@@ -9713,7 +9746,16 @@ cdef class SimplexTreeMulti_Ff64:
|
|
|
9713
9746
|
out = self.get_ptr().get_edge_list()
|
|
9714
9747
|
return out
|
|
9715
9748
|
|
|
9716
|
-
def collapse_edges(
|
|
9749
|
+
def collapse_edges(
|
|
9750
|
+
self,
|
|
9751
|
+
int num=1,
|
|
9752
|
+
int max_dimension = 0,
|
|
9753
|
+
bool progress=False,
|
|
9754
|
+
bool strong=True,
|
|
9755
|
+
bool full=False,
|
|
9756
|
+
bool ignore_warning=False,
|
|
9757
|
+
bool auto_clean=True,
|
|
9758
|
+
)->SimplexTreeMulti_Ff64:
|
|
9717
9759
|
"""Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
|
|
9718
9760
|
It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
|
|
9719
9761
|
|
|
@@ -9763,6 +9805,8 @@ cdef class SimplexTreeMulti_Ff64:
|
|
|
9763
9805
|
edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
|
|
9764
9806
|
# Retrieves the collapsed simplicial complex
|
|
9765
9807
|
self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
|
|
9808
|
+
if self.is_squeezed and auto_clean:
|
|
9809
|
+
self._clean_filtration_grid()
|
|
9766
9810
|
return self
|
|
9767
9811
|
|
|
9768
9812
|
@cython.inline
|
|
@@ -10040,10 +10084,10 @@ cdef class SimplexTreeMulti_Ff64:
|
|
|
10040
10084
|
self,
|
|
10041
10085
|
filtration_grid:np.ndarray|list|None=None,
|
|
10042
10086
|
bool coordinate_values=True,
|
|
10043
|
-
force=False,
|
|
10044
|
-
strategy:_available_strategies = "exact",
|
|
10087
|
+
bool force=False,
|
|
10088
|
+
str strategy:_available_strategies = "exact",
|
|
10045
10089
|
grid_strategy=None,
|
|
10046
|
-
inplace=False,
|
|
10090
|
+
bool inplace=False,
|
|
10047
10091
|
**filtration_grid_kwargs
|
|
10048
10092
|
)->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Ff64:
|
|
10049
10093
|
"""
|
|
@@ -972,7 +972,16 @@ cdef class SimplexTreeMulti_{{FSHORT}}:
|
|
|
972
972
|
out = self.get_ptr().get_edge_list()
|
|
973
973
|
return out
|
|
974
974
|
|
|
975
|
-
def collapse_edges(
|
|
975
|
+
def collapse_edges(
|
|
976
|
+
self,
|
|
977
|
+
int num=1,
|
|
978
|
+
int max_dimension = 0,
|
|
979
|
+
bool progress=False,
|
|
980
|
+
bool strong=True,
|
|
981
|
+
bool full=False,
|
|
982
|
+
bool ignore_warning=False,
|
|
983
|
+
bool auto_clean=True,
|
|
984
|
+
)->SimplexTreeMulti_{{FSHORT}}:
|
|
976
985
|
"""Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
|
|
977
986
|
It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
|
|
978
987
|
|
|
@@ -1022,6 +1031,8 @@ cdef class SimplexTreeMulti_{{FSHORT}}:
|
|
|
1022
1031
|
edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
|
|
1023
1032
|
# Retrieves the collapsed simplicial complex
|
|
1024
1033
|
self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
|
|
1034
|
+
if self.is_squeezed and auto_clean:
|
|
1035
|
+
self._clean_filtration_grid()
|
|
1025
1036
|
return self
|
|
1026
1037
|
|
|
1027
1038
|
@cython.inline
|
|
@@ -1317,10 +1328,10 @@ cdef class SimplexTreeMulti_{{FSHORT}}:
|
|
|
1317
1328
|
self,
|
|
1318
1329
|
filtration_grid:np.ndarray|list|None=None,
|
|
1319
1330
|
bool coordinate_values=True,
|
|
1320
|
-
force=False,
|
|
1321
|
-
strategy:_available_strategies = "exact",
|
|
1331
|
+
bool force=False,
|
|
1332
|
+
str strategy:_available_strategies = "exact",
|
|
1322
1333
|
grid_strategy=None,
|
|
1323
|
-
inplace=False,
|
|
1334
|
+
bool inplace=False,
|
|
1324
1335
|
**filtration_grid_kwargs
|
|
1325
1336
|
)->SimplexTreeMulti_{{FSHORT[:-3] + "i32"}} | SimplexTreeMulti_{{FSHORT}}:
|
|
1326
1337
|
"""
|
|
Binary file
|
multipers/slicer.pxd
CHANGED
|
@@ -2013,51 +2013,51 @@ cdef extern from "multiparameter_module_approximation/approximation.h" namespace
|
|
|
2013
2013
|
|
|
2014
2014
|
import multipers.slicer as mps
|
|
2015
2015
|
from cython.operator cimport dereference
|
|
2016
|
-
cdef inline Module[
|
|
2016
|
+
cdef inline Module[float] _multiparameter_module_approximation_f32(object slicer, One_critical_filtration[float] direction, float max_error, Box[float] box, bool threshold, bool complete, bool verbose):
|
|
2017
2017
|
import multipers.slicer as mps
|
|
2018
2018
|
cdef intptr_t slicer_ptr = <intptr_t>(slicer.get_ptr())
|
|
2019
|
-
cdef Module[
|
|
2019
|
+
cdef Module[float] mod
|
|
2020
2020
|
if False:
|
|
2021
2021
|
pass
|
|
2022
|
-
elif isinstance(slicer, mps.
|
|
2022
|
+
elif isinstance(slicer, mps._KSlicer_Matrix0_vine_f32):
|
|
2023
2023
|
with nogil:
|
|
2024
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2024
|
+
mod = multiparameter_module_approximation(dereference(<C_KSlicer_Matrix0_vine_f32*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2025
2025
|
return mod
|
|
2026
|
-
elif isinstance(slicer, mps.
|
|
2026
|
+
elif isinstance(slicer, mps._KSlicer_Matrix1_vine_f32):
|
|
2027
2027
|
with nogil:
|
|
2028
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2028
|
+
mod = multiparameter_module_approximation(dereference(<C_KSlicer_Matrix1_vine_f32*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2029
2029
|
return mod
|
|
2030
|
-
elif isinstance(slicer, mps.
|
|
2030
|
+
elif isinstance(slicer, mps._Slicer_Matrix0_vine_f32):
|
|
2031
2031
|
with nogil:
|
|
2032
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2032
|
+
mod = multiparameter_module_approximation(dereference(<C_Slicer_Matrix0_vine_f32*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2033
2033
|
return mod
|
|
2034
|
-
elif isinstance(slicer, mps.
|
|
2034
|
+
elif isinstance(slicer, mps._Slicer_Matrix1_vine_f32):
|
|
2035
2035
|
with nogil:
|
|
2036
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2036
|
+
mod = multiparameter_module_approximation(dereference(<C_Slicer_Matrix1_vine_f32*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2037
2037
|
return mod
|
|
2038
2038
|
else:
|
|
2039
2039
|
raise ValueError(f"Unsupported slicer type {type(slicer)}")
|
|
2040
|
-
cdef inline Module[
|
|
2040
|
+
cdef inline Module[double] _multiparameter_module_approximation_f64(object slicer, One_critical_filtration[double] direction, double max_error, Box[double] box, bool threshold, bool complete, bool verbose):
|
|
2041
2041
|
import multipers.slicer as mps
|
|
2042
2042
|
cdef intptr_t slicer_ptr = <intptr_t>(slicer.get_ptr())
|
|
2043
|
-
cdef Module[
|
|
2043
|
+
cdef Module[double] mod
|
|
2044
2044
|
if False:
|
|
2045
2045
|
pass
|
|
2046
|
-
elif isinstance(slicer, mps.
|
|
2046
|
+
elif isinstance(slicer, mps._KSlicer_Matrix0_vine_f64):
|
|
2047
2047
|
with nogil:
|
|
2048
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2048
|
+
mod = multiparameter_module_approximation(dereference(<C_KSlicer_Matrix0_vine_f64*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2049
2049
|
return mod
|
|
2050
|
-
elif isinstance(slicer, mps.
|
|
2050
|
+
elif isinstance(slicer, mps._KSlicer_Matrix1_vine_f64):
|
|
2051
2051
|
with nogil:
|
|
2052
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2052
|
+
mod = multiparameter_module_approximation(dereference(<C_KSlicer_Matrix1_vine_f64*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2053
2053
|
return mod
|
|
2054
|
-
elif isinstance(slicer, mps.
|
|
2054
|
+
elif isinstance(slicer, mps._Slicer_Matrix0_vine_f64):
|
|
2055
2055
|
with nogil:
|
|
2056
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2056
|
+
mod = multiparameter_module_approximation(dereference(<C_Slicer_Matrix0_vine_f64*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2057
2057
|
return mod
|
|
2058
|
-
elif isinstance(slicer, mps.
|
|
2058
|
+
elif isinstance(slicer, mps._Slicer_Matrix1_vine_f64):
|
|
2059
2059
|
with nogil:
|
|
2060
|
-
mod = multiparameter_module_approximation(dereference(<
|
|
2060
|
+
mod = multiparameter_module_approximation(dereference(<C_Slicer_Matrix1_vine_f64*>(slicer_ptr)), direction, max_error, box, threshold, complete, verbose)
|
|
2061
2061
|
return mod
|
|
2062
2062
|
else:
|
|
2063
2063
|
raise ValueError(f"Unsupported slicer type {type(slicer)}")
|
multipers/slicer.pyx
CHANGED
|
@@ -19876,7 +19876,7 @@ cdef extern from "gudhi/cubical_to_boundary.h" namespace "":
|
|
|
19876
19876
|
void _to_boundary(const vector[unsigned int]&, vector[vector[unsigned int]]&, vector[int]&) except + nogil
|
|
19877
19877
|
void get_vertices(unsigned int, cset[unsigned int]&, const vector[vector[unsigned int]]&) nogil
|
|
19878
19878
|
|
|
19879
|
-
def
|
|
19879
|
+
def _from_bitmapf32(image, **slicer_kwargs):
|
|
19880
19880
|
from multipers import Slicer
|
|
19881
19881
|
dtype = slicer_kwargs.get("dtype", image.dtype)
|
|
19882
19882
|
slicer_kwargs["dtype"] = dtype
|
|
@@ -19894,9 +19894,9 @@ def _from_bitmapi32(image, **slicer_kwargs):
|
|
|
19894
19894
|
cdef cset[unsigned int] vertices
|
|
19895
19895
|
|
|
19896
19896
|
cdef unsigned int num_gens = gen_dims.size()
|
|
19897
|
-
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.
|
|
19898
|
-
cdef
|
|
19899
|
-
cdef
|
|
19897
|
+
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.float32) - _Slicer._inf_value()
|
|
19898
|
+
cdef float[:,:] F = filtration_values
|
|
19899
|
+
cdef float[:,:] c_img = image.reshape(-1,num_parameters)
|
|
19900
19900
|
with nogil:
|
|
19901
19901
|
for i in range(num_gens):
|
|
19902
19902
|
# with gil:
|
|
@@ -19914,7 +19914,7 @@ def _from_bitmapi32(image, **slicer_kwargs):
|
|
|
19914
19914
|
# print(f"F = {np.asarray(F[i])}")
|
|
19915
19915
|
slicer = _Slicer(gen_maps, gen_dims, filtration_values)
|
|
19916
19916
|
return slicer
|
|
19917
|
-
def
|
|
19917
|
+
def _from_bitmapi32(image, **slicer_kwargs):
|
|
19918
19918
|
from multipers import Slicer
|
|
19919
19919
|
dtype = slicer_kwargs.get("dtype", image.dtype)
|
|
19920
19920
|
slicer_kwargs["dtype"] = dtype
|
|
@@ -19932,9 +19932,9 @@ def _from_bitmapf64(image, **slicer_kwargs):
|
|
|
19932
19932
|
cdef cset[unsigned int] vertices
|
|
19933
19933
|
|
|
19934
19934
|
cdef unsigned int num_gens = gen_dims.size()
|
|
19935
|
-
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.
|
|
19936
|
-
cdef
|
|
19937
|
-
cdef
|
|
19935
|
+
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.int32) - _Slicer._inf_value()
|
|
19936
|
+
cdef int32_t[:,:] F = filtration_values
|
|
19937
|
+
cdef int32_t[:,:] c_img = image.reshape(-1,num_parameters)
|
|
19938
19938
|
with nogil:
|
|
19939
19939
|
for i in range(num_gens):
|
|
19940
19940
|
# with gil:
|
|
@@ -19990,7 +19990,7 @@ def _from_bitmapi64(image, **slicer_kwargs):
|
|
|
19990
19990
|
# print(f"F = {np.asarray(F[i])}")
|
|
19991
19991
|
slicer = _Slicer(gen_maps, gen_dims, filtration_values)
|
|
19992
19992
|
return slicer
|
|
19993
|
-
def
|
|
19993
|
+
def _from_bitmapf64(image, **slicer_kwargs):
|
|
19994
19994
|
from multipers import Slicer
|
|
19995
19995
|
dtype = slicer_kwargs.get("dtype", image.dtype)
|
|
19996
19996
|
slicer_kwargs["dtype"] = dtype
|
|
@@ -20008,9 +20008,9 @@ def _from_bitmapf32(image, **slicer_kwargs):
|
|
|
20008
20008
|
cdef cset[unsigned int] vertices
|
|
20009
20009
|
|
|
20010
20010
|
cdef unsigned int num_gens = gen_dims.size()
|
|
20011
|
-
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.
|
|
20012
|
-
cdef
|
|
20013
|
-
cdef
|
|
20011
|
+
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.float64) - _Slicer._inf_value()
|
|
20012
|
+
cdef double[:,:] F = filtration_values
|
|
20013
|
+
cdef double[:,:] c_img = image.reshape(-1,num_parameters)
|
|
20014
20014
|
with nogil:
|
|
20015
20015
|
for i in range(num_gens):
|
|
20016
20016
|
# with gil:
|
|
@@ -20031,14 +20031,14 @@ def _from_bitmapf32(image, **slicer_kwargs):
|
|
|
20031
20031
|
|
|
20032
20032
|
def from_bitmap(img, **kwargs):
|
|
20033
20033
|
img = np.asarray(img)
|
|
20034
|
+
if img.dtype == np.float32:
|
|
20035
|
+
return _from_bitmapf32(img, **kwargs)
|
|
20034
20036
|
if img.dtype == np.int32:
|
|
20035
20037
|
return _from_bitmapi32(img, **kwargs)
|
|
20036
|
-
if img.dtype == np.float64:
|
|
20037
|
-
return _from_bitmapf64(img, **kwargs)
|
|
20038
20038
|
if img.dtype == np.int64:
|
|
20039
20039
|
return _from_bitmapi64(img, **kwargs)
|
|
20040
|
-
if img.dtype == np.
|
|
20041
|
-
return
|
|
20040
|
+
if img.dtype == np.float64:
|
|
20041
|
+
return _from_bitmapf64(img, **kwargs)
|
|
20042
20042
|
raise ValueError(f"Invalid dtype. Got {img.dtype=}, was expecting {available_dtype=}.")
|
|
20043
20043
|
|
|
20044
20044
|
def from_function_delaunay(
|
|
@@ -20100,6 +20100,7 @@ def minimal_presentation(
|
|
|
20100
20100
|
dtype:type|_valid_dtypes=None,
|
|
20101
20101
|
int n_jobs = -1,
|
|
20102
20102
|
bool force=False,
|
|
20103
|
+
bool auto_clean = True,
|
|
20103
20104
|
**minpres_kwargs
|
|
20104
20105
|
):
|
|
20105
20106
|
"""
|
|
@@ -20138,6 +20139,8 @@ def minimal_presentation(
|
|
|
20138
20139
|
|
|
20139
20140
|
new_slicer.minpres_degree = degree
|
|
20140
20141
|
new_slicer.filtration_grid = slicer.filtration_grid if slicer.is_squeezed else None
|
|
20142
|
+
if new_slicer.is_squeezed and auto_clean:
|
|
20143
|
+
new_slicer = new_slicer._clean_filtration_grid()
|
|
20141
20144
|
return new_slicer
|
|
20142
20145
|
|
|
20143
20146
|
|
multipers/slicer.pyx.tp
CHANGED
|
@@ -818,6 +818,7 @@ def minimal_presentation(
|
|
|
818
818
|
dtype:type|_valid_dtypes=None,
|
|
819
819
|
int n_jobs = -1,
|
|
820
820
|
bool force=False,
|
|
821
|
+
bool auto_clean = True,
|
|
821
822
|
**minpres_kwargs
|
|
822
823
|
):
|
|
823
824
|
"""
|
|
@@ -856,6 +857,8 @@ def minimal_presentation(
|
|
|
856
857
|
|
|
857
858
|
new_slicer.minpres_degree = degree
|
|
858
859
|
new_slicer.filtration_grid = slicer.filtration_grid if slicer.is_squeezed else None
|
|
860
|
+
if new_slicer.is_squeezed and auto_clean:
|
|
861
|
+
new_slicer = new_slicer._clean_filtration_grid()
|
|
859
862
|
return new_slicer
|
|
860
863
|
|
|
861
864
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: multipers
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.3b1
|
|
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>
|
|
@@ -5,32 +5,32 @@ 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.cp313-win_amd64.pyd,sha256=
|
|
8
|
+
multipers/function_rips.cp313-win_amd64.pyd,sha256=4CygDQQN_t5nsfXNsozoqR1ArtbxQaQ6OS_HWh9fX2w,332800
|
|
9
9
|
multipers/function_rips.pyx,sha256=j5NjbK3YrAv_2s8YHB1JB0k6m9NC7RQCSFlJe-w_kgE,5252
|
|
10
|
-
multipers/grids.cp313-win_amd64.pyd,sha256=
|
|
10
|
+
multipers/grids.cp313-win_amd64.pyd,sha256=n4UM7QfQY-yuI9ZvoOnQzzjHqlGiOp6WLVJofxQFSA4,480768
|
|
11
11
|
multipers/grids.pyx,sha256=ONN_RKkuxqwb9IaS9gd42FUGaiBLc8QWcd3L-ubZjKE,16575
|
|
12
|
-
multipers/io.cp313-win_amd64.pyd,sha256=
|
|
12
|
+
multipers/io.cp313-win_amd64.pyd,sha256=LErGBShjAZieqNU4chR2ZprMVkI9rijWAeJlVwkgiFY,221696
|
|
13
13
|
multipers/io.pyx,sha256=pQBH_rSqaCZqDSxTLnhlyECP3fLbX2tR_RKJHydHm_0,22210
|
|
14
|
-
multipers/mma_structures.cp313-win_amd64.pyd,sha256=
|
|
14
|
+
multipers/mma_structures.cp313-win_amd64.pyd,sha256=zGcv95AD29KrQs7JS2SdODt0QsB_LzhsNyqfKgWyhrM,1302528
|
|
15
15
|
multipers/mma_structures.pxd,sha256=jh1QnQRidt_VK0CK7losQi6rAl_1qG5DNuR23J42pUA,6595
|
|
16
16
|
multipers/mma_structures.pyx,sha256=4zNC6ePfFKMvx0MrH-FqJVouyTMciRc49oevKDnsJhI,109530
|
|
17
17
|
multipers/mma_structures.pyx.tp,sha256=hWuuk9USDFa8CbQVRHNjWSAdGgpkWKvSCNjTtVuSzwM,42299
|
|
18
18
|
multipers/multiparameter_edge_collapse.py,sha256=MFt0eKQQSv2354omeIqOmzASYTKIMsYdxZHFZauQr8g,1229
|
|
19
|
-
multipers/multiparameter_module_approximation.cp313-win_amd64.pyd,sha256=
|
|
20
|
-
multipers/multiparameter_module_approximation.pyx,sha256=
|
|
19
|
+
multipers/multiparameter_module_approximation.cp313-win_amd64.pyd,sha256=9AKU9VkCOyioTEmau3HlGpnEphSm5DtjA3jsF9JXQIg,456704
|
|
20
|
+
multipers/multiparameter_module_approximation.pyx,sha256=wp7la7Z9wBngnfw6WOVddf93mPyXf4HfNT6dKW2Z0r0,9030
|
|
21
21
|
multipers/pickle.py,sha256=YYVt4iHiD16E1x5Yn_4mX6P5P8rKi56pNGjJo5IzPhc,2579
|
|
22
|
-
multipers/plots.py,sha256=
|
|
23
|
-
multipers/point_measure.cp313-win_amd64.pyd,sha256=
|
|
22
|
+
multipers/plots.py,sha256=9yLuNLJ3XefALKTbdtGu6cJfOt0faXyE0bMGDyFRL4g,14417
|
|
23
|
+
multipers/point_measure.cp313-win_amd64.pyd,sha256=x_2NRlgF0Pqx3MAcnt31qycDxCg6ea7WKp2nkj_71F4,587264
|
|
24
24
|
multipers/point_measure.pyx,sha256=DVhal6HgCCuALSJMcHHKOW16CwDQCVTc2PpK8cGCqx8,12109
|
|
25
|
-
multipers/simplex_tree_multi.cp313-win_amd64.pyd,sha256=
|
|
25
|
+
multipers/simplex_tree_multi.cp313-win_amd64.pyd,sha256=CkgyuH5p0ffN8yRjjhCnpOzxZz5B15h5fSUIsX2BZ54,3599872
|
|
26
26
|
multipers/simplex_tree_multi.pxd,sha256=KpyDEQNPoMC2sOU9-d4LtrGXx_UVCJGxMJ1kk1AzHgU,6631
|
|
27
|
-
multipers/simplex_tree_multi.pyx,sha256=
|
|
28
|
-
multipers/simplex_tree_multi.pyx.tp,sha256=
|
|
29
|
-
multipers/slicer.cp313-win_amd64.pyd,sha256=
|
|
30
|
-
multipers/slicer.pxd,sha256=
|
|
27
|
+
multipers/simplex_tree_multi.pyx,sha256=reHyva5AR1lOQyiCs2_jQ2XfwHtktcQ1nmY_BNmyxhk,498156
|
|
28
|
+
multipers/simplex_tree_multi.pyx.tp,sha256=fUTuIscfDlNjsImWU1YALVZ1Mf9OEkdl-IFKcRQqalI,89202
|
|
29
|
+
multipers/slicer.cp313-win_amd64.pyd,sha256=vp1-NXjDx0vDl9zMFcP6kvnHQ1s3vMvCUJrNP0M2ABA,11775488
|
|
30
|
+
multipers/slicer.pxd,sha256=bHcV5COzDcjhaVcL3bWSHivUYtdkSx4bdj24fVOe_DU,185230
|
|
31
31
|
multipers/slicer.pxd.tp,sha256=fLOUPtPGqiY9o1fPDyc_whBrgKLh_6HVfvl7OtE-34Y,10243
|
|
32
|
-
multipers/slicer.pyx,sha256=
|
|
33
|
-
multipers/slicer.pyx.tp,sha256=
|
|
32
|
+
multipers/slicer.pyx,sha256=lR1XDmAGA10rwuZKNX6BoMPQeMmCapoEqZtQ5izLJ7Y,894068
|
|
33
|
+
multipers/slicer.pyx.tp,sha256=0oSaqT6-traFiDW9R3IFRQ-u0kYle9Hum8xVzkVsa3c,44550
|
|
34
34
|
multipers/tbb12.dll,sha256=6AsPR4GauU53hj2xqJNM0SfLkCKCDskjy-uKeS01tCk,338944
|
|
35
35
|
multipers/tbbbind_2_5.dll,sha256=8TtH7JJZlCEKF0UwfyJoiyrFt9utOI_x5AFOxpP-pGw,23040
|
|
36
36
|
multipers/tbbmalloc.dll,sha256=1MRBYYNzNcooog8__yuLq40l7kSgZ4lkNZhDFfTWM8A,112640
|
|
@@ -143,7 +143,7 @@ multipers/ml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
143
143
|
multipers/ml/accuracies.py,sha256=4KfH7EB6-3KjXhOcleHcCP_2OOA6mC9v7DI7MSA2PnU,2940
|
|
144
144
|
multipers/ml/invariants_with_persistable.py,sha256=HL0_IIrcJdAmCIqcyHPg0PNLle_pa2esnGQJsK2hnHc,2261
|
|
145
145
|
multipers/ml/kernels.py,sha256=XWfvKY68-c9E-MpRzdNqGzGD6K24Aizx95TkiSeAtIY,6175
|
|
146
|
-
multipers/ml/mma.py,sha256=
|
|
146
|
+
multipers/ml/mma.py,sha256=mSwYqSHWGiboEiMnxArCuhHyrOExPYdML2Mbx4dTO7s,23950
|
|
147
147
|
multipers/ml/one.py,sha256=np5jM8gywm65TsK1yeZ1BDWqP-Ym-7hz4brTXI_0imk,20119
|
|
148
148
|
multipers/ml/point_clouds.py,sha256=nTkSjSzQy6S10-sZ0uwBp_Fs2EIWleB7yHncK2b_xLg,13770
|
|
149
149
|
multipers/ml/signed_measures.py,sha256=MGxteZRNFvOPuNxCeJEp3iFKLLqHgfOk9EVeqM1OqIU,58131
|
|
@@ -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.
|
|
182
|
-
multipers-2.3.
|
|
183
|
-
multipers-2.3.
|
|
184
|
-
multipers-2.3.
|
|
185
|
-
multipers-2.3.
|
|
181
|
+
multipers-2.3.3b1.dist-info/licenses/LICENSE,sha256=UsQRnvlo_9wpQS9DNt52GEraERHwK2GIRwuqr2Yv5JI,1071
|
|
182
|
+
multipers-2.3.3b1.dist-info/METADATA,sha256=MU-U7yqOEIFamD8-E2ctFsjHx2xpWJXSpbV6JEiSPXQ,9672
|
|
183
|
+
multipers-2.3.3b1.dist-info/WHEEL,sha256=qV0EIPljj1XC_vuSatRWjn02nZIz3N1t8jsZz7HBr2U,101
|
|
184
|
+
multipers-2.3.3b1.dist-info/top_level.txt,sha256=L9e0AGmhRzrNw9FpuUx-zlqi5NcBOmrI9wYY8kYWr8A,10
|
|
185
|
+
multipers-2.3.3b1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|