Tools for JAX
April 14, 2026 · View on GitHub
.. role:: bash(code) :language: bash
.. role:: python(code) :language: python
.. image:: https://img.shields.io/pypi/v/tjax :target: https://pypi.org/project/tjax/ :alt: PyPI - Version :align: center .. image:: https://img.shields.io/badge/version_scheme-EffVer-0097a7 :alt: EffVer Versioning :target: https://jacobtomlinson.dev/effver .. image:: https://img.shields.io/badge/SPEC-0-blue :target: https://scientific-python.org/specs/spec-0000/ :alt: SPEC-0 :align: center .. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json :alt: Ruff :target: https://github.com/astral-sh/ruff .. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ty/main/assets/badge/v0.json :alt: ty :target: https://github.com/astral-sh/ty .. image:: https://img.shields.io/pypi/pyversions/tjax :alt: PyPI - Python Version :align: center
============= Tools for JAX
This repository implements a variety of tools for the differential programming library
JAX <https://github.com/google/jax>_.
Major components
Tjax's major components are:
-
A
dataclass <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/dataclasses>_ decorator :python:dataclassthat facilitates defining structured JAX objects (so-called "pytrees"), which benefits from:- the ability to mark fields as static (not available in
chex.dataclass), and - a display method that produces formatted text according to the tree structure.
- the ability to mark fields as static (not available in
-
A
shim <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/gradient>_ for the gradient transformation libraryoptax <https://github.com/deepmind/optax>_ that supports:- easy differentiation and vectorization of “gradient transformation” (learning rule) parameters,
- gradient transformation objects that can be passed dynamically to jitted functions, and
- generic type annotations.
-
A pretty printer :python:
print_genericfor aggregate and vector types, including dataclasses. (Seedisplay <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/display>_.) It features:- support for traced values,
- colorized tree output for aggregate structures, and
- formatted tabular output for arrays (or statistics when there's no room for tabular output).
Minor components
Tjax also includes:
-
Versions of :python:
custom_vjpand :python:custom_jvpthat support being used on methods: :python:custom_vjp_methodand :python:custom_jvp_method(Seeshims <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/shims.py>_.) -
Tools for working with cotangents. (See
cotangent_tools <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/cotangent_tools.py>_.) -
JAX tree registration for
NetworkX <https://networkx.github.io/>_ graph types. (Seegraph <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/graph/>_.) -
A hashable immutable mapping :python:
frozendictthat is registered as a JAX pytree, so it can be passed through transforms like :python:jitand :python:vmap. (Seefrozendict <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/frozendict.py>_.) -
Leaky integration :python:
leaky_integrateand Ornstein-Uhlenbeck process iteration :python:diffused_leaky_integrate. (Seeleaky_integral <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/leaky_integral.py>_.) -
A testing function :python:
assert_tree_allclosethat automatically produces testing code. And, a related function :python:tree_allclose, which compares pytrees with matching structure. (Seetesting <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/testing.py>_.) -
Basic tools like :python:
divide_where. (Seetools <https://github.com/NeilGirdhar/tjax/blob/master/tjax/_src/math_tools.py>_.)
Contribution guidelines
The implementation should be consistent with the surrounding style, be type annotated, and pass the linters below.
To run tests: :bash:uv run pytest
There are a few tools to clean and check the source:
- :bash:
uv run ruff check - :bash:
uv run ruff format - :bash:
uv run ty check