Skip to main content

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 Context and Config (RAII lifecycle wrappers),
  • the PLS fit/predict surface and a scikit-learn-compatible pls4all.sklearn.PLSRegression (and the other PLS-family estimators),
  • a typed Pls4allError raised on any non-OK status, carrying the context's last_error message.

Quick start

import numpy as np
import pls4all
from pls4all.sklearn import PLSRegression

print(pls4all.version())      # e.g. "1.0.15+abi.2.5.0"
print(pls4all.abi_version())  # (2, 5, 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:

  1. $PLS4ALL_LIB_PATH — explicit path to libn4m for this package,
  2. $N4M_LIB_PATH — shared libn4m override honoured by both pls4all and n4m,
  3. pls4all/lib/libn4m* next to the installed package (wheel layout),
  4. <repo-root>/build/dev-release/cpp/src/libn4m* (developer convenience),
  5. the standard system search path (LD_LIBRARY_PATH, macOS rpath, Windows PATH).

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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pls4all-1.0.16.tar.gz (147.7 kB view details)

Uploaded Source

Built Distributions

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

pls4all-1.0.16-py3-none-win_amd64.whl (1.4 MB view details)

Uploaded Python 3Windows x86-64

pls4all-1.0.16-py3-none-musllinux_1_2_x86_64.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

pls4all-1.0.16-py3-none-musllinux_1_2_aarch64.whl (4.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

pls4all-1.0.16-py3-none-manylinux_2_28_x86_64.whl (5.2 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

pls4all-1.0.16-py3-none-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

pls4all-1.0.16-py3-none-macosx_11_0_universal2.whl (8.0 MB view details)

Uploaded Python 3macOS 11.0+ universal2 (ARM64, x86-64)

File details

Details for the file pls4all-1.0.16.tar.gz.

File metadata

  • Download URL: pls4all-1.0.16.tar.gz
  • Upload date:
  • Size: 147.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pls4all-1.0.16.tar.gz
Algorithm Hash digest
SHA256 91447604d2aacf53f17d2a28ae2a90cddc2cd82c821f64fd483bf60fa0fbc79a
MD5 a4680926561af7e486484d34637939d1
BLAKE2b-256 0218cf976cc1b4ec0391c3d00629094ed0e4d6d8f13d439a2d15f5420e21282d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16.tar.gz:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pls4all-1.0.16-py3-none-win_amd64.whl.

File metadata

  • Download URL: pls4all-1.0.16-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pls4all-1.0.16-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 80a3fb685b497056ef5cebc0df406a412d9f2a99ba47e94f08f9923abc9e5311
MD5 2138a99006d75389175e33b020026c7d
BLAKE2b-256 50b1fed1396de72a56ff72e78e872e03d3f1ac8b473249d52d46257bafed0d26

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16-py3-none-win_amd64.whl:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pls4all-1.0.16-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.16-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d92fef430c6e488b9789a370e1c701a047744929b7aff7df25e16a0ae7244c24
MD5 93029c9db794c40d4777c26d8c068c1a
BLAKE2b-256 15288988d7224a4c7d671e6af95a324173b2649d04997b989e0b0bf4138b9781

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pls4all-1.0.16-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.16-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7b671b361b21d20632165dc3915b0dfe9f85e49999033f9e122664fa51800648
MD5 35bd835ec9d26cc50c233510b9eb4d79
BLAKE2b-256 b3893d7e53a5905e2f9068c51084b6074df1f3a59d5e13df5560fc0aad22fdbe

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pls4all-1.0.16-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.16-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bd6069cd1a8b8609afccd46955b2bf24377db102adcaf4a65e7e915e9e8a2abc
MD5 9d0b8fc65c78295b64019b3336d4cb0e
BLAKE2b-256 fdefb3949c5ef1d66fd232f133fc2f8944bc2331b9b604ce8aff2ecd20c05114

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16-py3-none-manylinux_2_28_x86_64.whl:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pls4all-1.0.16-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.16-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 89a0518e1cb3757fa3676290e3d2157edad15485ea20a240a92bcead9933f771
MD5 139b3f30ac9ea131e135ab4b889c0528
BLAKE2b-256 8c3c4105144c6ce8c822e0c32867e4668cb29e976ec7a2b5355745a41fbb5b6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pls4all-1.0.16-py3-none-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for pls4all-1.0.16-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 bb048be72876afa000c7c6bcb7776682a6749b0f98d318a24223ad5a89aca7e8
MD5 b57514b82e15355bf0e91c962f68320b
BLAKE2b-256 cb3147d57d98bda351986c647ca42f5ddea1fa47b0b66a4b5a87413d8849d6f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.16-py3-none-macosx_11_0_universal2.whl:

Publisher: release-python.yml on GBeurier/nirs4all-methods

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.0.18

7 files

1.0.17

7 files

This release

1.0.16 This release

7 files

1.0.15

7 files

1.0.13

7 files

1.0.12

7 files

1.0.11

7 files

1.0.10

7 files

1.0.9

7 files

1.0.8

7 files

1.0.7

7 files

1.0.6

7 files

1.0.5

7 files

1.0.2

7 files

1.0.1

7 files

0.99.0

7 files

0.97.3

7 files

0.97.2

7 files

0.97.1

7 files

0.97.0

7 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