Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 3 additions & 19 deletions .standards-baseline.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"version": 1,
"generated_at": "2026-10-02T17:17:10Z",
"generated_at": "2026-10-02T17:32:39Z",
"repository": "VMAFx/vmafx",
"commit_sha": "baa4abfeba3ca277a16f601ad92977f748f8d9c6",
"total_infractions": 231,
"commit_sha": "58376c70f3bbaad0d4ccd710b7ffeed31a4e7d31",
"total_infractions": 229,
"infractions": [
{
"rule_id": "HISS-04",
Expand Down Expand Up @@ -674,22 +674,6 @@
"message": "process::abort ends the process from library code; return an error to fn main instead",
"fingerprint": "bindings/rust/vmafx-sys/src/safe.rs:339:HISS-07"
},
{
"rule_id": "HISS-04",
"file_path": "compat/python-vmaf/__init__.py",
"line_number": 204,
"symbol": "call_vmafexec_multi_features",
"message": "Function 'call_vmafexec_multi_features' (77 LOC) exceeds HISS-04 / NASA Rule 4 limit of 60 LOC",
"fingerprint": "compat/python-vmaf/__init__.py:204:HISS-04"
},
{
"rule_id": "HISS-04",
"file_path": "compat/python-vmaf/__init__.py",
"line_number": 303,
"symbol": "call_vmafexec",
"message": "Function 'call_vmafexec' (118 LOC) exceeds HISS-04 / NASA Rule 4 limit of 60 LOC",
"fingerprint": "compat/python-vmaf/__init__.py:303:HISS-04"
},
{
"rule_id": "HISS-04",
"file_path": "compat/python-vmaf/core/cross_validation.py",
Expand Down
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,22 @@ make `core/AGENTS.md` a generated index over `AGENTS.d/` topic pages ([ADR-1454]
on 71,840 inputs.


- **`float_adm` uses AVX2 and AVX-512 on x86, with unchanged scores
(ADR-1473).** The wavelet and the contrast-sensitivity stage run through
kernels that return the scalar code's bits: every four-tap sum starts at
`+0` and multiplies before it adds, and the filtered CSF value is a double
product narrowed to float. `--cpumask` selects scalar (63), AVX2 (48) or
AVX-512 (0); every `float_adm` output and the float model scores are
identical on all three and identical to the previous release. One thread on
a Ryzen 9 9950X3D: 1.45 to 1.11 ms per 576x324 frame, 17.9 to 15.1 ms at
1920x1080, 76.2 to 62.9 ms at 3840x2160. The kernels existed but nothing
called them, and they differed from the scalar code (a negative zero where
it returns a positive one, a float product where it multiplies in double).
Two unused reduction kernels that could not reproduce the scalar sums
(`float_adm_csf_den_scale_avx2` / `_avx512`, `float_adm_sum_cube_avx2` /
`_avx512`) are removed.


- **The cross-backend parity gate covers every registered CUDA, SYCL and HIP
twin.** `speed_temporal` was the one feature whose three GPU twins were
registered and compared by no gate cell. It is now a gate feature, with a
Expand Down Expand Up @@ -1292,6 +1308,15 @@ make `core/AGENTS.md` a generated index over `AGENTS.d/` topic pages ([ADR-1454]
[ADR-1250](docs/adr/1250-eupl-fork-relicense.md)).


- **`compat/python-vmaf/__init__.py` meets the HISS standard and carries its
SPDX line.** `call_vmafexec()` (118 lines) and
`call_vmafexec_multi_features()` (77 lines) are assembled from pure helpers
that each emit one part of the command; the command text is unchanged and
now pinned by two tests. HISS baseline: two rows fewer
([ADR-1142](docs/adr/1142-whole-codebase-standards.md),
[ADR-1250](docs/adr/1250-eupl-fork-relicense.md)).


- Added missing SPDX-License-Identifier declarations across 387 clean source
and header files in accordance with ADR-1250 and repository provenance,
skipping 131 files with baselined debt, 5 vendored Pelorus mirror paths,
Expand Down Expand Up @@ -2483,6 +2508,16 @@ make `core/AGENTS.md` a generated index over `AGENTS.d/` topic pages ([ADR-1454]
[`psnr_hvs`](docs/metrics/psnr-hvs.md#cpu-instruction-sets).


- **The Python harness accepts `motion_force_zero` with more than one model.**
`ExternalProgramCaller.call_vmafexec()` raised `AssertionError` for the
second model when `motion_force_zero=True`: the loop over the models
replaced the argument with the string `"true"` and then failed its own type
check (the same statement is in Netflix upstream). Every model now gets the
overload. A run with one model, including every golden test, produces the
same command as before
(`T-PYTHON-CALL-VMAFEXEC-FORCE-ZERO-SECOND-MODEL-2026-10-02`).


- **`vmaf` no longer hangs after an out-of-memory on the device.**
`vmaf_read_pictures()` kept the pair of pictures it was given when it failed
before it reached an extractor (a non-increasing index, pictures that
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ generated agent context against `AGENTS.md`.
private scratch-link policy.

**Debt Baseline**: `.standards-baseline.json` anchors the debt ratchet at
231 recorded infractions; audit forbids growth.
229 recorded infractions; audit forbids growth.

[praetor-docs-badge]: https://github.com/vmafx/vmafx/actions/workflows/praetor-docs.yml/badge.svg
[praetor-docs-runs]: https://github.com/vmafx/vmafx/actions/workflows/praetor-docs.yml
Expand Down
14 changes: 14 additions & 0 deletions changelog.d/changed/float-adm-x86-simd-exact-dispatched.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
- **`float_adm` uses AVX2 and AVX-512 on x86, with unchanged scores
(ADR-1473).** The wavelet and the contrast-sensitivity stage run through
kernels that return the scalar code's bits: every four-tap sum starts at
`+0` and multiplies before it adds, and the filtered CSF value is a double
product narrowed to float. `--cpumask` selects scalar (63), AVX2 (48) or
AVX-512 (0); every `float_adm` output and the float model scores are
identical on all three and identical to the previous release. One thread on
a Ryzen 9 9950X3D: 1.45 to 1.11 ms per 576x324 frame, 17.9 to 15.1 ms at
1920x1080, 76.2 to 62.9 ms at 3840x2160. The kernels existed but nothing
called them, and they differed from the scalar code (a negative zero where
it returns a positive one, a float product where it multiplies in double).
Two unused reduction kernels that could not reproduce the scalar sums
(`float_adm_csf_den_scale_avx2` / `_avx512`, `float_adm_sum_cube_avx2` /
`_avx512`) are removed.
7 changes: 7 additions & 0 deletions changelog.d/changed/std-python-harness-init.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
- **`compat/python-vmaf/__init__.py` meets the HISS standard and carries its
SPDX line.** `call_vmafexec()` (118 lines) and
`call_vmafexec_multi_features()` (77 lines) are assembled from pure helpers
that each emit one part of the command; the command text is unchanged and
now pinned by two tests. HISS baseline: two rows fewer
([ADR-1142](docs/adr/1142-whole-codebase-standards.md),
[ADR-1250](docs/adr/1250-eupl-fork-relicense.md)).
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
- **The Python harness accepts `motion_force_zero` with more than one model.**
`ExternalProgramCaller.call_vmafexec()` raised `AssertionError` for the
second model when `motion_force_zero=True`: the loop over the models
replaced the argument with the string `"true"` and then failed its own type
check (the same statement is in Netflix upstream). Every model now gets the
overload. A run with one model, including every golden test, produces the
same command as before
(`T-PYTHON-CALL-VMAFEXEC-FORCE-ZERO-SECOND-MODEL-2026-10-02`).
14 changes: 14 additions & 0 deletions compat/python-vmaf/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,20 @@ python/vmaf/
`noref_feature_extractor` preserve reduction accumulation order; `local_explainer` /
`nn_train_test_model` keep RNG draw order. `result.scores_key_wildcard_match()`
doctests redistributed across helpers; `doctest.testmod()` finds all 12.
- **`__init__.py` command builders are assembled from pure helpers
(`T-PYTHON-CALL-VMAFEXEC-FORCE-ZERO-SECOND-MODEL-2026-10-02`).**
`ExternalProgramCaller.call_vmafexec()` and `call_vmafexec_multi_features()`
keep their signatures; the command text comes from
`_vmafexec_base_command`, `_vmafexec_feature_flags`, `_vmafexec_model_flags`
(which calls `_vmafexec_model_overloads` once per model),
`_vmafexec_run_flags`, `_multi_features_run_arguments` and
`_feature_argument`. Keep the helpers pure: upstream's loop overwrote
`motion_force_zero` with the string `"true"` and then failed its own
`isinstance(..., bool)` assertion on the second model. An upstream change to
a flag goes into the helper that emits it; the order of the parts is pinned
by `test_full_command_is_pinned` and
`test_full_multi_features_command_is_pinned` in
`python/test/python_harness_coverage_test.py`.
- **Bounded frame loops replace `while True` (HISS-02).** PyPSNR loop in
`core/feature_extractor.py` walks `min(ref.num_frms, dis.num_frms)` (`YuvReader` validated);
no `try/except StopIteration`. `tools/scanf.py` bounds loop in header; `readiter()`
Expand Down
Loading
Loading