Skip to main content

Formula-first generalized additive models with a high-performance Rust core

Project description

gamfit

PyPI Python Docs License

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.

rotating recovery of a trefoil knot, latent-free loop, wobbly cylinder, lumpy sphere, bumpy torus, and Möbius double-cover from noisy 3-D point clouds

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

# Smooth fits need enough rows for the basis to be identified; ~20 rows
# is the minimum the default `s(x)` basis (cubic B-spline) is well-posed
# on. Use more rows when the signal is noisier.
train = [
    {"y": 1.05, "x": 0.0}, {"y": 1.32, "x": 0.5}, {"y": 1.78, "x": 1.0},
    {"y": 2.41, "x": 1.5}, {"y": 3.10, "x": 2.0}, {"y": 3.95, "x": 2.5},
    {"y": 4.80, "x": 3.0}, {"y": 5.62, "x": 3.5}, {"y": 6.25, "x": 4.0},
    {"y": 6.71, "x": 4.5}, {"y": 6.94, "x": 5.0}, {"y": 6.88, "x": 5.5},
    {"y": 6.55, "x": 6.0}, {"y": 5.99, "x": 6.5}, {"y": 5.20, "x": 7.0},
    {"y": 4.30, "x": 7.5}, {"y": 3.42, "x": 8.0}, {"y": 2.65, "x": 8.5},
    {"y": 2.10, "x": 9.0}, {"y": 1.82, "x": 9.5},
]

model = gamfit.fit(train, "y ~ s(x)")
print(model.predict([{"x": 1.5}, {"x": 5.0}], 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; sas and beta-logistic learn 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gamfit-0.1.176.tar.gz (5.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

gamfit-0.1.176-cp310-abi3-win_amd64.whl (18.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.176-cp310-abi3-musllinux_1_2_x86_64.whl (17.8 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

gamfit-0.1.176-cp310-abi3-musllinux_1_2_aarch64.whl (15.6 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.176-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.5 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

gamfit-0.1.176-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (15.4 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

gamfit-0.1.176-cp310-abi3-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.176-cp310-abi3-macosx_10_12_x86_64.whl (16.6 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file gamfit-0.1.176.tar.gz.

File metadata

  • Download URL: gamfit-0.1.176.tar.gz
  • Upload date:
  • Size: 5.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for gamfit-0.1.176.tar.gz
Algorithm Hash digest
SHA256 167d44e107df5de4ea0f06fc4cd424496401f61af50b2c716294fd1f439f256f
MD5 5c69df45d0415810aa4f8bb2b0ac0a3e
BLAKE2b-256 97c2279c9ad7a49003a38be74aa72f23de7bcd7d4769365f260ec376c80e7a89

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: gamfit-0.1.176-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 18.4 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

Hashes for gamfit-0.1.176-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 6756837a03e9fe12fc26a6b5664f6a8a8ccb08ad93d4458dea5fb1f4b48d25c6
MD5 805ebc1a18f0b76babe0efeb99f491f9
BLAKE2b-256 df6c2933636f9f3da022889f02b27b137450b49d3859854d0a2b82ac3c2d2998

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for gamfit-0.1.176-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 74f8c338b5c3f770981c8700f8fb8bd37e0e959a8ee1cdc4d21d0424599e2148
MD5 503c9676e95037d672b455620884df29
BLAKE2b-256 f1d4e6a5925f75012bf304ff7db5129f5425bd8d180069c2749c6b6d3919ded9

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for gamfit-0.1.176-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5d0c5aa49f90399366328441cd04c8f8c225104fdf93346766ffe6cb7011a1f0
MD5 57b1fe59c1b9a7c84e9a59270659fc0c
BLAKE2b-256 1130c787ca7743765c19fb25172a632b708cda2d04cd51f25dbe5a33e62dbbd8

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamfit-0.1.176-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df318104ca15053d59afd77953ae1fc66a2a45adbc3fd6fd23bb0e4fcdc2f442
MD5 b5e6613752f75ad94a370ba1164dc230
BLAKE2b-256 3d8058dd4787a1ed2ad96e297a04d6c1a7a380c952d7ed815f300a51ef348238

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for gamfit-0.1.176-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ab8b58f48279e1a25d97a1402872411ae4d8ea65fdb9c6b2efe1ead05afc5874
MD5 7f6b35efcb9a3469b20a10ed1f06b8fa
BLAKE2b-256 ee92418c247d5f314d9a031d7934abf3e1501aa11aa545604868d41f87fc229f

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gamfit-0.1.176-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f7dd5c3287c9d70d49028b3b8b81da3cca14ba6aceb191889985e76d862149a5
MD5 45b4508e0e158dd2b9b220433b6367ab
BLAKE2b-256 ada81d67ef541dd3efcf0fdb550d578c59838c3adfafd4d957c5a8aeb349f1d5

See more details on using hashes here.

File details

Details for the file gamfit-0.1.176-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for gamfit-0.1.176-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 df98c3191fd86dbc261ba2b8e4cbc192f870caeeb600d9b1db793edbd47cabe7
MD5 4e01ad04261f7a9116a58d1b3b0021f6
BLAKE2b-256 102c2d06d9769dbd37ae2b3866db173e0145d610df92aaf967c76464be774769

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page