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.137.tar.gz (16.8 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.137-cp310-abi3-win_amd64.whl (29.1 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.137-cp310-abi3-musllinux_1_2_x86_64.whl (28.5 MB view details)

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

gamfit-0.1.137-cp310-abi3-musllinux_1_2_aarch64.whl (26.5 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.137-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28.3 MB view details)

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

gamfit-0.1.137-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (26.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

gamfit-0.1.137-cp310-abi3-macosx_11_0_arm64.whl (25.7 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.137-cp310-abi3-macosx_10_12_x86_64.whl (27.5 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: gamfit-0.1.137.tar.gz
  • Upload date:
  • Size: 16.8 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.137.tar.gz
Algorithm Hash digest
SHA256 67aa4a8d6b6b749f35d731b77064167cde0e244bd5c4fc0f7da5d65bdf62c0ca
MD5 fbac2f8f7bf076c62f388c264c84b412
BLAKE2b-256 2945a05b1f43c9de29043c06188e2f08adbf074a03e0813c9b5de3846055b436

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.137-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 29.1 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.137-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 2a19dec4b884d6c08edd0954efb50190534da5ac2b33fb7cb816cd906ef21c0f
MD5 f7e50656ee47b079d1d663d648a86f00
BLAKE2b-256 8ee8f5fc487ddb705315b04b821006ecce1bc5a66b90ef3a06df803d650f7195

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.137-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d930d347f8243bd557cbbb73f335006c2b74d245e033a3f0b2c4f0a5adbad0be
MD5 180d31100eb9030e587577e1682f1cd0
BLAKE2b-256 28fd109027087f59053aa4f125c082510058b132adfee49e421d78f3c482bce6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.137-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 61568ccf0ecda4a82d1f5e34814a76f68b02f10477fd4fe5d2267397aee0b1f1
MD5 55d17334eb3c48aec4ea2e9d051ad22e
BLAKE2b-256 8af9b563387026c8e67bcc945b514ba64bd9191179001c86e2740e604019d91b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.137-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a58e9ecd11f2c4c7f5d458e25b0fb94b227e7445feca34241ea327fdee20cf59
MD5 f14f4d9058ce285cf61e39f7075560b1
BLAKE2b-256 338f8820352735053ea2d04c8c64aa70aaac5043577010ec61736b0378844a8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.137-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1150ed348fad6f2ca335d7b0d40f2f1fce76ed27a8fb0be3b46d58421d395bae
MD5 e3df3577b82b077e8f7c2470f9075741
BLAKE2b-256 16d8e91dde399d2ceea23f2dba1f62173311f9a1550a4a3fb49beb4d7d1a9731

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.137-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a424383053f8fdec421bd18c82e3638a84038fd7af91e52ca4ffef06c24ae37d
MD5 d6d1c606895e5aff70b73e86dfd20516
BLAKE2b-256 14e498acc8a69b49e946397af2ce95921780ae8d55bd25e78cc7c0aab5b76eda

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.137-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7da433c7149949b8c39c858890bfcfc62274498581c9f8a70626aed48f1e369f
MD5 1eaedccdfe7cfd072cf1182a3ca9fbbd
BLAKE2b-256 6c8f832381fed41d469a30a9d9c9b16c1a1f72264b9ef9714d5ef89368dc73bc

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