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 and the `exp` group for benchmarks:
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)}
  }
}

Release files for e3j 0.1.0

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.0
File Size Uploaded
e3j-0.1.0.tar.gz 431.6 kB Details

Built distribution (wheel)

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

Total release size: 577.6 kB

Release files / e3j-0.1.0.tar.gz

Download URL e3j-0.1.0.tar.gz
Size 431.6 kB
Tags Source
SHA-256 checksum
How to use checksums
994671112e4b010e5a96d412d8f621e8db1af60d31997b2c5e997980856b0cf3
BLAKE2b-256 checksum
How to use checksums
445d6f3eb5a05428725e44b88a579c3874babf3a612f4cf6a46ee84ef3223560
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

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

Download URL e3j-0.1.0-py3-none-any.whl
Size 146.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1bbd0bc7bef204c157dab7d357b690fc2f7acef3b78104c6c0b39cefbb5fe459
BLAKE2b-256 checksum
How to use checksums
91fec2d8414d695cd29385c8905d8f5b5da93bd92f16f4530f5f1d3728bc96bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13
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