Cross-language Partial Least Squares with modern inference:
canonical percentile CIs, split_exact, and split_nb tests.
| Language | Package | Status |
|---|---|---|
| Rust | cargo add plskit |
available — see plskit-rs/ |
| Python | pip install plskit |
available — see plskit-py/ |
| R | — | planned |
| Julia | — | planned |
Installation, examples, and language-specific notes live in each wrapper's README.
import plskit
model = plskit.pls1_fit(X, y, k=3, seed=42)
sig = plskit.pls1_confirmatory_test(
X, y, k=3, method="split_nb", args={"n_splits": 50}, seed=42,
)
sig.pvalue, sig.statistic- Modern inference is canonical. Procrustes-aligned percentile CIs,
split_exact, andsplit_nbare the default. - One Rust engine, identical results across wrappers. All
numerical computation lives in
plskit-rs. Python (and the forthcoming R and Julia wrappers) call into it via FFI, so a fixed(version, seed, X, y)reproduces within a bit-near tolerance on every supported platform.
plskit/
├── plskit-rs/ Rust crate — canonical implementation
├── plskit-py/ Python wrapper
├── plskit-r/ R wrapper (planned)
├── plskit-jl/ Julia wrapper (planned)
└── testdata/ Shared reference corpus, regenerated from the Rust core
This is the single repository for the engine and every wrapper. The
Rust engine and each language wrapper carry their own version number,
and the same version number always means the same features —
plskit-rs 0.5.0 and plskit (Python) 0.5.0 ship the same API. The
Python, R, or Julia version may lag behind the Rust engine while its
surface is being built out, but it can never run ahead of it. Releases
use vX.Y.Z for the engine and vX.Y.Z-py / -r / -jl for the
wrappers. File pull requests and issues here.
API wiring (function names, argument names, result fields) is stable across versions. Numerical reproducibility requires pinning the version: changes to defaults, algorithms, or implementation details may shift outputs between releases.
Lenartowicz, P., Plisiecki, H. (2026). (Under Review).
GPL-3.0-or-later. See LICENSE.