chebax
Differentiable special functions for JAX and GPUs, built from Chebyshev approximants. A build-time generator (mpmath precision) produces fixed-degree branchless polynomial kernels with exact derivative series — including gradients with respect to function parameters (Bessel order, Beta shape, von Mises concentration), which mainstream ML libraries lack. No mpmath at use time; the runtime imports only jax and numpy.
pip install chebax
import jax
jax.config.update("jax_enable_x64", True) # before building instances: tables
# materialize in the active precision
import jax.numpy as jnp
import chebax
jv = chebax.besselj(2.5) # any real order in [0, 10]; cached
x = jnp.linspace(0.1, 30.0, 200)
jv(x), jax.vmap(jax.grad(jv))(x) # values and dJ/dx, jit/vmap-safe
chebax.besselk_fn(1.7, x) # order as a traced scalar:
jax.grad(chebax.besselk_fn)(1.7, 5.0) # jax.grad w.r.t. the ORDER
chebax.betainc_fn(2.0, 3.0, 0.4) # dI/da, dI/db via jax.grad (jax#38610)
chebax.betaincinv(2.0, 3.0, 0.05) # differentiable Beta quantile (jax#2399)
What's in
| family | factory | traced params | param derivative | notes |
|---|---|---|---|---|
besselj |
besselj(v), besselj(v, domain=(lo, hi)) |
— | besselj_dnu(v) |
x ≥ 0, validated to 1e4; domain= keeps only the regions covering the window and drops the rest of the evaluation, measured 2.5x f64 / 2.6x f32 (experiments/04), nan outside it |
bessely |
bessely(v) |
— (structural) | bessely_dnu(v) |
x ≥ 1e-6 |
besseli |
besseli(v, scaled=) |
besseli_fn, besseli_ratio |
besseli_dnu(v, scaled=) |
scaled = scipy's ive; the ratio I_{v+1}/I_v is the circular-statistics workhorse |
besselk |
besselk(v) |
besselk_fn, log_besselk_fn |
besselk_dnu(v) |
x ≥ 1e-6; the log form has no underflow ceiling |
| Matérn | — | matern(nu, r, lengthscale) |
via grad |
unit-variance correlation, LEARNABLE smoothness ν ∈ (0, 10] |
betainc |
betainc(a, b) |
betainc_fn, log_betainc_fn |
via grad of _fn |
(a, b) ∈ [0.1, 100]² (panels, split at 10); the log form resolves the lower tail with no underflow floor |
gammainc |
gammainc(a), gammaincc(a) |
gammainc_fn, gammaincc_fn, log_gammainc_fn, log_gammaincc_fn |
via grad of _fn |
a ≥ 0.1 (above 10 via Temme-zone tables, whose v = 10/a axis reaches a = ∞), x ≥ 0; branchless (no while_loop), measured 10–27x vs jax's on GPU f64 at a ≤ 10 (experiments/05) |
hyp1f1 |
hyp1f1(a, b) |
hyp1f1_fn, log_hyp1f1_fn |
via grad of _fn |
Kummer M, (a, b) ∈ [0.1, 10]², x ≥ 0; jax's is documented-unstable (jax#21503); the log form has no overflow ceiling |
| spherical | spherical_jn/yn(n) |
— | — | n ∈ [0, 9], via half-integer tables |
| quantiles | — | betaincinv, gammaincinv, gammainccinv, chi2inv, stdtr, stdtrit |
via grad (IFT) |
jax#2399/#5350/#20358; chi-squared at real dof to 2000; Student-t ν ∈ [0.2, 200] via dedicated slice tables |
| von Mises | — | vonmises_cdf/icdf |
via grad |
κ ∈ [0, 50] |
| erf family | — | dawsn, erfcx |
— (no params) | recent jax ships both; kept as a worked parameter-free recipe (plain functions, so not bake inputs: bake takes Recipe instances) |
| Lambert W | — | lambertw(x, k) |
— | both real branches, jax#13680 |
| Tweedie | — | tweedie_logpdf(p, mu, phi, y), log_wright_bessel0(rho, z) |
via grad |
power p ∈ [1.05, 1.95] (uniform per call), μ, φ > 0 and y ≥ 0 broadcast, the zero mass included; Wright's Φ(ρ, 0; z) with ρ = (2−p)/(p−1) ∈ [1/19, 19]; 89–130x scipy's log_wright_bessel on one CPU core, 254–331x on the GPU (experiments/21) |
Plus the generic core (fit, ChebSeries, PiecewiseCheb) and bake emitters
(chebax.bake.jax_module, chebax.bake.xsf_header: self-contained pure-jax
modules and C++17 headers from an instance; dtype="float" emits an f32
CUDA-shaped kernel body, and truncate_tol=1e-7 drops the converged f64
tail — measured 1.4–2.2x faster f32 evaluation, experiments/12).
For pymc users: import chebax.pytensor (installs with
pip install chebax[pytensor]) registers JAX-backend lowerings for the
pytensor ops that otherwise need tfp-nightly under
pm.sample(nuts_sampler="numpyro"|"blackjax") — betaincinv, gammaincinv,
gammainccinv, erfcx, erfcinv, ive, kve — and adds betainc gradients in its
shape parameters, so censored or truncated StudentT/Beta likelihoods with a
latent scalar shape sample instead of raising. The forward CDFs gammainc,
gammaincc and betainc take their VALUES off the tables too, which is
where the loop-free evaluation shows up for censored and truncated models;
outside the table box they fall back to jax's own, since a forward function
has to answer everywhere. Shape parameters must be
scalar (batched ones fall back to tfp or fail loudly); out-of-domain values
return nan, never silently wrong numbers. gammainccinv takes its
upper-tail probability directly (it used to be solved at 1 - p, which
collapsed everything below ~1e-17 onto one point), so both tails resolve to
the same depth.
For numpyro users: from chebax.numpyro import TruncatedGamma, TruncatedBeta, TruncatedStudentT (installs with pip install chebax[numpyro]) gives the
truncated distributions numpyro's location-scale machinery cannot cover
(numpyro#969, numpyro#1365): full Distribution classes with reparameterized
inverse-CDF sampling (has_rsample), truncation-normalized log_prob, and
gradients through every parameter including the shapes, so NUTS and SVI work
with a latent concentration or df. The truncation is normalized in log space,
so an interval whose two ends land in the same tail still works: Gamma(3)
truncated to [50, 51] has mass ~3e-20 and returns an ordinary density.
chebax.numpyro.Tweedie(mu, phi, power) is the compound Poisson-gamma law for
data with exact zeros and positive amounts in one likelihood (claims,
rainfall, biomass). Its log_prob is chebax.tweedie_logpdf, differentiable
in the power too, so NUTS can sample p instead of taking it fixed: on 1,500
draws at (mu, phi, p) = (3, 0.6, 1.35) the posterior is p = 1.41 +- 0.05.
Shape parameters are uniform per call; domain boxes are in the module
docstring and checked at construction.
notebooks/ holds themed, executed walkthroughs: why Chebyshev nodes work,
the Bessel family with a learnable Matérn kernel, differentiable quantiles,
truncated and circular distributions in numpyro, Gaussian tails / Lambert W /
binomial reliability, copulas, baking, and per-group shape parameters in a
hierarchical model under NUTS. The numpyro and plotting
dependencies install with pip install chebax[examples]. examples/ holds
plain scripts: a few of the notebook workflows in copy-paste form, plus
integration examples with no notebook counterpart (a GIG distribution for
efax, learned Matérn smoothness, truncated sampling, chebax.numpyro with
latent shape parameters under NUTS).
Parameters come first, evaluation point last (opposite of scipy). Orders/shapes
are uniform per call, meaning one value whatever its shape: a scalar or any
size-1 array, which is what numpyro and pytensor hand back after broadcasting.
Per-element parameter arrays are out of scope by design and say so by name.
The middle ground is chebax.pergroup(fn, group_idx): a static integer array
assigns each element to a group, each group gets its own (traceable) parameter
set — one group per chain, mixture component, or plate level.
Accuracy is validated against mpmath at 40 dps — measured worst cases and the
per-family error metrics are in each test file's docstring; tables regenerate
bit-for-bit from checked-in generators.
Docs
Architecture defines module boundaries, numerical contracts, and validation; Coding style defines naming, formatting, and documentation conventions. Adding a recipe is the workflow for new functions. The October review records the latest review, how each finding was resolved, and what is open.
docs/increments.md is the design log of every recipe (what was measured,
which traps were found); PROJECT.md holds the plan and evidence; CLAUDE.md
has agent operating instructions and local test commands.
Grown out of a private research project on GPU Bessel functions;
its two load-bearing measurements are reproduced here in experiments/.
BSD-3-Clause.
Metadata
Release files for chebax 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| chebax-0.4.1.tar.gz | 9.9 MB | With provenance | Details for chebax-0.4.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| chebax-0.4.1-py3-none-any.whl | Python 3 | none | any | Details for chebax-0.4.1-py3-none-any.whl |
Total release size: 19.8 MB
Release files / chebax-0.4.1.tar.gz
| Download URL | chebax-0.4.1.tar.gz |
|---|---|
| Size | 9.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e27b4c8e674cba6f8e2bcf87b967f69abd433e5f8d708c8ac97abaa5c1cb2ae5
|
|
BLAKE2b-256 checksum How to use checksums |
67c401b6208d141d018e6afd7de32b219c8962a1291f00f9ae29fcfa536a55b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / chebax-0.4.1-py3-none-any.whl
| Download URL | chebax-0.4.1-py3-none-any.whl |
|---|---|
| Size | 9.9 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
61f901991d1238e2b63584dc5bc01f1ba6c9deec33d1e89c784e5904174fe70b
|
|
BLAKE2b-256 checksum How to use checksums |
90ee19802e30fd615a7d2085be94f882c0b122535ba8de34569769c29044a34e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logSecurity for chebax 0.4.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for chebax-0.4.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.