JAX + Units
Project description
JAX + Units
This module provides an interface between JAX and Pint to allow JAX to support operations with units. The propagation of units happens at trace time, so jitted functions should see no runtime cost. This library is experimental so expect some sharp edges.
For example:
>>> import jax
>>> import jax.numpy as jnp
>>> import jpu
>>>
>>> u = jpu.UnitRegistry()
>>>
>>> @jax.jit
... def add_two_lengths(a, b):
... return a + b
...
>>> add_two_lengths(3 * u.m, jnp.array([4.5, 1.2, 3.9]) * u.cm)
<Quantity([3.045 3.012 3.039], 'meter')>
Installation
To install, use pip
:
python -m pip install jpu
The only dependencies are jax
and pint
, and these will also be installed, if
not already in your environment. Take a look at the JAX docs for more
information about installing JAX on different
systems.
Usage
Here is a slightly more complete example:
>>> import jax
>>> import numpy as np
>>> from jpu import UnitRegistry, numpy as jnpu
>>>
>>> u = UnitRegistry()
>>>
>>> @jax.jit
... def projectile_motion(v_init, theta, time, g=u.standard_gravity):
... """Compute the motion of a projectile with support for units"""
... x = v_init * time * jnpu.cos(theta)
... y = v_init * time * jnpu.sin(theta) - 0.5 * g * jnpu.square(time)
... return x.to(u.m), y.to(u.m)
...
>>> x, y = projectile_motion(
... 5.0 * u.km / u.h, 60 * u.deg, np.linspace(0, 1, 50) * u.s
... )
Technical details & limitations
The most significant limitation of this library is the fact that users must use
jpu.numpy
functions when interacting with "quantities" with units instead of
the jax.numpy
interface. This is because JAX does not (yet?) provide a general
interface for dispatching of ufuncs on custom array classes. I have played
around with the undocumented __jax_array__
interface, but it's not really
flexible enough, and it isn't currently compatible with Pytree objects.
So far, only a subset of the numpy
/jax.numpy
interface is implemented. Pull
requests adding broader support (including submodules) would be welcome!
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
File details
Details for the file jpu-0.0.1.tar.gz
.
File metadata
- Download URL: jpu-0.0.1.tar.gz
- Upload date:
- Size: 15.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c02e3a6189d6f99c5d8188b349972907a28731d7db3924a6ea9eda31e83aabc |
|
MD5 | be9282196308a8623a67a6a1a50e82b9 |
|
BLAKE2b-256 | e11b0d800e3e2ae58746418b1d4a5f0d4ddaae6ed4b096b0353748a0bee968e6 |
File details
Details for the file jpu-0.0.1-py3-none-any.whl
.
File metadata
- Download URL: jpu-0.0.1-py3-none-any.whl
- Upload date:
- Size: 12.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8427e18653aa711495617bd494a7da511f5b68d0f4dc6960b694126aebebd10e |
|
MD5 | 6b726883a6b2e2fa9c4ff571096fa96e |
|
BLAKE2b-256 | c1144d312c93efbc87f29e99043b5ec1b3a42528d54d1edabec5024fd30285a0 |