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


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

gamfit-0.1.143.tar.gz (5.2 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.143-cp310-abi3-win_amd64.whl (17.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.143-cp310-abi3-musllinux_1_2_x86_64.whl (16.8 MB view details)

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

gamfit-0.1.143-cp310-abi3-musllinux_1_2_aarch64.whl (14.7 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.143-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.5 MB view details)

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

gamfit-0.1.143-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

gamfit-0.1.143-cp310-abi3-macosx_11_0_arm64.whl (14.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.143-cp310-abi3-macosx_10_12_x86_64.whl (15.7 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: gamfit-0.1.143.tar.gz
  • Upload date:
  • Size: 5.2 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.143.tar.gz
Algorithm Hash digest
SHA256 285bf545821de0072b844dedc9efad9dda3ce59b4d5400a6f1495463a914fa0f
MD5 b40b9930a4d7d5185ce9f352d3a498f0
BLAKE2b-256 e4bbc0dea017f6318dde6866754365b9d5ddbbba3da3b23fe923390e78fda02e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.143-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 17.3 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.143-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b2bd58358f80b54c391d4db61f40d25a6e14753738e3bac279d90406bcb87d0f
MD5 6bfedbec0027ce00a9edc65795ce77fc
BLAKE2b-256 e0bc31c4da5e8b6aae51fa5581e84c884586ede0c162d7493263570e12ad2682

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.143-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cc3fd92c7736b86e1c4a84b1e8c4b18ccca2742ec545bf479b4bb2470d52fb79
MD5 fa10e131a57526f0d0b0209ae2cbf96f
BLAKE2b-256 2f30586c3977d7e976dfc379a363b7a37e265f44ce5201f541885838abec9871

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.143-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c7a19d5ec14ece9a6e4c50a43785c652b13a1e1ae7ec91826ddba3dda4858a1e
MD5 e9cd9fce25bc9ebcbfafaa6ca7798cec
BLAKE2b-256 54845df103455c9542bcbe1e41e750455ed7ea32f8c2dc05c702c54ba4986b58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.143-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b9d136c43adeea44e636f4afff5966f72d1f9b6326fb33db3559da812d409bb
MD5 8c245eee6ea5aaf0fcce721f03826fda
BLAKE2b-256 d22509ae29217aa00721f278d5d8e63b4fb8ebdd64d694406b1163485012a72c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.143-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cf1d3500de4ce3e664e5ecb891ded327d2b47d19e77ce094bb8cd9170bcf7566
MD5 f3e8af56398aa5c01f718bf04d1bf92b
BLAKE2b-256 eaf472f12dacf186e1723911ae8e2fdaccbc64c1c05e55aef87859aa177e709a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.143-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2473f4f93c685c60d7ecddbc528031f81efb0650e346aac64722446711b0ffb
MD5 c07bd5eb31d66d403d03d4714248cdff
BLAKE2b-256 7ecbde0f40ed3d508148fcfa42c7096a609c83c30f5ed16ffbbe85840147ecdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.143-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 849653d91198782ab3717f971e7ff0ab0cad1867ec882d0773e50ba36b8ec500
MD5 95f011af6e97bb85a2650301a599239d
BLAKE2b-256 bc54b012049980f2175ddedc62ceed51df60faec5461e72741cfaa6beb66234d

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