Skip to main content

PyTorch Cluster

PyPI Version Testing Status Linting Status Code Coverage


This package consists of a small extension library of highly optimized graph cluster algorithms for the use in PyTorch. The package consists of the following clustering algorithms:

All included operations work on varying data types and are implemented both for CPU and GPU.

Installation

Anaconda

Update: You can now install pytorch-cluster via Anaconda for all major OS/PyTorch/CUDA combinations 🤗 Given that you have pytorch >= 1.8.0 installed, simply run

conda install pytorch-cluster -c pyg

Binaries

We alternatively provide pip wheels for all major OS/PyTorch/CUDA combinations, see here.

PyTorch 2.4

To install the binaries for PyTorch 2.4.0, simply run

pip install torch-cluster -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html

where ${CUDA} should be replaced by either cpu, cu118, cu121, or cu124 depending on your PyTorch installation.

cpu cu118 cu121 cu124
Linux ✅ ✅ ✅ ✅
Windows ✅ ✅ ✅ ✅
macOS ✅

PyTorch 2.3

To install the binaries for PyTorch 2.3.0, simply run

pip install torch-cluster -f https://data.pyg.org/whl/torch-2.3.0+${CUDA}.html

where ${CUDA} should be replaced by either cpu, cu118, or cu121 depending on your PyTorch installation.

cpu cu118 cu121
Linux ✅ ✅ ✅
Windows ✅ ✅ ✅
macOS ✅

Note: Binaries of older versions are also provided for PyTorch 1.4.0, PyTorch 1.5.0, PyTorch 1.6.0, PyTorch 1.7.0/1.7.1, PyTorch 1.8.0/1.8.1, PyTorch 1.9.0, PyTorch 1.10.0/1.10.1/1.10.2, PyTorch 1.11.0, PyTorch 1.12.0/1.12.1, PyTorch 1.13.0/1.13.1, PyTorch 2.0.0/2.0.1, PyTorch 2.1.0/2.1.1/2.1.2, and PyTorch 2.2.0/2.2.1/2.2.2 (following the same procedure). For older versions, you need to explicitly specify the latest supported version number or install via pip install --no-index in order to prevent a manual installation from source. You can look up the latest supported version number here.

From source

Ensure that at least PyTorch 1.4.0 is installed and verify that cuda/bin and cuda/include are in your $PATH and $CPATH respectively, e.g.:

$ python -c "import torch; print(torch.__version__)"
>>> 1.4.0

$ python -c "import torch; print(torch.__version__)"
>>> 1.1.0

$ echo $PATH
>>> /usr/local/cuda/bin:...

$ echo $CPATH
>>> /usr/local/cuda/include:...

Then run:

pip install torch-cluster

When running in a docker container without NVIDIA driver, PyTorch needs to evaluate the compute capabilities and may fail. In this case, ensure that the compute capabilities are set via TORCH_CUDA_ARCH_LIST, e.g.:

export TORCH_CUDA_ARCH_LIST = "6.0 6.1 7.2+PTX 7.5+PTX"

Functions

Graclus

A greedy clustering algorithm of picking an unmarked vertex and matching it with one its unmarked neighbors (that maximizes its edge weight). The GPU algorithm is adapted from Fagginger Auer and Bisseling: A GPU Algorithm for Greedy Graph Matching (LNCS 2012)

import torch
from torch_cluster import graclus_cluster

row = torch.tensor([0, 1, 1, 2])
col = torch.tensor([1, 0, 2, 1])
weight = torch.tensor([1., 1., 1., 1.])  # Optional edge weights.

cluster = graclus_cluster(row, col, weight)
print(cluster)
tensor([0, 0, 1])

VoxelGrid

A clustering algorithm, which overlays a regular grid of user-defined size over a point cloud and clusters all points within a voxel.

import torch
from torch_cluster import grid_cluster

pos = torch.tensor([[0., 0.], [11., 9.], [2., 8.], [2., 2.], [8., 3.]])
size = torch.Tensor([5, 5])

cluster = grid_cluster(pos, size)
print(cluster)
tensor([0, 5, 3, 0, 1])

FarthestPointSampling

A sampling algorithm, which iteratively samples the most distant point with regard to the rest points.

