Parity methodology

pls4all uses three related but distinct parity surfaces. They should not be collapsed into a single “green/red” result.

Fixture parity

Fixture parity is the C++ correctness gate. JSON fixtures under parity/fixtures are generated from pinned Python/R/nirs4all references and compiled into the C++ tests. ctest must pass before any numerical change lands.

The schema lives at parity/schema/fixture_schema_v1.md; the generator and lock files live under parity/python_generator.

Current caveat: AOM/POP fixture generation still depends on the historical AOM_v0 bench oracle path. Until that reference is vendored or resolved from a pinned package, a clean clone can fail generate-fixtures --check before reaching the comparison step.

Reference parity

Reference parity compares pls4all and external implementations with the canonical library selected for each method in benchmarks/parity_timing/registry.py. It answers whether the method implementation behaves like the literature or established package oracle.

External libraries are included in this comparison. If sklearn, R pls, libPLS or another external implementation diverges from the canonical oracle, the dashboard should show that divergence explicitly.

Binding parity

Binding parity compares pls4all language bindings against the native C++ row for the same method and data. It answers whether Python, R, MATLAB and future bindings are thin and faithful wrappers over the C ABI.

External libraries are not bindings and should be marked not applicable for this gate.

Release rule

A release-quality run needs:

  • fixture parity green in CI;

  • binding parity green for every shipped pls4all binding row;

  • reference parity green or explicitly relaxed for every shipped method;

  • missing external references classified as paper_only or not_available, not hidden as infrastructure errors;

  • tolerances documented strongly enough that a wide selector mask threshold is visible as qualitative evidence, not exact agreement.