Skip to main content

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)

Source distribution for chebax 0.4.1
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)

Table of built distributions (wheels) for chebax 0.4.1
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

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