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.177.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.177-cp310-abi3-win_amd64.whl (18.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.177-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.177-cp310-abi3-musllinux_1_2_aarch64.whl (15.6 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.177-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.177-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.177-cp310-abi3-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.177-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.177.tar.gz.

File metadata

  • Download URL: gamfit-0.1.177.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.177.tar.gz
Algorithm Hash digest
SHA256 3efc96cf6f35763091c87c9be28d40e930e17b650b42bd24e1d03e7319198813
MD5 684dedc382903931fbcbf757683d9eca
BLAKE2b-256 312c0479b43c7b6a5430419bb86e01e63fd6830cc6598a72442051ad89830a27

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.177-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.177-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 de890424271880a8030c9233b2397daf2b3754f76f837b2de72b6b23b5e163cc
MD5 412bfbaf971e11335b8115774092f4b5
BLAKE2b-256 8fcc9f2ccfe1a5f2d5ab24b5d58f0c0b238f9437e1c99032bbe1e2d0dcf98a50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.177-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d3f399bd736179f1fe0d4debaf8fd1a4d57ff8ac02c27f9d6ec7c05793f38739
MD5 f787ed86560a58eeaf6b1142c0b1f13f
BLAKE2b-256 f37492ec507dde776f69759a74229c357c51b5141b228a50349fc0f323d7dabb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.177-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d6b6ee74edcfd908cc651dfde006b30ae95d3b2805b889b26234d1b2761773c3
MD5 d5a46bd1ae2b988c24ee937a4bb6a426
BLAKE2b-256 ffcd60fe2137ab9400f7f396ac31822bdf57164f4b1476e07387525b57171674

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.177-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ef1a3169fa48971f3da8a1900636e9fbc33fd2e0bc2a59655a4b7f2fbf05402
MD5 8c72793d0d7f0e098465bbfdb5aef257
BLAKE2b-256 7053ee90a7f4a7faa5f5cae85dd562a66a0838d25311bfdcfaafc9ad2d8e546e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.177-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 162c4ca81f384847f7e05b7aa05eb5966cb44cb4df6e0ab3daf71fe1620850e4
MD5 a400c7f1e1af2b6b5915104d5aa9624b
BLAKE2b-256 776b51b50c3bc7be1a458a75d6768806d1071462e064f4bc47664c1067722b8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.177-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36078fd8d7fb0a71c5fd9ee1cd39bc0574dc1380f8700ed57c3bc725f02ffa4f
MD5 70e4a0d2f66fae52cbcc1add53c1caaa
BLAKE2b-256 34dfb423c220d26418464602d35d128f56d13d7a23df5ab9b7138e1b5d9085eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.177-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 be9478882fbebb8f6bf3319ac34433e79fb444e16d7ab1108fb9aa1f4601bdf9
MD5 7375a270dc8ae72426be06c47c833995
BLAKE2b-256 d129be199112d15c6ef8e9311990c3da097a0d84420a46a91bbe152d589a67e9

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