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.196.tar.gz (6.9 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.196-cp310-abi3-win_amd64.whl (19.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.196-cp310-abi3-musllinux_1_2_x86_64.whl (18.8 MB view details)

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

gamfit-0.1.196-cp310-abi3-musllinux_1_2_aarch64.whl (16.5 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.196-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.5 MB view details)

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

gamfit-0.1.196-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (16.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

gamfit-0.1.196-cp310-abi3-macosx_11_0_arm64.whl (15.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.196-cp310-abi3-macosx_10_12_x86_64.whl (17.6 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: gamfit-0.1.196.tar.gz
  • Upload date:
  • Size: 6.9 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.196.tar.gz
Algorithm Hash digest
SHA256 7c2ab9e3e726dd16e83cb8b507562db40cb8eda425671597d1a0b224bcaf31d3
MD5 a2b7b2d4f3e6935db5f45d9b03a5f11c
BLAKE2b-256 1db0a42fbf912294f130c60d277a4c3db0a13b1490a78f4c29083be4d057be20

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.196-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 19.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.196-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d76eb18f07b7e4c184136020501ef3177d93ae7f1a55316aaed69b86bd504c70
MD5 affc31fe850d0becd9e9b33f386a4724
BLAKE2b-256 7ad61c09958e91eae9271e90ea57f967f1ecd373e561000cc3f3c162cf5bcebe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.196-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c43593ef3c1d7a363175772f451efcafc1d300cc5eb506032e2ed0ea3c91a7b7
MD5 b5bc2e3e79eb2491534350fe2e6e06a8
BLAKE2b-256 d884058a52f845769534106ca9fc697152d74a2c33eaf7ed37866eabcce78c98

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.196-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 546e1c7b95fff6128a1889a461237f94c4889f643201d2d86a1ac686992f9572
MD5 2c78c6906ab6316cced63ddbe5d7a6e0
BLAKE2b-256 ec704980f746b00683f2ac4498fd789b3830f83852d39d025b7965881babae36

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.196-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a72d54e503b6fe051ecb03dad829a4deaafaff703f24be32f2f43abb88799978
MD5 b21d8e0b8531d1fa0d8d64ca74018c67
BLAKE2b-256 083daa65359496bc8f32871dc418d6315c786c3e0d7ba548308017f6e9714622

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.196-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0b8f8d1e3913eb7dfb062edf7dbf60ba478eeca2e06744c7d41b8b38760c3fe5
MD5 78c1675bfd425ff35c97126782808b54
BLAKE2b-256 9df836e333acf2a33a83f8647e0409713342595eca9ccd64f536573e5ed87852

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.196-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 10efc8a2bbd60d5771f74ea42e7473c06de21f73161f5f79475f1b78e9c5cfe7
MD5 6171db6bab0643dc7a80a8784c2ec7bb
BLAKE2b-256 4754bfa821d8e933de70357f704b415cc539c6be9f6ecd0c1e1884facee6ca43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.196-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cafabf591faae29ac0f49785a99720c71ff1b235f82d87bc897a2d69cc3ff2e5
MD5 ec5d3ef19d1f4b31d708f4826acbacbe
BLAKE2b-256 ba23f36b25083b19d4e1f2a9c10456010a78128ce5ad7481a84f70424797bd59

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