multipers 2.3.2b1__cp311-cp311-win_amd64.whl → 2.3.3b2__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.
- multipers/array_api/__init__.py +4 -0
- multipers/function_rips.cp311-win_amd64.pyd +0 -0
- multipers/grids.cp311-win_amd64.pyd +0 -0
- multipers/io.cp311-win_amd64.pyd +0 -0
- multipers/ml/mma.py +1 -1
- multipers/mma_structures.cp311-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.cp311-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.pyx +2 -1
- multipers/plots.py +107 -26
- multipers/point_measure.cp311-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.cp311-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.pyx +72 -28
- multipers/simplex_tree_multi.pyx.tp +15 -4
- multipers/slicer.cp311-win_amd64.pyd +0 -0
- multipers/slicer.pyx +24 -21
- multipers/slicer.pyx.tp +6 -3
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b2.dist-info}/METADATA +1 -1
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b2.dist-info}/RECORD +21 -21
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b2.dist-info}/WHEEL +1 -1
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b2.dist-info}/licenses/LICENSE +0 -0
- {multipers-2.3.2b1.dist-info → multipers-2.3.3b2.dist-info}/top_level.txt +0 -0
multipers/array_api/__init__.py
CHANGED
|
Binary file
|
|
Binary file
|
multipers/io.cp311-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,12 +2,11 @@ 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
|
|
6
|
+
from warnings import warn
|
|
7
|
+
from multipers.array_api import to_numpy
|
|
8
|
+
|
|
5
9
|
|
|
6
|
-
try:
|
|
7
|
-
import torch
|
|
8
|
-
istensor = torch.is_tensor
|
|
9
|
-
except ImportError:
|
|
10
|
-
istensor = lambda x: False
|
|
11
10
|
|
|
12
11
|
def _plot_rectangle(rectangle: np.ndarray, weight, **plt_kwargs):
|
|
13
12
|
rectangle = np.asarray(rectangle)
|
|
@@ -121,11 +120,8 @@ def plot_signed_measure(signed_measure, threshold=None, ax=None, **plt_kwargs):
|
|
|
121
120
|
else:
|
|
122
121
|
plt.sca(ax)
|
|
123
122
|
pts, weights = signed_measure
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if istensor(weights):
|
|
127
|
-
weights = weights.detach().numpy()
|
|
128
|
-
pts = np.asarray(pts)
|
|
123
|
+
pts = to_numpy(pts)
|
|
124
|
+
weights = to_numpy(weights)
|
|
129
125
|
num_pts = pts.shape[0]
|
|
130
126
|
num_parameters = pts.shape[1]
|
|
131
127
|
if threshold is None:
|
|
@@ -137,16 +133,9 @@ def plot_signed_measure(signed_measure, threshold=None, ax=None, **plt_kwargs):
|
|
|
137
133
|
else:
|
|
138
134
|
pts_ = pts
|
|
139
135
|
threshold = np.max(np.ma.masked_invalid(pts_), axis=0)
|
|
140
|
-
threshold = np.max(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
else:
|
|
144
|
-
import torch
|
|
145
|
-
|
|
146
|
-
if isinstance(pts, torch.Tensor):
|
|
147
|
-
pts = pts.detach().numpy()
|
|
148
|
-
else:
|
|
149
|
-
raise Exception("Invalid measure type.")
|
|
136
|
+
threshold = np.max(
|
|
137
|
+
[threshold, [plt.gca().get_xlim()[1], plt.gca().get_ylim()[1]]], axis=0
|
|
138
|
+
)
|
|
150
139
|
|
|
151
140
|
assert num_parameters in (2, 4)
|
|
152
141
|
if num_parameters == 2:
|
|
@@ -217,9 +206,9 @@ def plot_surface(
|
|
|
217
206
|
|
|
218
207
|
def plot_surfaces(HF, size=4, **plt_args):
|
|
219
208
|
grid, hf = HF
|
|
220
|
-
assert (
|
|
221
|
-
hf.ndim
|
|
222
|
-
)
|
|
209
|
+
assert hf.ndim == 3, (
|
|
210
|
+
f"Found hf.shape = {hf.shape}, expected ndim = 3 : degree, 2-parameter surface."
|
|
211
|
+
)
|
|
223
212
|
num_degrees = hf.shape[0]
|
|
224
213
|
fig, axes = plt.subplots(
|
|
225
214
|
nrows=1, ncols=num_degrees, figsize=(num_degrees * size, size)
|
|
@@ -255,7 +244,7 @@ def plot2d_PyModule(
|
|
|
255
244
|
dimension=-1,
|
|
256
245
|
separated=False,
|
|
257
246
|
min_persistence=0,
|
|
258
|
-
alpha
|
|
247
|
+
alpha=None,
|
|
259
248
|
verbose=False,
|
|
260
249
|
save=False,
|
|
261
250
|
dpi=200,
|
|
@@ -273,12 +262,14 @@ def plot2d_PyModule(
|
|
|
273
262
|
|
|
274
263
|
shapely = True and shapely
|
|
275
264
|
except ImportError:
|
|
276
|
-
from warnings import warn
|
|
277
|
-
|
|
278
265
|
shapely = False
|
|
279
266
|
warn(
|
|
280
267
|
"Shapely not installed. Fallbacking to matplotlib. The plots may be inacurate."
|
|
281
268
|
)
|
|
269
|
+
if alpha is None:
|
|
270
|
+
alpha = 0.8 if shapely else 1
|
|
271
|
+
if not shapely and alpha != 1:
|
|
272
|
+
warn("Opacity without shapely will lead to incorect plots.")
|
|
282
273
|
cmap = (
|
|
283
274
|
matplotlib.colormaps["Spectral"] if cmap is None else matplotlib.colormaps[cmap]
|
|
284
275
|
)
|
|
@@ -341,3 +332,93 @@ def plot2d_PyModule(
|
|
|
341
332
|
if dimension >= 0:
|
|
342
333
|
plt.title(rf"$H_{dimension}$ $2$-persistence")
|
|
343
334
|
return
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def plot_simplicial_complex(
|
|
338
|
+
st, pts: ArrayLike, x: float, y: float, mma=None, degree=None
|
|
339
|
+
):
|
|
340
|
+
"""
|
|
341
|
+
Scatters the points, with the simplices in the filtration at coordinates (x,y).
|
|
342
|
+
if an mma module is given, plots it in a second axis
|
|
343
|
+
"""
|
|
344
|
+
if mma is not None:
|
|
345
|
+
fig, (a, b) = plt.subplots(ncols=2, figsize=(15, 5))
|
|
346
|
+
plt.sca(a)
|
|
347
|
+
plot_simplicial_complex(st, pts, x, y)
|
|
348
|
+
plt.sca(b)
|
|
349
|
+
mma.plot(degree=degree)
|
|
350
|
+
box = mma.get_box()
|
|
351
|
+
a, b, c, d = box.ravel()
|
|
352
|
+
mma.plot(degree=1, min_persistence=0.01)
|
|
353
|
+
plt.vlines(x, b, d, color="k", linestyle="--")
|
|
354
|
+
plt.hlines(y, a, c, color="k", linestyle="--")
|
|
355
|
+
plt.scatter([x], [y], c="r", zorder=10)
|
|
356
|
+
plt.text(x + 0.01 * (b - a), y + 0.01 * (d - c), f"({x},{y})")
|
|
357
|
+
return
|
|
358
|
+
|
|
359
|
+
pts = np.asarray(pts)
|
|
360
|
+
values = np.array([-f[1] for s, f in st.get_skeleton(0)])
|
|
361
|
+
qs = np.quantile(values, np.linspace(0, 1, 100))
|
|
362
|
+
|
|
363
|
+
def color_idx(d):
|
|
364
|
+
return np.searchsorted(qs, d) / 100
|
|
365
|
+
|
|
366
|
+
from matplotlib.pyplot import get_cmap
|
|
367
|
+
|
|
368
|
+
def color(d):
|
|
369
|
+
return get_cmap("viridis")([0, color_idx(d), 1])[1]
|
|
370
|
+
|
|
371
|
+
cols_pc = np.asarray([color(v) for v in values])
|
|
372
|
+
ax = plt.gca()
|
|
373
|
+
for s, f in st: # simplexe, filtration
|
|
374
|
+
density = -f[1]
|
|
375
|
+
if len(s) <= 1 or f[0] > x or density < -y: # simplexe = point
|
|
376
|
+
continue
|
|
377
|
+
if len(s) == 2: # simplexe = segment
|
|
378
|
+
xx = np.array([pts[a, 0] for a in s])
|
|
379
|
+
yy = np.array([pts[a, 1] for a in s])
|
|
380
|
+
plt.plot(xx, yy, c=color(density), alpha=1, zorder=10 * density, lw=1.5)
|
|
381
|
+
if len(s) == 3: # simplexe = triangle
|
|
382
|
+
xx = np.array([pts[a, 0] for a in s])
|
|
383
|
+
yy = np.array([pts[a, 1] for a in s])
|
|
384
|
+
_c = color(density)
|
|
385
|
+
ax.fill(xx, yy, c=_c, alpha=0.3, zorder=0)
|
|
386
|
+
out = plt.scatter(pts[:, 0], pts[:, 1], c=cols_pc, zorder=10, s=10)
|
|
387
|
+
ax.set_aspect(1)
|
|
388
|
+
return out
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def plot_point_cloud(pts, function, x, y, mma=None, degree=None):
|
|
392
|
+
if mma is not None:
|
|
393
|
+
fig, (a, b) = plt.subplots(ncols=2, figsize=(15, 5))
|
|
394
|
+
plt.sca(a)
|
|
395
|
+
plot_point_cloud(pts, function, x, y)
|
|
396
|
+
plt.sca(b)
|
|
397
|
+
mma.plot(degree=degree)
|
|
398
|
+
box = mma.get_box()
|
|
399
|
+
a, b, c, d = box.ravel()
|
|
400
|
+
mma.plot(degree=1, min_persistence=0.01)
|
|
401
|
+
plt.vlines(x, b, d, color="k", linestyle="--")
|
|
402
|
+
plt.hlines(y, a, c, color="k", linestyle="--")
|
|
403
|
+
plt.scatter([x], [y], c="r", zorder=10)
|
|
404
|
+
plt.text(x + 0.01 * (b - a), y + 0.01 * (d - c), f"({x},{y})")
|
|
405
|
+
return
|
|
406
|
+
values = 1 - function
|
|
407
|
+
qs = np.quantile(values, np.linspace(0, 1, 100))
|
|
408
|
+
|
|
409
|
+
def color_idx(d):
|
|
410
|
+
return np.searchsorted(qs, d) / 100
|
|
411
|
+
|
|
412
|
+
from matplotlib.pyplot import get_cmap
|
|
413
|
+
from matplotlib.collections import PatchCollection
|
|
414
|
+
|
|
415
|
+
def color(d):
|
|
416
|
+
return get_cmap("viridis")([0, color_idx(d), 1])[1]
|
|
417
|
+
|
|
418
|
+
ax = plt.gca()
|
|
419
|
+
idx = function <= y
|
|
420
|
+
circles = [plt.Circle(pt, x, color=color(c)) for pt, c in zip(pts[idx], function)]
|
|
421
|
+
pc = PatchCollection(circles, alpha=0.3)
|
|
422
|
+
ax.add_collection(pc)
|
|
423
|
+
plt.scatter(*pts.T, c=-function, s=20)
|
|
424
|
+
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.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_bitmapf64(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_bitmapf64(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_bitmapf64(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_bitmapi64(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.float64) - _Slicer._inf_value()
|
|
19936
|
+
cdef double[:,:] F = filtration_values
|
|
19937
|
+
cdef double[:,:] c_img = image.reshape(-1,num_parameters)
|
|
19938
19938
|
with nogil:
|
|
19939
19939
|
for i in range(num_gens):
|
|
19940
19940
|
# with gil:
|
|
@@ -19952,7 +19952,7 @@ def _from_bitmapi64(image, **slicer_kwargs):
|
|
|
19952
19952
|
# print(f"F = {np.asarray(F[i])}")
|
|
19953
19953
|
slicer = _Slicer(gen_maps, gen_dims, filtration_values)
|
|
19954
19954
|
return slicer
|
|
19955
|
-
def
|
|
19955
|
+
def _from_bitmapi64(image, **slicer_kwargs):
|
|
19956
19956
|
from multipers import Slicer
|
|
19957
19957
|
dtype = slicer_kwargs.get("dtype", image.dtype)
|
|
19958
19958
|
slicer_kwargs["dtype"] = dtype
|
|
@@ -19970,9 +19970,9 @@ def _from_bitmapi32(image, **slicer_kwargs):
|
|
|
19970
19970
|
cdef cset[unsigned int] vertices
|
|
19971
19971
|
|
|
19972
19972
|
cdef unsigned int num_gens = gen_dims.size()
|
|
19973
|
-
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.
|
|
19974
|
-
cdef
|
|
19975
|
-
cdef
|
|
19973
|
+
filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.int64) - _Slicer._inf_value()
|
|
19974
|
+
cdef int64_t[:,:] F = filtration_values
|
|
19975
|
+
cdef int64_t[:,:] c_img = image.reshape(-1,num_parameters)
|
|
19976
19976
|
with nogil:
|
|
19977
19977
|
for i in range(num_gens):
|
|
19978
19978
|
# with gil:
|
|
@@ -19990,7 +19990,7 @@ def _from_bitmapi32(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_bitmapi32(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.int32) - _Slicer._inf_value()
|
|
20012
|
+
cdef int32_t[:,:] F = filtration_values
|
|
20013
|
+
cdef int32_t[:,:] 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.float64:
|
|
20035
20037
|
return _from_bitmapf64(img, **kwargs)
|
|
20036
20038
|
if img.dtype == np.int64:
|
|
20037
20039
|
return _from_bitmapi64(img, **kwargs)
|
|
20038
20040
|
if img.dtype == np.int32:
|
|
20039
20041
|
return _from_bitmapi32(img, **kwargs)
|
|
20040
|
-
if img.dtype == np.float32:
|
|
20041
|
-
return _from_bitmapf32(img, **kwargs)
|
|
20042
20042
|
raise ValueError(f"Invalid dtype. Got {img.dtype=}, was expecting {available_dtype=}.")
|
|
20043
20043
|
|
|
20044
20044
|
def from_function_delaunay(
|
|
@@ -20046,7 +20046,7 @@ def from_function_delaunay(
|
|
|
20046
20046
|
grades,
|
|
20047
20047
|
int degree=-1,
|
|
20048
20048
|
backend:Optional[_valid_pers_backend]=None,
|
|
20049
|
-
vineyard=None, #
|
|
20049
|
+
vineyard=None, # Optionmal[bool], wait for cython
|
|
20050
20050
|
dtype=np.float64,
|
|
20051
20051
|
bool verbose = False,
|
|
20052
20052
|
bool clear = True,
|
|
@@ -20061,9 +20061,9 @@ def from_function_delaunay(
|
|
|
20061
20061
|
backend : slicer backend, e.g. "matrix", "clement"
|
|
20062
20062
|
vineyard : bool, use a vineyard-compatible backend
|
|
20063
20063
|
"""
|
|
20064
|
-
from multipers.io import
|
|
20064
|
+
from multipers.io import function_delaunay_presentation_to_slicer, _init_external_softwares
|
|
20065
20065
|
s = multipers.Slicer(None, backend=backend, vineyard=vineyard, dtype=dtype)
|
|
20066
|
-
|
|
20066
|
+
_init_external_softwares(requires=["function_delaunay"])
|
|
20067
20067
|
function_delaunay_presentation_to_slicer(s, points, grades, degree=degree, verbose=verbose,clear=clear)
|
|
20068
20068
|
if degree >= 0:
|
|
20069
20069
|
s.minpres_degree = degree
|
|
@@ -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
|
@@ -764,7 +764,7 @@ def from_function_delaunay(
|
|
|
764
764
|
grades,
|
|
765
765
|
int degree=-1,
|
|
766
766
|
backend:Optional[_valid_pers_backend]=None,
|
|
767
|
-
vineyard=None, #
|
|
767
|
+
vineyard=None, # Optionmal[bool], wait for cython
|
|
768
768
|
dtype=np.float64,
|
|
769
769
|
bool verbose = False,
|
|
770
770
|
bool clear = True,
|
|
@@ -779,9 +779,9 @@ def from_function_delaunay(
|
|
|
779
779
|
backend : slicer backend, e.g. "matrix", "clement"
|
|
780
780
|
vineyard : bool, use a vineyard-compatible backend
|
|
781
781
|
"""
|
|
782
|
-
from multipers.io import
|
|
782
|
+
from multipers.io import function_delaunay_presentation_to_slicer, _init_external_softwares
|
|
783
783
|
s = multipers.Slicer(None, backend=backend, vineyard=vineyard, dtype=dtype)
|
|
784
|
-
|
|
784
|
+
_init_external_softwares(requires=["function_delaunay"])
|
|
785
785
|
function_delaunay_presentation_to_slicer(s, points, grades, degree=degree, verbose=verbose,clear=clear)
|
|
786
786
|
if degree >= 0:
|
|
787
787
|
s.minpres_degree = degree
|
|
@@ -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.3b2
|
|
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,39 +5,39 @@ 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=
|
|
8
|
+
multipers/function_rips.cp311-win_amd64.pyd,sha256=s2lrvKbJVGbOjuu8AfmAm6WtCQuXchepGWNJInbARHw,329216
|
|
9
9
|
multipers/function_rips.pyx,sha256=j5NjbK3YrAv_2s8YHB1JB0k6m9NC7RQCSFlJe-w_kgE,5252
|
|
10
|
-
multipers/grids.cp311-win_amd64.pyd,sha256=
|
|
10
|
+
multipers/grids.cp311-win_amd64.pyd,sha256=zJTsC_IUjWlUYY1KC125KF0SWh4umPZiAOq3PWosNnI,482304
|
|
11
11
|
multipers/grids.pyx,sha256=ONN_RKkuxqwb9IaS9gd42FUGaiBLc8QWcd3L-ubZjKE,16575
|
|
12
|
-
multipers/io.cp311-win_amd64.pyd,sha256=
|
|
12
|
+
multipers/io.cp311-win_amd64.pyd,sha256=QYVkdiKrXmSLMddkMl6Px8fYal3sgxcSZPLMhW5V5eg,222720
|
|
13
13
|
multipers/io.pyx,sha256=pQBH_rSqaCZqDSxTLnhlyECP3fLbX2tR_RKJHydHm_0,22210
|
|
14
|
-
multipers/mma_structures.cp311-win_amd64.pyd,sha256=
|
|
14
|
+
multipers/mma_structures.cp311-win_amd64.pyd,sha256=ZZQvuoKP76MQX1AVk7KCe-_l14rsxRXDc-_JnfdPirw,1325056
|
|
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.cp311-win_amd64.pyd,sha256=
|
|
20
|
-
multipers/multiparameter_module_approximation.pyx,sha256=
|
|
19
|
+
multipers/multiparameter_module_approximation.cp311-win_amd64.pyd,sha256=JELqN9vZNA1E7cM6eN9uilAIqCNUI7mp13xrEzVO3A8,446976
|
|
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.cp311-win_amd64.pyd,sha256=
|
|
22
|
+
multipers/plots.py,sha256=UrVWFQvc7csmRIhTbY-3J1VQh78EjpaduCk76dbt-x0,14229
|
|
23
|
+
multipers/point_measure.cp311-win_amd64.pyd,sha256=vHP_1g_1988j8z4dwMiiaNE2NjTTnd6VKBZhqFLWNPs,604160
|
|
24
24
|
multipers/point_measure.pyx,sha256=DVhal6HgCCuALSJMcHHKOW16CwDQCVTc2PpK8cGCqx8,12109
|
|
25
|
-
multipers/simplex_tree_multi.cp311-win_amd64.pyd,sha256=
|
|
25
|
+
multipers/simplex_tree_multi.cp311-win_amd64.pyd,sha256=IkkhRH9uosn-BmrANP5m0tO5BYceAdcdRVBaGPz1NPI,3757056
|
|
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.cp311-win_amd64.pyd,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.cp311-win_amd64.pyd,sha256=TwmUG38-26G4JxjtKt0lnFO7_aq-vVCMpmYguzaGP4Y,11619840
|
|
30
30
|
multipers/slicer.pxd,sha256=fzA-lL_QWyUMf9rRSpcKG35QNS9UXEmVC9r7kR0geho,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=rvQZVc4i_AsUDzWAvzXptPLBVtvwGeHCv5Pp5uhu7Co,894041
|
|
33
|
+
multipers/slicer.pyx.tp,sha256=jZOdsHKMpq0nclmvlzkZUDzdjffT3_mFDVY_mnsl9Es,44523
|
|
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
|
|
37
37
|
multipers/tbbmalloc_proxy.dll,sha256=fcM6szEVHayvxKW8sPUTWoqEZx1_4FbWni81hbOcbi4,31232
|
|
38
38
|
multipers/tensor.pxd,sha256=MSmaMU0sOP9CHLmg4dym7nOGaI1S4cOdM01TQ9flI54,417
|
|
39
39
|
multipers/test.pyx,sha256=-g7WU-jKrZK8H0c-6eAPsfrApjvTKrUoswVYFu8LoV4,1798
|
|
40
|
-
multipers/array_api/__init__.py,sha256=
|
|
40
|
+
multipers/array_api/__init__.py,sha256=y8WJQwh9rkzM2vZn_WpsLMzOxdg5ZDqockSnpK8vBfY,1111
|
|
41
41
|
multipers/array_api/numpy.py,sha256=aXNzWLfDIv0_kFqRzYUUcpAJuM9SX3_fm73Bx18nogs,606
|
|
42
42
|
multipers/array_api/torch.py,sha256=w55ow_Gxht2FOvc5EksCfaceh5gMTNKixHVsAMeSZik,548
|
|
43
43
|
multipers/data/MOL2.py,sha256=nLZHy2OSFN9Z2uJKsbqWOEG2R7G-uH6dCLHG48UjvR4,15428
|
|
@@ -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.3b2.dist-info/licenses/LICENSE,sha256=UsQRnvlo_9wpQS9DNt52GEraERHwK2GIRwuqr2Yv5JI,1071
|
|
182
|
+
multipers-2.3.3b2.dist-info/METADATA,sha256=dzqMyVIOk45QhWOjmyZRVi4oT6P6ogNxcGZ9hoSfemw,9672
|
|
183
|
+
multipers-2.3.3b2.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
|
|
184
|
+
multipers-2.3.3b2.dist-info/top_level.txt,sha256=L9e0AGmhRzrNw9FpuUx-zlqi5NcBOmrI9wYY8kYWr8A,10
|
|
185
|
+
multipers-2.3.3b2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|