Added
- Sub-8px inputs are reflect(mirror)-padded up to the metric's 8px pyramid floor instead of returning
InvalidImageSize:compute_ssimulacra2/compute_ssimulacra2_with_confignow score images down to 1×1 (identical pairs still score 100) (480df7e) Ssimulacra2Referenceapplies the same sub-8px reflect-padding, so the batch path accepts the same inputs as the one-shot path and produces identical scores;width()/height()report the caller-supplied (pre-padding) dimensions and mismatched pre-padding dimensions are still rejected. Strip APIs intentionally keep the ≥8×8 requirement (54df468)- Experimental
hdr-pufeature:compute_ssimulacra2_pu_nitsscores HDR content using the PU21 (banding_glare) encoding in place of the cube-root opsin nonlinearity; input is absolute-luminance linear RGB in cd/m². Validated on UPIQ HDR (380 pairs, SROCC 0.7044; see imazen/zenmetrics#25) (35f198a) - CI now lints (
clippy -D warnings) and tests the non-defaulthdr-pufeature on the Linux clippy job, so the feature-gated path is exercised on every push (f987fc1)
Changed
- Vectorised the recursive-Gaussian blur horizontal pass across rows (8 rows per SIMD lane group, one row per lane), mirroring the across-columns trick the vertical pass already uses. Bit-identical output to the scalar path — the SIMD IIR replicates the scalar op order exactly. Measured on Neoverse-N1 (where the scalar per-row recurrence was ~50% of the blur kernel): blur-only +9–12%, full SSIMULACRA2 +3.6–9.5% (
ssimulacra2_1920x1080540.9 → 503.0 ms). x86 (AVX2) unaffected — blur was already well-vectorised there (87e06d5)
What's Changed
- perf(fast-ssim2): vectorise blur horizontal pass across rows (+5.8-12.4% on Neoverse-N1) by @lilith in #3
Full Changelog: v0.8.1...v0.8.2