import torch
from torch_cluster import fps

x = torch.tensor([[-1., -1.], [-1., 1.], [1., -1.], [1., 1.]])
batch = torch.tensor([0, 0, 0, 0])
index = fps(x, batch, ratio=0.5, random_start=False)
print(index)
tensor([0, 3])

kNN-Graph

Computes graph edges to the nearest k points.

Args:

  • x (Tensor): Node feature matrix of shape [N, F].
  • k (int): The number of neighbors.
  • batch (LongTensor, optional): Batch vector of shape [N], which assigns each node to a specific example. batch needs to be sorted. (default: None)
  • loop (bool, optional): If True, the graph will contain self-loops. (default: False)
  • flow (string, optional): The flow direction when using in combination with message passing ("source_to_target" or "target_to_source"). (default: "source_to_target")
  • cosine (boolean, optional): If True, will use the Cosine distance instead of Euclidean distance to find nearest neighbors. (default: False)
  • num_workers (int): Number of workers to use for computation. Has no effect in case batch is not None, or the input lies on the GPU. (default: 1)
import torch
from torch_cluster import knn_graph

x = torch.tensor([[-1., -1.], [-1., 1.], [1., -1.], [1., 1.]])
batch = torch.tensor([0, 0, 0, 0])
edge_index = knn_graph(x, k=2, batch=batch, loop=False)
print(edge_index)
tensor([[1, 2, 0, 3, 0, 3, 1, 2],
        [0, 0, 1, 1, 2, 2, 3, 3]])

Radius-Graph

Computes graph edges to all points within a given distance.

Args:

  • x (Tensor): Node feature matrix of shape [N, F].
  • r (float): The radius.
  • batch (LongTensor, optional): Batch vector of shape [N], which assigns each node to a specific example. batch needs to be sorted. (default: None)
  • loop (bool, optional): If True, the graph will contain self-loops. (default: False)
  • max_num_neighbors (int, optional): The maximum number of neighbors to return for each element. If the number of actual neighbors is greater than max_num_neighbors, returned neighbors are picked randomly. (default: 32)
  • flow (string, optional): The flow direction when using in combination with message passing ("source_to_target" or "target_to_source"). (default: "source_to_target")
  • num_workers (int): Number of workers to use for computation. Has no effect in case batch is not None, or the input lies on the GPU. (default: 1)
import torch
from torch_cluster import radius_graph

x = torch.tensor([[-1., -1.], [-1., 1.], [1., -1.], [1., 1.]])
batch = torch.tensor([0, 0, 0, 0])
edge_index = radius_graph(x, r=2.5, batch=batch, loop=False)
print(edge_index)
tensor([[1, 2, 0, 3, 0, 3, 1, 2],
        [0, 0, 1, 1, 2, 2, 3, 3]])

Nearest

Clusters points in x together which are nearest to a given query point in y. batch_{x,y} vectors need to be sorted.

import torch
from torch_cluster import nearest

x = torch.Tensor([[-1, -1], [-1, 1], [1, -1], [1, 1]])
batch_x = torch.tensor([0, 0, 0, 0])
y = torch.Tensor([[-1, 0], [1, 0]])
batch_y = torch.tensor([0, 0])
cluster = nearest(x, y, batch_x, batch_y)
print(cluster)
tensor([0, 0, 1, 1])

RandomWalk-Sampling

Samples random walks of length walk_length from all node indices in start in the graph given by (row, col).

import torch
from torch_cluster import random_walk

row = torch.tensor([0, 1, 1, 1, 2, 2, 3, 3, 4, 4])
col = torch.tensor([1, 0, 2, 3, 1, 4, 1, 4, 2, 3])
start = torch.tensor([0, 1, 2, 3, 4])

walk = random_walk(row, col, start, walk_length=3)
print(walk)
tensor([[0, 1, 2, 4],
        [1, 3, 4, 2],
        [2, 4, 2, 1],
        [3, 4, 2, 4],
        [4, 3, 1, 0]])

Running tests

pytest

C++ API

torch-cluster also offers a C++ API that contains C++ equivalent of python models.

