pls4all
pls4all is the slim, PLS-only subset of nirs4all-methods — a thin Python
binding over the portable libn4m C ABI (a C++17 PLS / NIRS engine). The wheel
bundles the libn4m shared library, so pip install pls4all is self-contained;
no separate native build is required. For the full method surface (preprocessing,
selectors, diagnostics, augmenters, …) install the nirs4all-methods package
instead and import it as n4m — both load the same libn4m.
The binding loads libn4m with ctypes.CDLL (so the GIL is released during
native calls) and exposes:
version()/abi_version()introspection,- a Pythonic
ContextandConfig(RAII lifecycle wrappers), - the PLS fit/predict surface and a scikit-learn-compatible
pls4all.sklearn.PLSRegression(and the other PLS-family estimators), - a typed
Pls4allErrorraised on any non-OK status, carrying the context'slast_errormessage.
Quick start
import numpy as np
import pls4all
from pls4all.sklearn import PLSRegression
print(pls4all.version()) # e.g. "1.0.21+abi.2.14.0"
print(pls4all.abi_version()) # (2, 14, 0)
rng = np.random.default_rng(0)
X = rng.standard_normal((40, 12))
y = X @ rng.standard_normal(12)
model = PLSRegression(n_components=5).fit(X, y)
print(model.predict(X).shape) # (40,)
Low-level lifecycle, if you need it:
with pls4all.Context() as ctx, pls4all.Config() as cfg:
cfg.algorithm = pls4all.Algorithm.PLS_REGRESSION
cfg.solver = pls4all.Solver.SIMPLS
cfg.n_components = 5
# ... drive a fit through the C ABI ...
scikit-learn is an optional dependency (only pls4all.sklearn needs it); the
core import pls4all works with NumPy alone.
Verified affine-model migration
pls4all.export_linear_predictor_n4mm(...) is the public, PREDICT-only
migration boundary for a converter that has already verified a source model's
affine equation. It accepts finite, row-major coefficients with shape
(n_features, n_targets) and a target-length intercept, then returns a raw
N4MM payload. It neither reads pickle/joblib data nor retrains a model.
from pls4all import export_linear_predictor_n4mm
payload = export_linear_predictor_n4mm(
coefficients=[[0.5], [-1.0]],
intercept=[0.25],
source_training_samples=120,
)
assert payload[:4] == b"N4MM"
The resulting imported-linear-predictor model supports native prediction only;
it deliberately does not claim to reconstruct a source PLS latent transform.
Callers remain responsible for attesting that the source model is exactly
intercept + X @ coefficients before conversion.
Pure-native estimator selection in the full package
The full nirs4all-methods distribution (imported as n4m) exposes the native
single-level finetuning driver. It is not part of the slim pls4all namespace.
Build the validation plan and search space through public owning objects:
import numpy as np
from n4m.model_selection import (
Algorithm,
Metric,
Sampler,
SearchSpace,
ValidationPlan,
finetune_estimator,
)
rng = np.random.default_rng(42)
X = rng.normal(size=(60, 12))
y = X @ rng.normal(size=12) + rng.normal(scale=0.02, size=60)
fold_ids = np.arange(X.shape[0], dtype=np.int32) % 5
with ValidationPlan.from_fold_ids(fold_ids) as plan:
with SearchSpace() as space:
space.add_int("n_components", 1, 10)
result = finetune_estimator(
Algorithm.PLS_REGRESSION,
X,
y,
plan,
space,
n_trials=30,
sampler=Sampler.TPE,
metric=Metric.RMSE,
seed=42,
timeout_seconds=20.0,
)
print(result.best_params) # for example: {"n_components": 6}
print(result.best_score)
print(result.timed_out) # True only for a successful partial timeout
print(len(result.trials)) # owning completed/failed trial snapshots
The eligible algorithms are PLS_REGRESSION, PLS_CANONICAL, PLS_SVD,
OPLS, SPARSE_PLS and PCR. The five non-sparse routes require the exact
keyword n_components, a non-log integer axis. SPARSE_PLS accepts any
non-empty subset of n_components and sparsity_lambda; omitted axes retain
the native defaults 2 and 0.0. sparsity_lambda must stay in [0, 1) and
may be declared with space.add_float(..., log=True) when low > 0.
This call selects a configuration and returns an owning trace; it does not
fit a final estimator on all rows. A timeout before any completion raises
N4MError with CANCELLED. A later timeout returns the best partial result
with result.timed_out is True and fewer trials than
result.requested_trials. See
docs/methods/optimization.md
for the exact schema, status and validation-plan contracts.
Relation to nirs4all conformal learning and robustness
The Python bindings are thin translation layers over the libn4m C ABI. They
expose native kernels, scikit-learn-compatible PLS estimators and the
single-estimator finetune_estimator(...) selection trace, but they do not own
the higher-level nirs4all statistical lifecycle.
Use nirs4all.run(tuning=...) when the workflow needs final winner projection,
workspace persistence, .n4a packaging, optional nirs4all.calibrate() /
predict_calibrated() semantics, CalibratedRunResult, or
nirs4all.robustness() / RobustnessReport artifacts. Those guarantees and
invalidation reasons are produced by nirs4all, not by n4m or pls4all.
Binding consumers must not reimplement tuning/conformal/robustness guarantees
from raw native predictions. A UI, Studio panel or alternate language binding
that wants to display conformal intervals or robustness summaries should consume
the public nirs4all artifact/schema surfaces instead of inferring guarantees
locally from finetune_estimator(...) or PLSRegression.predict(...).
Loading libn4m
The bundled wheel ships libn4m inside pls4all/lib/, found automatically. For
development against a local build the loader searches, in order:
$PLS4ALL_LIB_PATH— explicit path tolibn4mfor this package,$N4M_LIB_PATH— sharedlibn4moverride honoured by bothpls4allandn4m,pls4all/lib/libn4m*next to the installed package (wheel layout),<repo-root>/build/dev-release/cpp/src/libn4m*(developer convenience),- the standard system search path (
LD_LIBRARY_PATH, macOS rpath, WindowsPATH).
Building libn4m from source (developers)
cmake --preset dev-release
cmake --build --preset dev-release --parallel
This produces build/dev-release/cpp/src/libn4m.so (.dylib / .dll on
macOS / Windows), which the loader rules above pick up.
See https://github.com/GBeurier/nirs4all-methods for the full project.
Metadata
Release files for pls4all 1.2.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 | |
|---|---|---|---|
| pls4all-1.2.1.tar.gz | 182.7 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| pls4all-1.2.1-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| pls4all-1.2.1-py3-none-musllinux_1_2_x86_64.whl | Python 3 | none | Linux musl 1.2+ x86-64 | Details |
| pls4all-1.2.1-py3-none-musllinux_1_2_aarch64.whl | Python 3 | none | Linux musl 1.2+ ARM64 | Details |
| pls4all-1.2.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 | Details |
| pls4all-1.2.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 | Details |
| pls4all-1.2.1-py3-none-macosx_11_0_universal2.whl | Python 3 | none | macOS 11.0+ universal2 (ARM64, x86-64) | Details |
Total release size: 35.7 MB
Release files / pls4all-1.2.1.tar.gz
| Download URL | pls4all-1.2.1.tar.gz |
|---|---|
| Size | 182.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dfb857cc6fad4183f690cbd424e31c5a89c7e4dca0922d90452964bc73949b3c
|
|
BLAKE2b-256 checksum How to use checksums |
dc8014e37891ca2d9b46d2f1c5bed6542ae30760772e8b070515be21039d0ea3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / pls4all-1.2.1-py3-none-win_amd64.whl
| Download URL | pls4all-1.2.1-py3-none-win_amd64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
892995d8159d2f763a6d845abdbdc534a39790fb1431026cf27e3d349f2d3086
|
|
BLAKE2b-256 checksum How to use checksums |
1bda6be4ef51436eb618977d71bcd1c3611f61bf9173785676f2ee7f2aaa9104
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / pls4all-1.2.1-py3-none-musllinux_1_2_x86_64.whl
| Download URL | pls4all-1.2.1-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 6.6 MB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
6ee23c91b04351c4dc14dd8d07e01427c4de90f5bde7b6d514d48cfd66332350
|
|
BLAKE2b-256 checksum How to use checksums |
712d81cf7c5624337e3c717841cccead99afd53e64f8b426d487c252836db218
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / pls4all-1.2.1-py3-none-musllinux_1_2_aarch64.whl
| Download URL | pls4all-1.2.1-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
66eae3c97549245b154fccc95542b35d81803293694d25ed0a2a8c2e0ee4d867
|
|
BLAKE2b-256 checksum How to use checksums |
91690bf441ee9a7cdbddab92396b2fe67c6faf3d63ef52742e51d78895589dc7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / pls4all-1.2.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pls4all-1.2.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
161aa0daa8c92dfb42499cdd4ec4c57eb9bc1c8acadffe0326f98cd1e3a61667
|
|
BLAKE2b-256 checksum How to use checksums |
a10a86982f665de56562ea9e248c0422acae13cedce66e8f2f16d300943d1323
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / pls4all-1.2.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
| Download URL | pls4all-1.2.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
923e2625e930e4b7bb2cb762bf1ad24cd453c1a6b70eeeacc926340a461febd1
|
|
BLAKE2b-256 checksum How to use checksums |
de0fb6ce50b83c8e7701f5f573484fb4a40fa9d8c435ad56ff75ade1dbcd2d0e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / pls4all-1.2.1-py3-none-macosx_11_0_universal2.whl
| Download URL | pls4all-1.2.1-py3-none-macosx_11_0_universal2.whl |
|---|---|
| Size | 10.8 MB |
| Tags | Python 3 macOS 11.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
91b90b87782d95cb9eea739d2c3149291993e8c473326cf961ef7c71788899c1
|
|
BLAKE2b-256 checksum How to use checksums |
30daaa8a26e9ccf48bc39910165581d761c9cebf313b510f4d2106fc8b7e5452
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency log