Skip to main content

🌐 e3j

A fast, full-featured and platform-agnostic equivariance backend for GPU and TPU!

This library can be used in place of e3nn and e3x to replace slow operations in Machine Learned Interatomic Potentials (MLIPs), with carefully optimized and open-source CUDA and Pallas kernels.

The equivariance backend of our MLIP library is e3j as of mlip 0.2.0.

Installation

Pulling from PyPI

The e3j package is available on PyPI. It consists of a thin JAX-based Python API which can run on CPU, GPU and TPU, supporting Python versions from 3.11 to 3.14 included.

For efficiency on GPU, our CUDA binaries are bundled as the e3j_ops package on PyPI. The compatible version of the binaries should be pulled by requiring the "e3j[ops]" extra:

# requirements.txt
e3j[ops] >= 0.1.0b0
jax[cuda13_local] ~= 0.8.0

See JAX installation instructions for more information on JAX versions and their CUDA support. We recommend using a version of JAX above 0.7.0 and CUDA 13.

Building from source

Our dependencies are managed with uv. After cloning the repository, you can build from source by running run one of:

# Existing CUDA 13 install with `e3j_ops` kernels:
uv sync --group cuda13_local --extra ops
# Install CUDA 13 via pip:
uv sync --group cuda13 --extra ops

The Python build internally relies on CMake, scikit-build and pybind11. You can also look at the Makefile for alternate recipes to build kernels, C++ tests and the Python bindings.

The e3j_ops Python package only contains our CUDA binaries and bindings to their associated XLA handlers. It is not meant to be used as standalone until its ABI is reported stable.

Features

e3j provides a platform-agnostic API for GPU and TPU:

  • 🖥️ The same Python API on CPU, GPU and TPU, with a portable JAX fallback when kernels don't apply
  • 🔗 Interoperability made easy via plain jax.Array semantics
  • 🌐 All equivariant building blocks: spherical harmonics (Harmonics), tensor products (TensorProduct, Bigotimes), message-passing convolution (Convolution) and learnable linear maps (Linear, LinearIndexwise) as flax.linen.Module with weight initializations matching e3nn
  • 🏎️ Fused CUDA kernels for GPU (tensor product, message-passing convolution, scatter-add), shipped as the standalone e3j_ops wheel and dispatched through XLA-FFI
  • 🧮 Fused Pallas Mosaic-TPU kernels, computing gather, tensor product, scalar mixing and scatter in a single kernel
  • 🔁 Custom VJP rules for every fused kernel, so they differentiate under jax.grad like any other JAX primitive
  • 🎛️ SPMD support for muliple-device MLIP training
  • 🧱 Multiple memory layouts (leading channels, trailing channels, and a flat e3nn-compatible layout) to trade coalescing off against interoperability
  • 📐 Representation utilities: O(3) and SO(3) spaces, irreps filtering and irrep filtering, permutations and generalized Clebsch-Gordan coefficients
  • 🔌 Full coverage of the e3nn and e3x layers used by an MLIP, kernel-backed or not, so an existing model can be ported over entirely — to train, simulate and benchmark end to end, see mlip
Watch: E3J's Message Passing Convolution kernel on TPU

Contributing

Bug reports, questions and feature requests are welcome via GitHub issues and discussions.

Citing

If you use e3j within your work, we kindly ask you to cite the following preprint:

@article{Peltre26-e3j,
    title   = {{E3J}: an Efficient and Open-Source Euclidean Equivariance Backend},
    author  = {Peltre, Olivier and Picard, Armand and Pichard, Adrien and Giacomoni, Luca and Braganca, Miguel and Heyraud, Valentin and Brunken, Christoph and Tilly, Jules},
    journal = {preprint},
    year    = {2026},
    url     = {(preprint)}
  }
}

Metadata

Release files for e3j 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for e3j 0.1.2
File Size Uploaded
e3j-0.1.2.tar.gz 462.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for e3j 0.1.2
File Interpreter ABI Platform
e3j-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 660.6 kB

Release files / e3j-0.1.2.tar.gz

Download URL e3j-0.1.2.tar.gz
Size 462.3 kB
Tags Source
SHA-256 checksum
How to use checksums
1d2704c1ab7eb7c89534a9cf9594dbd1c9103fc0e7c42fa99909dbc661212a1e
BLAKE2b-256 checksum
How to use checksums
df6e9152ed1f00290472c6f727da6c114ab35ee3cd7980d42b28e27faff83332
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.10

Release files / e3j-0.1.2-py3-none-any.whl

Download URL e3j-0.1.2-py3-none-any.whl
Size 198.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
834214585e50b0375f61b09c47e2c1c465365322d825d8111fb917f5c716a46c
BLAKE2b-256 checksum
How to use checksums
07475dd87cd04f5a947ac06a21197593dd87a640ca489c9b2e2888b8d76e08e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.10
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