Skip to main content

PyPI Docs CI

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:

  1. Approximate kNN graph, via ann-search-rs.
  2. Fuzzy simplicial set over that graph.
  3. Label-propagation initialisation.
  4. UMAP-like node embedding with a repulsion term tuned by noise_level.
  5. MST over mutual reachability distances in the embedding.
  6. 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)

Table of built distributions (wheels) for evoc-rs 0.1.5
File Interpreter ABI Platform
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 log

Release 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 log

Release 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 log

Security 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.

Select from 3 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page