export Torch_DIR=`python -c 'import torch;print(torch.utils.cmake_prefix_path)'`
mkdir build
cd build
# Add -DWITH_CUDA=on support for the CUDA if needed
cmake ..
make
make install

Metadata

Release files for torch-cluster-rocm 1.6.3.post7

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 torch-cluster-rocm 1.6.3.post7
File
torch_cluster_rocm-1.6.3.post7-cp314-cp314-manylinux_2_32_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.32+ x86-64 Details
torch_cluster_rocm-1.6.3.post7-cp313-cp313-manylinux_2_32_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.32+ x86-64 Details
torch_cluster_rocm-1.6.3.post7-cp312-cp312-manylinux_2_32_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.32+ x86-64 Details
torch_cluster_rocm-1.6.3.post7-cp311-cp311-manylinux_2_32_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.32+ x86-64 Details
torch_cluster_rocm-1.6.3.post7-cp310-cp310-manylinux_2_32_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.32+ x86-64 Details

Total release size: 35.1 MB

Release files / torch_cluster_rocm-1.6.3.post7-cp314-cp314-manylinux_2_32_x86_64.whl

Download URL torch_cluster_rocm-1.6.3.post7-cp314-cp314-manylinux_2_32_x86_64.whl
Size 7.0 MB
Tags CPython 3.14 Linux glibc 2.32+ x86-64
SHA-256 checksum
How to use checksums
968abfa7b306bbcc8ad22e2d2b2ee74916f10a51e3d7ca36b1135344f8078390
BLAKE2b-256 checksum
How to use checksums
8019bb3e86e8a520c765fb1806a128dd5e8fa31599f5fd89fe6e6ec2183d791f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / torch_cluster_rocm-1.6.3.post7-cp313-cp313-manylinux_2_32_x86_64.whl

Download URL torch_cluster_rocm-1.6.3.post7-cp313-cp313-manylinux_2_32_x86_64.whl
Size 7.0 MB
Tags CPython 3.13 Linux glibc 2.32+ x86-64
SHA-256 checksum
How to use checksums
7fb2ef060e77ffbc483545879b27247068fa9619e40ad4ad934f01cf3a72858d
BLAKE2b-256 checksum
How to use checksums
bfdff6c4b1eeb94eb6143d2a95f106c8093c5082a984727bd89bee749ccfc88f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / torch_cluster_rocm-1.6.3.post7-cp312-cp312-manylinux_2_32_x86_64.whl

Download URL torch_cluster_rocm-1.6.3.post7-cp312-cp312-manylinux_2_32_x86_64.whl
Size 7.0 MB
Tags CPython 3.12 Linux glibc 2.32+ x86-64
SHA-256 checksum
How to use checksums
de4b259663f0c9c56ad0638dafd8d66eb3156d34a8ff1e8933ae10529073fb9e
BLAKE2b-256 checksum
How to use checksums
409957e858e94d902f6ca62e278532d1154603faf7c2ccfa2446c9d40aad6e18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / torch_cluster_rocm-1.6.3.post7-cp311-cp311-manylinux_2_32_x86_64.whl

Download URL torch_cluster_rocm-1.6.3.post7-cp311-cp311-manylinux_2_32_x86_64.whl
Size 7.0 MB
Tags CPython 3.11 Linux glibc 2.32+ x86-64
SHA-256 checksum
How to use checksums
49c50320e24ecb340ed8928d6c0dfba3d6af417aa9ee68919698c5d9583e12cf
BLAKE2b-256 checksum
How to use checksums
523c193b5519d66320031b533295732ffb1cc43f076a8724cd9f4a05b3a7931c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / torch_cluster_rocm-1.6.3.post7-cp310-cp310-manylinux_2_32_x86_64.whl

Download URL torch_cluster_rocm-1.6.3.post7-cp310-cp310-manylinux_2_32_x86_64.whl
Size 7.0 MB
Tags CPython 3.10 Linux glibc 2.32+ x86-64
SHA-256 checksum
How to use checksums
ef9fc8246039c72ac668493416a1eba5188e09662e1f088d7b506ea737d099e7
BLAKE2b-256 checksum
How to use checksums
6abbcaa80cff440324f7950c3b51e1c3b0824b38ea8e40f8fdeedab77d323e01
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12
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