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

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.145-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.145-cp310-abi3-musllinux_1_2_aarch64.whl (14.7 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.145-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.145-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.145-cp310-abi3-macosx_11_0_arm64.whl (14.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.145-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.145.tar.gz.

File metadata

  • Download URL: gamfit-0.1.145.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.145.tar.gz
Algorithm Hash digest
SHA256 6be2316cf426d86bd5b59b3e959afe9afd56eecbe204120d20a7aab177b6132d
MD5 bb44f4cdb3659cc300edc862031ac7e5
BLAKE2b-256 b74364620fda3ed207c1556d1866239ff6d700563c5ba9979c00df1a081cece6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.145-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.145-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 577c7c863dbc9493b77dc1fbc169e73b85fd7e72a9e5e1cbe2359e3152892c22
MD5 a560622d26d86c7fafd8845861c582bb
BLAKE2b-256 c46609bb815238eec8dfff0e04e5542fac3c869697f58c821b4e8d9a392e69f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.145-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a86a09b14f793e354210813c8ad2d4402fcb275289e185784701bfb7cd3344bb
MD5 a91f669a1faa89a934ce2f977dd02ad2
BLAKE2b-256 b0892f2a9ddeaab34a95b16f29757659c1722511ce2d6badbadb12d295a1002c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.145-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 53ceb30957b3af88df850b46fbb4f92201b90b45487405d6a4961b3cb59dedb6
MD5 533761a5b76380fb21218184257c98cb
BLAKE2b-256 fa503f61d4ce9e705f91afb2a2be3ff1fcd4f4da4b2b14410ef8210c23724cf2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.145-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c72a5144b957f522e80109b862c9f410fa8e4b1ecc69a4239f41da4590fee397
MD5 f04acf727685922dcbbf63b94f2d3dda
BLAKE2b-256 121a892d8e9a58f0c17ac50d4125085e283bf3a5c66c99806fc1ac73fa0074a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.145-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7c870696cc9b9f337df18d7b873f373d55adfcdc0c900bbea089ce9650ea6381
MD5 97831cfc86983bc2f4a8d669d7fc3652
BLAKE2b-256 0968314a89c3af6da74a82417794bd292d074d52fe9ca8c8f937b55fabfa7001

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.145-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c87f45cf4386986c12b3b495d2e5f8e0452217ce4f84de506014a0e261aaf5e8
MD5 3c39fbbf7c941a42feb68f74b7095ca6
BLAKE2b-256 a654507cc4c8a59aac96ff5e8c3e83442381ab98df188efb4be63ba9b34f6346

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.145-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 26713e7e2b03248105b163e4744aa21a8bfc7c55965899cffb7cffa77c62cda0
MD5 54e8383983100f4177a67e13b5fbb8b8
BLAKE2b-256 6b9fcd17e0f0f0779da84edcfaba898abfe171ea5a9330b8daaab27c854a41c7

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