Metadata-Version: 2.4
Name: nirs4all-core
Version: 0.3.0
Summary: Portable nirs4all aggregate binding over formats, IO, methods, dag-ml, and dag-ml-data (datasets optional)
Project-URL: Homepage, https://nirs4all.org
Project-URL: Documentation, https://nirs4all-core.readthedocs.io/en/latest/
Project-URL: Repository, https://github.com/GBeurier/nirs4all-core
Project-URL: Issues, https://github.com/GBeurier/nirs4all-core/issues
Author: nirs4all contributors
License-Expression: CECILL-2.1 OR AGPL-3.0-or-later
License-File: LICENSE
Keywords: bindings,chemometrics,nirs,spectroscopy,wasm
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.11
Requires-Dist: pyyaml>=6
Provides-Extra: all
Requires-Dist: dag-ml-data>=0.2.4; extra == 'all'
Requires-Dist: dag-ml>=0.2.3; extra == 'all'
Requires-Dist: nirs4all-formats>=0.2.2; extra == 'all'
Requires-Dist: nirs4all-io>=0.1.6; extra == 'all'
Requires-Dist: nirs4all-methods>=1.0.5; extra == 'all'
Requires-Dist: pls4all>=1.0.5; extra == 'all'
Requires-Dist: scikit-learn>=1.3; extra == 'all'
Provides-Extra: dag-ml
Requires-Dist: dag-ml>=0.2.3; extra == 'dag-ml'
Provides-Extra: dag-ml-data
Requires-Dist: dag-ml-data>=0.2.4; extra == 'dag-ml-data'
Provides-Extra: datasets
Requires-Dist: nirs4all-datasets>=0.3.4; extra == 'datasets'
Provides-Extra: everything
Requires-Dist: dag-ml-data>=0.2.4; extra == 'everything'
Requires-Dist: dag-ml>=0.2.3; extra == 'everything'
Requires-Dist: nirs4all-datasets>=0.3.4; extra == 'everything'
Requires-Dist: nirs4all-formats>=0.2.2; extra == 'everything'
Requires-Dist: nirs4all-io>=0.1.6; extra == 'everything'
Requires-Dist: nirs4all-methods>=1.0.5; extra == 'everything'
Requires-Dist: pls4all>=1.0.5; extra == 'everything'
Requires-Dist: scikit-learn>=1.3; extra == 'everything'
Provides-Extra: formats
Requires-Dist: nirs4all-formats>=0.2.2; extra == 'formats'
Provides-Extra: io
Requires-Dist: nirs4all-io>=0.1.6; extra == 'io'
Provides-Extra: methods
Requires-Dist: nirs4all-methods>=1.0.5; extra == 'methods'
Requires-Dist: pls4all>=1.0.5; extra == 'methods'
Requires-Dist: scikit-learn>=1.3; extra == 'methods'
Description-Content-Type: text/markdown

# Python Binding

Distribution name: `nirs4all-core`

Import name: `nirs4all_core`

This binding intentionally avoids the `nirs4all` import name so it can be
installed next to the full Python `nirs4all` package during parity checks.
The canonical source repository is `nirs4all-core`; only the Python
distribution carries the `-core` suffix because the production `nirs4all`
Python package already owns the bare name.

An additive import facade is available for governed topology work:

- `n4a` mirrors the full `nirs4all_core` aggregate surface.

## Portable Execution

`nirs4all_core.run_portable_pipeline(source, dataset)` executes the shared
portable JSON/YAML subset through the `nirs4all-methods` Python bindings:

- `KennardStoneSplitter`
- `StandardNormalVariate` / `SNV`
- `SavitzkyGolay`
- `sklearn.cross_decomposition.PLSRegression`
- `_range_` sweeps over `n_components`

Savitzky-Golay defaults to `mode="interp"` for full Python nirs4all parity and
preserves explicit methods-backed modes (`mirror`, `constant`, `nearest`,
`wrap`, `interp`) plus `cval`.

The aggregate does not implement numerical kernels. Install the optional
methods extra, or make `n4m` and `pls4all` importable, before calling it:

```bash
python -m pip install "nirs4all-core[methods]"
```

The strict local parity gate compares all shared fixtures against the full
Python `nirs4all` oracle and reports max prediction/RMSE deltas on failure:

```bash
PYTHONPATH=bindings/python/src:/path/to/nirs4all-methods/bindings/python/src \
PLS4ALL_LIB_PATH=/path/to/libn4m.so \
NIRS4ALL_CORE_REQUIRE_METHODS_PARITY=1 \
python -m unittest bindings/python/tests/test_execution_parity.py -v
```
