Skip to main content

CliffordIP: Clifford Algebra Equivariant Interatomic Potentials for Heterogeneous Catalysis

Project description

CliffordIP: Clifford Algebra Equivariant Interatomic Potentials for Heterogeneous 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

  1. Create src/cliffordip/data/mydata.py with a @register_dataset("mydata") decorated factory
  2. Add src/cliffordip/configs/dataset/mydata.yaml with dataset defaults
  3. Add dependencies to pyproject.toml optional extras
  4. Add from cliffordip.data import mydata # noqa to src/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.compile stability

Layer stack

  1. src/cliffordip/clifford.py — Cl(3,0) primitives (CliffordIPLinear, CliffordIPNorm, CliffordIPGateActivation, CliffordIPGeometricProductLayer)
  2. src/cliffordip/interaction.py — Message-passing GNN (RBF edge embedding, equivariant attention, multi-body interactions)
  3. src/cliffordip/wrapper.py — Training wrapper (torch.compile, EMA, DeNS)
  4. src/cliffordip/lightning/ — PyTorch Lightning LightningModule + LightningDataModule

Verifying Equivariance

from cliffordip import test_equivariance
test_equivariance()  # raises AssertionError if O(3) equivariance is broken

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

cliffordip-0.1.1.tar.gz (85.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cliffordip-0.1.1-py3-none-any.whl (64.8 kB view details)

Uploaded Python 3

File details

Details for the file cliffordip-0.1.1.tar.gz.

File metadata

  • Download URL: cliffordip-0.1.1.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

Hashes for cliffordip-0.1.1.tar.gz
Algorithm Hash digest
SHA256 9de8e297f5c791d657788c2f2ca152a20325efcb382191bd4534f698b3e805f0
MD5 0f7ad3f607f4d67a59c2add704868897
BLAKE2b-256 38780cd5de0133c0d6059328a633e4a0f70f149422734918b9498b942e52909e

See more details on using hashes here.

File details

Details for the file cliffordip-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: cliffordip-0.1.1-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

Hashes for cliffordip-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f0be97a00576ea2c6d09c8cbb6308b6c339c7fa2316d654401bd202d0c572c03
MD5 0aa177768ec075c8fc7fdb3cef95b37d
BLAKE2b-256 6d878069e77e678edd1aa5ec6b3dc3e85c0ac4fbb1ed0c4ffddaec07896d8d16

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page