Skip to main content

afisp-rs

A clean-room Rust + PyO3 implementation of the AFISP workflow: stability analysis to find worst-performing data subsets, then interpretable subgroup phenotyping.

Full documentation: DOCUMENTATION.md

Two Python APIs ship in one package:

Import Use when
from afisp import … You want the original sklearn-style API (fit(X, losses), optional EBM, plotting)
from afisp_rs import … You want the Rust-backed API (fit_from_mu_hat, fit_with_estimator, explicit backends)

Install from PyPI

pip install afisp-rs

Original AFISP compatibility (EBM cross-fit, pandas, plotting, statsmodels):

pip install "afisp-rs[original]"

Demo extras (includes PyTorch surrogate losses):

pip install "afisp-rs[demo]"

Requires Python ≥ 3.9 and numpy. Prebuilt wheels are provided for common Linux, macOS, and Windows platforms. If no wheel matches your platform, pip builds from source and you will need Rust + Python dev headers.


Quick start

Rust-native API (recommended for new code)

import numpy as np
from sklearn.ensemble import RandomForestRegressor
from afisp_rs import WorstSubsetFinder, SubgroupPhenotyper, brier_loss

y_true = np.array([0, 1, 0, 1, 0, 1], dtype=np.uint8)
y_score = np.array([0.2, 0.8, 0.3, 0.7, 0.1, 0.9])
losses = np.asarray(brier_loss(y_true, y_score))

X = np.random.randn(len(losses), 3)

finder = WorstSubsetFinder(subset_fractions=[0.5, 1.0], eps=1e-8, random_state=7)
finder.fit_with_estimator(X, losses, RandomForestRegressor(random_state=7), cv=3)

print("Worst-case risks:", finder.r_hats_)
print("Subset masks:", finder.subset_masks())

subset_labels = finder.subset_masks()[0].astype(np.uint8)
phen = SubgroupPhenotyper(backend="sirus", random_state=7, sirus_num_trees=64)
phen.fit(
    X,
    subset_labels,
    losses,
    y_true=y_true,
    y_score=y_score,
    performance_threshold=0.6,
)
print(phen.summary_table())

Original-style sklearn API

from afisp import WorstSubsetFinder, SubgroupPhenotyper

# Requires: pip install "afisp-rs[original]"
# Uses ExplainableBoostingRegressor by default for conditional-loss cross-fit.

finder = WorstSubsetFinder(subset_fractions=[0.2, 0.4, 1.0], cv=10, eps=1e-5)
finder.fit(X, losses, feature_names=["age", "sex", "score"])
print(finder.R_hats_)
print(finder.confidence_intervals())
idx, effect = finder.find_max_effect_size()

For Rust-backed phenotyping through the compatibility layer, pass y_true, y_score, and performance_threshold to SubgroupPhenotyper.fit().


What is implemented

Stage 1 — Stability analysis

  • Fold-aware worst-subset thresholds on out-of-fold conditional loss estimates (mu_hat)
  • Influence-function style worst-case risk estimator with analytical 95% CIs
  • Subset masks, observed fractions, Cohen's d effect sizes

Stage 2 — Subgroup phenotyping

  • backend="sirus" — Rust-native stable rule forest (default)
  • backend="conjunction" — deterministic conjunction miner (DecisionList fallback in afisp layer)
  • Bootstrap AUROC CIs, Holm–Bonferroni correction, Cohen's d filtering

See DESIGN.md for fidelity notes vs the upstream Python reference.


Rust library (crates.io)

[dependencies]
afisp_rs = { version = "0.1", default-features = false }

Pure Rust usage (no Python):

use afisp_rs::WorstSubsetFinderCore;

let mut finder = WorstSubsetFinderCore::new(vec![0.2, 1.0], 0.0, 0);
finder.fit_from_mu_hat(losses, mu_hat, Some(fold_ids)).unwrap();

Enable the Python extension when building with maturin: --features extension-module.


Development (from source)

