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.15.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.15-py3-none-win_amd64.whl (1.4 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

pls4all-1.0.15-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.15.tar.gz.

File metadata

  • Download URL: pls4all-1.0.15.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.15.tar.gz
Algorithm Hash digest
SHA256 b2c71eb24352db5db04c01841671a8ae9a478c7e54cc007a7c90a2d1d70d3688
MD5 d2d172f3d50d098dfb078d45c453445c
BLAKE2b-256 5cb33a0fbd5d244d43f8808ca931511bd9def37cf78e8ed7c4b4693c4be9695f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15.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.15-py3-none-win_amd64.whl.

File metadata

  • Download URL: pls4all-1.0.15-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.15-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bc2e3fa813b9905058699ba1d95a1493ac3f07ebae71bbd00ab78b4cefc39a27
MD5 3f2e98b23ff5cdb710566bfe0373ad22
BLAKE2b-256 d51213a7464c90f3843a7b0d6e70de96c13d5f41d91d28f87e601b7592227fab

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15-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.15-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.15-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 fa7fa129588d271b8c16f2f4228b301783c365f409b6599bf866a7f7d85404e6
MD5 ae49e9cb423ee4bcfdf55fd2545f3bdc
BLAKE2b-256 0bcef7201df5eaf49261b677d82e6169f044e4a642dae58df8a724fe2bc2bc14

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15-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.15-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.15-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b737fc1ab52832aad0453b3b5b73a6af57463fc1d084220741f28bae96880a34
MD5 d02d62000de17163bac15101390a6663
BLAKE2b-256 d2d39eb838c869aecc11734efde3dde8d7e8ea5815a4043d6ad2d0da3ed4e364

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15-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.15-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.15-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bbc0d3cedd8a5bb963511a8972b8073f16d8b17e04cc519753c2b326956da16f
MD5 87f1e30c451b71cef28e35153cc68bc6
BLAKE2b-256 55695f008b6fed24baa89eb1f1395fefbfeac78f0b7f2675db680d5d100c52a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15-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.15-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pls4all-1.0.15-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8256e2f5cf8cb07496dff1f10d050e9119bebccb31ce84f6db0eec918e94051b
MD5 59328abca7a5c45a9d665e7df4c43e0d
BLAKE2b-256 df2018346b13a35813114fc405cc2e0d6f0f1193c8ce38d52907f9a1e49d0917

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15-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.15-py3-none-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for pls4all-1.0.15-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c369b1e7ab920cbc07de91260ad06ae0cb49d456b5667034e274b9f038ea739c
MD5 385f7d22cb79568553c1e321fc47350d
BLAKE2b-256 fd99b0542158fd67b6c2468a247b9347866f58dd50d889d6257f6b210546df52

See more details on using hashes here.

Provenance

The following attestation bundles were made for pls4all-1.0.15-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

1.0.16

7 files

This release

1.0.15 This release

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