name: WAI neural decoders end-to-end # The float neural decoders (elic / mlicpp / glc / dcvc / snac) cannot make # WAI's cross-architecture byte-equality promise — their ONNX synthesis is # float, so the low bits differ by hardware (this is exactly why the # integer-exact int_synth path exists, and why only it is in the byte-equality # matrix). What they CAN be is *correct end-to-end* on a real machine: entropy # decode → ONNX synthesis → image assembly, reproducing a reference within ORT # float rounding (±4). This job proves that, with no committed model blobs: # the committed tool builds minimal synthetic CompressAI-compatible models + # bitstreams, and the Rust decoders reproduce each reference. It runs only when # the neural decode code or the generator changes — not on every cargo class. on: push: branches: [main] paths: - 'wai/wai-rs/src/neural/**' - 'wai/wai-rs/tests/neural_native_decode.rs' - 'wai/tools/wai_validate_synthetic.py' - '.github/workflows/wai-neural-e2e.yml' pull_request: paths: - 'wai/wai-rs/src/neural/**' - 'wai/wai-rs/tests/neural_native_decode.rs' - 'wai/tools/wai_validate_synthetic.py' - '.github/workflows/wai-neural-e2e.yml' jobs: neural-e2e: name: synthetic fixtures → Rust decode → reference (±4) runs-on: linux steps: - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: python-version: '3.11' - name: ML stack (CPU torch + torchvision + compressai + onnxruntime) run: | python -m pip install --upgrade pip # torch AND torchvision from the CPU index so their compiled ops match # (compressai imports torchvision; a mismatched build fails at # `torchvision::nms does not exist`). pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # `onnx` (the exporter) is separate from `onnxruntime` (the decoder). pip install compressai onnx onnxruntime numpy pillow - name: Build the synthetic fixtures (elic / mlicpp / snac / dcvc / glc) working-directory: wai run: python tools/wai_validate_synthetic.py --size 256 # Bootstrap rustup: the docker runner image ships no Rust. - name: Install Rust 1.97.1 run: | export PATH="$HOME/.cargo/bin:$PATH" command -v rustup >/dev/null 2>&1 || \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.97.1 rustup toolchain install 1.97.1 --profile minimal rustup default 1.97.1 echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - name: Each Rust decoder reproduces its reference end-to-end working-directory: wai/wai-rs # --no-default-features: the neural decoders need only `ort`, NOT the C # codec chain (AV1/JXL/opus), so the job needs no system codec deps. run: cargo test --no-default-features --features neural --test neural_native_decode -- _matches_reference --nocapture