git clone https://github.com/na399/afisp-rs.git
cd afisp-rs
python -m pip install maturin pytest numpy scikit-learn
maturin develop --release --features extension-module
pytest -q
cargo test --no-default-features

Full example: examples/demo.py


Publishing

Maintainers: see PUBLISHING.md. Releases are automated on v* tags to PyPI (afisp-rs) and crates.io (afisp_rs).


License

MIT License. See LICENSE.

Metadata

Release files for afisp-rs 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for afisp-rs 0.1.1
File Size Uploaded
afisp_rs-0.1.1.tar.gz 29.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for afisp-rs 0.1.1
File
afisp_rs-0.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl PyPy 3.11 PyPy 3.11 7.3 Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
afisp_rs-0.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64 Details
afisp_rs-0.1.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
afisp_rs-0.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64, macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64) Details
afisp_rs-0.1.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
afisp_rs-0.1.1-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
afisp_rs-0.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64 Details
afisp_rs-0.1.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
afisp_rs-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64 Details
afisp_rs-0.1.1-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
afisp_rs-0.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARM64 Details
afisp_rs-0.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ ARM64 Details

Total release size: 8.1 MB

Release files / afisp_rs-0.1.1.tar.gz

Download URL afisp_rs-0.1.1.tar.gz
Size 29.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a08761c9294f86f80b6ccddfbe90a8bda50516ebe9c2492f1ded1b6270164584
BLAKE2b-256 checksum
How to use checksums
fee9c34013090dd927fa20e080fa49a4b2436e6ff0b3e936850a1b4415a153c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 414.8 kB
Tags Linux glibc 2.17+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
ecbe0da2660941938d06e816a6457502de3d9b6fc60215ed9f7783193c7576d3
BLAKE2b-256 checksum
How to use checksums
c760e95c95cf884c7824c7de1f7ace70524a8c165f56fdcd2f2bfc1c2b861a55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 407.2 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
dc453b831adacec9f7c71b4bd19a8bc0be0549a4775f04f5a2a3d28db02c97d9
BLAKE2b-256 checksum
How to use checksums
0c6de5ad912123888deec04d572e0c6e8057129fa988dca7224b77e600bc633a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp314-cp314-win_amd64.whl

Download URL afisp_rs-0.1.1-cp314-cp314-win_amd64.whl
Size 269.0 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
ee3185cc18c80ed6794133208d9f82e96d187eef05d227ce1536af91937d45d9
BLAKE2b-256 checksum
How to use checksums
ce154d4a80728077c7a123203caa7edfb2b70e1f6f34fa56a9ef1ba2fc5fcb2f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 409.5 kB
Tags CPython 3.14 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
2f390a287ed3569df1acdef7792fe94a4c4c3d12bbf9e17dffabd5caa4db089a
BLAKE2b-256 checksum
How to use checksums
464f2f7f41124a303a3f50957c7d596b05cac6190e0b21a5db563a196cf12ada
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL afisp_rs-0.1.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 739.3 kB
Tags CPython 3.14 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ba9130227ce82ab474a31ac463c09396c7d84961f2b1c409015abcba688f9297
BLAKE2b-256 checksum
How to use checksums
19aaa920e4d44efb87882b410d41bb9599f99aa4bdbe09c2434ca7824c181524
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp313-cp313-win_amd64.whl

Download URL afisp_rs-0.1.1-cp313-cp313-win_amd64.whl
Size 268.0 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
1d4e1a2729b9ff18c730303f1b3fa8cecc584999a4a1061d61a82948fd69e03f
BLAKE2b-256 checksum
How to use checksums
29dafb5c5d3b9e4e25c3ab5071e214d0a33571fed158594ac9898c9ce0e9a769
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 409.4 kB
Tags CPython 3.13 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
d5bef11e8ac570664fef5d481c6bd74d5f0f322242d8cc8903d383d1f2d33d26
BLAKE2b-256 checksum
How to use checksums
223a471888f0a0a41b0b96fcdd175ad5873ed52a47ddb871dd173afc5f1b30ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL afisp_rs-0.1.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 739.4 kB
Tags CPython 3.13 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
697b223949a62ac1ea0d7c67ea071c893756e7203b03dc673d505d8832562373
BLAKE2b-256 checksum
How to use checksums
057033eea336c741ea07412f4b5acc4bd4c4269b635aa1c27f18b70444c36178
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp312-cp312-win_amd64.whl

