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.139.tar.gz (17.0 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.139-cp310-abi3-win_amd64.whl (29.0 MB view details)

Uploaded CPython 3.10+Windows x86-64

gamfit-0.1.139-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.139-cp310-abi3-musllinux_1_2_aarch64.whl (26.5 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

gamfit-0.1.139-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.139-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.139-cp310-abi3-macosx_11_0_arm64.whl (25.7 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

gamfit-0.1.139-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.139.tar.gz.

File metadata

  • Download URL: gamfit-0.1.139.tar.gz
  • Upload date:
  • Size: 17.0 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.139.tar.gz
Algorithm Hash digest
SHA256 596ce6a9c5b6baab369c9f192359aacff9f792e3ee5c66dea737b4eb486b0ccc
MD5 22895107ecb88a3b58a9d7804ee6f949
BLAKE2b-256 af3d38c69a8d2fbdb349c2eba6d1aeeb4fcbd4afbd7d2540d66feb0d78cd47d2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gamfit-0.1.139-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 29.0 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.139-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 dd494069c7f311c3cd62cc9341d9ad2c84b13440bf836dcbfa41fdd42089da7e
MD5 f49a61089bb54d36a16439d74d429f3e
BLAKE2b-256 d8b4ee7c2b4e80ad01817e6f78d79f544b72f983728c62f104c37ef558703d0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.139-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7543f085d1635295390516c26aec66b4cbb103074067484e9b0451ba6d328257
MD5 be1037ffc263a2ea2f69ea9633ed7be9
BLAKE2b-256 71c29e2aab649cc20e16f205a8895bef1de9d949f36a15d35a61b58d3667f147

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.139-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3bf1a5431fb0802eb531924680bc6c16aa6912ff4f3c7e4b5ab77555200c3e2c
MD5 fe6691b2dfbba162068694819d77995a
BLAKE2b-256 3379a26951fb5086e2f433cfb5cf2b66b20f690b8a375c504dd8af8b0d099a49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.139-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c8165d04fc133bb963ee320f35905a4a2b33852e48f18c30df7dea4ce2b16cee
MD5 5a59b91f07aa0dcc7229e87c3f596613
BLAKE2b-256 77524910acfdf857ec2fa45d46eae8c7411ed7cd5e2f3f459a1b6941775090da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.139-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a8e1ae34398fc7d135aafd7e80a963d28753fb8bb6bd6a04d2796a253c0b94e3
MD5 ccd88fa2c5ddceaa53e7453b498018e2
BLAKE2b-256 560e5234f64bd10783ebad3ce05e872dc01ea07cda545ae6f18250da853d752c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.139-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9edc97e34abdb41f1db94a2c45b1acba64953424aac2852c901633a67db0030d
MD5 5339a6d374aca64f201982d0258d6b4a
BLAKE2b-256 fcbed5f59696e68b0dfd746c0e28895fb9a14ba5a7c30c9585b250256b15675b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for gamfit-0.1.139-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fce04975da65eb5759b281cde0a7c6f06c7b47b736c307f9d199354936471e1c
MD5 38bc46cb482160cd65d54cbcab4c7aaf
BLAKE2b-256 62ac6181a239156973c69c5221338f1fe5f00d8982ce4b9a80137dd53350d062

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