cut pursuit algorithms
Project description
Cut-Pursuit Algorithms, Parallelized Along Components
Generic C++ classes for implementing cut-pursuit algorithms.
Specialization to convex problems involving graph total variation, and nonconvex problems involving contour length, as explained in our articles (Landrieu and Obozinski, 2016; Raguet and Landrieu, 2018).
Parallel implementation with OpenMP.
MEX interfaces for GNU Octave or Matlab.
Extension modules for Python.
This Git repository uses submodules.
Clone with
git clone --recurse-submodules https://gitlab.com/1a7r0ch3/parallel-cut-pursuit
Pull changes with
git pull --recurse-submodules
Table of Contents
- General problem statement
- C++ classes and Specializations
2.1. Proximity operator of the graph total variation
2.2. Quadratic functional and graph total variation
2.3. Separable multidimensional loss and graph total variation
2.4. Separable distance and contour length - Documentation
3.1. Directory tree
3.2. Graph structure
3.3. C++ documentation
3.4. GNU Octave or Matlab
3.5. Python - References
- License
General problem statement
The cut-pursuit algorithms minimize functionals structured, over a weighted graph G = (V, E, w), as
F: x ∈ ΩV ↦ f(x) + ∑(u,v) ∈ E w(u,v) ψ(xu, xv) ,
where Ω is some base set, and the functional ψ: Ω² → ℝ penalizes dissimilarity between its arguments, in order to enforce solutions which are piecewise constant along the graph G.
The cut-pursuit approach is to seek partitions V of the set of vertices V, constituting the constant connected components of the solution, by successively solving the corresponding problem, structured over the reduced graph G = (V, E), that is
arg minξ ∈ ΩV F(x) , such that ∀ U ∈ V, ∀ u ∈ U, xu = ξU ,
and then refining the partition.
A key requirement is thus the ability to solve the reduced problem, which often have the exact same structure as the original one, but with much less vertices |V| ≪ |V|. If the solution of the original problem has only few constant connected components in comparison to the number of vertices, the cut-pursuit strategy can speed-up minimization by several orders of magnitude.
Cut-pursuit algorithms come in two main flavors, namely “directionally differentiable” and “noncontinuous”.
-
In the directionally differentiable case, the base set Ω is typically a vector space, and it is required that f is differentiable, or at least that its nondifferentiable part is separable along the graph and admits (potentially infinite) directional derivatives. This comprises notably many convex problems, where ψ(xu, xv) = ║xu − xv║, that is to say involving a graph total variation. The refinement of the partition is based on the search for a steep directional derivative, and the reduced problem is solved using convex or continuous optimization; optimality guarantees can be provided.
-
In the noncontinuous case, the dissimilarity penalization typically uses ψ(xu, xv) = 0 if xu =xv, 1 otherwise, resulting in a measure of the contour length of the constant connected components. The functional f is typically required to be separable along the graph, and to have computational properties favorable enough for solving reduced problems. The refinement of the partition relies on greedy heuristics.
Both flavors admit multidimensional extensions, that is to say Ω is not required to be only a set of scalars.
C++ classes and Specializations
The module maxflow
implements the class Maxflow
, a modification of the Graph
class of Y. Boykov and V. Kolmogorov, for making use of their maximum flow algorithm.
The module cut_pursuit
implements the base class Cp
, defining all steps of the cut-pursuit approach in virtual methods.
The module cut_pursuit_d1
implements the class Cp_d1
derived from Cp
, specializing cut-pursuit for directionally differentiable cases involving the graph total variation.
The module cut_pursuit_d0
implements the class Cp_d0
derived from Cp
, specializing cut-pursuit for noncontinuous cases involving the contour length penalization.
Cp_prox_tv
: proximity operator of the graph total variation
Also coined “graph total variation denoising” or “general fused LASSO signal approximation”. The objective functional is
F: x ∈ ℝD⨯V ↦ 1/2 ║y − x║Mℓ2 + ∑(u,v) ∈ E w(u,v) ║xu − xv║p, Mδ ,
where D is the dimension of the signal on each vertex, y ∈ ℝD⨯V, Mℓ is a diagonal metric weighting the square ℓ2 norm, w ∈ ℝE are regularization weights, and the norm on the finite differences is defined by p being 1 or 2 and a weighting diagonal metric Mδ.
The reduced problem is solved using the preconditioned forward-Douglas–Rachford splitting algorithm, included as a git submodule pcd-prox-split
.
Cp_d1_ql1b
: quadratic functional, ℓ1 norm, bounds, and graph total variation
The base set is Ω = ℝ, and the general form is
F: x ∈ ℝV ↦
1/2 ║y(ℓ2) − Ax║2 +
∑v ∈ V λv
|y(ℓ1) − xv| +
∑v ∈ V
ι[mv, Mv](xv) +
∑(u,v) ∈ E w(u,v)
|xu − xv| ,
where y(ℓ2) ∈ ℝn, A: ℝV → ℝn is a linear operator, y(ℓ1) ∈ ℝV and λ ∈ ℝV and w ∈ ℝE are regularization weights, m, M ∈ ℝV are parameters and ι[a,b] is the convex indicator of [a, b] : x ↦ 0 if x ∈ [a, b], +∞ otherwise.
When y(ℓ1) is zero, the combination of ℓ1 norm and total variation is sometimes coined fused LASSO.
When A is the identity, λ is zero and there are no box constraints, the problem boils down to the proximity operator of the graph total variation.
Currently, A must be provided as a matrix. See the documentation for special cases.
The reduced problem is solved using the preconditioned forward-Douglas–Rachford splitting algorithm, included as a git submodule pcd-prox-split
.
An example with GNU Octave or Matlab and Python interfaces, where A is a full ill-conditioned matrix, with positivity and fused LASSO constraints, on a task of brain source identification from electroencephalography.
ground truth | raw retrieved activity | identified sources | ||||
Cp_d1_lsx
: separable loss, simplex constraints, and graph total variation
The base set is Ω = ℝD, where D can be seen as a set of labels, and the general form is
F: x ∈ ℝD⨯V ↦ f(y, x) +
∑v ∈ V ιΔD(xv) +
∑(u,v) ∈ E w(d1)(u,v)
∑d ∈ D λd |xu,d − xv,d| ,
where y ∈ ℝD⨯V, f is a loss functional (see below), w(d1) ∈ ℝE and λ ∈ ℝD are regularization weights, and ιΔD is the convex indicator of the simplex ΔD = {x ∈ ℝD | ∑d xd = 1 and ∀ d, xd ≥ 0}: x ↦ 0 if x ∈ ΔD, +∞ otherwise.
The following loss functionals are available, where w(f) ∈ ℝV are weights on vertices.
Linear: f(y, x) = − ∑v ∈ V w(f)v ∑d ∈ D xv,d yv,d
Quadratic: f(y, x) = ∑v ∈ V w(f)v ∑d ∈ D (xv,d − yv,d)2
Smoothed Kullback–Leibler divergence (equivalent to cross-entropy):
f(y, x) = ∑v ∈ V w(f)v
KL(α u + (1 − α) yv, α u + (1 − α) xv),
where α ∈ ]0,1[,
u ∈ ΔD is the uniform discrete distribution over D,
and
KL: (p, q) ↦ ∑d ∈ D pd log(pd/qd).
The reduced problem is solved using the preconditioned forward-Douglas–Rachford splitting algorithm, included as a git submodule pcd-prox-split
.
An example with the smoothed Kullback–Leibler is provided with GNU Octave or Matlab and Python interfaces, on a task of spatial regularization of semantic classification of a 3D point cloud.
ground truth | random forest classifier | regularized classification | ||||
Cp_d0_dist
: separable distance and weighted contour length
The base set is Ω = ℝD or ΔD and the general form is
F: x ∈ ℝD⨯V ↦ f(y, x) + ∑(u,v) ∈ E w(d0)(u,v) ║xu − xv║0 ,
where y ∈ ΩV, f is a loss functional akin to a distance (see below), and ║·║0 is the ℓ0 pseudo-norm x ↦ 0 if x = 0, 1 otherwise.
The following loss functionals are available, where w(f) ∈ ℝV are weights on vertices and m(f) ∈ ℝD are weights on coordinates.
Weighted quadratic: Ω = ℝD and
f(y, x) = ∑v ∈ V w(f)v ∑d ∈ D m(f)d (xv,d − yv,d)2
Weighted smoothed Kullback–Leibler divergence (equivalent to cross-entropy):
Ω = ΔD and
f(y, x) = ∑v ∈ V w(f)v
KLm(f)(α u + (1 − α) yv, α u + (1 − α) xv),
where α ∈ ]0,1[,
u ∈ ΔD is the uniform discrete distribution over D,
and
KLm(f): (p, q) ↦ ∑d ∈ D m(f)d pd log(pd/qd).
The reduced problem amounts to averaging, and the split step uses k-means++ algorithm.
When the loss is quadratic, the resulting problem is sometimes coined “minimal partition problem”.
An example with the smoothed Kullback–Leibler is provided with GNU Octave or Matlab interface, on a task of spatial regularization of semantic classification of a 3D point cloud.
Documentation
Directory tree
.
├── include/ C++ headers, with some doc
├── octave/ GNU Octave or Matlab code
│ ├── doc/ some documentation
│ └── mex/ MEX C++ interfaces
├── pcd-prox-split/ git submodule preconditionned forward-Douglas–Rachford
│ algorithm (required only for directionnaly
│ differentiable cases and example data)
├── python/ Python code
│ ├── cpython/ C Python interfaces
│ └── wrappers/ python wrappers and documentation
├── src/ C++ sources
└── wth-element/ git submodule for weighted quantiles search
(required only for cp_d1_ql1b)
C++ documentation
Requires C++11
.
Be sure to have OpenMP enabled with your compiler to enjoy parallelization. Note that, as of 2020, MSVC still does not support OpenMP 3.0 (published in 2008); consider switching to a decent compiler.
The number of parallel threads used in parallel regions is crucial for good performance; it is roughly controlled by a preprocessor macro MIN_OPS_PER_THREAD
which can be again set with-D
compilation flag. A rule of thumb is to set it to 10000
on personal computers with a handful of cores, and up to 100000
for large computer clusters with tens of cores.
The C++ classes are documented within the corresponding headers in include/
.
Graph structure
Graph structures must be given as forward-star representation. For conversion from simple adjacency list representation, or for creation from scratch for regular N-dimensionnal grids (2D for images, 3D for volumes, etc.), see the pcd-prox-split/grid-graph
git submodule.
GNU Octave or Matlab
See the script compile_parallel_cut_pursuit_mex.m
for typical compilation commands; it can be run directly from the GNU Octave interpreter, but Matlab users must set compilation flags directly on the command line CXXFLAGS = ...
and LDFLAGS = ...
.
The integer type holding the components assignment is by defaut on 16 bits. For applications expecting a large number of components, this can be extended to 32 bits with the compilation option -DCOMP_T_ON_32_BITS
.
Extensive documentation of the MEX interfaces can be found within dedicated .m
files in octave/doc/
.
The script example_prox_tv.m
exemplifies the use of Cp_prox_tv
, on a task of color image denoising.
The script example_EEG.m
exemplifies the use of Cp_d1_ql1b
, on a task of brain source identification from electroencephalography.
The scripts example_labeling_3D.m
and example_labeling_3D_d0.m
exemplify the use of, respectively, Cp_d1_lsx
and Cp_d0_dist
, on a task of spatial regularization of semantic classification of a 3D point cloud.
Python
Requires numpy
package.
See the script setup.py
for compiling modules with setuptools
; it can be run simply by using pip
e.g. python -m pip install .
. pre compiled binaries for Windows and Linux will soon be available on PyPI
.
if more than 65535 components are expected in you graph you can force the use of 32 bit indices by setting
the COMP_T_ON_32_BITS
environement variable to 1 e.g. export COMP_T_ON_32_BITS=1
on bash.
Extensive documentation of the Python wrappers can be found in the corresponding .py
files.
The script example_prox_tv.py
exemplifies the use of Cp_prox_tv
, on a task of color image denoising.
The script example_EEG.py
exemplifies the use of Cp_d1_ql1b
, on a task of brain source identification from electroencephalography.
The scripts example_labeling_3D.py
and example_labeling_3D_d0.py
exemplify the use of, respectively, Cp_d1_lsx
and Cp_d0_dist
, on a task of spatial regularization of semantic classification of a 3D point cloud.
References
L. Landrieu and G. Obozinski, Cut Pursuit: Fast Algorithms to Learn Piecewise Constant Functions on Weighted Graphs, 2017.
H. Raguet and L. Landrieu, Cut-pursuit Algorithm for Regularizing Nonsmooth Functionals with Graph Total Variation, 2018.
Y. Boykov and V. Kolmogorov, An Experimental Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision, IEEE Transactions on Pattern Analysis and Machine Intelligence, 2004.
License
This software is under the GPLv3 license.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for pycut_pursuit-0.1.1-cp312-cp312-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 79cecb74964b3d99b7997e3f1ad43850f2aef4937c6cfccb386fb67f4d03f804 |
|
MD5 | e5c8fdacacbe90fce0fd0cb96a6efeba |
|
BLAKE2b-256 | 6af41968c52e79dc2f0c33da4c614a86658f6648ce74edff21490b900b0bbb4b |
Hashes for pycut_pursuit-0.1.1-cp312-cp312-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d0a57332ae6dbfc29f6e42589c7adbc5aaca9fce90b527047bc4ebb5b61ee2b3 |
|
MD5 | 9447dd08adc98bed854afcab349f4b2d |
|
BLAKE2b-256 | 7ffdb2791d0d72bc629958db6ceac90e36fabbe6cea7f05368c7d1a831a9cf17 |
Hashes for pycut_pursuit-0.1.1-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 11bf42653b137e81ae1f8fff0369ee905de6f3ff4247a66847c18f33055c6b82 |
|
MD5 | 1e24a6597250186e83ba8d5e8693a4bc |
|
BLAKE2b-256 | 52020442a64690fd816ed18a24a89e8b097065fb12a5b65a8b0f0bb7bad8acd2 |
Hashes for pycut_pursuit-0.1.1-cp312-cp312-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b5838252b833fda63c3e2dfea7d8138bb662d45a40910e25dc243ff7252e15b9 |
|
MD5 | 7d7992bb74da467da750eb05561d58d4 |
|
BLAKE2b-256 | 5f7fe1bcd0c99675bb465bcc25b441e2710de623e377a77fedb955fff4121d06 |
Hashes for pycut_pursuit-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 839ee82a98aff80696750ee54754c6a9f8b9f28529f25fd8446b24424d1554d9 |
|
MD5 | 0a24416185874ba5260eab0963bfa18e |
|
BLAKE2b-256 | 7bbb3861bfa9d70b552067e25915ac04989d9394797389572612e3586e3c7924 |
Hashes for pycut_pursuit-0.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 528d12254bd1deb73844399b63ed3ea127c1d54dc186514fb0814c5bb1c81f5d |
|
MD5 | cbefc49f0dcfcae8100b59aea51e714e |
|
BLAKE2b-256 | e52e8387161a932553018d71c7380bd4755a264480a6f66ee7614d933be1bc71 |
Hashes for pycut_pursuit-0.1.1-cp312-cp312-macosx_14_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 01f5b3da9b68ce018cce21e571864799e87b0912cec2d07b438dc6e57fff66d1 |
|
MD5 | 01dc6c5ad82063b830e74e32a44f75d1 |
|
BLAKE2b-256 | e0bd467b0340bf08d29ca68a104e4e6004e92672631c7573d82b89f0b5d95799 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6e23788f50da5a6a83db70e3ada90d6bfebb369e3d8c97984fe619b7c64e2a91 |
|
MD5 | fff32ff12cb7fbe1bfe4d5a6e936950d |
|
BLAKE2b-256 | 6a6f99135aa2aaff705fea42c737610ae6bb4b96fa47e6c204026e601d3d4ca2 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ccdf682c6d7ab9f9e6650a5b70fc1b17a2839f4b0ca1dd721d2867f2c2f9681c |
|
MD5 | 0b0ef4766eeadc4139c5ea7d3e2766b6 |
|
BLAKE2b-256 | 72836cfac8d7df9ecc9c8db584f358714e789cf775e46364a77c5e2784072013 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b4c1ca33fd4c7fbd129b044b18323c81fd1a3d5ba8882fbafb2b8a0854de6a97 |
|
MD5 | 23fc46551cdf21bf58696778e8891797 |
|
BLAKE2b-256 | cc0b7ff98973f94feddaba476d5787e79e27d8f9786a12e0be95732e91aa0fc5 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8272c9f305638623cd1658ed9f78045e58d82e30059c1cbe2774909541385768 |
|
MD5 | 67d616cc861b2bc5a7ac90a744a3db59 |
|
BLAKE2b-256 | 8c12d427ff2484c4893ea32538d8eacd1c8dc56f8409f34d1c6cc13e7f619288 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 68f279a5d191359a9fc1fae6bdea4d9ec988644c779b51052a89aebc57ea9c0d |
|
MD5 | 912c8fa93a6f8e84536758decf9ed6dc |
|
BLAKE2b-256 | bdc8cfac22b8618c2611a879646d09efaee8115f4905bd9988f3d3fa5c7558e2 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cb69e6766b14c01973385583fd7d76b5717d0299e2ff3507ae91a834a04ad3a9 |
|
MD5 | b9ceff72487b45622bc7e56675235b49 |
|
BLAKE2b-256 | 0f22c1a06804a703bd5fd19057ee6575a4516481957b2dd4a5272f4d390a9130 |
Hashes for pycut_pursuit-0.1.1-cp311-cp311-macosx_14_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7ec7242337ef983b43c376577762c570ed5b74149068224e2411b3a94b5de96 |
|
MD5 | 4e72a74fd2ec980542704119d3229c63 |
|
BLAKE2b-256 | 88cbef37f671e6eeac348bb860a7b06e77b36fc49060c30c98d826ac7265bed6 |
Hashes for pycut_pursuit-0.1.1-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6f25bfda66b07d207c0e65e3540dd2251e24cb98b073a283afe5f4d79b8bde3a |
|
MD5 | 599737b719cbe33aaac96c9cb4ce178f |
|
BLAKE2b-256 | 7f81713e7bf0004d511279497e3561c8995d3344b5d14e210b1470f7e921e807 |
Hashes for pycut_pursuit-0.1.1-cp310-cp310-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 88a4aab07d93f3388025c9c090ec098605bc9251a317df33f0b93424cc746e5f |
|
MD5 | 50078f65196503eb49a163197b6bb961 |
|
BLAKE2b-256 | 677da29bf39a9e1b11e02b2c829a39e90b1a9a78f527aafce31347d1212b1dcd |
Hashes for pycut_pursuit-0.1.1-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a03128c5bd4477b52cd326fd56b7ae81d1404f5a863c0f6d043f2e2cf3b36b6a |
|
MD5 | 328342bcada2d92f5a10205a392d499b |
|
BLAKE2b-256 | dd46cfcfadedb0a5b2832a8ec77356a3431fb728a0bd95de7ae4e449deca7212 |
Hashes for pycut_pursuit-0.1.1-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aa3258928e44bc7fc7aa68ddfdeb7bf82ca056a9b09c296b1af1b361e3d6b83f |
|
MD5 | 7a4b828cef0f517ca5f25c54f57ed491 |
|
BLAKE2b-256 | a8fe91f4ef239e44ee83b0ca672dfa9d67f780cfa1d479758809f16b2dd4bf2d |
Hashes for pycut_pursuit-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c5cda4ee8605264573eaa7a252b0d876dbdac2a44869aedf8be12367f16cf4a |
|
MD5 | b507f71b8b4c0bfaa168e395bd89f069 |
|
BLAKE2b-256 | 988513b8c36435adef38d3102fda998aff314e42e12cdd427826bb10770888b6 |
Hashes for pycut_pursuit-0.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b621667a49eba9cdd08ff19fdff3443c94bf1d8afec7025add7e5cf1373ad437 |
|
MD5 | 6baf3a0bbf897737adaa92c0aec19bb8 |
|
BLAKE2b-256 | e11e59db3c97b938aefd21c8efd393575ccfe432414a05dfa3060c3fa8590b50 |
Hashes for pycut_pursuit-0.1.1-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 10550647e8b1e2c13b36dd470f434e63a67cca392d40832363d95e10e2db2962 |
|
MD5 | 089ba2287f3be5b5b7e30dc714c99836 |
|
BLAKE2b-256 | 7441e784eecce19d394cb6cdf10bde255087eb0673b71c3d27a397f500f7a827 |
Hashes for pycut_pursuit-0.1.1-cp39-cp39-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 546acea84cc8a26c68e681bbadfaa437d29d80238f73ee32143b47f4877d1e39 |
|
MD5 | d41cdb51f8e070ae099930ea2c6ba54f |
|
BLAKE2b-256 | c1a844dbbd90ec894c4e3f37760442443bbe801afcfe442f80e71379e0bfe155 |
Hashes for pycut_pursuit-0.1.1-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 599fad162e79dcffbe8e7a0f2cdcc2e506162f6a8dd4ea80a458d33789c11bf7 |
|
MD5 | 0425cdf08ab99db788d0f5c2a45c1053 |
|
BLAKE2b-256 | 60220dcada687a889abba9032886017c89bd31aaa6e0f10266ac174fe6012b5a |
Hashes for pycut_pursuit-0.1.1-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2f99a68938c9741f00d257f3d7d36a95d1f3dae568f9e053191cda6af3032ff7 |
|
MD5 | 72c0b34938361893e2d7aba5abd49ba4 |
|
BLAKE2b-256 | a0f323ffd578d39b916de4c146e3a3a5529a1cfba93a5f5d6e1109236830e060 |
Hashes for pycut_pursuit-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a89663b866b2b503902a90a91ba5c6674e49c0158f740884e4f321f6bd83b3ff |
|
MD5 | 14ad0c3c56638474fda5bdb8b7ca8bc4 |
|
BLAKE2b-256 | 815847ba54cf99c55840d3cfbd265fb1592774de7ca2c2d17e6ec142af3a1a29 |
Hashes for pycut_pursuit-0.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 214cd223b6225bfb65bebd824b8f119f2c0d70e0bdd425a2672aa34c808c054e |
|
MD5 | 5a5201514a46f33718930461793cf871 |
|
BLAKE2b-256 | fec91c85e9ad7ada4bd9ee7eb1d175de5b013ca217373bd208892cac07207cf0 |