Skip to main content

GAM core (Rust) with sklearn-style Python bindings — beta

Project description

gamrs

Generalised Additive Models in Rust — clean-room reimplementation built on six composable trait layers (Basis, BasisTransform, Loss/Link/VarianceFn, InnerSolver, ScoreDerivatives, OuterSolver). Designed for parity with R's mgcv.

Status: beta (v0.10). Faster than mgcv_rust 0.23 at every tested fixture and scale (see Performance), and mgcv R-parity on µ across all ten families. Multi-smooth additive (y ~ s(x0) + s(x1)), n-margin tensor products (te(x0, x1, …) / ti(…)) and thin-plate splines (s(x0, x1, bs="tp")) all ship. NegBin and Tweedie fit multi-smooth, with Tweedie offering both profile-p (tw()) and fixed-p (Tweedie(p)).

Install

pip install gamrs            # base wheel
pip install gamrs[quantile]  # + scipy for SHASH-calibrated quantile fits

Quickstart

from gamrs import Gam, CrTerm, TeTerm

# Single 1-D smooth, Gaussian
g = Gam(family="gaussian").fit(X, y)
mu  = g.predict(X)
mu, lo, hi = g.predict_ci(X, level=0.95)

# Multi-smooth additive
g = Gam(terms=[CrTerm("x0", k=10), CrTerm("x1", k=15)]).fit(df, df["y"])

# Tensor product
g = Gam(terms=[TeTerm(cols=("x0", "x1"), k=(5, 5))]).fit(df, df["y"])

# Large-n GLM — switch to the bam()-style fREML optimiser
g = Gam(family="poisson", method="fREML").fit(X_big, y_big)

Full walkthrough: docs/quickstart.md. Optimiser & large-n notes: docs/perf.md.

Families

All ten families land 1-D parity against mgcv:

Family Link Inner solver Outer optimiser Parity (µ rel-err)
Gaussian identity one-Cholesky 1-D Newton ~3e-6
Bernoulli logit PIRLS 1-D Newton ~1e-3
Poisson log PIRLS 1-D Newton ~8e-5
QuasiPoisson log PIRLS 1-D Newton (prof φ) ~2e-4
QuasiBinomial logit PIRLS 1-D Newton (prof φ) ~7e-5
Gamma log PIRLS 1-D Newton (prof φ) ~2e-2
InverseGaussian log PIRLS 1-D Newton (prof φ) ~3e-4
NegBin log PIRLS 2-D joint Newton ~9e-7
Tweedie log PIRLS 3-D joint Newton ~5e-3
TDist (scat) identity PIRLS 3-D joint Newton ~2e-2
Ocat logit gam.fit5 joint β + threshold smoke
Quantile (ELF) identity Armijo BT 1-D Newton smoke

Multi-smooth (s(x0) + s(x1) + …) ships with mgcv R parity tests for Gaussian / Bernoulli / Poisson / QuasiPoisson / QuasiBinomial / Gamma / InvGauss / NegBin / Tweedie. scat / TDist multi-smooth fits run and converge; reference parity tests are pending. Quantile/ELF is single-smooth-only.

Multi-smooth Ocat fits run, produce well-defined predict_proba, and reach 99%+ classification accuracy on synthetic fixtures.

v0.10 ports the full mgcv R outer-Newton stabilisation stack (smart θ-init from category frequencies, diagonal Hessian preconditioning, Gill-Murray-Wright eigen-fix, subset Newton, rank-deficient KKT convergence check). After the ports, single-smooth ocat converges cleanly on every tested seed. Multi-smooth still hits a flat coordinated-shift ridge on the most pathological synthetic fixtures (both θ axes against the bound) where converged_=False lingers despite correct predictions — same regime mgcv R itself bails out of with a "did not converge after 200 iterations" warning. See ~/ObsidianVault/Projects/gamrs/gamrs - mgcv outer-Newton stabilisation techniques (port catalogue) 2026-06-03.md for the full port story.

Smooths

  • Single 1-Ds(x0) via CrTerm (cubic regression spline default).
  • Additive multis(x0) + s(x1) + s(x2).
  • Tensor productte(x0, x1, …) via TeTerm, ti(…) via TiTerm, any n-margin.
  • Thin-plates(x0, x1, bs="tp") via TpsTerm.
  • Random effectss(g, bs="re") via ReTerm.
  • Parametric (linear) — unsmoothed raw column via ParametricTerm or predictor_basis_map={"x": "parametric"} (alias "linear"). Use for 0/1 indicators, counts, or anything you want unpenalised. mgcv R's "pterms" block.

Performance

gamrs vs mgcv_rust 0.23.2, single-smooth, best-of-20 wall time after long warm-up. Numbers >1× mean gamrs is faster. Measured on a single 12th-gen Intel core. See scripts/bench_matters.py.

Single-smooth at gamrs-default k=10, n=2K:

family speedup vs mgcv_rust
Gaussian 1.6×
Poisson 1.9×
Bernoulli 2.1×
Tweedie 2.6×
NegBin 1.0×
scat 0.77×
ocat 14× (†)