Download URL afisp_rs-0.1.1-cp312-cp312-win_amd64.whl
Size 268.6 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
7315bea413fa8db6c18217c46b0abce50e1d00a7fc50f58e5bdd31868b0777ad
BLAKE2b-256 checksum
How to use checksums
a5288966758966946f4e093efd12d9a39c7021d457cb9363f31d906cfa25f90c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp312-cp312-manylinux_2_34_x86_64.whl

Download URL afisp_rs-0.1.1-cp312-cp312-manylinux_2_34_x86_64.whl
Size 422.0 kB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
bd1c72061d812e0226ab95b75f5d779e5e6442da87da91f59466f00159b80588
BLAKE2b-256 checksum
How to use checksums
d5dcc345eaa87f52170fbc7200e1aa9a2bd61f7565042357ce5b457ea27f8ab4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 409.4 kB
Tags CPython 3.12 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
3a2db8b89eafe9f111e5937f6813025aafe3840cfbb497cf8df62c70f23322af
BLAKE2b-256 checksum
How to use checksums
624508a7f83333f8b957fcefa70459043051ee2a7cf410733a8f4c0218e277a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL afisp_rs-0.1.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 740.1 kB
Tags CPython 3.12 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7955a89ed8162979142b31264551a3131f596ec06ec47ade5fa8f7cddaab22c7
BLAKE2b-256 checksum
How to use checksums
08f7554ccc33e5e6c00c02646cc2caf081363712423c4fc25310fc0c8c90e117
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp311-cp311-win_amd64.whl

Download URL afisp_rs-0.1.1-cp311-cp311-win_amd64.whl
Size 271.7 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
767a1a51df0aaba1025104fbbab0ab166db55aebd7a0860352fd0f518e923108
BLAKE2b-256 checksum
How to use checksums
5a4399f8832805049e7348e4d4b13f5d389f82eb19e72af354e1eb065a11eddf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 413.3 kB
Tags CPython 3.11 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
c71e2e6422bda034fc639d4ca03632a3f4becc6bb299f5dff59777dcf1e6283f
BLAKE2b-256 checksum
How to use checksums
97192733a22f195e987cb1b1cc3a34805e95b97fffb0b95524016d6cf861e7d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL afisp_rs-0.1.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 746.1 kB
Tags CPython 3.11 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
94328b041331e160d0c23d70332d584e43b5e50ca8705ecee123e1c1948d9ae7
BLAKE2b-256 checksum
How to use checksums
d27f512a5d5c3f7eee9e298ba46b652215f591af558924e59cfe5f622d41a45e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp310-cp310-win_amd64.whl

Download URL afisp_rs-0.1.1-cp310-cp310-win_amd64.whl
Size 271.5 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
f186265371a26515106c32ccf6014a17a4fcec1b2b8f9db9c39bc6a6931a283a
BLAKE2b-256 checksum
How to use checksums
3f9a96f9a18414f31bf1f291953d3752609f777edbc8214c8b33cc7077b60fa9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 413.1 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
139ab82066ccc57f11d7b8d06026815fba25ecda6dbf44975f91c942f7981f47
BLAKE2b-256 checksum
How to use checksums
8b4655963c666480f9217e1f62803c2e6ea60302d8e740bdd6aaf807b22e46c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / afisp_rs-0.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL afisp_rs-0.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 415.9 kB
Tags CPython 3.9 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
e97db816729691ec9d26b1d607d99634479cbc388c4f820917035074adae830c
BLAKE2b-256 checksum
How to use checksums
a4bcdc56141fa5c28f4fdf6ad385961959f00ebce4b805f21d8f42d1e30f5d55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release history Release notifications | RSS feed

This release

0.1.1 This release

19 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page