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.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 chebax 0.4.0
File Size Uploaded Provenance Actions
chebax-0.4.0.tar.gz 9.9 MB With provenance Details for chebax-0.4.0.tar.gz

Built distribution (wheel)

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

Total release size: 19.8 MB

Release files / chebax-0.4.0.tar.gz

Download URL chebax-0.4.0.tar.gz
Size 9.9 MB
Tags Source
SHA-256 checksum
How to use checksums
c08036ca7df38369ac75e29d97a2411c0b916296b418754b861eb9a7e8b5c15b
BLAKE2b-256 checksum
How to use checksums
982cfd69ba4babc7ddf7fec325a22c7e5989609fca37df9be99dcd77abc8e33c
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 28, 2026.

Transparency log

Release files / chebax-0.4.0-py3-none-any.whl

Download URL chebax-0.4.0-py3-none-any.whl
Size 9.9 MB
Tags Python 3
SHA-256 checksum
How to use checksums
7ee7f4f8e5c502d45072c2a1dcebc71173a2044515cfe935b57afbf4ceb7f140
BLAKE2b-256 checksum
How to use checksums
0e9711c72a53048f6f348cd4eb80509164660739e958ad01a236eb6eac7a4c1c
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 28, 2026.

Transparency log

Security for chebax 0.4.0

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.0.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 28, 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