Formula-first generalized additive models with a high-performance Rust core
Project description
gamfit
Formula-based generalized additive models for Python, backed by a Rust engine.
gamfit fits Gaussian, binomial (including Bernoulli marginal-slope),
Poisson, and Gamma GLMs with smooth terms, random effects,
bounded/constrained coefficients, location-scale extensions, survival
likelihoods, and flexible/learnable links. Smoothing parameters are
selected by REML or LAML. Posterior sampling uses NUTS where supported,
and a Gaussian Laplace approximation otherwise.
Manifold smooths handle predictor spaces that wrap or close: circles, cylinders, tori, and the sphere (intrinsic Wahba and spherical-harmonic kernels), plus periodic tensor products and boundary-conditioned B-splines. The Möbius example in the gallery is a 4π-periodic double-cover parameterization, not a twisted Möbius-strip basis.
Docs: https://gamfit.readthedocs.io/.
Install
uv add gamfit
Wheels are published for Linux (x86_64, aarch64), macOS (x86_64, Apple silicon), and Windows. No Rust toolchain is required.
Example
import gamfit
train = [
{"y": 1.2, "x": 0.0},
{"y": 1.9, "x": 1.0},
{"y": 3.1, "x": 2.0},
{"y": 4.5, "x": 3.0},
]
model = gamfit.fit(train, "y ~ s(x)")
print(model.predict([{"x": 1.5}, {"x": 2.5}], interval=0.95))
print(model.summary())
model.save("model.gam")
pandas, polars, pyarrow, numpy, dict-of-columns, and list-of-records inputs are all accepted without conversion.
Features
- Polyharmonic / Duchon smooths combine magnitude, gradient, and curvature penalty operators on the same basis. P-spline and thin-plate smooths use their standard derivative penalties. Each penalized block has its own smoothing parameter.
- Flexible link functions:
flexible(base)adds a spline offset on a base link;blended(...)learns a mixture weight;sasandbeta-logisticlearn shape parameters. - Surface smooths in arbitrary dimension: thin-plate, Duchon (scale-free
by default, hybrid with
length_scale=...), and Matérn, with automatic knot placement. - Manifold smooths: periodic 1-D, cylinder / torus tensor products, intrinsic sphere (Wahba kernel or spherical harmonics), and boundary-conditioned B-splines.
- Per-axis anisotropy inside a single joint smooth.
- Marginal-slope models that separate baseline risk from a calibrated score's effect, for Bernoulli and survival outcomes.
- Posterior sampling via NUTS where supported, Gaussian Laplace otherwise, behind one API.
API examples
import gamfit
from gamfit.sklearn import GAMRegressor, GAMClassifier
# Validate before you fit
gamfit.validate_formula(train, "y ~ s(x) + group(site)")
# Posterior sampling and mean bands
posterior = model.sample(train, seed=42)
bands = posterior.predict(test, level=0.95)
# Survival
gamfit.fit(df,
"Surv(entry, exit, event) ~ s(age) + bmi + timewiggle(internal_knots=6)",
survival_likelihood="transformation",
baseline_target="weibull",
)
# scikit-learn
est = GAMRegressor(formula="y ~ s(x)")
est.fit(X, y)
# Diagnose, plot, report
model.diagnose(train).metrics
model.plot(train, x="x", kind="prediction")
model.report("report.html")
Public API
| Symbol | Purpose |
|---|---|
gamfit.fit(data, formula, **kwargs) |
Fit a model. |
gamfit.load(path) / gamfit.loads(bytes) |
Reload a saved model. |
gamfit.load_posterior(path) |
Reload a PosteriorSamples archive. |
gamfit.validate_formula(data, formula, ...) |
Type-check a formula without fitting. |
gamfit.build_info() |
Native extension build metadata. |
gamfit.cuda_diagnostics() / gamfit.format_cuda_diagnostics() |
CUDA probe results. |
gamfit.explain_error(exc) |
Human-readable hint for a gamfit exception. |
gamfit.Model |
Fitted model: predict, summary, check, diagnose, plot, report, sample, save. |
gamfit.SurvivalPrediction |
Per-row hazard / survival surface. |
gamfit.CompetingRisksPrediction, competing_risks_cif |
Competing-risks CIF evaluation. |
gamfit.SamplingConfig, PosteriorSamples, PosteriorPredictive, PairedPosteriorSamples |
Posterior interface. |
gamfit.ResponseGeometryModel, sphere_frechet_mean, simplex_frechet_mean, alr, clr, closure |
Response-geometry utilities. |
gamfit.sklearn.GAMRegressor / GAMClassifier |
scikit-learn estimators. |
Full reference: https://gamfit.readthedocs.io/en/latest/api-reference/.
Optional extras
uv add "gamfit[pandas]" # pandas + pyarrow input/output
uv add "gamfit[plot]" # matplotlib-based plotting
uv add "gamfit[sklearn]" # scikit-learn integration
uv add "gamfit[torch]" # PyTorch bridge
uv add "gamfit[all]" # everything
GPU acceleration
CUDA support (cuBLAS / cuSOLVER / cuSPARSE) is built into the same
wheel; there is no separate gamfit-gpu package. Per-op dispatch
thresholds are derived at probe time from measured GPU FP64 throughput,
CPU FP64 throughput, and PCIe bandwidth, so small kernels stay on the
CPU. Inspect the calibrated thresholds with
gamfit.build_info()["cuda_diagnostics"] or
gamfit.format_cuda_diagnostics().
If both a system CUDA toolkit and pip nvidia-*-cu12 wheels are present
in the same environment, gamfit warns once per conflict-set and
continues; glibc resolves dlopen(SONAME) to a single file, so this is
usually benign. If you use gamfit with torch, install a torch build
whose CUDA suffix matches your driver.
License
AGPL-3.0-or-later. See LICENSE.
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 Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gamfit-0.1.105.tar.gz.
File metadata
- Download URL: gamfit-0.1.105.tar.gz
- Upload date:
- Size: 3.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83c5dad534bf539b6b8bd50b3d07050be58ee87a2a9ee578343c48620e68a5ee
|
|
| MD5 |
009e1af0f2935b3f1b983c84d6cd3569
|
|
| BLAKE2b-256 |
f59646c6653c5eae823fdd5c58c3bd8cb89c404c53241abccdc2971fd80dcb95
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 14.1 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
165735d6c741f23eb59fd1bcba5c8a92f6a0b2cd3646ef096538c8ecd0d726ad
|
|
| MD5 |
8da0cfba80f99456c0a320dc2ee2d28a
|
|
| BLAKE2b-256 |
f12a2e49492453dba5fd54f377738dd49af4428211d3625622cfcc50d6eab0ac
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 13.5 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0c77fed1299883728da96179fb7e8ec562a87d1fe6d0bf783925f9d1aedb577
|
|
| MD5 |
120c0572fe787bc57f06abcdfdc6dc80
|
|
| BLAKE2b-256 |
84b544bc84731182e4e3ae1a786ab39d80a8fecfd751d72c164c0d7129970345
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 11.8 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b269cb0a66236cd4ae40b80b66c029ce7b9684159097a7a8b04549f04a6cffbb
|
|
| MD5 |
e1836a276f689609cae91396195b8a87
|
|
| BLAKE2b-256 |
eb607cd23c357679e33fd5b7bb03c32ce5414c22442aa03db518cfa8b3b3b4f8
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 13.4 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0388e2ef4818ac9868935e9b624923cb20dd03a89cdeb0082a83de4f58674ba4
|
|
| MD5 |
1b35d2dbbcb1a13c98470210535f3cff
|
|
| BLAKE2b-256 |
9bd0e72b3953effbd9940bf172300682d63b4857de4f0ddfaf84103e18afe40c
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 11.6 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
647c9950ba16196073be528ee6a686fe5a7df19452236c7a6ddd298417b8b9f7
|
|
| MD5 |
a16b53a174f9b7d458f359481a92b02f
|
|
| BLAKE2b-256 |
483159a64f4f5e79f50e9744a525d7073f628e7b8c7961485775814bd859724f
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 11.4 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
337ad96894d95a6b2f50d2643d2281256110a013a9f9e775106e85fac3844baf
|
|
| MD5 |
ab47136bf0609b840c81f45bb933d99b
|
|
| BLAKE2b-256 |
8662a3cdf52bc398976978e8fcb29f384d413c8f11ebcd932a424e7c6c2575b7
|
File details
Details for the file gamfit-0.1.105-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: gamfit-0.1.105-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 12.8 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a2fad66ecd61393e1c5a4098e5846205c0c4ea810fdead8d037e48432550f1e
|
|
| MD5 |
76be5af73c17f9caaf319076b2cd9e30
|
|
| BLAKE2b-256 |
3eefdd6c97e3318f16bc8d916ec107752a4131df3997ded37bb9138f8ca6b0df
|