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.166.tar.gz (5.6 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.166-cp310-abi3-win_amd64.whl (17.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.166-cp310-abi3-musllinux_1_2_x86_64.whl (17.3 MB view details)

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

gamfit-0.1.166-cp310-abi3-musllinux_1_2_aarch64.whl (15.2 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.166-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.1 MB view details)

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

gamfit-0.1.166-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (15.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

gamfit-0.1.166-cp310-abi3-macosx_11_0_arm64.whl (14.4 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.166-cp310-abi3-macosx_10_12_x86_64.whl (16.1 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: gamfit-0.1.166.tar.gz
  • Upload date:
  • Size: 5.6 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.166.tar.gz
Algorithm Hash digest
SHA256 2732eee5938ece1698a294ac15b61b88d87dd5ee4294b5ef87a189305a19bbb4
MD5 ba238d7009592259bce7911b3d2d92f0
BLAKE2b-256 d65f7c4f0d1d7a623993f095329232ec561048ffa9d7c846eb34dbc428f90d98

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.166-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 17.8 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.166-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c55a27045cf670a58742d476e63f5d582b4127886dba55a6e6978df9f59b36fc
MD5 82ae4b669e6abdc77f636d4f12699eba
BLAKE2b-256 c06be73c00f1cfbb9250cc0ae5df154da52973f0c125f2df9ec28d986cdc5fab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.166-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 442c179108d76464e5f3dafe227f6d082ad72171de072d43787ca111292fd705
MD5 419acbb8c214bf3eca00a0b097721464
BLAKE2b-256 4d7b29239ccda86fc192880d6b5a5dd99dc97ccecac459a9c0b26af1db79cc51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.166-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 53cb83bdb8d3ac87e98bf45f5718f8a6ba7def9fd340bdbbdea3c405a1916a3f
MD5 729dc0621bcb47f32187938547e12f36
BLAKE2b-256 4fd8f50f9fdfa6c2ea1491bb3ed5d46ea59daacccf660c870219e6d86618976b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.166-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 81f177462f8e66bf29e50b5c7f93e4b27c37202bc5190645183504836ef6206f
MD5 2e3b9ed6f14724925379f624041ac9d2
BLAKE2b-256 a207c5f0a1860af6ff589703270524007f2e855e049a16d354ecec76ef25a105

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.166-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ad9336aa2d04ab0f48fb04029f4b846155ae63e7167ff6602f91077166bf7e9d
MD5 b33de6e78ee2c4953223d5a7e8bb7168
BLAKE2b-256 889c329c505380e916ca68d1320bcf825f4c0c77e361edba404d3d34c5a8b3e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.166-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d5dd844199474defd69c9820aef618acd1f196f82f4d6dc668d9d27a365f10f9
MD5 502677d73d12e742c57b110583d5bf26
BLAKE2b-256 86de886108820b9285a6c7ba1082d1b2ca1759c1c41bba7196e9cdb7d03528b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.166-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 42cbd6e81a698b6f3f3dbf971b04dfff258f6122816cc2b8d551383cb9d9bd4f
MD5 31380ad26c6911724b4a254a36fa041f
BLAKE2b-256 225a4d40f8eb0cfaa654d2c80333cbd3e9e523c94a6c2a55bce995bfb080ac73

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