(†) ocat speedup is fixture-dependent; mgcv_rust's ocat path is slow on multi-category outputs by construction.

scat closed substantially in v0.11.1 — from v0.10.0's 0.07× to 0.77× of mgcv_rust. Two structural wins drove it: (a) analytic gradient + Level-2 analytic Hessian + observed-W PIRLS + warm-start (v0.11.0), and (b) broadcast-expression conversion + batched-h_diag matmul across the IFT chain (v0.11.1). The remaining ~25 % gap is per-pair work in the Hessian assembly that's already broadcast-friendly — closing it would need either algorithmic shortcuts or fundamentally different BLAS dispatch at small p.

For GLM families at large n, set method="fREML" (mgcv R's bam() equivalent — Wood & Fasiolo 2017 Fellner-Schall multiplicative updates with single-step IRLS per outer iteration). The defaults are sensible at small/medium n; the perf guide covers when to switch.

Rust API

use gamrs::{TermSpec, MarginKind, DesignStrategy};
use ndarray::Array2;

let x: Array2<f64> = /* (n, n_input_dims) */;
let y = /* Array1<f64> */;

let fit = gamrs::fit(gamrs::family::gaussian_identity(), x.view(), y.view(), None, 10)?;

let fit = gamrs::fit_with_design(
    gamrs::family::gaussian_identity(),
    DesignStrategy::Additive { terms: vec![
        TermSpec::Cr { col: 0, k: 10 },
        TermSpec::Cr { col: 1, k: 15 },
    ]},
    x.view(), y.view(), None,
)?;

let fit = gamrs::fit_with_design(
    gamrs::family::gaussian_identity(),
    DesignStrategy::Additive { terms: vec![
        TermSpec::Tensor { col_a: 0, col_b: 1, k_a: 5, k_b: 5,
                           bs_a: MarginKind::Cr, bs_b: MarginKind::Cr },
    ]},
    x.view(), y.view(), None,
)?;

let mu = fit.predict(x.view())?;

Python API

PyO3 bindings + numpy. sklearn-like surface: fit / predict / predict_ci / predict_diff / vcov_ / coef_ / lambda_ / edf_ / fit_stats_, plus serialize / deserialize and GamPredictor for inference-only deployment.

Architecture

Trait layering (src/traits.rs):

Layer 1   Basis              ←  CrBasis, RandomEffectsBasis, TensorProductBasis<A, B>
Layer 1.5 BasisTransform     ←  SumToZero, StableReparam
Layer 2   Loss/Link/Variance ←  10 families (see table above)
Layer 3   InnerSolver        ←  GaussianClosedFormInner, PirlsInner, GamFit5Inner, ArmijoInner
Layer 4   ScoreDerivatives   ←  EnvelopeScore, ShapeAwareEnvelopeScore
Layer 5   OuterSolver        ←  NewtonWithHalving, FellnerSchall
Layer 6   FittedGam          ←  predict, predict_ci, predict_diff, vcov, serialize

Outer optimisers (Newton, Fellner-Schall) and per-family tolerances are selected through Loss::outer_tuning() and Loss::allows_no_refresh(), so adding a family is a Loss impl, not a fork of the optimiser.

Versioning

Beta (0.10.x). The API is stabilising; minor bumps may carry breaking changes until the remaining shape-aware families (scat/Ocat/ELF) gain multi-smooth support and the 1.0 surface is locked.

License

MIT.

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

gamrs-0.11.7.tar.gz (3.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

gamrs-0.11.7-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

gamrs-0.11.7-cp314-cp314-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.14Windows x86-64

gamrs-0.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

gamrs-0.11.7-cp314-cp314-macosx_11_0_arm64.whl (5.1 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

gamrs-0.11.7-cp313-cp313-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.13Windows x86-64

gamrs-0.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

gamrs-0.11.7-cp313-cp313-macosx_11_0_arm64.whl (5.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

gamrs-0.11.7-cp312-cp312-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.12Windows x86-64

gamrs-0.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

gamrs-0.11.7-cp312-cp312-macosx_11_0_arm64.whl (5.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

gamrs-0.11.7-cp311-cp311-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.11Windows x86-64

gamrs-0.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

gamrs-0.11.7-cp311-cp311-macosx_11_0_arm64.whl (5.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

gamrs-0.11.7-cp310-cp310-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.10Windows x86-64

gamrs-0.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

gamrs-0.11.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

File details

Details for the file gamrs-0.11.7.tar.gz.

File metadata

  • Download URL: gamrs-0.11.7.tar.gz
  • Upload date:
  • Size: 3.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for gamrs-0.11.7.tar.gz
Algorithm Hash digest
SHA256 6443ba39a121cc0453dc60f82b0bdd2c3ce06aa127f07a6ea03d76a6b20b3589
MD5 ec9c418acb1c1e5ae242b9525534006f
BLAKE2b-256 b33d063caf372a2084e6358ede772046e0f54cfc8c5934ca653cea2a8bcdbe64

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1bff634e31ec4f82165e061898a2664a8fd14448eaa0646cc85ca4820f8753f0
MD5 0ce20affba1b104104620ec1769a5823
BLAKE2b-256 cc97cc90abee30e19966aba026a005bfaed7d8d997f9e223b811f9320f2b1464

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: gamrs-0.11.7-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for gamrs-0.11.7-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 75ec225ceda6d7e2f0393a9fba079ba7582fbb791b8035d415741af4334cc086
MD5 58f4959496ea4cee2c30b6e7a8861d4a
BLAKE2b-256 4f2c0e22a63ecdc51013b1538a566102b0c20c7c3a7f9772cf2ff57346d10be9

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 deb737b26f0b6014575795892f3fc04a13e1689e9cdf1a141fca2c017b990457
MD5 ee576c7c36db3bc4de93cd743296cf07
BLAKE2b-256 cf9fe41478554504307e1ba2f432a368c4acba0964520b8b4355c60dd43034e8

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6a327964c7166bf14cc43030ef43f38d474b80ea17002935e4dda4a77444a6ca
MD5 9157d03ae33bcbf08037ec7d8d02edaf
BLAKE2b-256 aef98481394348a5573cf94b8b9591695cecb3971bb1c631a7b8be5e7e9cc832

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: gamrs-0.11.7-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for gamrs-0.11.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e579269b601f9c751b0263490be914fb70c6a04278ddad1c62576623722a9854
MD5 882f937cb77ecbc67d51f78282685324
BLAKE2b-256 1fe378331e535e84e458830979024a25a6e4951a1f1522db1ea50b64fcf5fc86

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dae3b81322fbc24d94f2e478466e21d83dcd7c4c194abe20e9db3561de5ff880
MD5 e99dd477b8b4dd2b25426007ce08f755
BLAKE2b-256 5946593a093881fa0af936323654393dc98148f00c569d896dd7b9b4a998905c

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ae1f6a449a8a79d71c2a8dc7ab13f1d7034c1ee5d82c0609af2ca908241f0a75
MD5 889ab6bc245826974704a732edd11395
BLAKE2b-256 72ca253a9808739489c4dbd97576414d6e5475f4cc0cb34a0d373d063248692d

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: gamrs-0.11.7-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for gamrs-0.11.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4c9c45d74302cfd34c21e723ff207960d47c0d49c325497e56d14595b63994e1
MD5 22c43c98e297d7cbb9e7d4a8e5b00734
BLAKE2b-256 0b028fc735c2debfff4914be4cfba6a7d544ba7550c53542c582430377a098f8

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1d90ecf9dc3ef4b3f813411346dd56b3c11c8641ebceb27969878ebdaa900cd3
MD5 019d01cdf4dd3d344bec53d3855a8d41
BLAKE2b-256 c32f39cb1b22869bc94155f6ecd330c1011c07fd683406e5421523927a49e7de

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2cb56d7faa7c6c8cc2f419ecfd1c1eeb6f7c24b4d4f766d3f11719526bcc0c15
MD5 23e453b080ed1bf5819c25504d8f9083
BLAKE2b-256 86652e959a4ef99c40fbfe063130d63c7143ffdb771a5f87f0f9887705dbae50

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: gamrs-0.11.7-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for gamrs-0.11.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9b2490b16700648ca278c92556fe4433f61130bc6e9141bc18f1deff8b2d6b49
MD5 56d57ba0e9dd67d647b3378776e21b92
BLAKE2b-256 72a6c7dc0ba46e91efe7ee9f5c35de5ee405734dc51e54c3aeb10cfecf03b3f6

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bfd0d8903c954889410ff6fd1ccb0330155734efa0585898f980df3fd3af583c
MD5 0976f623d1bb1e854a1bbd2392567d57
BLAKE2b-256 d7ce7c68e8978ae0eeefd9bb8de285171986845d6535eea80d2f87a45807c0c2

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6b98283e6c0dcd5633a50e6e6764ee9594ef7af24b61bb0a1127c6656a34505
MD5 90506c6ca0b5a9d04c729f2c04d51802
BLAKE2b-256 d42872daf2bca0e3b2469f0755b2ab685a1534b5a8b65b3e4fcf6da4c0bb75bf

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: gamrs-0.11.7-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for gamrs-0.11.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a54da60510bb4ab146def85932aa203fe5d12ed771485ff3c576da935c46ec08
MD5 a4caba8b41969a84344f5bc80f39380b
BLAKE2b-256 84ec26bd6d3a87417fcb28ce80b31981a6399c2b36d91978ce5ff97a94782882

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d0dd06fbf1cf365eff0c64b36aadd16204faa4842e318812b49e6daf99ae3742
MD5 85cfab29c25a18331864212be65d719d
BLAKE2b-256 5af953297b32c7eb6c8dff6a741e2f56b90da96486b6a15dc76303711de9fe92

See more details on using hashes here.

File details

Details for the file gamrs-0.11.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gamrs-0.11.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c0ed65a65d0d36f3ee23095ea2b7931c77b40a5d608291c35af2c75e2ff40f3e
MD5 b774c9fec91ab9574ac8eb25ab18a323
BLAKE2b-256 40776beebe9f97fbaaa67a36a33a281f847f227051c7157db065c91ef0b06d15

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