Equivariant GNN for MLIPs built on Clifford algebra Cl(3,0)
Project description
CliffordIP: Geometric Algebra Equivariant Graph Neural Network Potentials for Computational Catalysis
Equivariant GNN for machine learning interatomic potentials (MLIPs) built on Clifford algebra Cl(3,0). Targets OC20, OC22, QM9, MD17, and any custom dataset via a plugin registry.
Installation
# Core (Clifford algebra + model + Lightning trainer)
pip install cliffordip
# With OC20/OC22 dataset support
pip install "cliffordip[oc20]"
# Development install (editable, all extras)
pip install -e ".[dev]"
# With uv (recommended)
uv pip install -e ".[dev]"
Quickstart
from cliffordip import CliffordIPWrapper, test_equivariance
# Verify O(3) equivariance is intact
test_equivariance()
# Build a model directly
model = CliffordIPWrapper(
n_channels=52,
n_interactions=5,
cutoff=6.0,
n_rbf=50,
max_neighbors=50,
)
Training
Training uses PyTorch Lightning via the cliffordip-train CLI:
# Fit on OC20 S2EF
cliffordip-train fit \
--config src/cliffordip/configs/dataset/oc20_s2ef.yaml \
--trainer.max_epochs 10 \
--trainer.precision bf16-mixed \
--trainer.devices 4
# Override any parameter
cliffordip-train fit \
--config src/cliffordip/configs/dataset/oc20_s2ef.yaml \
--model.n_channels 64 \
--data.cfg.training.batch_size 32
Supported trainer features (via Lightning)
| Feature | Config |
|---|---|
| BF16 mixed precision | --trainer.precision bf16-mixed |
| Multi-GPU (DDP) | --trainer.devices N --trainer.strategy ddp |
| Gradient clipping | --trainer.gradient_clip_val 1.0 |
| Gradient accumulation | --trainer.accumulate_grad_batches 4 |
| EMA weights | Add EMACallback(decay=0.999) |
| W&B logging | Add WandbLogger(project="mlip") |
| Checkpointing | Built-in ModelCheckpoint callback |
| Early stopping | Built-in EarlyStopping callback |
Python API
import lightning as L
from cliffordip.lightning import CliffordIPLightningModule, CliffordIPDataModule, EMACallback
from cliffordip.train.config_utils import load_config
cfg = load_config(["dataset.name=oc20_s2ef", "model.name=clifford"])
module = CliffordIPLightningModule(cfg)
datamodule = CliffordIPDataModule(cfg)
trainer = L.Trainer(
max_epochs=10,
precision="bf16-mixed",
gradient_clip_val=1.0,
callbacks=[EMACallback(decay=0.999)],
)
trainer.fit(module, datamodule)
Supported Datasets
| Dataset | Extra | Name |
|---|---|---|
| OC20 S2EF / IS2RE | [oc20] |
oc20_s2ef, oc20_is2re |
| OC22 S2EF / IS2RE | [oc22] |
oc22_s2ef, oc22_is2re |
| QM9 | [qm9] |
qm9 |
| MD17 | [md17] |
md17 (+ molecule config) |
Adding a New Dataset
- Create
src/cliffordip/data/mydata.pywith a@register_dataset("mydata")decorated factory - Add
src/cliffordip/configs/dataset/mydata.yamlwith dataset defaults - Add dependencies to
pyproject.tomloptional extras - Add
from cliffordip.data import mydata # noqatosrc/cliffordip/data/__init__.py
Baseline Models
Baseline implementations (PaiNN, NequIP, SchNet, DimeNet++, EquiformerV2, GotenNet, TorchMD-Net) live in baselines/ and are not included in the pip package — they are available in the GitHub repo for reproducibility only. To use them, clone the repo and add the root to your PYTHONPATH.
Architecture
Clifford algebra Cl(3,0)
8-dimensional multivectors with grades 0–3 (scalars, vectors, bivectors, pseudoscalar). Key design choices:
- Grade-sparse dispatch: Selects cheapest geometric product variant based on grade occupancy (~4× faster for early layers)
- Progressive grade activation: Early layers use only grades 0–1; higher grades unlock as the network deepens
- Zero-allocation forward: Pre-allocated multivector tensors, filled via index slices for
torch.compilestability
Layer stack
src/cliffordip/clifford.py— Cl(3,0) primitives (CliffordIPLinear,CliffordIPNorm,CliffordIPGateActivation,CliffordIPGeometricProductLayer)src/cliffordip/interaction.py— Message-passing GNN (RBF edge embedding, equivariant attention, multi-body interactions)src/cliffordip/wrapper.py— Training wrapper (torch.compile, EMA, DeNS)src/cliffordip/lightning/— PyTorch LightningLightningModule+LightningDataModule
Verifying Equivariance
from cliffordip import test_equivariance
test_equivariance() # raises AssertionError if O(3) equivariance is broken
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cliffordip-0.1.0.tar.gz.
File metadata
- Download URL: cliffordip-0.1.0.tar.gz
- Upload date:
- Size: 85.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f75085f97cb566acd35af7b88f9338dab37c92c15198ed713cb352446b54205
|
|
| MD5 |
a2821735a4073d845b8fa3a526ead879
|
|
| BLAKE2b-256 |
f10e00ea49bead2deb7bfd51e5de3e8e3880af64d8e4164e1187a78212664649
|
File details
Details for the file cliffordip-0.1.0-py3-none-any.whl.
File metadata
- Download URL: cliffordip-0.1.0-py3-none-any.whl
- Upload date:
- Size: 64.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80c4659caf421820e2a87fc95a94c118b542e4bdbe3410d1bd9ead5ce78292a9
|
|
| MD5 |
0f4d353497a8a084dd0149c494a54289
|
|
| BLAKE2b-256 |
17b6d8a1125f4db91846ef2c19f6025ce23cec14519dcd615daea7133339a181
|