HAPC: Highly Adaptive Prinicipal Components
A fast and flexible machine learning library for nonparametric high-dimensional regression and classification with guarantees.
⚠️ Breaking changes in 2.7.0 (read first — humans and coding agents)
Code written for hapc ≤ 2.6.0 that uses family = "binomial" must be checked. R and Python behave identically.
2.7.0 was tagged but never reached PyPI (the wheel build failed). 2.7.1 is the first published release with these changes. It also replaces the scikit-learn dependency by scipy: the package no longer uses scikit-learn.
| What | ≤ 2.6.0 | 2.7.0 |
|---|---|---|
Binomial predictions from hapc() |
log-odds for norm = "1" and "2", probabilities for "sv" |
always probabilities; the linear predictor is in log_odds (cv.hapc / cv_hapc already returned probabilities and still do) |
probabilities, predicted_classes fields |
present in some paths | removed: use predictions (and predictions > 0.5 if classes are needed) |
| Intercept of binomial fits | fitted with the intercept fixed at 0, then calibrated afterwards (biased for unbalanced outcomes) | always an unpenalised intercept estimated jointly, in every norm |
intercept argument |
intercept = FALSE allowed (R, norm = "1") |
default NULL/None; intercept = FALSE is an error for binomial / logit-hazard; for gaussian it must agree with center (center = TRUE ⇔ intercept) |
norm = "2" logistic ridge λ |
effective penalty λ‖β‖² | glmnet's scale, -(1/n)·loglik + (λ/2)‖β‖² (same as glmnet(alpha = 0)): λ values from 2.6.0 are not comparable |
norm = "1" binomial basis |
built from the full HAL design (memory O(n²·Σ C(p,k))) and rebuilt for every fold × λ | built from the n×n kernel once per fold; λ along a warm-started path |
Python norm = "1" solver |
sklearn liblinear |
glmnet's algorithm (IRLS + coordinate descent, no sklearn); max_iter now counts IRLS steps (default 100) |
Grid edges (norm = "1"; also "sv"/"2" in R) |
— | extend_grid = k extends the λ grid at either edge; results report lambda_position (interior, lower_edge, upper_edge, null_model), n_extend, lambda_max |
| Kernel / cross-kernel | single-threaded | multi-threaded, bit-identical results; set the thread count with the env var HAPC_NUM_THREADS |
.Call("logistic_call") (R, unexported) |
present | removed (dead code) |
Migration: replace fit$probabilities / fit.probabilities by predictions, replace predictions used as log-odds by log_odds, and drop any intercept = FALSE.
The binomial norm = "sv" and norm = "2" paths are still pending a full review: they still materialise the HAL design and do not scale to n ≈ 2000 with p ≈ 30. Prefer norm = "1".
Documentation
- Python API (rendered from docstrings): https://hapc.readthedocs.io —
configured via
.readthedocs.yamlanddocs/(Sphinx + autodoc). Build locally withpip install -e ".[docs]" && sphinx-build -b html docs docs/_build/html. - R API (rendered from roxygen): a pkgdown
site built by
.github/workflows/pkgdown.yaml(config in_pkgdown.yml). Build locally withRscript -e 'pkgdown::build_site()'.
Installation
Prerequisites
- Python 3.8+
- C++ compiler (g++, clang, or MSVC)
- CMake 3.15+
- Eigen3
Quick Install
pip install hapc
Prebuilt wheels are published for Linux (manylinux2014, x86_64), macOS (Intel + Apple Silicon) and Windows, for CPython 3.8–3.12. No compiler, CMake or Eigen is needed when a wheel is available.
Linux / HPC clusters
The Linux wheels use the manylinux2014 baseline (glibc 2.17), so
pip install hapc works out of the box on HPC login/compute nodes —
no conda toolchain, devtoolset, or sysroot setup required:
pip install hapc
If you must build from the source distribution (niche architecture, very
old Python, or an air-gapped node), provide a C++17 compiler and either
let CMake fetch Eigen automatically (needs network) or install Eigen and
let find_package(Eigen3) find it:
# with conda compilers (recommended on HPC)
conda install -c conda-forge cxx-compiler cmake eigen
pip install hapc --no-binary hapc
Install from GitHub (latest development version)
pip install git+https://github.com/meixide/hapc.git
Or with editable install for development:
git clone https://github.com/meixide/hapc.git
cd hapc
pip install -e .
Install build dependencies
If installation fails, you may need to install build dependencies:
macOS:
brew install cmake eigen
Ubuntu/Debian:
sudo apt-get install cmake libeigen3-dev build-essential
Windows:
pip install cmake
# Install Visual Studio Build Tools or use conda
conda install -c conda-forge eigen
Quick Start
import numpy as np
from hapc.single import single_pcghal
from hapc.cv import pcghal_cv
# Generate sample data
X = np.random.randn(100, 5)
Y = X[:, 0] + 0.5 * X[:, 1] + np.random.randn(100) * 0.1
# Single fit with fixed lambda
result = single_pcghal(X, Y, maxdeg=2, npc=5, single_lambda=0.01)
print(f"Risk: {result.optimizer_output.risk:.6f}")
# Cross-validation to select lambda
lambdas = np.logspace(-4, 0, 10)
cv_result = pcghal_cv(X, Y, maxdeg=2, npc=5, lambdas=lambdas, nfolds=5)
print(f"Best lambda: {cv_result.best_lambda:.6f}")
# Make predictions
X_test = np.random.randn(20, 5)
result = single_pcghal(X, Y, maxdeg=2, npc=5, single_lambda=0.01, predict=X_test)
print(f"Predictions: {result.predictions}")
Usage
Regression
from hapc.single import single_pcghal
result = single_pcghal(
X, Y,
maxdeg=2, # Maximum degree of interactions
npc=10, # Number of principal components
single_lambda=0.01,
predict=X_test # Optional: test data for predictions
)
Classification
from hapc.single import single_pcghal
result = single_pcghal(
X, Y_binary,
maxdeg=2,
npc=10,
single_lambda=0.01,
predict=X_test
)
Cross-Validation
from hapc.cv import pcghal_cv
cv_result = pcghal_cv(
X, Y,
maxdeg=2,
npc=10,
lambdas=np.logspace(-4, 0, 20),
nfolds=5
)
print(cv_result.best_lambda)
Average Treatment Effect (ATE)
Estimate the ATE E[Y(1)] − E[Y(0)] with HAPC nuisance models and a
doubly-robust (AIPW) efficient influence function. ate_hapc returns a point
estimate and a (1 − alpha) Wald confidence interval.
from hapc import ate_hapc
# W: covariates (n, p); A: binary treatment in {0,1} or {-1,+1}; Y: outcome
res = ate_hapc(W, Y, A, alpha=0.05, method="undersmooth")
print(res.estimate, res.lower, res.upper)
Two bias-control strategies are available through method:
method="undersmooth"(default) — single-sample estimator. The outcome model is undersmoothed (λ pushed below the CV-optimal value) until the empirical influence function is withinσ / (√n · log n). This requires the full PC basis (npcs = n, the default) and a λ grid that reaches small λ (defaultslog_lambda_out_min = -10); otherwise the gate never reaches the low-bias regime andate_hapcemits a warning. Passreport_undersmoothing=Trueto print the|mean(EIF)|-vs-λ path.method="crossfit"— DML-style K-fold cross-fitting (cf_folds, default 5, stratified by treatment). Both nuisances are fit on the training folds and the influence function is evaluated out-of-fold, giving honest point estimates and coverage without undersmoothing. Recommended under good overlap.
Discrete-time survival (family = "logit-hazard")
Fit a discrete-time logistic hazard model with HAPC. You supply only the
observed right-censored data — baseline covariates X, the observed time
T = min(T_event, C), and the event indicator Delta = 1(T_event <= C) — and
the wrapper performs the person-period expansion (one row per
subject-per-interval-at-risk, hazard label = 1 at the event interval), prepends
the visit time as the first HAL covariate, and cross-validates the binomial fit.
Model. The discrete hazard is the conditional event probability in interval
t given survival up to t, modelled on the logit scale by a HAPC fit f of
the augmented covariate (t, x):
lambda(t | x) = P(T_event = t | T_event >= t, X = x)
logit lambda(t | x) = f(t, x)
Person-period likelihood. Under independent right-censoring the observed-data likelihood factorises over the at-risk intervals,
prod_i prod_{t <= T_i} lambda(t|x_i)^Y_it * (1 - lambda(t|x_i))^(1 - Y_it),
with Y_it = 1(T_event_i = t),
which is exactly the Bernoulli (logistic) likelihood of the expanded
person-period table — so a binomial HAPC fit of Y_it on (t, x_i) estimates
the discrete hazard (Cox 1972; Brown 1975; Allison 1982).
Survival. The conditional survival function follows by the product-limit
relation S(t | x) = prod_{s <= t} (1 - lambda(s | x)), returned for new
subjects when predict= is supplied.
from hapc import hazard_hapc
import numpy as np
# X: baseline covariates (n, p); T: observed times; Delta: 0/1 event indicator
fit = hazard_hapc(X, T, Delta, norm="1", max_degree=2, time_grid=np.arange(1, 7))
fit.hazard # estimated hazard per person-period row (CV predictions)
fit.best_lambda, fit.interior # CV-selected lambda; is it interior to the grid?
# survival curves S(t|x) for new subjects
fit = hazard_hapc(X, T, Delta, norm="1", predict=X_new)
fit.predict_survival # (m, K) survival probabilities over the grid
library(hapc)
# equivalent to cv.hapc(X, T, family = "logit-hazard", Delta = Delta, norm = "1")
fit <- hazard.hapc(X, T, Delta, norm = "1", max_degree = 2, time_grid = 1:6)
fit$hazard; fit$best_lambda; fit$interior
norm must be "1" (logistic LASSO) or "2" (logistic ridge); norm = "sv"
is not implemented for this family and is flagged.
Returns (Python HazardResult / R hapc_hazard):
hazard— cross-validated discrete hazard for each person-period rowlambdas,risk,best_lambda— CV grid, mean logistic deviance, selected λinterior— whetherbest_lambdais strictly inside the grid (sanity check)time_grid,ids/id,Y— the discrete grid and person-period bookkeepingpredict_hazard,predict_survival— hazard surface and survival curves for new subjects (only whenpredict=is given)cv— the underlying cross-validation result
Worked end-to-end examples (five hazard data-generating processes, with
true-vs-estimated hazard scatters and CV risk-vs-λ curves verifying an interior
optimum) are in
examples/hazard_logit_hazard_examples.R
and
examples/hazard_logit_hazard_examples.py.
References. Cox (1972, JRSS B); Brown (1975, Biometrics); Allison (1982, Sociological Methodology); Singer & Willett (2003, Applied Longitudinal Data Analysis); Benkeser & van der Laan (2016, IEEE DSAA).
API Reference
hapc.single.single_pcghal()
Fit PC-GHAL with a single lambda value.
Parameters:
X(ndarray, shape (n, p)): Input featuresY(ndarray, shape (n,)): Response variablemaxdeg(int): Maximum degree of interactionsnpc(int): Number of principal componentssingle_lambda(float): Regularization parametermax_iter(int, default=100): Maximum iterationstol(float, default=1e-6): Convergence toleranceverbose(bool, default=False): Print progresspredict(ndarray, optional): Test data for predictionscenter(bool, default=True): Center the design matrix
Returns:
result.optimizer_output.alpha: Coefficientsresult.optimizer_output.risk: Final riskresult.optimizer_output.iter: Iterations until convergenceresult.predictions: Predictions on test data (if provided)
hapc.cv.pcghal_cv()
Cross-validation to select lambda.
Parameters:
lambdas(ndarray): Grid of lambda values to testnfolds(int, default=5): Number of CV folds- ...other parameters same as
single_pcghal
Returns:
cv_result.best_lambda: Optimal lambdacv_result.mses: CV errors for each lambdacv_result.best_model: Fitted model with best lambdacv_result.predictions: Predictions on test data (if provided)
Contributing
Contributions welcome! The C++ core is shared between R and Python packages.
git clone https://github.com/meixide/hapc.git
cd hapc
pip install -e .
pytest
License
MIT License - see LICENSE file
Metadata
Release files for hapc 2.7.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| hapc-2.7.1.tar.gz | 87.6 kB | Without provenance | Details |
Built distributions (wheels)
Total release size: 6.8 MB
Release files / hapc-2.7.1.tar.gz
| Download URL | hapc-2.7.1.tar.gz |
|---|---|
| Size | 87.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0351bf27ce3ae157441f4b08be3c3ae410084e07fa27a5bb1d7c7971213e1880
|
|
BLAKE2b-256 checksum How to use checksums |
5fc3a0937613136a399f81e2a16f21a5232e57c5c489b7ba9bc1a7452568e20a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp312-cp312-win_amd64.whl
| Download URL | hapc-2.7.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 550.3 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
130ca44f6cc229394062a6c75133db984559a2881a8bb4c5c55c23c254f16ce1
|
|
BLAKE2b-256 checksum How to use checksums |
b75bb81be1a1783e0a5bfab844c46d07f593273432219dd7bbf76095d10c2c10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | hapc-2.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 314.9 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
f2ebe33c604e76d398930dd99565acea1a79d86f175d3bbffaf5cbedc77fe53f
|
|
BLAKE2b-256 checksum How to use checksums |
24cf22aa98e4aa663c80f3132235430f6b9e2fc06f6ac4d9ae81bd193eb3d8c1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp312-cp312-macosx_10_13_universal2.whl
| Download URL | hapc-2.7.1-cp312-cp312-macosx_10_13_universal2.whl |
|---|---|
| Size | 491.0 kB |
| Tags | CPython 3.12 macOS 10.13+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
972066474b89cd81c8e469dde66d511b5083bd963f9c8d236cd021da182a1201
|
|
BLAKE2b-256 checksum How to use checksums |
6d7433989e576216ce7e78aa59817833ae3474cea73ff88d721d931d9b5c205b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp311-cp311-win_amd64.whl
| Download URL | hapc-2.7.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 546.1 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
02d239e5f68ca0de01c9c1ba5a362a778b5da5f10a9d6dca168b8bed6d241e97
|
|
BLAKE2b-256 checksum How to use checksums |
ffdca3be2af354bf334912069eb48b2804d3dfcce24329158b4a0a4b7588b2c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | hapc-2.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 315.4 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
a491ff1e8d0cdba7aa248a21719e94468ff507c0e8a30ccda762e6957380db5a
|
|
BLAKE2b-256 checksum How to use checksums |
003381c5e7710a0d077a35c64865cc9192a5115e3804f97a7aed5e6e391f70c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp311-cp311-macosx_10_9_universal2.whl
| Download URL | hapc-2.7.1-cp311-cp311-macosx_10_9_universal2.whl |
|---|---|
| Size | 486.3 kB |
| Tags | CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
00cb1cd12936c2c7832906064e7d78059b720632591353481898e16705c22230
|
|
BLAKE2b-256 checksum How to use checksums |
aa036e2c6dee73509fb88bb1f5a922d76d8640efe3bf17406d6df4536863b2c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp310-cp310-win_amd64.whl
| Download URL | hapc-2.7.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 543.6 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
73d2fa051388e49b4503efe96d1b153119e13716d67575a22409040de223f4b7
|
|
BLAKE2b-256 checksum How to use checksums |
fb1d4dac641454ae6c52250fd024ae334c115e3263910f0ff81ef78679ea955b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | hapc-2.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 314.4 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
a8e7a8b0d09f4cad934cd4b607456e285414781cf4dbb288545d6e6e2e0a61a8
|
|
BLAKE2b-256 checksum How to use checksums |
9f09c661f70ac4bf2648070b62b9cab9b7ac3005993a7abe8795ec7e6088964c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp310-cp310-macosx_10_9_universal2.whl
| Download URL | hapc-2.7.1-cp310-cp310-macosx_10_9_universal2.whl |
|---|---|
| Size | 483.6 kB |
| Tags | CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
f388974e2748aa5824b85f4f54f94608596ae8c3d32345c89beb1fa773b3daca
|
|
BLAKE2b-256 checksum How to use checksums |
c2ba57a22b6d4751b455ff3b6e84488b2150975490dec2fe05aa9945572ffaf0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp39-cp39-win_amd64.whl
| Download URL | hapc-2.7.1-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 543.9 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
315a11222a5af04f20bb77da4fefd4d9cb4fed53ef5688263917765c4187d715
|
|
BLAKE2b-256 checksum How to use checksums |
1b693ff184b63c6b3334892a267d88a99a6f56e1bdb73de25e1312cde162195c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | hapc-2.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 314.8 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
4e363e7ae94e5ce2a894a4287813ec0dfe7e6b8ec7e5530ed353913907db2571
|
|
BLAKE2b-256 checksum How to use checksums |
ab84b57fefd98ad5ce8bf154cebabbe42b4d0002513e37692aabf7c1563fc707
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp39-cp39-macosx_10_9_universal2.whl
| Download URL | hapc-2.7.1-cp39-cp39-macosx_10_9_universal2.whl |
|---|---|
| Size | 483.8 kB |
| Tags | CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
7f41a3d201f19e79b534ee2a9f08da3fd0d408ff2f4bfe95014aa55bf0cad4a6
|
|
BLAKE2b-256 checksum How to use checksums |
0354a0bb21c710e69919d1bf046ab294b167be4cf11abbec9881e993f02ca2d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp38-cp38-win_amd64.whl
| Download URL | hapc-2.7.1-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 540.0 kB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
513a30501d5eea0ad520a103767ffd7928ba307717dba7a9a666c752ca2a8552
|
|
BLAKE2b-256 checksum How to use checksums |
5399d5256a0a9a4a8d989c5ef7f505a367aa49c022bc86071370e49731958d9a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | hapc-2.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 312.6 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
2d3b8ede6fcdf6d07af4c5d3da1bfe0c28040ca74d6bba30f6c8e38f5da73f06
|
|
BLAKE2b-256 checksum How to use checksums |
6eb13b60836e7c931fffd3e7152d8e479805906678164d4b1877850030057c08
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hapc-2.7.1-cp38-cp38-macosx_10_9_universal2.whl
| Download URL | hapc-2.7.1-cp38-cp38-macosx_10_9_universal2.whl |
|---|---|
| Size | 481.9 kB |
| Tags | CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
5e5b46a6e716067df9a8c30fa92072bfbc70ed88721392a4019c99be4dd517f4
|
|
BLAKE2b-256 checksum How to use checksums |
63c0b97421e7f108e91b7bbd3a851b72ab82cc57cd02830a49445a78357b89c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for hapc 2.7.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.