evoc-rs
Python bindings for evoc-rs: EVoC
clustering for high-dimensional embeddings. The Rust crate does the work. This
is a thin scikit-learn shaped layer over it.
Documentation: https://gregorlueg.github.io/evoc-rs/
This package versions separately from the Rust crate. Changes here are in
python/CHANGELOG.md;
the crate's are in
CHANGELOG.md.
Install
You can just install from PyPI.
uv pip install evoc-rs
Use
import numpy as np
import evoc_rs
rng = np.random.default_rng(0)
X = np.vstack([rng.normal(c * 20, 1, (500, 32)) for c in range(4)]).astype(np.float32)
model = evoc_rs.EVoC(n_neighbours=15).fit(X)
model.labels_ # the most persistent layer, -1 is noise
model.cluster_layers_ # (n_layers, n_samples), finest first
model.persistence_scores_ # (n_layers,), higher is more stable
Parameters go in the constructor, data goes into fit, results come off the
fitted estimator. get_params, set_params, fit and fit_predict are all
there, so it drops into scikit-learn pipelines and GridSearchCV without
scikit-learn being an install requirement.
The hierarchy is the point
Most clustering libraries hand you one labelling. EVoC hands you several, one
per granularity, ranked by how stable each is. labels_ picks the most
persistent for you, but the interesting bit is often a layer or two either side:
for layer, score in zip(model.cluster_layers_, model.persistence_scores_):
print(f"{layer.max() + 1:3d} clusters, persistence {score:.3f}")
Already know how many clusters you want? Pass approx_n_clusters and the finest
layer is binary-searched for it, returning a single layer.
model = evoc_rs.EVoC(approx_n_clusters=8).fit(X)
How it works
Six stages, all in Rust:
- Approximate kNN graph, via
ann-search-rs. - Fuzzy simplicial set over that graph.
- Label-propagation initialisation.
- UMAP-like node embedding with a repulsion term tuned by
noise_level. - MST over mutual reachability distances in the embedding.
- Cluster layers pulled out of the tree by persistence.
Clustering the embedding rather than the original space is what makes it fast and what makes the hierarchy meaningful.
kNN backends
ann_algorithm picks the backend for stage 1. nndescent is the default and
the right first choice for a self-kNN graph. exhaustive is exact, and worth it
below roughly 10k points. hnsw, annoy, ivf, kmknn and balltree are all
there if you have a reason.
Bring your own graph instead, if you already have one:
model = evoc_rs.EVoC().fit(X, precomputed_knn=(indices, distances))
Both arrays are (n_samples, k) and exclude self.
GPU
EVoCGpu moves the kNN stage onto the GPU via wgpu and leaves everything
downstream on the CPU. That only pays off when the search dominates: many
points, high dimension, or an exhaustive search. float32 only, because WGSL has
no f64.
if evoc_rs.gpu_available():
model = evoc_rs.EVoCGpu(n_neighbours=15).fit(X)
gpu_available() answers both "was this wheel built with GPU support" and "is
there an adapter here" at once. The published wheel carries it.
Threads
evoc_rs.set_num_threads(8) # cap it
evoc_rs.set_num_threads(0) # back to one per core
Credit
Port of evoc by Leland McInnes. Where behaviour diverges, the Python original is the source of truth.
Metadata
Release files for evoc-rs 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| evoc_rs-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| evoc_rs-0.1.5-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| evoc_rs-0.1.5-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 15.6 MB
Release files / evoc_rs-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | evoc_rs-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
79738c400c6c542bb7ff646596fd1c8d0f1cc58ffaffcca170ce97f2bde9282f
|
|
BLAKE2b-256 checksum How to use checksums |
e913b6fa872015dc5d51aadbd0b2a64d45b76ff7570de858ab0860844f0e9402
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logRelease files / evoc_rs-0.1.5-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | evoc_rs-0.1.5-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.8 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4df6e10d0f9d2e83316f527e9279af4f3c53dd7ec2a2c28a878229e619651f90
|
|
BLAKE2b-256 checksum How to use checksums |
ddf81a26cafd53f416adb29157a5eba8e8fc850d6897e1535050fd4bddb0ab70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logRelease files / evoc_rs-0.1.5-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | evoc_rs-0.1.5-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.3 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
9cbdf50eb310120a311d6853baf903afe3b3cd6716735a56824dd9921a888f54
|
|
BLAKE2b-256 checksum How to use checksums |
0621040d64237a2f76a6a483ee1f71f8df9fad91ac85a96d8967a6d3d79f3d33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logSecurity for evoc-rs 0.1.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 3 files in this release have been uploaded with provenance metadata.
Attestation for evoc_rs-0.1.5-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.