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.155.tar.gz (5.5 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.155-cp310-abi3-win_amd64.whl (17.6 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.155-cp310-abi3-musllinux_1_2_x86_64.whl (17.1 MB view details)

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

gamfit-0.1.155-cp310-abi3-musllinux_1_2_aarch64.whl (15.0 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.155-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.8 MB view details)

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

gamfit-0.1.155-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.9 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

gamfit-0.1.155-cp310-abi3-macosx_11_0_arm64.whl (14.2 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.155-cp310-abi3-macosx_10_12_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: gamfit-0.1.155.tar.gz
  • Upload date:
  • Size: 5.5 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.155.tar.gz
Algorithm Hash digest
SHA256 2560237ed3ebb55ef7b1a1fc91ee73c15ce68ee47efcd016b07ddd0ad0283e53
MD5 f59560233af3a76371757295acde765c
BLAKE2b-256 c63d96daad8aa9e50828d2348a0291b1da4c4206b93a138b85af0687679d8afa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.155-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 17.6 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.155-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7d7dec9b0d673a0b46393e833c17e675fee338bb9d762f918b2fc1e9d0765b17
MD5 522108474aebd68e356bd93b6b25c4d9
BLAKE2b-256 c2ed69df8a9ef004257dfd54261615c445482e90576af72277a12f567a9e99d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.155-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6c1ff7999df0818484f43e8fa153061b0b64a552393ee456aab12c55e951d214
MD5 386deaa0bcce0972a0e546190b7d7740
BLAKE2b-256 a09abab1ba24f633fc6b1b5d54aeeb00819e9e76e429a46d91ce7aa698b07211

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.155-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9aefab8a0b26aea27a36dfe1b18e0245ca50a40a6c9c3ee8c49172f58020ced0
MD5 3a52b02acc6ecffdcd57296c89db9990
BLAKE2b-256 d0138c64952d8a3b625c28e7b63992ddfc7da3841925163902e09f03ad929803

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.155-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1922d0cda15ba2f72a98fc3d8f951595fe23392049af58913ba66ff66a546917
MD5 7427790ce0030cd05e6a9beb81d745ab
BLAKE2b-256 1877362ea8a85c2fe1237b03573eb02038d08b15cfffdc5a13fb79c62a5d7cb9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.155-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 38c96b8e13f87b44646d92944dc37ace970c9ddc235848527c90ae0ab85823c6
MD5 43b9c84b06bf457578b8019bd0bb1036
BLAKE2b-256 f3d5a2d6a01d0423eb6936ad024d06ad5a313a88be14a2cc07f057e15d7748a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.155-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 690ceadb8a0059a24d2c63d30bf2d8f0b5f841dd859136c69fc3d67565b4c741
MD5 e37b18b2391cb3bf6e5dc7f7e8697910
BLAKE2b-256 c37b71238f743866d89e3fe80acb5f64c34d93fc91f06820fb3af152fefed890

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.155-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 57dcdf27002d264b6b0421d4502c7485092b27901d129b3100da51645f611a25
MD5 043fede5077cbff123f8e196c43c26be
BLAKE2b-256 427caefa05cd2735160ed53c6f52e284a816b0be22310d2dd3e8025063f4ba22

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