Binding Contract

Shared requirements

Every binding must:

  • expose upstream domains from the top-level package;

  • translate host-native objects to upstream contracts;

  • parse the shared nirs4all JSON/YAML pipeline definition envelope before handing execution to upstream runtimes;

  • preserve ownership and lifetime rules across FFI boundaries;

  • report unavailable upstream components explicitly;

  • expose external operators through host-language idioms only when the upstream execution path can actually plan or call them;

  • participate in parity checks before release.

For the portable Savitzky-Golay operator, every binding normalizes the same methods-backed SciPy boundary-mode contract: mirror=0, constant=1, nearest=2, wrap=3, and interp=4. The default remains interp to match the full Python nirs4all operator; explicit mode and cval values must be preserved in the execution plan and forwarded to the upstream binding.

Python

  • Distribution name: nirs4all-lite.

  • Import name: nirs4all_lite.

  • Framework idioms: sklearn-style estimators, fit/predict/transform, NumPy arrays, pandas data frames, and clear optional extras.

  • External operators should look like normal sklearn-compatible transformers or estimators when they participate in Python execution.

  • Do not shadow the full Python nirs4all package until the core replacement migration is intentional.

Rust

  • Crate name: nirs4all.

  • Use Result-returning APIs and typed wrappers around upstream crates.

  • External operators should use traits and typed builder APIs, with capabilities declared at compile time or through explicit runtime feature checks.

  • Keep FFI handles explicit; never hide ownership transfers.

  • The portable KS/SNV/Savitzky-Golay/PLS subset executes through a caller-supplied libn4m path and is covered by the shared full-Python nirs4all oracle.

JavaScript/WASM

  • npm package name: nirs4all.

  • Expose typed ESM APIs and browser-safe WASM loaders.

  • External operators should be ESM functions/classes over browser-safe values and TypedArray data, with async initialization where WASM is required.

  • The portable KS/SNV/Savitzky-Golay/PLS subset executes with runPortablePipeline() and predicts from its serialized selected model with predictPortablePipeline(), both delegating to @nirs4all/methods-wasm.

  • nirs4all-web consumes this package; UI code does not live here.

  • Current upstream package candidates are nirs4all-formats-wasm, nirs4all-io-wasm, @nirs4all/datasets-wasm, dag-ml-wasm, dag-ml-data-wasm, and @nirs4all/methods-wasm.

R

  • Package name: nirs4all.

  • Provide formula/data-frame paths where appropriate.

  • External operators should expose S3 generics and formula/data-frame adapters where that is the natural R interface.

  • Keep native handles opaque and expose provenance in returned objects.

  • Current R package candidates include nirs4allformats, nirs4allio, nirs4alldatasets, dagmldata, and n4m / pls4all for methods. dag-ml has no declared R binding yet and remains unavailable in the R aggregate.

MATLAB/Octave

  • Namespace: +nirs4all.

  • Prefer matrices/tables and explicit options structs.

  • External operators should use function handles or small handle classes with fit/predict/transform-style methods when execution support exists.

  • Keep Octave compatibility in the public subset unless a function is marked MATLAB-only.

  • The portable KS/SNV/Savitzky-Golay/PLS subset executes through nirs4all.runPortablePipeline() by delegating to the nirs4all-methods +pls4all MEX shims. The aggregate binding still owns only parsing, orchestration, and result-shape translation.