From e7b30d45eca0308973a63b9192d97d8b78c9380a Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 09:32:17 -0700 Subject: [PATCH 01/12] fix(texture): square zone sizes, run lengths and grey levels in double GLSZM and GLRLM took the square of a zone size or run length in int and the square of a grey level in unsigned before widening, so a zone or run of 46,341 or more overflowed (undefined behaviour), and a grey level times a run length of 65,536 or more wrapped silently. The affected features were GLSZM SAE/LAE (2D, 3D and the GPU kernel) and the GLRLM run-length and grey-level emphases (2D and 3D). On a whole-organ ROI this made 3GLSZM_SAE exactly 0 and 3GLSZM_LAE negative or 142x low. Every such product is now taken in floating point: double on the CPU, the way GLDM already did it, and float in the GPU kernel, whose accumulators are float. The two #if 0 copies of the old 3D GLSZM SAE/LAE are removed. Tests, closed form at rel=1e-12, each failing without the fix: - TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC: two zones of 46,656 - TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC: two zones of 65,536 - TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC and the 3D twin: two runs of 46,656, six run-length emphases - TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC and the 3D twin: grey level 70,000, six grey-level emphases in every direction --- src/nyx/features/3d_glrlm.cpp | 24 +++---- src/nyx/features/3d_glszm.cpp | 26 +------ src/nyx/features/glrlm.cpp | 24 +++---- src/nyx/features/glszm.cpp | 4 +- src/nyx/gpu/glszm.cu | 4 +- tests/test_2d_glrlm_analytic.h | 85 +++++++++++++++++++++++ tests/test_2d_glszm_analytic.h | 48 +++++++++++++ tests/test_3d_glrlm_analytic.h | 122 +++++++++++++++++++++++++++++++++ tests/test_3d_glszm_analytic.h | 35 ++++++++++ tests/test_all.cc | 34 ++++++++- 10 files changed, 353 insertions(+), 53 deletions(-) create mode 100644 tests/test_2d_glrlm_analytic.h create mode 100644 tests/test_2d_glszm_analytic.h create mode 100644 tests/test_3d_glrlm_analytic.h create mode 100644 tests/test_3d_glszm_analytic.h diff --git a/src/nyx/features/3d_glrlm.cpp b/src/nyx/features/3d_glrlm.cpp index aa7ef9bcb..4eab8be57 100644 --- a/src/nyx/features/3d_glrlm.cpp +++ b/src/nyx/features/3d_glrlm.cpp @@ -344,7 +344,7 @@ double D3_GLRLM_feature::calc_SRE (const SimpleMatrix &P, const double sum_ for (int j = 1; j <= Nr; ++j) { - f += rj[j] / double(j * j); + f += rj[j] / (double(j) * double(j)); } double retval = f / sum_p; @@ -366,7 +366,7 @@ double D3_GLRLM_feature::calc_LRE (const SimpleMatrix &P, const double sum_ { for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(j * j); + f += P.matlab(i, j) * (double(j) * double(j)); } } @@ -490,7 +490,7 @@ double D3_GLRLM_feature::calc_GLV (const SimpleMatrix &P, const std::vector double mu = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { mu += P.matlab(i, j) / sum_p * inten; @@ -500,7 +500,7 @@ double D3_GLRLM_feature::calc_GLV (const SimpleMatrix &P, const std::vector double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { double mu2 = (inten - mu) * (inten - mu); @@ -578,7 +578,7 @@ double D3_GLRLM_feature::calc_LGLRE (const SimpleMatrix &P, const std::vect double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) / double(inten * inten); @@ -601,7 +601,7 @@ double D3_GLRLM_feature::calc_HGLRE (const SimpleMatrix &P, const std::vect double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) * double(inten) * double(inten); @@ -624,7 +624,7 @@ double D3_GLRLM_feature::calc_SRLGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I [i-1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) / double(inten * inten * j * j); @@ -647,10 +647,10 @@ double D3_GLRLM_feature::calc_SRHGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten) / double(j * j); + f += P.matlab(i, j) * double(inten * inten) / (double(j) * double(j)); } } double retval = f / sum_p; @@ -670,10 +670,10 @@ double D3_GLRLM_feature::calc_LRLGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(j * j) / double(inten * inten); + f += P.matlab(i, j) * (double(j) * double(j)) / double(inten * inten); } } double retval = f / sum_p; @@ -693,7 +693,7 @@ double D3_GLRLM_feature::calc_LRHGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) * double(inten * inten * j * j); diff --git a/src/nyx/features/3d_glszm.cpp b/src/nyx/features/3d_glszm.cpp index 67fd5871f..a4b0f5cee 100644 --- a/src/nyx/features/3d_glszm.cpp +++ b/src/nyx/features/3d_glszm.cpp @@ -820,22 +820,11 @@ void D3_GLSZM_feature::save_value(std::vector>& fvals) // 1. Small Area Emphasis double D3_GLSZM_feature::calc_SAE() { -#if 0 - // Calculate feature. 'sj' is expected to have been initialized in calc_sums_of_P() - double f = 0.0; - for (int j = 1; j <= /*Ns*/P.width(); j++) - { - f += sj[j] / (j * j); - } - double retval = f / sum_p; - return retval; -#endif - double tot = 0; for (int i=1; i<=Ng; i++) { for (int j=1; j<=P.width(); j++) - tot += double(P.matlab(i,j)) / double(j*j); + tot += double(P.matlab(i,j)) / (double(j) * double(j)); } double retval = tot / Nz; return retval; @@ -844,22 +833,11 @@ double D3_GLSZM_feature::calc_SAE() // 2. Large Area Emphasis double D3_GLSZM_feature::calc_LAE() { -#if 0 - // Calculate feature. 'sj' is expected to have been initialized in calc_sums_of_P() - double f = 0.0; - for (int j = 1; j <= /*Ns*/P.width(); j++) - { - f += sj[j] * (j * j); - } - double retval = f / sum_p; - return retval; -#endif - double tot = 0; for (int i = 1; i <= Ng; i++) { for (int j = 1; j <= P.width(); j++) - tot += double(P.matlab(i,j)) * double(j*j); + tot += double(P.matlab(i,j)) * (double(j) * double(j)); } double retval = tot / Nz; return retval; diff --git a/src/nyx/features/glrlm.cpp b/src/nyx/features/glrlm.cpp index f89e391a5..9b6ea724c 100644 --- a/src/nyx/features/glrlm.cpp +++ b/src/nyx/features/glrlm.cpp @@ -379,7 +379,7 @@ void GLRLMFeature::calc_SRE(AngledFtrs& af) } for (int j = 1; j <= Nr; ++j) { - f += rj[j] / (j * j); + f += rj[j] / (double(j) * double(j)); } double retval = f / double(sum_p[ai]); @@ -410,7 +410,7 @@ void GLRLMFeature::calc_LRE(AngledFtrs& af) { for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * j * j; + f += P.matlab(i, j) * (double(j) * double(j)); } } @@ -597,7 +597,7 @@ void GLRLMFeature::calc_GLV(AngledFtrs& af) double mu = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { mu += P.matlab(i, j) / sum_p[ai] * inten; @@ -607,7 +607,7 @@ void GLRLMFeature::calc_GLV(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { double mu2 = (inten - mu) * (inten - mu); @@ -711,7 +711,7 @@ void GLRLMFeature::calc_LGLRE (AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) / double(inten*inten); @@ -743,7 +743,7 @@ void GLRLMFeature::calc_HGLRE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) * double(inten * inten); @@ -775,7 +775,7 @@ void GLRLMFeature::calc_SRLGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) / double(inten * inten * j * j); @@ -807,10 +807,10 @@ void GLRLMFeature::calc_SRHGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten) / double(j * j); + f += P.matlab(i, j) * double(inten * inten) / (double(j) * double(j)); } } double retval = f / double(sum_p[ai]); @@ -838,10 +838,10 @@ void GLRLMFeature::calc_LRLGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(j * j) / double(inten*inten); + f += P.matlab(i, j) * (double(j) * double(j)) / double(inten*inten); } } double retval = f / double(sum_p[ai]); @@ -870,7 +870,7 @@ void GLRLMFeature::calc_LRHGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i - 1]; + double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) * double(inten * inten * j * j); diff --git a/src/nyx/features/glszm.cpp b/src/nyx/features/glszm.cpp index 0f8f9e00c..f12018d6c 100644 --- a/src/nyx/features/glszm.cpp +++ b/src/nyx/features/glszm.cpp @@ -423,7 +423,7 @@ double GLSZMFeature::calc_SAE() double f = 0.0; for (int j = 1; j <= Ns; j++) { - f += sj[j] / (j * j); + f += sj[j] / (double(j) * double(j)); } double retval = f / sum_p; return retval; @@ -436,7 +436,7 @@ double GLSZMFeature::calc_LAE() double f = 0.0; for (int j = 1; j <= Ns; j++) { - f += sj[j] * (j * j); + f += sj[j] * (double(j) * double(j)); } double retval = f / sum_p; return retval; diff --git a/src/nyx/gpu/glszm.cu b/src/nyx/gpu/glszm.cu index bb0e6d303..9c9a0cd4d 100644 --- a/src/nyx/gpu/glszm.cu +++ b/src/nyx/gpu/glszm.cu @@ -117,8 +117,8 @@ namespace NyxusGpu return; float s = SJ[j]; - atomicAdd(&state[f_SAE], s / (j * j)); - atomicAdd(&state[f_LAE], s * (j * j)); + atomicAdd(&state[f_SAE], s / (float(j) * float(j))); + atomicAdd(&state[f_LAE], s * (float(j) * float(j))); atomicAdd(&state[f_SZN], s * s); atomicAdd(&state[f_SZNN], s * s); } diff --git a/tests/test_2d_glrlm_analytic.h b/tests/test_2d_glrlm_analytic.h new file mode 100644 index 000000000..26dc3f8d8 --- /dev/null +++ b/tests/test_2d_glrlm_analytic.h @@ -0,0 +1,85 @@ +#pragma once + +// 2D GLRLM emphases against their closed form, on ROIs whose run lengths and grey levels are large +// enough that a squared term no longer fits in 32 bits (SPEC 4, oracle `analytic`). + +// gtest and are this file's own; GLRLMFeature, Feature2D, the IBSI settings recipe and the +// ROI loader arrive with the common header. +#include +#include +#include "test_2d_glrlm_common.h" + +// Featurises one fully masked ROI given as (x, y, intensity) pixels, at the IBSI recipe, which keeps +// the grey levels as they are. +static void run_2d_glrlm_on_pixels (LR& roidata, const std::vector& intensity) +{ + std::vector mask (intensity); + for (auto& px : mask) + px.intensity = 1u; + Nyxus::load_masked_test_roi_data (roidata, intensity.data(), mask.data(), intensity.size()); + + GLRLMFeature f; + f.calculate (roidata, make_2d_glrlm_ibsi_settings()); + roidata.initialize_fvals(); + f.save_value (roidata.fvals); +} + +static void assert_2d_glrlm_closed_form (const LR& roidata, Feature2D fcode, int angle, double expected) +{ + const double actual = roidata.fvals[(int)fcode][angle]; + ASSERT_NEAR (actual, expected, 1e-12 * expected) << "feature " << (int)fcode << " angle " << angle; +} + +// bench_glrlm_2d_two_long_runs -- one row of 2L pixels, L = 46,656, the left half at intensity 1 and +// the right half at intensity 2. At 0 degrees that is two runs, one of length L at each level, and +// L^2 = 2,176,782,336 is past INT_MAX while 2^2 * L^2 is past UINT_MAX, so every run-length term is +// right here only if it is taken in double. Over the Nr = 2 runs: +// +// SRE = 1/L^2 LRE = L^2 +// SRLGLE = (1 + 1/4) / 2 / L^2 SRHGLE = (1 + 4) / 2 / L^2 +// LRLGLE = (1 + 1/4) / 2 * L^2 LRHGLE = (1 + 4) / 2 * L^2 +void test_2d_glrlm_long_run_emphasis_analytic() +{ + const size_t L = 46656; + std::vector intensity; + for (size_t x = 0; x < 2 * L; x++) + intensity.push_back ({ x, 0, x < L ? 1u : 2u }); + + LR roidata; + ASSERT_NO_FATAL_FAILURE (run_2d_glrlm_on_pixels (roidata, intensity)); + + const double L2 = double(L) * double(L); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRE, 0, 1.0 / L2); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRE, 0, L2); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, 0, 0.625 / L2); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, 0, 2.5 / L2); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, 0, 0.625 * L2); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, 0, 2.5 * L2); +} + +// bench_glrlm_2d_high_grey_pair -- two adjacent pixels at intensities 1 and G = 70,000. Every +// direction sees two runs of length 1, and G^2 = 4.9e9 is past UINT_MAX, so the grey-level terms are +// right here only if the level is squared in double. Over the Nr = 2 runs, in all four directions: +// +// LGLRE = SRLGLE = LRLGLE = (1 + 1/G^2) / 2 +// HGLRE = SRHGLE = LRHGLE = (1 + G^2) / 2 +void test_2d_glrlm_high_grey_level_emphasis_analytic() +{ + const double G = 70000.0; + std::vector intensity = { { 0, 0, 1u }, { 1, 0, 70000u } }; + + LR roidata; + ASSERT_NO_FATAL_FAILURE (run_2d_glrlm_on_pixels (roidata, intensity)); + + const double low = (1.0 + 1.0 / (G * G)) / 2.0, + high = (1.0 + G * G) / 2.0; + for (int angle = 0; angle < 4; angle++) + { + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LGLRE, angle, low); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, angle, low); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, angle, low); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_HGLRE, angle, high); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, angle, high); + assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, angle, high); + } +} diff --git a/tests/test_2d_glszm_analytic.h b/tests/test_2d_glszm_analytic.h new file mode 100644 index 000000000..ae9d255ec --- /dev/null +++ b/tests/test_2d_glszm_analytic.h @@ -0,0 +1,48 @@ +#pragma once + +// 2D GLSZM size emphases against their closed form, on a ROI whose zones are large enough that the +// square of a zone size no longer fits in an int (SPEC 4, oracle `analytic`). + +// Nothing of its own: gtest, , GLSZMFeature, the settings recipe and the ROI loader all +// arrive with the common header. +#include "test_2d_glszm_common.h" + +// bench_glszm_2d_two_large_zones -- a 216 x 432 rectangle, the top half at intensity 1 and the +// bottom half at intensity 2. Each half is one zone of L = 216 * 216 = 46,656 pixels, and L^2 = +// 2,176,782,336 is past INT_MAX, so a size emphasis is right here only if j^2 is taken in double. +// With two zones, both of size L, the size-zone matrix has one column that matters and: +// +// SAE = (1/L^2 + 1/L^2) / 2 = 1 / L^2 LAE = (L^2 + L^2) / 2 = L^2 +// +// Read at IBSI=true, which keeps the two levels as they are. +static void make_glszm_2d_two_large_zones (std::vector& intensity, std::vector& mask) +{ + const size_t side = 216; + intensity.clear(); + mask.clear(); + for (size_t y = 0; y < 2 * side; y++) + for (size_t x = 0; x < side; x++) + { + intensity.push_back ({ x, y, y < side ? 1u : 2u }); + mask.push_back ({ x, y, 1u }); + } +} + +void test_2d_glszm_large_zone_size_emphasis_analytic() +{ + std::vector intensity, mask; + make_glszm_2d_two_large_zones (intensity, mask); + + LR roidata; + Nyxus::load_masked_test_roi_data (roidata, intensity.data(), mask.data(), intensity.size()); + + GLSZMFeature f; + f.calculate (roidata, make_glszm2d_settings (true/*ibsi*/, 0)); + roidata.initialize_fvals(); + f.save_value (roidata.fvals); + + const double L = 216.0 * 216.0, + L2 = L * L; + ASSERT_NEAR (roidata.fvals[(int)Feature2D::GLSZM_SAE][0], 1.0 / L2, 1e-12 / L2); + ASSERT_NEAR (roidata.fvals[(int)Feature2D::GLSZM_LAE][0], L2, 1e-12 * L2); +} diff --git a/tests/test_3d_glrlm_analytic.h b/tests/test_3d_glrlm_analytic.h new file mode 100644 index 000000000..16a56ac95 --- /dev/null +++ b/tests/test_3d_glrlm_analytic.h @@ -0,0 +1,122 @@ +#pragma once + +// 3D GLRLM emphases against their closed form, on volumes whose run lengths and grey levels are large +// enough that a squared term no longer fits in 32 bits (SPEC 4, oracle `analytic`). + +#include +#include +#include "../src/nyx/features/3d_glrlm.h" // D3_GLRLM_feature, and SimpleCube / PixIntens with it +#include "test_main_nyxus.h" // the Environment / roi_cache graph, Fsettings with it + +// No binning (GLRLM_GREYDEPTH = 0), which keeps the levels of a fixture as they are. +static Fsettings make_glrlm3d_nobinning_settings() +{ + Fsettings s; + s.resize ((int)NyxSetting::__COUNT__); + s[(int)NyxSetting::SOFTNAN].rval = 0.0; + s[(int)NyxSetting::TINY].rval = 0.0; + s[(int)NyxSetting::SINGLEROI].bval = false; + s[(int)NyxSetting::GREYDEPTH].ival = 64; + s[(int)NyxSetting::PIXELSIZEUM].rval = 100; + s[(int)NyxSetting::PIXELDISTANCE].ival = 5; + s[(int)NyxSetting::USEGPU].bval = false; + s[(int)NyxSetting::VERBOSLVL].ival = 0; + s[(int)NyxSetting::IBSI].bval = false; + s[(int)NyxSetting::GLRLM_GREYDEPTH].ival = 0; + return s; +} + +// Featurises a w x h x d volume held in memory, every non-zero voxel inside the ROI, into 'fvals' +// (indexed by Nyxus 3D feature code). The LR is built the way the prescan hands one to calculate(): +// the voxel cube, the voxel cloud and the running intensity extrema. +static void run_3d_glrlm_on_volume ( + std::vector>& fvals, + const std::vector& voxels, + int w, int h, int d) +{ + ASSERT_EQ (voxels.size(), size_t(w) * size_t(h) * size_t(d)); + + LR r; + r.aux_image_cube = SimpleCube (voxels, w, h, d); + for (int z = 0; z < d; z++) + for (int y = 0; y < h; y++) + for (int x = 0; x < w; x++) + { + PixIntens v = r.aux_image_cube.zyx (z, y, x); + if (!v) + continue; + r.raw_pixels_3D.push_back (Pixel3 (x, y, z, v)); + if (v < r.aux_min) + r.aux_min = v; + if (v > r.aux_max) + r.aux_max = v; + } + + D3_GLRLM_feature f; + ASSERT_NO_THROW (r.initialize_fvals()); + ASSERT_NO_THROW (f.calculate (r, make_glrlm3d_nobinning_settings())); + f.save_value (r.fvals); + fvals = r.fvals; +} + +static void assert_3d_glrlm_closed_form (const std::vector>& fvals, Feature3D fcode, int angle, double expected) +{ + const double actual = fvals[(int)fcode][angle]; + ASSERT_NEAR (actual, expected, 1e-12 * expected) << "feature " << (int)fcode << " angle " << angle; +} + +// bench_glrlm_3d_two_long_runs -- a 2L x 1 x 1 line of voxels, L = 46,656, the first half at +// intensity 1 and the second at intensity 2. Direction slot 12 is {dz=0, dy=0, dx=1}, along the +// line, and sees two runs, one of length L at each level; L^2 = 2,176,782,336 is past INT_MAX and +// 2^2 * L^2 is past UINT_MAX, so every run-length term is right here only if it is taken in double. +// Over its Nr = 2 runs: +// +// SRE = 1/L^2 LRE = L^2 +// SRLGLE = (1 + 1/4) / 2 / L^2 SRHGLE = (1 + 4) / 2 / L^2 +// LRLGLE = (1 + 1/4) / 2 * L^2 LRHGLE = (1 + 4) / 2 * L^2 +void test_3d_glrlm_long_run_emphasis_analytic() +{ + const int L = 46656; + std::vector voxels (2 * size_t(L)); + for (size_t x = 0; x < voxels.size(); x++) + voxels[x] = x < size_t(L) ? 1 : 2; + + std::vector> fvals; + ASSERT_NO_FATAL_FAILURE (run_3d_glrlm_on_volume (fvals, voxels, 2 * L, 1, 1)); + + const int along_x = 12; + const double L2 = double(L) * double(L); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRE, along_x, 1.0 / L2); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRE, along_x, L2); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, along_x, 0.625 / L2); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, along_x, 2.5 / L2); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, along_x, 0.625 * L2); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, along_x, 2.5 * L2); +} + +// bench_glrlm_3d_high_grey_pair -- two adjacent voxels at intensities 1 and G = 70,000. Every one of +// the 13 directions sees two runs of length 1, and G^2 = 4.9e9 is past UINT_MAX, so the grey-level +// terms are right here only if the level is squared in double. Over the Nr = 2 runs: +// +// LGLRE = SRLGLE = LRLGLE = (1 + 1/G^2) / 2 +// HGLRE = SRHGLE = LRHGLE = (1 + G^2) / 2 +void test_3d_glrlm_high_grey_level_emphasis_analytic() +{ + const double G = 70000.0; + std::vector voxels = { 1, 70000 }; + + std::vector> fvals; + ASSERT_NO_FATAL_FAILURE (run_3d_glrlm_on_volume (fvals, voxels, 2, 1, 1)); + + const double low = (1.0 + 1.0 / (G * G)) / 2.0, + high = (1.0 + G * G) / 2.0; + for (int angle = 0; angle < 13; angle++) + { + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LGLRE, angle, low); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, angle, low); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, angle, low); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_HGLRE, angle, high); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, angle, high); + assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, angle, high); + } +} diff --git a/tests/test_3d_glszm_analytic.h b/tests/test_3d_glszm_analytic.h new file mode 100644 index 000000000..47f7e84d3 --- /dev/null +++ b/tests/test_3d_glszm_analytic.h @@ -0,0 +1,35 @@ +#pragma once + +// 3D GLSZM size emphases against their closed form, on a volume whose zones are large enough that +// the square of a zone size no longer fits in an int (SPEC 4, oracle `analytic`). + +// Nothing of its own: gtest, , D3_GLSZM_feature, the settings recipe and the in-memory +// volume runner all arrive with the common header. +#include "test_3d_glszm_common.h" + +// bench_glszm_3d_two_large_zones -- a 64 x 64 x 32 volume, slices 0-15 at intensity 1 and slices +// 16-31 at intensity 2. Each half is one 26-connected zone of L = 64 * 64 * 16 = 65,536 voxels, and +// L^2 = 2^32 is past INT_MAX -- in 32-bit arithmetic it is exactly 0 -- so a size emphasis is right +// here only if j^2 is taken in double. With two zones, both of size L: +// +// SAE = (1/L^2 + 1/L^2) / 2 = 1 / L^2 LAE = (L^2 + L^2) / 2 = L^2 +// +// Read with no binning, which keeps the two levels as they are. +void test_3d_glszm_large_zone_size_emphasis_analytic() +{ + const int w = 64, h = 64, d = 32; + std::vector voxels (size_t(w) * h * d); + for (int z = 0; z < d; z++) + for (int i = 0; i < w * h; i++) + voxels[size_t(z) * w * h + i] = z < d / 2 ? 1 : 2; + + std::vector> fvals; + D3_GLSZM_feature f; + ASSERT_NO_FATAL_FAILURE (run_3d_glszm_on_volume ( + fvals, voxels, w, h, d, make_glszm3d_settings (64/*greydepth*/, 0/*no binning*/), f)); + + const double L = 64.0 * 64.0 * 16.0, + L2 = L * L; + ASSERT_NEAR (fvals[(int)Feature3D::GLSZM_SAE][0], 1.0 / L2, 1e-12 / L2); + ASSERT_NEAR (fvals[(int)Feature3D::GLSZM_LAE][0], L2, 1e-12 * L2); +} diff --git a/tests/test_all.cc b/tests/test_all.cc index 60b116c29..dd048c22b 100644 --- a/tests/test_all.cc +++ b/tests/test_all.cc @@ -65,11 +65,13 @@ #include "test_2d_glrlm_ibsi.h" #include "test_2d_glrlm_pyradiomics.h" #include "test_2d_glrlm_mirp.h" +#include "test_2d_glrlm_analytic.h" #include "test_2d_gldzm_ibsi.h" #include "test_2d_gldzm_mirp.h" #include "test_2d_gldzm_regression.h" #include "test_2d_glszm_ibsi.h" #include "test_2d_glszm_mirp.h" +#include "test_2d_glszm_analytic.h" #include "test_2d_firstorder_ibsi.h" #include "test_2d_firstorder_pyradiomics.h" #include "test_2d_ngldm_ibsi.h" @@ -130,9 +132,11 @@ #include "test_3d_ngtdm_mechanics.h" #include "test_3d_glrlm_pyradiomics.h" #include "test_3d_glrlm_regression.h" +#include "test_3d_glrlm_analytic.h" #include "test_3d_glszm_pyradiomics.h" #include "test_3d_glszm_regression.h" #include "test_3d_glszm_mechanics.h" +#include "test_3d_glszm_analytic.h" #include "test_3d_coverage_common.h" #include "test_2d_glcm_mechanics.h" #ifdef USE_ARROW @@ -408,6 +412,14 @@ TEST(TEST_NYXUS, TEST_3D_GLRLM_AVE_PYRADIOMICS) { ASSERT_NO_THROW(test_3d_glrlm_ave_pyradiomics()); } +TEST(TEST_NYXUS, TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC) { + ASSERT_NO_THROW(test_3d_glrlm_long_run_emphasis_analytic()); +} + +TEST(TEST_NYXUS, TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC) { + ASSERT_NO_THROW(test_3d_glrlm_high_grey_level_emphasis_analytic()); +} + //***** 3D GLSZM compatibility ***** TEST(TEST_NYXUS, TEST_3D_GLSZM_MATRIX_PYRADIOMICS) { @@ -574,6 +586,10 @@ TEST(TEST_NYXUS, TEST_3D_GLSZM_IBSI_EQUALS_NO_BINNING_MECHANICS) { ASSERT_NO_THROW(test_3d_glszm_ibsi_equals_no_binning_mechanics()); } +TEST(TEST_NYXUS, TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC) { + ASSERT_NO_THROW(test_3d_glszm_large_zone_size_emphasis_analytic()); +} + //***** 3D GLDM compatibility ***** TEST(TEST_NYXUS, TEST_3D_GLDM_DE_PYRADIOMICS) { @@ -3092,7 +3108,19 @@ TEST(TEST_NYXUS, TEST_2D_GLDM_DE_IBSI) ASSERT_NO_THROW(test_2d_gldm_de_ibsi()); } -//***** IBSI tests of GLRLM ***** +//***** closed-form tests of GLRLM ***** + +TEST(TEST_NYXUS, TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC) +{ + ASSERT_NO_THROW(test_2d_glrlm_long_run_emphasis_analytic()); +} + +TEST(TEST_NYXUS, TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC) +{ + ASSERT_NO_THROW(test_2d_glrlm_high_grey_level_emphasis_analytic()); +} + +//***** IBSI tests of GLRLM ***** TEST(TEST_NYXUS, TEST_2D_GLRLM_SRE_IBSI) { @@ -3266,6 +3294,10 @@ TEST(TEST_NYXUS, TEST_2D_GLRLM_RE_IBSI) //***** IBSI tests of GLSZM ***** +TEST(TEST_NYXUS, TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC) { + ASSERT_NO_THROW(test_2d_glszm_large_zone_size_emphasis_analytic()); +} + TEST(TEST_NYXUS, TEST_2D_GLSZM_SAE_IBSI) { ASSERT_NO_THROW(test_2d_glszm_sae_ibsi()); } From d49771f576ecaf1b2ef24ecace9530c955153545 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 09:32:17 -0700 Subject: [PATCH 02/12] test(vetting): record the 32-bit range closed-form assertions Registers the six new analytic tests with the coverage tooling: - the 2D GLSZM, 2D GLRLM and 3D GLRLM rows now name their analytic file in current_test - 3D GLSZM gets two vetted analytic rows at the new recipe glszm3d.analytic_two_large_zones - benchmarks.md describes the six fixtures, and config_recipes.md and the two GLSZM matrices describe the new configuration point - the four scanners read the analytic files report_output.csv/.md are regenerated. --- tests/vetting/audit/scan_glrlm3d_coverage.py | 3 +- tests/vetting/audit/scan_glrlm_coverage.py | 3 +- tests/vetting/audit/scan_glszm3d_coverage.py | 5 +- tests/vetting/audit/scan_glszm_coverage.py | 3 +- tests/vetting/benchmarks.md | 88 ++++++++++++++++++++ tests/vetting/config_recipes.md | 13 +++ tests/vetting/matrix/glszm.md | 1 + tests/vetting/matrix/glszm3d.md | 2 +- tests/vetting/oracle_coverage.csv | 38 +++++---- tests/vetting/report_output.csv | 58 ++++++------- tests/vetting/report_output.md | 16 ++-- 11 files changed, 171 insertions(+), 59 deletions(-) diff --git a/tests/vetting/audit/scan_glrlm3d_coverage.py b/tests/vetting/audit/scan_glrlm3d_coverage.py index 5bdee4b89..6e3ae3dc3 100644 --- a/tests/vetting/audit/scan_glrlm3d_coverage.py +++ b/tests/vetting/audit/scan_glrlm3d_coverage.py @@ -13,6 +13,7 @@ import scanlib SOURCES = [ + "test_3d_glrlm_analytic.h", "test_3d_glrlm_pyradiomics.h", "test_3d_glrlm_regression.h", os.path.join("python", "test_nyxus.py"), @@ -31,7 +32,7 @@ FAMILY = scanlib.Family( dim="3D", family="glrlm", sources=SOURCES, - oracle_suffix={"pyradiomics": "pyradiomics"}, + oracle_suffix={"pyradiomics": "pyradiomics", "analytic": "analytic"}, notes=NOTE, enum_dim_prefix=True, # the _AVE test aliases the enum (`using F = Nyxus::Feature3D;`), so cover `F::` too diff --git a/tests/vetting/audit/scan_glrlm_coverage.py b/tests/vetting/audit/scan_glrlm_coverage.py index 1f61e5090..9494e6a9c 100644 --- a/tests/vetting/audit/scan_glrlm_coverage.py +++ b/tests/vetting/audit/scan_glrlm_coverage.py @@ -12,6 +12,7 @@ import scanlib SOURCES = [ + "test_2d_glrlm_analytic.h", "test_2d_glrlm_ibsi.h", "test_2d_glrlm_mirp.h", "test_2d_glrlm_pyradiomics.h", @@ -24,7 +25,7 @@ FAMILY = scanlib.Family( dim="2D", family="glrlm", sources=SOURCES, - oracle_suffix={"ibsi": "ibsi", "mirp": "mirp", "pyradiomics": "pyradiomics"}, + oracle_suffix={"ibsi": "ibsi", "mirp": "mirp", "pyradiomics": "pyradiomics", "analytic": "analytic"}, notes=lambda feature, cov: AVE if feature.endswith("_AVE") else "", # the two family-wide oracle tests loop a golden table keyed by feature name and never spell a # feature on an assertion line diff --git a/tests/vetting/audit/scan_glszm3d_coverage.py b/tests/vetting/audit/scan_glszm3d_coverage.py index feb468921..e8f763acd 100644 --- a/tests/vetting/audit/scan_glszm3d_coverage.py +++ b/tests/vetting/audit/scan_glszm3d_coverage.py @@ -20,6 +20,7 @@ import scanlib SOURCES = [ + "test_3d_glszm_analytic.h", "test_3d_glszm_pyradiomics.h", "test_3d_glszm_regression.h", "test_3d_glszm_mechanics.h", @@ -36,7 +37,7 @@ "glszm_3d_regression_nobinning_ref_vals": "test_3d_glszm_default_greydepth_regression", } -ORACLE_SUFFIX = {"pyradiomics": "pyradiomics"} +ORACLE_SUFFIX = {"pyradiomics": "pyradiomics", "analytic": "analytic"} # recipe -> the function that asserts AT that recipe. Five recipes read the same sixteen features, # three of them out of one file at one kind, so feature, kind and file together still do not say @@ -50,6 +51,8 @@ "glszm3d.regression_ut_phantom_nobinning": re.compile(r"^test_3d_glszm_default_greydepth_regression$"), "glszm3d.regression_constant_roi": re.compile(r"^test_3d_glszm_constant_roi_regression$"), + "glszm3d.analytic_two_large_zones": + re.compile(r"^test_3d_glszm_large_zone_size_emphasis_analytic$"), } # `for (auto fc : D3_GLSZM_feature::featureset)` -- a function that range-loops the calculator's own diff --git a/tests/vetting/audit/scan_glszm_coverage.py b/tests/vetting/audit/scan_glszm_coverage.py index eaa62eab8..b56439126 100644 --- a/tests/vetting/audit/scan_glszm_coverage.py +++ b/tests/vetting/audit/scan_glszm_coverage.py @@ -12,6 +12,7 @@ import scanlib SOURCES = [ + "test_2d_glszm_analytic.h", "test_2d_glszm_ibsi.h", "test_2d_glszm_mirp.h", "test_2d_glszm_regression.h", @@ -34,7 +35,7 @@ FAMILY = scanlib.Family( dim="2D", family="glszm", sources=SOURCES, - oracle_suffix={"mirp": "mirp", "ibsi": "ibsi"}, + oracle_suffix={"mirp": "mirp", "ibsi": "ibsi", "analytic": "analytic"}, notes=scanlib.dual_oracle_notes(NOTE, DUAL_ORACLE), ) diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index 819f5b74a..f443d716b 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -270,6 +270,94 @@ was never written pass. --- +## `bench_glszm_3d_two_large_zones` — two 3D zones whose squared size is 2^32 + +| | | +|---|---| +| Data | built inline in `test_3d_glszm_large_zone_size_emphasis_analytic()` (`tests/test_3d_glszm_analytic.h`) | +| ROI | all 131,072 voxels of a 64×64×32 volume, slices 0-15 at intensity 1 and slices 16-31 at 2 | +| Shape | two 26-connected zones of `L = 65,536` voxels, so the size-zone matrix has two cells, both in column `L` | +| Why it exists | `L^2 = 2^32` is past `INT_MAX` -- in 32-bit arithmetic it is exactly 0 -- so `3GLSZM_SAE = 1/L^2` and `3GLSZM_LAE = L^2` are right only if the square of the zone size is taken in double | + +Recipes: `glszm3d.analytic_two_large_zones`. + +Tests reaching it today: `test_3d_glszm_analytic.h`. + +**One of six 32-bit range fixtures.** Each of the six below is built so that a squared term of a +size-zone or run-length emphasis lies past the 32-bit range while every feature it feeds keeps a +closed form: a zone or run of `L >= 46,341` puts `L^2` past `INT_MAX`, and a grey level +`G >= 65,536` puts `G^2` past `UINT_MAX`. All are read with no binning (2D at `IBSI=true`, 3D at a +family grey depth of 0), so the levels written are the levels used. Each carries two levels, because +a ROI of one intensity is intercepted before any matrix is built. Only this one has a recipe: the 2D +GLSZM, 2D GLRLM and 3D GLRLM registries keep one row per feature, so the other five appear in those +rows' `current_test` instead. + +--- + +## `bench_glszm_2d_two_large_zones` — two 2D zones of 46,656 pixels + +| | | +|---|---| +| Data | `make_glszm_2d_two_large_zones()` in `tests/test_2d_glszm_analytic.h` | +| ROI | a 216×432 rectangle, the top half at intensity 1 and the bottom half at 2 | +| Shape | two zones of `L = 46,656` pixels | +| Why it exists | `GLSZM_SAE = 1/L^2` and `GLSZM_LAE = L^2`, with `L^2` past `INT_MAX` | + +Tests reaching it today: `test_2d_glszm_analytic.h`. + +--- + +## `bench_glrlm_2d_two_long_runs` — two 2D runs of 46,656 pixels + +| | | +|---|---| +| Data | built inline in `test_2d_glrlm_long_run_emphasis_analytic()` (`tests/test_2d_glrlm_analytic.h`) | +| ROI | one row of 93,312 pixels, the left half at intensity 1 and the right half at 2 | +| Shape | at 0 degrees, two runs of `L = 46,656`, one per level | +| Why it exists | the six run-length emphases at 0 degrees, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | + +Tests reaching it today: `test_2d_glrlm_analytic.h`. + +--- + +## `bench_glrlm_2d_high_grey_pair` — two 2D pixels at 1 and 70,000 + +| | | +|---|---| +| Data | built inline in `test_2d_glrlm_high_grey_level_emphasis_analytic()` (`tests/test_2d_glrlm_analytic.h`) | +| ROI | two adjacent pixels at intensities 1 and `G = 70,000` | +| Shape | two runs of length 1 in every direction | +| Why it exists | the six grey-level emphases in all 4 directions, with `G^2` past `UINT_MAX` | + +Tests reaching it today: `test_2d_glrlm_analytic.h`. + +--- + +## `bench_glrlm_3d_two_long_runs` — two 3D runs of 46,656 voxels + +| | | +|---|---| +| Data | built inline in `test_3d_glrlm_long_run_emphasis_analytic()` (`tests/test_3d_glrlm_analytic.h`) | +| ROI | a 93,312×1×1 line, the first half at intensity 1 and the second at 2 | +| Shape | along x, direction slot 12, two runs of `L = 46,656`, one per level | +| Why it exists | the six run-length emphases along x, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | + +Tests reaching it today: `test_3d_glrlm_analytic.h`. + +--- + +## `bench_glrlm_3d_high_grey_pair` — two 3D voxels at 1 and 70,000 + +| | | +|---|---| +| Data | built inline in `test_3d_glrlm_high_grey_level_emphasis_analytic()` (`tests/test_3d_glrlm_analytic.h`) | +| ROI | two adjacent voxels at intensities 1 and `G = 70,000` | +| Shape | two runs of length 1 in every one of the 13 directions | +| Why it exists | the six grey-level emphases in all 13 directions, with `G^2` past `UINT_MAX` | + +Tests reaching it today: `test_3d_glrlm_analytic.h`. +--- + ## `bench_constant_roi_3d` — a nonempty ROI of one intensity | | | diff --git a/tests/vetting/config_recipes.md b/tests/vetting/config_recipes.md index 0214fda69..2ac129469 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -995,6 +995,19 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g narrowing the intercept is `src/` work on its own branch — these rows are what will fail when it happens. +## glszm3d.analytic_two_large_zones +- `bench_glszm_3d_two_large_zones` — a 64x64x32 volume built in + `test_3d_glszm_large_zone_size_emphasis_analytic()`, slices 0-15 at intensity 1 and 16-31 at 2 — at + `GREYDEPTH=64`, `IBSI=false` and `GLSZM_GREYDEPTH=0`, so the two levels are read as they are. + Oracle: `analytic`. Used by `test_3d_glszm_analytic.h`, for `3GLSZM_SAE` and `3GLSZM_LAE` only. +- **What it is for.** Each half is one 26-connected zone of `L = 65,536` voxels, so the matrix has + two cells, both in column `L`, and `SAE = 1/L^2`, `LAE = L^2` exactly. `L^2 = 2^32` is past + `INT_MAX`, so the values are right only if the square of the zone size is taken in double. A zone + of 46,341 voxels already needs that, and a whole-organ ROI reaches it routinely; the family's + PyRadiomics fixtures stop at a largest zone of 634 voxels. +- The band is `rel=1e-12` rather than SPEC 7's absolute exact tier, because `LAE` is 4.3e9 and an + absolute 1e-9 is below its last bit. + ## gldm3d.pyradiomics_bincount20 - The compat phantom (`compat_int/compat_int_mri.nii` + `compat_seg/compat_seg_liver.nii`, label 1) at `GREYDEPTH=100`, `IBSI=false`, `GLDM_GREYDEPTH=-20` (negative activates radiomics binCount-based diff --git a/tests/vetting/matrix/glszm.md b/tests/vetting/matrix/glszm.md index 958a60e12..f253d1d7b 100644 --- a/tests/vetting/matrix/glszm.md +++ b/tests/vetting/matrix/glszm.md @@ -20,6 +20,7 @@ configure once the discretisation is fixed. |---|---|---|---|---| | True | none (identity on an already-discrete fixture) | phantom's own 1..6 | VALID, 15 features | `glszm.ibsi_phantom_2d` — mirp + ibsi, at SPEC §7's exact tier | | True | none | phantom's own 1..6 | VALID, 1 feature at a wider band | `GLSZM_ZE` — same oracles, `rel=4e-3`, the `fast_log10` residual | +| True | none | 1 and 2, zones of 46,656 | VALID, 2 features | `GLSZM_SAE`, `GLSZM_LAE` on zones whose squared size is past `INT_MAX` — analytic, `rel=1e-12`, `test_2d_glszm_analytic.h` | | False | MATLAB (`GREYDEPTH > 0`) | 64 | VALID-prod-only, all 16 | no oracle reproduces it → `test_2d_glszm_regression.h` | | False | radiomics (`GREYDEPTH < 0`) | any | NOT MEASURED | see below | | any | any | ROI with `aux_min == aux_max` | INVALID | degenerate — a blank ROI has no zones; `calculate()` returns NaN before building a matrix, guarded in code rather than by an oracle | diff --git a/tests/vetting/matrix/glszm3d.md b/tests/vetting/matrix/glszm3d.md index 4befdf742..569a9aa78 100644 --- a/tests/vetting/matrix/glszm3d.md +++ b/tests/vetting/matrix/glszm3d.md @@ -20,7 +20,7 @@ therefore has no distance, angle or alpha axis at all, unlike 3D GLCM, 3D GLRLM |---|---|---|---|---| | False | radiomics (`GLSZM_GREYDEPTH < 0`) | 20 bins | VALID | `glszm3d.pyradiomics_bincount20` — pyradiomics, 16/16 | | False | MATLAB (`GLSZM_GREYDEPTH > 0`) | 64 | VALID-prod-only | drift guard, `glszm3d.regression_ut_phantom` — no oracle | -| False | none (`GLSZM_GREYDEPTH == 0`) | the raw levels | VALID | `glszm3d.pyradiomics_ibsi_gapped` — pyradiomics, 16/16 + the matrix, on `bench_cube3_gapped_levels`; pinned on the phantom too, `glszm3d.regression_ut_phantom_nobinning` | +| False | none (`GLSZM_GREYDEPTH == 0`) | the raw levels | VALID | `glszm3d.pyradiomics_ibsi_gapped` — pyradiomics, 16/16 + the matrix, on `bench_cube3_gapped_levels`; pinned on the phantom too, `glszm3d.regression_ut_phantom_nobinning`; `3GLSZM_SAE` and `3GLSZM_LAE` on zones past the 32-bit range, `glszm3d.analytic_two_large_zones` — analytic | | True | none (forced) | the raw levels | VALID — the same cell | measured identical to the row above, values and matrix, by `test_3d_glszm_ibsi_equals_no_binning_mechanics`; see below | | any | any | ROI with `aux_min == aux_max` | VALID-prod-only | drift guard, `glszm3d.regression_constant_roi` — no oracle, and **the pinned behaviour is a known defect**: a constant-intensity ROI has a valid one-zone GLSZM, and `calculate()` returns the soft-NaN sentinel for all sixteen instead. Pinned by `test_3d_glszm_constant_roi_regression`, not endorsed; see below | diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index 174c2bffc..0cfdae23f 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -263,8 +263,8 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLCM_SUMAVERAGE_AVE,glcm,vetted,mirp,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_ibsi.h;test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_regression.h;test_2d_glcm_pyradiomics.py,,MIRP/IBSI check,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | vetted vs MIRP (IBSI digital phantom, glcm_oracle/); MIRP reproduces IBSI consensus exactly and Nyxus IBSI gtest passes (ACOR 5.09, CLUSHADE 7, INFOMEAS1 -0.155, JAVE 2.14, JVAR 2.69, SUMAVERAGE 4.28); _AVE = angle-average of the vetted base",, 2D,GLCM_SUMENTROPY_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=5e-3,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLCM_SUMVARIANCE_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, -2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, +2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, 2D,GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, @@ -273,12 +273,12 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_GLV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=5e-3,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, 2D,GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, @@ -313,8 +313,8 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLDZM_ZDM,gldzm,regression,,,gldzm.ibsi_phantom_2d,rel=1e-3,test_2d_gldzm_regression.h,,,,audit,"not an IBSI GLDZM feature and mirp exposes no column for it, so nothing independent covers it; drift-pinned on the IBSI phantom in test_2d_gldzm_regression.h at rel=1e-3. Value re-recorded after the zone-connectivity fix (8-connected zones), see audit/gldzm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLDZM_ZDM_REGRESSION,ibsi_digital_phantom 2D,GLDZM_ZDV,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,ibsi_digital_phantom 2D,GLDZM_ZDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,ibsi_digital_phantom -2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom -2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom +2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX.",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom +2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX.",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom 2D,GLSZM_GLN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,ibsi_digital_phantom 2D,GLSZM_GLNN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,ibsi_digital_phantom 2D,GLSZM_SZN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,ibsi_digital_phantom @@ -962,7 +962,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_ut_phantom,rel=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md.",TEST_NYXUS.TEST_3D_GLSZM_LAHGLE_REGRESSION,bench_ut57_3d 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md.",TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,bench_ut57_3d 3D,3GLSZM_SAE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant +3D,3GLSZM_SAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones 3D,3GLSZM_LAE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant +3D,3GLSZM_LAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones 3D,3GLSZM_GLN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_GLNN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_SZN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant @@ -977,8 +979,8 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_SAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LALGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, 3D,3GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, @@ -987,12 +989,12 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_GLV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=2e-3,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference.",, -3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, 3D,3GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, diff --git a/tests/vetting/report_output.csv b/tests/vetting/report_output.csv index c860474c8..2b4506522 100644 --- a/tests/vetting/report_output.csv +++ b/tests/vetting/report_output.csv @@ -263,8 +263,8 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glcm,GLCM_SUMAVERAGE_AVE,vetted,mirp,glcm.ibsi_identity,rel=1e-9,agreed,,,,MIRP/IBSI check,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_acor_family_pyradiomics;test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_average_ave_ibsi,test_2d_glcm_sum_average_ave_regression,,4,1,"angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_mirp_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | vetted vs MIRP (IBSI digital phantom, glcm_oracle/); MIRP reproduces IBSI consensus exactly and Nyxus IBSI gtest passes (ACOR 5.09, CLUSHADE 7, INFOMEAS1 -0.155, JAVE 2.14, JVAR 2.69, SUMAVERAGE 4.28); _AVE = angle-average of the vetted base" 2D,glcm,GLCM_SUMENTROPY_AVE,vetted,ibsi,glcm.ibsi_identity,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_entropy_ave_ibsi,test_2d_glcm_sum_entropy_ave_regression,,3,1,"log-based: Nyxus sums through fast_log10 with an EPSILON guard, so it lands 1e-3..3e-3 from both tools instead of on them; asserted at rel=5e-3 | angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." 2D,glcm,GLCM_SUMVARIANCE_AVE,vetted,ibsi,glcm.ibsi_identity,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_variance_ave_ibsi,test_2d_glcm_sum_variance_ave_regression,,3,1,"angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." -2D,glrlm,GLRLM_SRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_LRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" +2D,glrlm,GLRLM_SRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_LRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." 2D,glrlm,GLRLM_GLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ibsi,test_2d_glrlm_gln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_GLNN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glnn_ibsi,test_2d_glrlm_glnn_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rln_ibsi,test_2d_glrlm_rln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" @@ -273,12 +273,12 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glrlm,GLRLM_GLV,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glv_ibsi,test_2d_glrlm_glv_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RV,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rv_ibsi,test_2d_glrlm_rv_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_re_ibsi,test_2d_glrlm_re_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_LGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,3,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_HGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi,test_2d_glrlm_hglre_regression,,3,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,3,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,3,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,3,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,3,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_LGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_HGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_SRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_SRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_LRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_LRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." 2D,glrlm,GLRLM_SRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_LRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_GLN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ave_ibsi,test_2d_glrlm_gln_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." @@ -313,8 +313,8 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,gldzm,GLDZM_ZDM,regression,,gldzm.ibsi_phantom_2d,rel=1e-3,,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDM_REGRESSION,,,audit,,,test_2d_gldzm_zdm_regression,,0,1,no IBSI GLDZM counterpart and no mirp column; regression drift guard only,test_2d_gldzm_zdm_regression,agree,row,,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"not an IBSI GLDZM feature and mirp exposes no column for it, so nothing independent covers it; drift-pinned on the IBSI phantom in test_2d_gldzm_regression.h at rel=1e-3. Value re-recorded after the zone-connectivity fix (8-connected zones), see audit/gldzm_2d_mirp_vetting_report.md" 2D,gldzm,GLDZM_ZDV,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,,,audit,mirp,test_2d_gldzm_zdv_mirp,,,1,0,vetted by mirp only; the IBSI file never held a published value for it,test_2d_gldzm_zdv_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_ZDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" -2D,glszm,GLSZM_SAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,,,audit,ibsi;mirp,test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" -2D,glszm,GLSZM_LAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,,,audit,ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,test_2d_glszm_lae_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" +2D,glszm,GLSZM_SAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX." +2D,glszm,GLSZM_LAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX." 2D,glszm,GLSZM_GLN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,test_2d_glszm_gln_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_GLNN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,test_2d_glszm_glnn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_SZN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,test_2d_glszm_szn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" @@ -897,14 +897,14 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,ngtdm,3NGTDM_STRENGTH,vetted,pyradiomics,ngtdm3d.pyradiomics_binwidth1,rel=1e-9,agreed,bench_compat_ngtdm_3d,TEST_NYXUS.TEST_3D_NGTDM_STRENGTH_PYRADIOMICS,,,audit,pyradiomics,test_3d_ngtdm_strength_pyradiomics;test_3d_ngtdm_strength_r2_pyradiomics,test_3d_ngtdm_strength_regression,test_3d_ngtdm_compatibility,2,1,also asserted by test_3d_ngtdm_compatibility (kind is neither oracle nor regression),test_3d_ngtdm_strength_pyradiomics,agree,row+config,audit/ngtdm_3d_pyradiomics_vetting_report.md,audit/ngtdm_3d_golden_regen.md,matrix/ngtdm3d.md,"vetted vs PyRadiomics 3.0.1 NGTDM on the 4x4x3 NGTDM phantom (label 57), recipe ngtdm3d.pyradiomics_binwidth1. Both sides discretise the phantom's levels 0..5 to 1..6 -- PyRadiomics by binWidth=1, Nyxus by the zero-min correction at NGTDM_GREYDEPTH=0 -- so no binning convention separates them and the residual is 0 to the last bit; asserted at rel=1e-9. Backed by the FIVE SCALARS AND THE MATRIX THEY CONTRACT: all five features are sums over one (i, n_i, p_i, s_i) table of six grey levels, so test_3d_ngtdm_matrix_pyradiomics pins that table too, per level, against PyRadiomics' own P_ngtdm array. A planted 1e-8 error in one s_i fails the matrix assertion naming its level while all five scalars still pass. PyRadiomics' public extractor cannot load this phantom at all -- its mask is label 57 in all 48 voxels with no background, which imageoperations.getMask() rejects -- so the generator constructs RadiomicsNGTDM directly and cross-checks it against an independent numpy NGTDM (worst rel 2.7e-16). The ut_ phantom carries its own drift pins at recipe ngtdm3d.regression_ut_phantom, which are a different config point on a different fixture and have their own rows. gen_ngtdm3d_pyradiomics.py" 3D,ngtdm,3NGTDM_STRENGTH,vetted,pyradiomics,ngtdm3d.pyradiomics_binwidth1_r2,rel=1e-9,agreed,bench_compat_ngtdm_3d,TEST_NYXUS.TEST_3D_NGTDM_STRENGTH_R2_PYRADIOMICS,,,audit,pyradiomics,test_3d_ngtdm_strength_pyradiomics;test_3d_ngtdm_strength_r2_pyradiomics,test_3d_ngtdm_strength_regression,test_3d_ngtdm_compatibility,2,1,also asserted by test_3d_ngtdm_compatibility (kind is neither oracle nor regression),test_3d_ngtdm_strength_r2_pyradiomics,agree,row+config,audit/ngtdm_3d_pyradiomics_vetting_report.md,audit/ngtdm_3d_golden_regen.md,matrix/ngtdm3d.md,"vetted vs PyRadiomics 3.0.1 NGTDM on the 4x4x3 NGTDM phantom (label 57) at NGTDM_RADIUS=2, recipe ngtdm3d.pyradiomics_binwidth1_r2 -- the same phantom and the same binning as ngtdm3d.pyradiomics_binwidth1, differing only in the radius. Asserted at rel=1e-9 with residual 0. THE SECOND CONFIG POINT EXISTS BECAUSE ONE CANNOT SEPARATE HONOURING THE RADIUS FROM IGNORING IT: the radius is the axis a run gets wrong by leaving it unset, and at radius 2 every one of the five features moves by a quarter or more, so an implementation that clamped the radius to 1 would pass every radius-1 assertion and fail these. PyRadiomics' distances names Chebyshev SHELLS rather than a radius, so the match for a solid radius-2 neighbourhood is distances=[1, 2] and not [2]; distances_semantics_check() in the generator measures both readings every run and reports [2] at worst s_i rel 0.334 against the solid neighbourhood. Backed by the matrix as well as the scalars: test_3d_ngtdm_matrix_r2_pyradiomics pins the six-level (i, n_i, p_i, s_i) table these five features contract, per level, against PyRadiomics' own P_ngtdm array. The phantom is 4x4x3, so radius 3 already spans it from every voxel and supports no further config point. gen_ngtdm3d_pyradiomics.py" 3D,ngtdm,3NGTDM_STRENGTH,regression,,ngtdm3d.regression_ut_phantom,rel=1e-9,na,bench_ut57_3d,TEST_NYXUS.TEST_3D_NGTDM_STRENGTH_REGRESSION,,,audit,pyradiomics,test_3d_ngtdm_strength_pyradiomics;test_3d_ngtdm_strength_r2_pyradiomics,test_3d_ngtdm_strength_regression,test_3d_ngtdm_compatibility,2,1,also asserted by test_3d_ngtdm_compatibility (kind is neither oracle nor regression),test_3d_ngtdm_strength_regression,agree,row+config,audit/ngtdm_3d_pyradiomics_vetting_report.md,audit/ngtdm_3d_golden_regen.md,matrix/ngtdm3d.md,"Snapshot drift guard only, recipe ngtdm3d.regression_ut_phantom; establishes no vetting (SPEC 1). The segmented ut_ phantom (ut_inten.nii + ut_mask57.nii, label 57) at NGTDM_GREYDEPTH=64, GREYDEPTH=64, NGTDM_RADIUS=1, ibsi=false -- a different fixture and a different config point from the oracle rows above, not a second assertion on them. At NGTDM_GREYDEPTH=64 the binning is MATLAB-style, which makes bin 1 the background level: a voxel binned there is no matrix row of its own but still counts towards its neighbours' neighbourhood means, and no reference tool reproduces that, which is why this fixture carries no oracle claim. Pinned at full precision in test_3d_ngtdm_regression.h at rel=1e-9; regenerate with runAllTests --gtest_filter=*3D_NGTDM_DUMP_REGRESSION*. The family's oracle assertions are the ngtdm3d.pyradiomics_binwidth1 and ngtdm3d.pyradiomics_binwidth1_r2 rows. Evidence: tests/vetting/audit/ngtdm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_SAE,vetted,pyradiomics,glszm3d.pyradiomics_bincount20,rel=1e-9,agreed,bench_compat_liver_3d,TEST_NYXUS.TEST_3D_GLSZM_SAE_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_sae_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on the compat phantom (bench_compat_liver_3d, label 1), recipe glszm3d.pyradiomics_bincount20. Nyxus' GLSZM_GREYDEPTH=-20 and PyRadiomics' binCount=20 produce the same twenty levels, and both sides gather zones over the full 26-voxel neighbourhood, so no convention separates them: the measured residual is within a few ULP (worst 1.19e-15) on fifteen of the sixteen features, asserted at rel=1e-9. 3GLSZM_ZE is the exception at rel=1e-3, its residual 1.9e-4, because Nyxus takes the only logarithm in the family through fast_log10() -- a documented fast path, banded rather than reported. Backed by the SIXTEEN SCALARS AND THE MATRIX THEY CONTRACT: test_3d_glszm_matrix_pyradiomics reads the size-zone matrix off the feature object calculate() filled -- all 186 non-empty cells of the 20x634 table, its Ng/Ns/Nz/Np, the width and height it was allocated at, and a count proving no cell outside them is populated -- against PyRadiomics' own P_glszm array, read through its jvector because PyRadiomics deletes the columns for zone sizes nothing occupies. A defect planted in the production fill loop alone fails it, naming the level and the size, while all sixteen scalars still pass. The family's other assertions are their own rows: glszm3d.pyradiomics_ibsi_gapped, glszm3d.regression_ut_phantom and glszm3d.regression_ut_phantom_nobinning. tests/python/test_nyxus.py::test_3d_glszm_compatibility asserts these same goldens through the Python API; neither is this row's assertion. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md; generator tests/vetting/oracles/gen_glszm3d_pyradiomics.py." -3D,glszm,3GLSZM_SAE,vetted,pyradiomics,glszm3d.pyradiomics_ibsi_gapped,rel=1e-9,agreed,bench_cube3_gapped_levels,TEST_NYXUS.TEST_3D_GLSZM_IBSI_GAPPED_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_ibsi_gapped_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on bench_cube3_gapped_levels, recipe glszm3d.pyradiomics_ibsi_gapped: a 3x3x3 literal carrying grey levels 1, 3 and 5 with 2 and 4 absent, read by Nyxus at IBSI=true and by PyRadiomics at binWidth=1. This is the only configuration that reaches calculate()'s IBSI-only expressions -- row = zone.first-1 and Ng = max(I) -- and the only fixture on which they are distinguishable from the ones beside them, since a level's position and the level itself are different numbers here. Both sides report Ng = 5 for three occupied levels. Fifteen features agree exactly; 3GLSZM_ZE is banded at rel=2e-3 on a measured residual of 1.1e-3, the same fast_log10 path costing more on a six-zone matrix than on the phantom's 860. The size-zone matrix is pinned cell by cell off the feature object as well. test_3d_glszm_ibsi_equals_no_binning_mechanics measures that this configuration and GLSZM_GREYDEPTH=0 produce bit-identical values and matrices, which is why tests/vetting/matrix/glszm3d.md carries one cell for the two. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_SAE_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_sae_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." -3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." -3D,glszm,3GLSZM_LAE,vetted,pyradiomics,glszm3d.pyradiomics_bincount20,rel=1e-9,agreed,bench_compat_liver_3d,TEST_NYXUS.TEST_3D_GLSZM_LAE_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lae_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on the compat phantom (bench_compat_liver_3d, label 1), recipe glszm3d.pyradiomics_bincount20. Nyxus' GLSZM_GREYDEPTH=-20 and PyRadiomics' binCount=20 produce the same twenty levels, and both sides gather zones over the full 26-voxel neighbourhood, so no convention separates them: the measured residual is within a few ULP (worst 1.19e-15) on fifteen of the sixteen features, asserted at rel=1e-9. 3GLSZM_ZE is the exception at rel=1e-3, its residual 1.9e-4, because Nyxus takes the only logarithm in the family through fast_log10() -- a documented fast path, banded rather than reported. Backed by the SIXTEEN SCALARS AND THE MATRIX THEY CONTRACT: test_3d_glszm_matrix_pyradiomics reads the size-zone matrix off the feature object calculate() filled -- all 186 non-empty cells of the 20x634 table, its Ng/Ns/Nz/Np, the width and height it was allocated at, and a count proving no cell outside them is populated -- against PyRadiomics' own P_glszm array, read through its jvector because PyRadiomics deletes the columns for zone sizes nothing occupies. A defect planted in the production fill loop alone fails it, naming the level and the size, while all sixteen scalars still pass. The family's other assertions are their own rows: glszm3d.pyradiomics_ibsi_gapped, glszm3d.regression_ut_phantom and glszm3d.regression_ut_phantom_nobinning. tests/python/test_nyxus.py::test_3d_glszm_compatibility asserts these same goldens through the Python API; neither is this row's assertion. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md; generator tests/vetting/oracles/gen_glszm3d_pyradiomics.py." -3D,glszm,3GLSZM_LAE,vetted,pyradiomics,glszm3d.pyradiomics_ibsi_gapped,rel=1e-9,agreed,bench_cube3_gapped_levels,TEST_NYXUS.TEST_3D_GLSZM_IBSI_GAPPED_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_ibsi_gapped_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on bench_cube3_gapped_levels, recipe glszm3d.pyradiomics_ibsi_gapped: a 3x3x3 literal carrying grey levels 1, 3 and 5 with 2 and 4 absent, read by Nyxus at IBSI=true and by PyRadiomics at binWidth=1. This is the only configuration that reaches calculate()'s IBSI-only expressions -- row = zone.first-1 and Ng = max(I) -- and the only fixture on which they are distinguishable from the ones beside them, since a level's position and the level itself are different numbers here. Both sides report Ng = 5 for three occupied levels. Fifteen features agree exactly; 3GLSZM_ZE is banded at rel=2e-3 on a measured residual of 1.1e-3, the same fast_log10 path costing more on a six-zone matrix than on the phantom's 860. The size-zone matrix is pinned cell by cell off the feature object as well. test_3d_glszm_ibsi_equals_no_binning_mechanics measures that this configuration and GLSZM_GREYDEPTH=0 produce bit-identical values and matrices, which is why tests/vetting/matrix/glszm3d.md carries one cell for the two. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_LAE_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lae_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." -3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." +3D,glszm,3GLSZM_SAE,vetted,pyradiomics,glszm3d.pyradiomics_bincount20,rel=1e-9,agreed,bench_compat_liver_3d,TEST_NYXUS.TEST_3D_GLSZM_SAE_PYRADIOMICS,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_sae_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on the compat phantom (bench_compat_liver_3d, label 1), recipe glszm3d.pyradiomics_bincount20. Nyxus' GLSZM_GREYDEPTH=-20 and PyRadiomics' binCount=20 produce the same twenty levels, and both sides gather zones over the full 26-voxel neighbourhood, so no convention separates them: the measured residual is within a few ULP (worst 1.19e-15) on fifteen of the sixteen features, asserted at rel=1e-9. 3GLSZM_ZE is the exception at rel=1e-3, its residual 1.9e-4, because Nyxus takes the only logarithm in the family through fast_log10() -- a documented fast path, banded rather than reported. Backed by the SIXTEEN SCALARS AND THE MATRIX THEY CONTRACT: test_3d_glszm_matrix_pyradiomics reads the size-zone matrix off the feature object calculate() filled -- all 186 non-empty cells of the 20x634 table, its Ng/Ns/Nz/Np, the width and height it was allocated at, and a count proving no cell outside them is populated -- against PyRadiomics' own P_glszm array, read through its jvector because PyRadiomics deletes the columns for zone sizes nothing occupies. A defect planted in the production fill loop alone fails it, naming the level and the size, while all sixteen scalars still pass. The family's other assertions are their own rows: glszm3d.pyradiomics_ibsi_gapped, glszm3d.regression_ut_phantom and glszm3d.regression_ut_phantom_nobinning. tests/python/test_nyxus.py::test_3d_glszm_compatibility asserts these same goldens through the Python API; neither is this row's assertion. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md; generator tests/vetting/oracles/gen_glszm3d_pyradiomics.py." +3D,glszm,3GLSZM_SAE,vetted,pyradiomics,glszm3d.pyradiomics_ibsi_gapped,rel=1e-9,agreed,bench_cube3_gapped_levels,TEST_NYXUS.TEST_3D_GLSZM_IBSI_GAPPED_PYRADIOMICS,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_ibsi_gapped_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on bench_cube3_gapped_levels, recipe glszm3d.pyradiomics_ibsi_gapped: a 3x3x3 literal carrying grey levels 1, 3 and 5 with 2 and 4 absent, read by Nyxus at IBSI=true and by PyRadiomics at binWidth=1. This is the only configuration that reaches calculate()'s IBSI-only expressions -- row = zone.first-1 and Ng = max(I) -- and the only fixture on which they are distinguishable from the ones beside them, since a level's position and the level itself are different numbers here. Both sides report Ng = 5 for three occupied levels. Fifteen features agree exactly; 3GLSZM_ZE is banded at rel=2e-3 on a measured residual of 1.1e-3, the same fast_log10 path costing more on a six-zone matrix than on the phantom's 860. The size-zone matrix is pinned cell by cell off the feature object as well. test_3d_glszm_ibsi_equals_no_binning_mechanics measures that this configuration and GLSZM_GREYDEPTH=0 produce bit-identical values and matrices, which is why tests/vetting/matrix/glszm3d.md carries one cell for the two. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." +3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_SAE_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_sae_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." +3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." +3D,glszm,3GLSZM_LAE,vetted,pyradiomics,glszm3d.pyradiomics_bincount20,rel=1e-9,agreed,bench_compat_liver_3d,TEST_NYXUS.TEST_3D_GLSZM_LAE_PYRADIOMICS,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lae_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on the compat phantom (bench_compat_liver_3d, label 1), recipe glszm3d.pyradiomics_bincount20. Nyxus' GLSZM_GREYDEPTH=-20 and PyRadiomics' binCount=20 produce the same twenty levels, and both sides gather zones over the full 26-voxel neighbourhood, so no convention separates them: the measured residual is within a few ULP (worst 1.19e-15) on fifteen of the sixteen features, asserted at rel=1e-9. 3GLSZM_ZE is the exception at rel=1e-3, its residual 1.9e-4, because Nyxus takes the only logarithm in the family through fast_log10() -- a documented fast path, banded rather than reported. Backed by the SIXTEEN SCALARS AND THE MATRIX THEY CONTRACT: test_3d_glszm_matrix_pyradiomics reads the size-zone matrix off the feature object calculate() filled -- all 186 non-empty cells of the 20x634 table, its Ng/Ns/Nz/Np, the width and height it was allocated at, and a count proving no cell outside them is populated -- against PyRadiomics' own P_glszm array, read through its jvector because PyRadiomics deletes the columns for zone sizes nothing occupies. A defect planted in the production fill loop alone fails it, naming the level and the size, while all sixteen scalars still pass. The family's other assertions are their own rows: glszm3d.pyradiomics_ibsi_gapped, glszm3d.regression_ut_phantom and glszm3d.regression_ut_phantom_nobinning. tests/python/test_nyxus.py::test_3d_glszm_compatibility asserts these same goldens through the Python API; neither is this row's assertion. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md; generator tests/vetting/oracles/gen_glszm3d_pyradiomics.py." +3D,glszm,3GLSZM_LAE,vetted,pyradiomics,glszm3d.pyradiomics_ibsi_gapped,rel=1e-9,agreed,bench_cube3_gapped_levels,TEST_NYXUS.TEST_3D_GLSZM_IBSI_GAPPED_PYRADIOMICS,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_ibsi_gapped_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on bench_cube3_gapped_levels, recipe glszm3d.pyradiomics_ibsi_gapped: a 3x3x3 literal carrying grey levels 1, 3 and 5 with 2 and 4 absent, read by Nyxus at IBSI=true and by PyRadiomics at binWidth=1. This is the only configuration that reaches calculate()'s IBSI-only expressions -- row = zone.first-1 and Ng = max(I) -- and the only fixture on which they are distinguishable from the ones beside them, since a level's position and the level itself are different numbers here. Both sides report Ng = 5 for three occupied levels. Fifteen features agree exactly; 3GLSZM_ZE is banded at rel=2e-3 on a measured residual of 1.1e-3, the same fast_log10 path costing more on a six-zone matrix than on the phantom's 860. The size-zone matrix is pinned cell by cell off the feature object as well. test_3d_glszm_ibsi_equals_no_binning_mechanics measures that this configuration and GLSZM_GREYDEPTH=0 produce bit-identical values and matrices, which is why tests/vetting/matrix/glszm3d.md carries one cell for the two. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." +3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_LAE_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lae_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." +3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." 3D,glszm,3GLSZM_GLN,vetted,pyradiomics,glszm3d.pyradiomics_bincount20,rel=1e-9,agreed,bench_compat_liver_3d,TEST_NYXUS.TEST_3D_GLSZM_GLN_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_gln_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_gln_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_gln_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on the compat phantom (bench_compat_liver_3d, label 1), recipe glszm3d.pyradiomics_bincount20. Nyxus' GLSZM_GREYDEPTH=-20 and PyRadiomics' binCount=20 produce the same twenty levels, and both sides gather zones over the full 26-voxel neighbourhood, so no convention separates them: the measured residual is within a few ULP (worst 1.19e-15) on fifteen of the sixteen features, asserted at rel=1e-9. 3GLSZM_ZE is the exception at rel=1e-3, its residual 1.9e-4, because Nyxus takes the only logarithm in the family through fast_log10() -- a documented fast path, banded rather than reported. Backed by the SIXTEEN SCALARS AND THE MATRIX THEY CONTRACT: test_3d_glszm_matrix_pyradiomics reads the size-zone matrix off the feature object calculate() filled -- all 186 non-empty cells of the 20x634 table, its Ng/Ns/Nz/Np, the width and height it was allocated at, and a count proving no cell outside them is populated -- against PyRadiomics' own P_glszm array, read through its jvector because PyRadiomics deletes the columns for zone sizes nothing occupies. A defect planted in the production fill loop alone fails it, naming the level and the size, while all sixteen scalars still pass. The family's other assertions are their own rows: glszm3d.pyradiomics_ibsi_gapped, glszm3d.regression_ut_phantom and glszm3d.regression_ut_phantom_nobinning. tests/python/test_nyxus.py::test_3d_glszm_compatibility asserts these same goldens through the Python API; neither is this row's assertion. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md; generator tests/vetting/oracles/gen_glszm3d_pyradiomics.py." 3D,glszm,3GLSZM_GLN,vetted,pyradiomics,glszm3d.pyradiomics_ibsi_gapped,rel=1e-9,agreed,bench_cube3_gapped_levels,TEST_NYXUS.TEST_3D_GLSZM_IBSI_GAPPED_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_gln_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_gln_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_ibsi_gapped_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on bench_cube3_gapped_levels, recipe glszm3d.pyradiomics_ibsi_gapped: a 3x3x3 literal carrying grey levels 1, 3 and 5 with 2 and 4 absent, read by Nyxus at IBSI=true and by PyRadiomics at binWidth=1. This is the only configuration that reaches calculate()'s IBSI-only expressions -- row = zone.first-1 and Ng = max(I) -- and the only fixture on which they are distinguishable from the ones beside them, since a level's position and the level itself are different numbers here. Both sides report Ng = 5 for three occupied levels. Fifteen features agree exactly; 3GLSZM_ZE is banded at rel=2e-3 on a measured residual of 1.1e-3, the same fast_log10 path costing more on a six-zone matrix than on the phantom's 860. The size-zone matrix is pinned cell by cell off the feature object as well. test_3d_glszm_ibsi_equals_no_binning_mechanics measures that this configuration and GLSZM_GREYDEPTH=0 produce bit-identical values and matrices, which is why tests/vetting/matrix/glszm3d.md carries one cell for the two. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_GLN,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_GLN_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_gln_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_gln_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_gln_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." @@ -961,8 +961,10 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_LAHGLE,vetted,pyradiomics,glszm3d.pyradiomics_ibsi_gapped,rel=1e-9,agreed,bench_cube3_gapped_levels,TEST_NYXUS.TEST_3D_GLSZM_IBSI_GAPPED_PYRADIOMICS,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_ibsi_gapped_pyradiomics,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Vetted against PyRadiomics 3.0.1 GLSZM on bench_cube3_gapped_levels, recipe glszm3d.pyradiomics_ibsi_gapped: a 3x3x3 literal carrying grey levels 1, 3 and 5 with 2 and 4 absent, read by Nyxus at IBSI=true and by PyRadiomics at binWidth=1. This is the only configuration that reaches calculate()'s IBSI-only expressions -- row = zone.first-1 and Ng = max(I) -- and the only fixture on which they are distinguishable from the ones beside them, since a level's position and the level itself are different numbers here. Both sides report Ng = 5 for three occupied levels. Fifteen features agree exactly; 3GLSZM_ZE is banded at rel=2e-3 on a measured residual of 1.1e-3, the same fast_log10 path costing more on a six-zone matrix than on the phantom's 860. The size-zone matrix is pinned cell by cell off the feature object as well. test_3d_glszm_ibsi_equals_no_binning_mechanics measures that this configuration and GLSZM_GREYDEPTH=0 produce bit-identical values and matrices, which is why tests/vetting/matrix/glszm3d.md carries one cell for the two. Evidence: tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_LAHGLE_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lahgle_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." -3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." +3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." +3D,glszm,3GLSZM_SAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic." +3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." +3D,glszm,3GLSZM_LAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic." 3D,glszm,3GLSZM_GLN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_gln_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_gln_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_GLNN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_glnn_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_glnn_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_SZN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_szn_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_szn_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." @@ -977,8 +979,8 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_SAHGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LALGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lalgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lalgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glrlm,3GLRLM_SRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_SRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_LRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." 3D,glrlm,3GLRLM_GLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_gln_pyradiomics,test_3d_glrlm_gln_grey64_regression;test_3d_glrlm_gln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_GLNN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_glnn_pyradiomics,test_3d_glrlm_glnn_grey64_regression;test_3d_glrlm_glnn_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rln_pyradiomics,test_3d_glrlm_rln_grey64_regression;test_3d_glrlm_rln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." @@ -987,12 +989,12 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_GLV,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_glv_pyradiomics,test_3d_glrlm_glv_grey64_regression;test_3d_glrlm_glv_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RV,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rv_pyradiomics,test_3d_glrlm_rv_grey64_regression;test_3d_glrlm_rv_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=2e-3,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_re_pyradiomics,test_3d_glrlm_re_grey64_regression;test_3d_glrlm_re_regression,,2,2,"the family's only sum over logarithms; fast_log10 puts it 3.9e-4 from PyRadiomics, so it is asserted at rel=5e-3 where the rest are at rel=1e-9",,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference." -3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_SRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_LRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_LRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." 3D,glrlm,3GLRLM_SRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_LRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_GLN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_gln_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." diff --git a/tests/vetting/report_output.md b/tests/vetting/report_output.md index 2b4e95775..a61d84f3f 100644 --- a/tests/vetting/report_output.md +++ b/tests/vetting/report_output.md @@ -32,11 +32,11 @@ regression: 121 invariant: 0 untested: 0 ## Verdicts -1020 of 1020 assertion rows agree with the tree. +1022 of 1022 assertion rows agree with the tree. | verdict | rows | meaning | |---|---:|---| -| `agree` | 1020 | the claim and the tree say the same thing | +| `agree` | 1022 | the claim and the tree say the same thing | ### How far each verdict reaches @@ -47,7 +47,7 @@ regression: 121 invariant: 0 untested: 0 |---|---:|---| | `feature` | 533 | `test_name` is empty, so the tree was read for the feature and not for this row's own assertion | | `row` | 280 | the case named in `test_name` asserts this feature, at this row's kind; its configuration is unchecked, the family declaring no recipe reader | -| `row+config` | 207 | the case named in `test_name` asserts this feature at this `config_recipe` | +| `row+config` | 209 | the case named in `test_name` asserts this feature at this `config_recipe` | ## Every oracle a feature was matched against @@ -62,8 +62,8 @@ that alone understates every family that corroborates. | 2D | glcm | . | . | . | 55 | . | . | 59 | . | 59 | . | . | | 2D | gldm | . | . | . | 14 | . | . | . | . | 14 | . | . | | 2D | gldzm | . | . | . | 14 | . | . | 16 | . | . | . | 2 | -| 2D | glrlm | . | . | . | 32 | . | . | 32 | . | 32 | . | . | -| 2D | glszm | . | . | . | 16 | . | . | 16 | . | . | . | . | +| 2D | glrlm | 8 | . | . | 32 | . | . | 32 | . | 32 | . | . | +| 2D | glszm | 2 | . | . | 16 | . | . | 16 | . | . | . | . | | 2D | intensity_histogram | 26 | . | . | 16 | . | . | 23 | . | . | . | 4 | | 2D | moments | . | . | . | . | . | . | . | . | . | 118 | 62 | | 2D | morphology | 5 | 5 | 2 | . | 20 | 33 | . | . | . | 8 | 29 | @@ -76,13 +76,13 @@ that alone understates every family that corroborates. | 3D | glcm | . | . | . | . | . | . | . | . | 59 | . | . | | 3D | gldm | . | . | . | . | . | . | . | . | 14 | . | . | | 3D | gldzm | . | . | . | . | . | . | 16 | . | . | . | 2 | -| 3D | glrlm | . | . | . | . | . | . | . | . | 32 | . | . | -| 3D | glszm | . | . | . | . | . | . | . | . | 16 | . | . | +| 3D | glrlm | 8 | . | . | . | . | . | . | . | 32 | . | . | +| 3D | glszm | 2 | . | . | . | . | . | . | . | 16 | . | . | | 3D | morphology | 2 | . | . | . | . | 2 | 8 | . | 6 | . | 6 | | 3D | ngldm | . | . | . | . | . | . | 16 | . | . | . | 3 | | 3D | ngtdm | . | . | . | . | . | . | . | . | 5 | . | . | | IMQ | imq | 1 | 2 | . | . | . | . | . | 2 | . | . | 2 | -| | **all** | **41** | **9** | **2** | **181** | **20** | **95** | **208** | **2** | **272** | **127** | **121** | +| | **all** | **61** | **9** | **2** | **181** | **20** | **95** | **208** | **2** | **272** | **127** | **121** | ## By dimensionality From 7a455a9f4d429e4db6d856cccab32a4d2821cfee Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 09:46:11 -0700 Subject: [PATCH 03/12] test(vetting): give the 32-bit range closed-form assertions their own rows The 2D GLSZM, 2D GLRLM and 3D GLRLM closed-form assertions each have an oracle=analytic registry row, one per feature and recipe, as 3D GLSZM does. The five recipes they name are defined in config_recipes.md: glszm.analytic_two_large_zones, glrlm.analytic_two_long_runs, glrlm.analytic_high_grey_pair, glrlm3d.analytic_two_long_runs and glrlm3d.analytic_high_grey_pair. The mirp, pyradiomics and ibsi rows of those features describe only their own oracles again. The separator after bench_glrlm_3d_high_grey_pair in benchmarks.md has a blank line before it, so it renders as a rule rather than a heading. --- tests/vetting/benchmarks.md | 1 + tests/vetting/config_recipes.md | 52 ++++++++++++++++++++++++++ tests/vetting/oracle_coverage.csv | 62 ++++++++++++++++++++++--------- tests/vetting/report_output.csv | 62 ++++++++++++++++++++++--------- tests/vetting/report_output.md | 6 +-- 5 files changed, 144 insertions(+), 39 deletions(-) diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index f443d716b..748f77c7e 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -356,6 +356,7 @@ Tests reaching it today: `test_3d_glrlm_analytic.h`. | Why it exists | the six grey-level emphases in all 13 directions, with `G^2` past `UINT_MAX` | Tests reaching it today: `test_3d_glrlm_analytic.h`. + --- ## `bench_constant_roi_3d` — a nonempty ROI of one intensity diff --git a/tests/vetting/config_recipes.md b/tests/vetting/config_recipes.md index 2ac129469..479c1fef8 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -430,6 +430,18 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `GLSZM_HGLZE` is 16.44 here and 1497.57 there on the same fixture. Those values are drift-pinned only, in `test_2d_glszm_regression.h`, and no oracle row claims them. +## glszm.analytic_two_large_zones +- `bench_glszm_2d_two_large_zones` — a 216x432 rectangle built in + `test_2d_glszm_large_zone_size_emphasis_analytic()`, the top half at intensity 1 and the bottom + half at 2 — at `IBSI=true` and `GREYDEPTH=0`, so the two levels are read as they are. Oracle: + `analytic`. Used by `test_2d_glszm_analytic.h`, for `GLSZM_SAE` and `GLSZM_LAE` only. Config + matrix: `matrix/glszm.md`. +- **What it is for.** Each half is one zone of `L = 46,656` pixels, so the matrix has two cells, both + in column `L`, and `SAE = 1/L^2`, `LAE = L^2` exactly. `L^2 = 2,176,782,336` is past `INT_MAX`, so + the values are right only if the square of the zone size is taken in double. +- The band is `rel=1e-12` rather than SPEC 7's absolute exact tier, because `LAE` is 2.2e9 and an + absolute 1e-9 is below its last bit. + ## glrlm.ibsi_ng128 - The four IBSI digital-phantom slices (`ibsi_phantom_z1..z4`, `test_data.h`), each featurised on its own with `IBSI=true` and `GREYDEPTH=128`, the four in-slice directions averaged, then the four @@ -459,6 +471,26 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `coarse_gray_depth`), which no reference tool reproduces. Drift-pinned only, in `test_2d_glrlm_regression.h`; no oracle row claims it. +## glrlm.analytic_two_long_runs +- `bench_glrlm_2d_two_long_runs` — one row of `2L` pixels, `L = 46,656`, built in + `test_2d_glrlm_long_run_emphasis_analytic()`, the left half at intensity 1 and the right half at 2 — + at `make_2d_glrlm_ibsi_settings()` (`IBSI=true`), which keeps the two levels as they are. Oracle: + `analytic`. Used by `test_2d_glrlm_analytic.h`, for `GLRLM_SRE`, `GLRLM_LRE` and the four + run-length-and-grey-level emphases, at 0 degrees. +- **What it is for.** At 0 degrees the row is two runs of length `L`, one at each level. `L^2 = + 2,176,782,336` is past `INT_MAX` and `2^2 * L^2` past `UINT_MAX`, so the values are right only if + the run-length terms are taken in double. +- The band is `rel=1e-12`, because `LRE` is 2.2e9 and an absolute 1e-9 is below its last bit. + +## glrlm.analytic_high_grey_pair +- `bench_glrlm_2d_high_grey_pair` — two adjacent pixels at intensities 1 and `G = 70,000`, built in + `test_2d_glrlm_high_grey_level_emphasis_analytic()` — at `make_2d_glrlm_ibsi_settings()` + (`IBSI=true`), which keeps the two levels as they are. Oracle: `analytic`. Used by + `test_2d_glrlm_analytic.h`, for the six grey-level emphases, in all four directions. +- **What it is for.** Every direction sees two runs of length 1. `G^2 = 4.9e9` is past `UINT_MAX`, so + the values are right only if the grey level is squared in double. +- The band is `rel=1e-12`, because `HGLRE` is 2.45e9 and an absolute 1e-9 is below its last bit. + ## neighbor.scene2d_radius1 - Benchmark `bench_scene7_5roi_enclosed`; config matrix `matrix/neighbor.md`. Assertions at SPEC 7's exact tier, an absolute 1e-9 band. @@ -711,6 +743,26 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g for `RE`, the family's only `fast_log10` path), so it is not comparable to `glrlm3d.regression_ut_phantom` — the two bin the same voxels differently by construction. +## glrlm3d.analytic_two_long_runs +- `bench_glrlm_3d_two_long_runs` — a `2L x 1 x 1` line of voxels, `L = 46,656`, built in + `test_3d_glrlm_long_run_emphasis_analytic()`, the first half at intensity 1 and the second at 2 — + at `GREYDEPTH=64`, `IBSI=false` and `GLRLM_GREYDEPTH=0`, so the two levels are read as they are. + Oracle: `analytic`. Used by `test_3d_glrlm_analytic.h`, for `3GLRLM_SRE`, `3GLRLM_LRE` and the four + run-length-and-grey-level emphases, in direction slot 12 (`{dz=0, dy=0, dx=1}`, along the line). +- **What it is for.** Along the line the volume is two runs of length `L`, one at each level. `L^2 = + 2,176,782,336` is past `INT_MAX` and `2^2 * L^2` past `UINT_MAX`, so the values are right only if + the run-length terms are taken in double. +- The band is `rel=1e-12`, because `LRE` is 2.2e9 and an absolute 1e-9 is below its last bit. + +## glrlm3d.analytic_high_grey_pair +- `bench_glrlm_3d_high_grey_pair` — two adjacent voxels at intensities 1 and `G = 70,000`, built in + `test_3d_glrlm_high_grey_level_emphasis_analytic()` — at the same settings as + `glrlm3d.analytic_two_long_runs`. Oracle: `analytic`. Used by `test_3d_glrlm_analytic.h`, for the + six grey-level emphases, in all 13 directions. +- **What it is for.** Every direction sees two runs of length 1. `G^2 = 4.9e9` is past `UINT_MAX`, so + the values are right only if the grey level is squared in double. +- The band is `rel=1e-12`, because `HGLRE` is 2.45e9 and an absolute 1e-9 is below its last bit. + ## ngldm3d.regression_ut_phantom - The segmented phantom (`phantoms/ut_inten.nii` + `phantoms/ut_mask57.nii`, label 57) at `GREYDEPTH=64`, `IBSI=false`. **No oracle** — pinned Nyxus output as drift guards in diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index 0cfdae23f..7bbfbd45d 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -263,8 +263,10 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLCM_SUMAVERAGE_AVE,glcm,vetted,mirp,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_ibsi.h;test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_regression.h;test_2d_glcm_pyradiomics.py,,MIRP/IBSI check,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | vetted vs MIRP (IBSI digital phantom, glcm_oracle/); MIRP reproduces IBSI consensus exactly and Nyxus IBSI gtest passes (ACOR 5.09, CLUSHADE 7, INFOMEAS1 -0.155, JAVE 2.14, JVAR 2.69, SUMAVERAGE 4.28); _AVE = angle-average of the vetted base",, 2D,GLCM_SUMENTROPY_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=5e-3,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLCM_SUMVARIANCE_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, -2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, +2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, +2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, @@ -273,12 +275,22 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_GLV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=5e-3,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, @@ -313,8 +325,10 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLDZM_ZDM,gldzm,regression,,,gldzm.ibsi_phantom_2d,rel=1e-3,test_2d_gldzm_regression.h,,,,audit,"not an IBSI GLDZM feature and mirp exposes no column for it, so nothing independent covers it; drift-pinned on the IBSI phantom in test_2d_gldzm_regression.h at rel=1e-3. Value re-recorded after the zone-connectivity fix (8-connected zones), see audit/gldzm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLDZM_ZDM_REGRESSION,ibsi_digital_phantom 2D,GLDZM_ZDV,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,ibsi_digital_phantom 2D,GLDZM_ZDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,ibsi_digital_phantom -2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX.",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom -2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX.",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom +2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom +2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom +2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones 2D,GLSZM_GLN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,ibsi_digital_phantom 2D,GLSZM_GLNN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,ibsi_digital_phantom 2D,GLSZM_SZN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,ibsi_digital_phantom @@ -979,8 +993,10 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_SAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LALGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, @@ -989,12 +1005,22 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_GLV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=2e-3,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference.",, -3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, -3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range.",, +3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, diff --git a/tests/vetting/report_output.csv b/tests/vetting/report_output.csv index 2b4506522..3b71d3074 100644 --- a/tests/vetting/report_output.csv +++ b/tests/vetting/report_output.csv @@ -263,8 +263,10 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glcm,GLCM_SUMAVERAGE_AVE,vetted,mirp,glcm.ibsi_identity,rel=1e-9,agreed,,,,MIRP/IBSI check,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_acor_family_pyradiomics;test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_average_ave_ibsi,test_2d_glcm_sum_average_ave_regression,,4,1,"angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_mirp_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | vetted vs MIRP (IBSI digital phantom, glcm_oracle/); MIRP reproduces IBSI consensus exactly and Nyxus IBSI gtest passes (ACOR 5.09, CLUSHADE 7, INFOMEAS1 -0.155, JAVE 2.14, JVAR 2.69, SUMAVERAGE 4.28); _AVE = angle-average of the vetted base" 2D,glcm,GLCM_SUMENTROPY_AVE,vetted,ibsi,glcm.ibsi_identity,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_entropy_ave_ibsi,test_2d_glcm_sum_entropy_ave_regression,,3,1,"log-based: Nyxus sums through fast_log10 with an EPSILON guard, so it lands 1e-3..3e-3 from both tools instead of on them; asserted at rel=5e-3 | angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." 2D,glcm,GLCM_SUMVARIANCE_AVE,vetted,ibsi,glcm.ibsi_identity,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_variance_ave_ibsi,test_2d_glcm_sum_variance_ave_regression,,3,1,"angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." -2D,glrlm,GLRLM_SRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -2D,glrlm,GLRLM_LRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_SRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" +2D,glrlm,GLRLM_SRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" +2D,glrlm,GLRLM_LRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." 2D,glrlm,GLRLM_GLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ibsi,test_2d_glrlm_gln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_GLNN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glnn_ibsi,test_2d_glrlm_glnn_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rln_ibsi,test_2d_glrlm_rln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" @@ -273,12 +275,22 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glrlm,GLRLM_GLV,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glv_ibsi,test_2d_glrlm_glv_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RV,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rv_ibsi,test_2d_glrlm_rv_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_re_ibsi,test_2d_glrlm_re_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_LGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -2D,glrlm,GLRLM_HGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -2D,glrlm,GLRLM_SRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -2D,glrlm,GLRLM_SRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -2D,glrlm,GLRLM_LRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -2D,glrlm,GLRLM_LRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted. Also asserted against its closed form in test_2d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 pixels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +2D,glrlm,GLRLM_LGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_LGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_HGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_HGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." 2D,glrlm,GLRLM_SRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_LRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_GLN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ave_ibsi,test_2d_glrlm_gln_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." @@ -313,8 +325,10 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,gldzm,GLDZM_ZDM,regression,,gldzm.ibsi_phantom_2d,rel=1e-3,,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDM_REGRESSION,,,audit,,,test_2d_gldzm_zdm_regression,,0,1,no IBSI GLDZM counterpart and no mirp column; regression drift guard only,test_2d_gldzm_zdm_regression,agree,row,,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"not an IBSI GLDZM feature and mirp exposes no column for it, so nothing independent covers it; drift-pinned on the IBSI phantom in test_2d_gldzm_regression.h at rel=1e-3. Value re-recorded after the zone-connectivity fix (8-connected zones), see audit/gldzm_2d_mirp_vetting_report.md" 2D,gldzm,GLDZM_ZDV,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,,,audit,mirp,test_2d_gldzm_zdv_mirp,,,1,0,vetted by mirp only; the IBSI file never held a published value for it,test_2d_gldzm_zdv_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_ZDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" -2D,glszm,GLSZM_SAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX." -2D,glszm,GLSZM_LAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md Also asserted against its closed form in test_2d_glszm_analytic.h at rel=1e-12, on two zones of 46,656 pixels each, where the square of the zone size is past INT_MAX." +2D,glszm,GLSZM_SAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" +2D,glszm,GLSZM_SAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic." +2D,glszm,GLSZM_LAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" +2D,glszm,GLSZM_LAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic." 2D,glszm,GLSZM_GLN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,test_2d_glszm_gln_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_GLNN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,test_2d_glszm_glnn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_SZN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,test_2d_glszm_szn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" @@ -979,8 +993,10 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_SAHGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_sahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LALGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lalgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lalgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glrlm,3GLRLM_SRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -3D,glrlm,3GLRLM_LRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_SRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_SRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_LRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." 3D,glrlm,3GLRLM_GLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_gln_pyradiomics,test_3d_glrlm_gln_grey64_regression;test_3d_glrlm_gln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_GLNN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_glnn_pyradiomics,test_3d_glrlm_glnn_grey64_regression;test_3d_glrlm_glnn_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rln_pyradiomics,test_3d_glrlm_rln_grey64_regression;test_3d_glrlm_rln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." @@ -989,12 +1005,22 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_GLV,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_glv_pyradiomics,test_3d_glrlm_glv_grey64_regression;test_3d_glrlm_glv_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RV,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rv_pyradiomics,test_3d_glrlm_rv_grey64_regression;test_3d_glrlm_rv_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=2e-3,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_re_pyradiomics,test_3d_glrlm_re_grey64_regression;test_3d_glrlm_re_regression,,2,2,"the family's only sum over logarithms; fast_log10 puts it 3.9e-4 from PyRadiomics, so it is asserted at rel=5e-3 where the rest are at rel=1e-9",,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference." -3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -3D,glrlm,3GLRLM_SRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -3D,glrlm,3GLRLM_LRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." -3D,glrlm,3GLRLM_LRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. Also asserted against its closed form in test_3d_glrlm_analytic.h at rel=1e-12, on two runs of 46,656 voxels and on a grey level of 70,000, where the squared terms are past the 32-bit range." +3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_LGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." +3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." 3D,glrlm,3GLRLM_SRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_LRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_GLN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_gln_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." diff --git a/tests/vetting/report_output.md b/tests/vetting/report_output.md index a61d84f3f..b466dbf3e 100644 --- a/tests/vetting/report_output.md +++ b/tests/vetting/report_output.md @@ -32,11 +32,11 @@ regression: 121 invariant: 0 untested: 0 ## Verdicts -1022 of 1022 assertion rows agree with the tree. +1048 of 1048 assertion rows agree with the tree. | verdict | rows | meaning | |---|---:|---| -| `agree` | 1022 | the claim and the tree say the same thing | +| `agree` | 1048 | the claim and the tree say the same thing | ### How far each verdict reaches @@ -46,7 +46,7 @@ regression: 121 invariant: 0 untested: 0 | scope | rows | what was compared | |---|---:|---| | `feature` | 533 | `test_name` is empty, so the tree was read for the feature and not for this row's own assertion | -| `row` | 280 | the case named in `test_name` asserts this feature, at this row's kind; its configuration is unchecked, the family declaring no recipe reader | +| `row` | 306 | the case named in `test_name` asserts this feature, at this row's kind; its configuration is unchecked, the family declaring no recipe reader | | `row+config` | 209 | the case named in `test_name` asserts this feature at this `config_recipe` | ## Every oracle a feature was matched against From 48bac16e41685608823bd842dee48f58e0b14451 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 10:12:25 -0700 Subject: [PATCH 04/12] test(vetting): name every covering file on each GLSZM and GLRLM row 2D GLSZM, 2D GLRLM and 3D GLRLM are row-scope families: each row of a feature lists in current_test every file that covers the feature. The rows of the 18 features with an analytic test, the analytic rows among them, all name the analytic file next to the oracle and regression files, so the four family scanners' --check pass. --- tests/vetting/oracle_coverage.csv | 88 +++++++++++++++---------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index 7bbfbd45d..c5f4006e9 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -263,10 +263,10 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLCM_SUMAVERAGE_AVE,glcm,vetted,mirp,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_ibsi.h;test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_regression.h;test_2d_glcm_pyradiomics.py,,MIRP/IBSI check,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | vetted vs MIRP (IBSI digital phantom, glcm_oracle/); MIRP reproduces IBSI consensus exactly and Nyxus IBSI gtest passes (ACOR 5.09, CLUSHADE 7, INFOMEAS1 -0.155, JAVE 2.14, JVAR 2.69, SUMAVERAGE 4.28); _AVE = angle-average of the vetted base",, 2D,GLCM_SUMENTROPY_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=5e-3,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLCM_SUMVARIANCE_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, -2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, +2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, +2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, @@ -275,22 +275,22 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_GLV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=5e-3,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair -2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair -2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair -2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair -2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair -2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, @@ -325,10 +325,10 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLDZM_ZDM,gldzm,regression,,,gldzm.ibsi_phantom_2d,rel=1e-3,test_2d_gldzm_regression.h,,,,audit,"not an IBSI GLDZM feature and mirp exposes no column for it, so nothing independent covers it; drift-pinned on the IBSI phantom in test_2d_gldzm_regression.h at rel=1e-3. Value re-recorded after the zone-connectivity fix (8-connected zones), see audit/gldzm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLDZM_ZDM_REGRESSION,ibsi_digital_phantom 2D,GLDZM_ZDV,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,ibsi_digital_phantom 2D,GLDZM_ZDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,ibsi_digital_phantom -2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom -2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones -2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom -2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom +2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom +2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones 2D,GLSZM_GLN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,ibsi_digital_phantom 2D,GLSZM_GLNN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,ibsi_digital_phantom 2D,GLSZM_SZN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,ibsi_digital_phantom @@ -993,10 +993,10 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_SAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LALGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, @@ -1005,22 +1005,22 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_GLV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=2e-3,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference.",, -3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair -3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair -3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair -3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair -3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair -3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, From f29911cc129335ba2c7fdf90da647bea56fe0bd1 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 10:38:37 -0700 Subject: [PATCH 05/12] docs(vetting): point each 32-bit range fixture at its recipe Each of the six 32-bit range fixtures in benchmarks.md names its recipe on a Recipes: line, and the shared paragraph says each has its own recipe and analytic rows. The 3D high-grey-pair fixture, its recipe and the 3GLRLM_HGLRE analytic row say that 3GLRLM_HGLRE multiplies the level as two doubles, so for that feature the fixture pins the value without telling a 32-bit square from a double one. --- tests/vetting/benchmarks.md | 17 +++++++++++++---- tests/vetting/config_recipes.md | 4 +++- tests/vetting/oracle_coverage.csv | 2 +- tests/vetting/report_output.csv | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index 748f77c7e..c5ef626e2 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -288,9 +288,8 @@ size-zone or run-length emphasis lies past the 32-bit range while every feature closed form: a zone or run of `L >= 46,341` puts `L^2` past `INT_MAX`, and a grey level `G >= 65,536` puts `G^2` past `UINT_MAX`. All are read with no binning (2D at `IBSI=true`, 3D at a family grey depth of 0), so the levels written are the levels used. Each carries two levels, because -a ROI of one intensity is intercepted before any matrix is built. Only this one has a recipe: the 2D -GLSZM, 2D GLRLM and 3D GLRLM registries keep one row per feature, so the other five appear in those -rows' `current_test` instead. +a ROI of one intensity is intercepted before any matrix is built. Each has its own recipe, named on +its `Recipes:` line, and its own `analytic` rows in the registry. --- @@ -303,6 +302,8 @@ rows' `current_test` instead. | Shape | two zones of `L = 46,656` pixels | | Why it exists | `GLSZM_SAE = 1/L^2` and `GLSZM_LAE = L^2`, with `L^2` past `INT_MAX` | +Recipes: `glszm.analytic_two_large_zones`. + Tests reaching it today: `test_2d_glszm_analytic.h`. --- @@ -316,6 +317,8 @@ Tests reaching it today: `test_2d_glszm_analytic.h`. | Shape | at 0 degrees, two runs of `L = 46,656`, one per level | | Why it exists | the six run-length emphases at 0 degrees, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | +Recipes: `glrlm.analytic_two_long_runs`. + Tests reaching it today: `test_2d_glrlm_analytic.h`. --- @@ -329,6 +332,8 @@ Tests reaching it today: `test_2d_glrlm_analytic.h`. | Shape | two runs of length 1 in every direction | | Why it exists | the six grey-level emphases in all 4 directions, with `G^2` past `UINT_MAX` | +Recipes: `glrlm.analytic_high_grey_pair`. + Tests reaching it today: `test_2d_glrlm_analytic.h`. --- @@ -342,6 +347,8 @@ Tests reaching it today: `test_2d_glrlm_analytic.h`. | Shape | along x, direction slot 12, two runs of `L = 46,656`, one per level | | Why it exists | the six run-length emphases along x, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | +Recipes: `glrlm3d.analytic_two_long_runs`. + Tests reaching it today: `test_3d_glrlm_analytic.h`. --- @@ -353,7 +360,9 @@ Tests reaching it today: `test_3d_glrlm_analytic.h`. | Data | built inline in `test_3d_glrlm_high_grey_level_emphasis_analytic()` (`tests/test_3d_glrlm_analytic.h`) | | ROI | two adjacent voxels at intensities 1 and `G = 70,000` | | Shape | two runs of length 1 in every one of the 13 directions | -| Why it exists | the six grey-level emphases in all 13 directions, with `G^2` past `UINT_MAX` | +| Why it exists | the six grey-level emphases in all 13 directions, with `G^2` past `UINT_MAX`; `3GLRLM_HGLRE` multiplies the level as `double(inten) * double(inten)`, so for it the fixture pins the value without telling a 32-bit square from a double one | + +Recipes: `glrlm3d.analytic_high_grey_pair`. Tests reaching it today: `test_3d_glrlm_analytic.h`. diff --git a/tests/vetting/config_recipes.md b/tests/vetting/config_recipes.md index 479c1fef8..fd69215e6 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -760,7 +760,9 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `glrlm3d.analytic_two_long_runs`. Oracle: `analytic`. Used by `test_3d_glrlm_analytic.h`, for the six grey-level emphases, in all 13 directions. - **What it is for.** Every direction sees two runs of length 1. `G^2 = 4.9e9` is past `UINT_MAX`, so - the values are right only if the grey level is squared in double. + the values are right only if the grey level is squared in double. `3GLRLM_HGLRE` multiplies the level + as `double(inten) * double(inten)`, so for it the fixture pins the value without telling a 32-bit + square from a double one. - The band is `rel=1e-12`, because `HGLRE` is 2.45e9 and an absolute 1e-9 is below its last bit. ## ngldm3d.regression_ut_phantom diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index c5f4006e9..3e59a1340 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -1008,7 +1008,7 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair diff --git a/tests/vetting/report_output.csv b/tests/vetting/report_output.csv index 3b71d3074..0b1d479a2 100644 --- a/tests/vetting/report_output.csv +++ b/tests/vetting/report_output.csv @@ -1008,7 +1008,7 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_LGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." 3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic." 3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." 3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." From 91ad3fc7e5467150c40133b18fa9d3b7a75eba4b Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 12:40:26 -0700 Subject: [PATCH 06/12] refactor(texture): square every GLRLM term in double explicitly The GLRLM grey-level emphases, 2D and 3D, multiply the level as `inten * inten` with `inten` declared double, and the four-factor terms square the run length as `double(j) * double(j)` rather than relying on left-to-right promotion. GLV keeps its upstream declarations. 3D GLSZM SAE and LAE sum the column sums `sj` over the zone sizes, as 2D GLSZM and 3D SZN do. One comment per file states why the squares are wide. Tests: the in-memory 3D volume runner is one template in test_main_nyxus.h, used by the GLSZM and GLRLM 3D tests, and the 3D GLRLM settings recipe is test_3d_glrlm_common.h, used by the regression and the analytic tests. The 2D GLSZM closed-form test sits under its own banner in test_all.cc. The 3D GLSZM fixture and its benchmarks.md entry say that L^2 = 2^32 is past INT_MAX, and no more. --- src/nyx/features/3d_glrlm.cpp | 18 ++++++----- src/nyx/features/3d_glszm.cpp | 25 +++++++-------- src/nyx/features/glrlm.cpp | 18 ++++++----- src/nyx/features/glszm.cpp | 1 + src/nyx/gpu/glszm.cu | 1 + tests/test_3d_glrlm_analytic.h | 55 +++++--------------------------- tests/test_3d_glrlm_common.h | 26 +++++++++++++++ tests/test_3d_glrlm_regression.h | 14 ++------ tests/test_3d_glszm_analytic.h | 2 +- tests/test_3d_glszm_common.h | 34 +++----------------- tests/test_all.cc | 4 ++- tests/test_main_nyxus.h | 41 ++++++++++++++++++++++++ tests/vetting/benchmarks.md | 2 +- 13 files changed, 119 insertions(+), 122 deletions(-) create mode 100644 tests/test_3d_glrlm_common.h diff --git a/src/nyx/features/3d_glrlm.cpp b/src/nyx/features/3d_glrlm.cpp index 4eab8be57..98f9763aa 100644 --- a/src/nyx/features/3d_glrlm.cpp +++ b/src/nyx/features/3d_glrlm.cpp @@ -344,6 +344,8 @@ double D3_GLRLM_feature::calc_SRE (const SimpleMatrix &P, const double sum_ for (int j = 1; j <= Nr; ++j) { + // Run lengths and grey levels are squared in double: j^2 passes INT_MAX at a run of 46,341, + // and a grey level times a run passes UINT_MAX once their product reaches 65,536. f += rj[j] / (double(j) * double(j)); } @@ -490,7 +492,7 @@ double D3_GLRLM_feature::calc_GLV (const SimpleMatrix &P, const std::vector double mu = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + auto inten = I[i - 1]; for (int j = 1; j <= Nr; j++) { mu += P.matlab(i, j) / sum_p * inten; @@ -500,7 +502,7 @@ double D3_GLRLM_feature::calc_GLV (const SimpleMatrix &P, const std::vector double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + auto inten = I[i - 1]; for (int j = 1; j <= Nr; j++) { double mu2 = (inten - mu) * (inten - mu); @@ -581,7 +583,7 @@ double D3_GLRLM_feature::calc_LGLRE (const SimpleMatrix &P, const std::vect double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) / double(inten * inten); + f += P.matlab(i, j) / (inten * inten); } } double retval = f / double(sum_p); @@ -604,7 +606,7 @@ double D3_GLRLM_feature::calc_HGLRE (const SimpleMatrix &P, const std::vect double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten) * double(inten); + f += P.matlab(i, j) * (inten * inten); } } double retval = f / double(sum_p); @@ -627,7 +629,7 @@ double D3_GLRLM_feature::calc_SRLGLE (const SimpleMatrix &P, const std::vec double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) / double(inten * inten * j * j); + f += P.matlab(i, j) / (inten * inten * (double(j) * double(j))); } } double retval = f / sum_p; @@ -650,7 +652,7 @@ double D3_GLRLM_feature::calc_SRHGLE (const SimpleMatrix &P, const std::vec double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten) / (double(j) * double(j)); + f += P.matlab(i, j) * (inten * inten) / (double(j) * double(j)); } } double retval = f / sum_p; @@ -673,7 +675,7 @@ double D3_GLRLM_feature::calc_LRLGLE (const SimpleMatrix &P, const std::vec double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (double(j) * double(j)) / double(inten * inten); + f += P.matlab(i, j) * (double(j) * double(j)) / (inten * inten); } } double retval = f / sum_p; @@ -696,7 +698,7 @@ double D3_GLRLM_feature::calc_LRHGLE (const SimpleMatrix &P, const std::vec double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten * j * j); + f += P.matlab(i, j) * (inten * inten * (double(j) * double(j))); } } double retval = f / sum_p; diff --git a/src/nyx/features/3d_glszm.cpp b/src/nyx/features/3d_glszm.cpp index a4b0f5cee..e8e568660 100644 --- a/src/nyx/features/3d_glszm.cpp +++ b/src/nyx/features/3d_glszm.cpp @@ -820,26 +820,23 @@ void D3_GLSZM_feature::save_value(std::vector>& fvals) // 1. Small Area Emphasis double D3_GLSZM_feature::calc_SAE() { - double tot = 0; - for (int i=1; i<=Ng; i++) - { - for (int j=1; j<=P.width(); j++) - tot += double(P.matlab(i,j)) / (double(j) * double(j)); - } - double retval = tot / Nz; + // Calculate feature. 'sj' is expected to have been initialized in calc_sums_of_P() + // Zone sizes are squared in double: j^2 passes INT_MAX at a zone of 46,341. + double f = 0.0; + for (int j = 1; j <= Ns; j++) + f += sj[j] / (double(j) * double(j)); + double retval = f / Nz; return retval; } // 2. Large Area Emphasis double D3_GLSZM_feature::calc_LAE() { - double tot = 0; - for (int i = 1; i <= Ng; i++) - { - for (int j = 1; j <= P.width(); j++) - tot += double(P.matlab(i,j)) * (double(j) * double(j)); - } - double retval = tot / Nz; + // Calculate feature. 'sj' is expected to have been initialized in calc_sums_of_P() + double f = 0.0; + for (int j = 1; j <= Ns; j++) + f += sj[j] * (double(j) * double(j)); + double retval = f / Nz; return retval; } diff --git a/src/nyx/features/glrlm.cpp b/src/nyx/features/glrlm.cpp index 9b6ea724c..a59477a4b 100644 --- a/src/nyx/features/glrlm.cpp +++ b/src/nyx/features/glrlm.cpp @@ -378,6 +378,8 @@ void GLRLMFeature::calc_SRE(AngledFtrs& af) } } + // Run lengths and grey levels are squared in double: j^2 passes INT_MAX at a run of 46,341, + // and a grey level times a run passes UINT_MAX once their product reaches 65,536. for (int j = 1; j <= Nr; ++j) { f += rj[j] / (double(j) * double(j)); } @@ -597,7 +599,7 @@ void GLRLMFeature::calc_GLV(AngledFtrs& af) double mu = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i-1]; + auto inten = I[i-1]; for (int j = 1; j <= Nr; j++) { mu += P.matlab(i, j) / sum_p[ai] * inten; @@ -607,7 +609,7 @@ void GLRLMFeature::calc_GLV(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i-1]; + auto inten = I[i-1]; for (int j = 1; j <= Nr; j++) { double mu2 = (inten - mu) * (inten - mu); @@ -714,7 +716,7 @@ void GLRLMFeature::calc_LGLRE (AngledFtrs& af) double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) / double(inten*inten); + f += P.matlab(i, j) / (inten * inten); } } double retval = f / double(sum_p[ai]); @@ -746,7 +748,7 @@ void GLRLMFeature::calc_HGLRE(AngledFtrs& af) double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten); + f += P.matlab(i, j) * (inten * inten); } } double retval = f / double(sum_p[ai]); @@ -778,7 +780,7 @@ void GLRLMFeature::calc_SRLGLE(AngledFtrs& af) double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) / double(inten * inten * j * j); + f += P.matlab(i, j) / (inten * inten * (double(j) * double(j))); } } double retval = f / double(sum_p[ai]); @@ -810,7 +812,7 @@ void GLRLMFeature::calc_SRHGLE(AngledFtrs& af) double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten) / (double(j) * double(j)); + f += P.matlab(i, j) * (inten * inten) / (double(j) * double(j)); } } double retval = f / double(sum_p[ai]); @@ -841,7 +843,7 @@ void GLRLMFeature::calc_LRLGLE(AngledFtrs& af) double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (double(j) * double(j)) / double(inten*inten); + f += P.matlab(i, j) * (double(j) * double(j)) / (inten * inten); } } double retval = f / double(sum_p[ai]); @@ -873,7 +875,7 @@ void GLRLMFeature::calc_LRHGLE(AngledFtrs& af) double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten * j * j); + f += P.matlab(i, j) * (inten * inten * (double(j) * double(j))); } } double retval = f / double(sum_p[ai]); diff --git a/src/nyx/features/glszm.cpp b/src/nyx/features/glszm.cpp index f12018d6c..0c44fca1e 100644 --- a/src/nyx/features/glszm.cpp +++ b/src/nyx/features/glszm.cpp @@ -421,6 +421,7 @@ double GLSZMFeature::calc_SAE() { // Calculate feature. 'sj' is expected to have been initialized in calc_sums_of_P() double f = 0.0; + // Zone sizes are squared in double: j^2 passes INT_MAX at a zone of 46,341. for (int j = 1; j <= Ns; j++) { f += sj[j] / (double(j) * double(j)); diff --git a/src/nyx/gpu/glszm.cu b/src/nyx/gpu/glszm.cu index 9c9a0cd4d..da3e7c2c7 100644 --- a/src/nyx/gpu/glszm.cu +++ b/src/nyx/gpu/glszm.cu @@ -117,6 +117,7 @@ namespace NyxusGpu return; float s = SJ[j]; + // Zone sizes are squared in float, the accumulators' type: j^2 passes INT_MAX at a zone of 46,341. atomicAdd(&state[f_SAE], s / (float(j) * float(j))); atomicAdd(&state[f_LAE], s * (float(j) * float(j))); atomicAdd(&state[f_SZN], s * s); diff --git a/tests/test_3d_glrlm_analytic.h b/tests/test_3d_glrlm_analytic.h index 16a56ac95..802c3fbd2 100644 --- a/tests/test_3d_glrlm_analytic.h +++ b/tests/test_3d_glrlm_analytic.h @@ -3,60 +3,21 @@ // 3D GLRLM emphases against their closed form, on volumes whose run lengths and grey levels are large // enough that a squared term no longer fits in 32 bits (SPEC 4, oracle `analytic`). -#include -#include -#include "../src/nyx/features/3d_glrlm.h" // D3_GLRLM_feature, and SimpleCube / PixIntens with it -#include "test_main_nyxus.h" // the Environment / roi_cache graph, Fsettings with it +// gtest, , Fsettings and the volume runner arrive with the common headers; the feature method +// is this file's own. +#include "../src/nyx/features/3d_glrlm.h" // D3_GLRLM_feature +#include "test_3d_glrlm_common.h" // make_glrlm3d_settings -// No binning (GLRLM_GREYDEPTH = 0), which keeps the levels of a fixture as they are. -static Fsettings make_glrlm3d_nobinning_settings() -{ - Fsettings s; - s.resize ((int)NyxSetting::__COUNT__); - s[(int)NyxSetting::SOFTNAN].rval = 0.0; - s[(int)NyxSetting::TINY].rval = 0.0; - s[(int)NyxSetting::SINGLEROI].bval = false; - s[(int)NyxSetting::GREYDEPTH].ival = 64; - s[(int)NyxSetting::PIXELSIZEUM].rval = 100; - s[(int)NyxSetting::PIXELDISTANCE].ival = 5; - s[(int)NyxSetting::USEGPU].bval = false; - s[(int)NyxSetting::VERBOSLVL].ival = 0; - s[(int)NyxSetting::IBSI].bval = false; - s[(int)NyxSetting::GLRLM_GREYDEPTH].ival = 0; - return s; -} - -// Featurises a w x h x d volume held in memory, every non-zero voxel inside the ROI, into 'fvals' -// (indexed by Nyxus 3D feature code). The LR is built the way the prescan hands one to calculate(): -// the voxel cube, the voxel cloud and the running intensity extrema. +// Featurises a volume held in memory, every non-zero voxel inside the ROI, into 'fvals' (indexed by +// Nyxus 3D feature code), with no binning (GLRLM_GREYDEPTH = 0), which keeps the levels of a fixture +// as they are. static void run_3d_glrlm_on_volume ( std::vector>& fvals, const std::vector& voxels, int w, int h, int d) { - ASSERT_EQ (voxels.size(), size_t(w) * size_t(h) * size_t(d)); - - LR r; - r.aux_image_cube = SimpleCube (voxels, w, h, d); - for (int z = 0; z < d; z++) - for (int y = 0; y < h; y++) - for (int x = 0; x < w; x++) - { - PixIntens v = r.aux_image_cube.zyx (z, y, x); - if (!v) - continue; - r.raw_pixels_3D.push_back (Pixel3 (x, y, z, v)); - if (v < r.aux_min) - r.aux_min = v; - if (v > r.aux_max) - r.aux_max = v; - } - D3_GLRLM_feature f; - ASSERT_NO_THROW (r.initialize_fvals()); - ASSERT_NO_THROW (f.calculate (r, make_glrlm3d_nobinning_settings())); - f.save_value (r.fvals); - fvals = r.fvals; + run_3d_feature_on_volume (fvals, voxels, w, h, d, make_glrlm3d_settings (64, 0), f); } static void assert_3d_glrlm_closed_form (const std::vector>& fvals, Feature3D fcode, int angle, double expected) diff --git a/tests/test_3d_glrlm_common.h b/tests/test_3d_glrlm_common.h new file mode 100644 index 000000000..55d7ca7e7 --- /dev/null +++ b/tests/test_3d_glrlm_common.h @@ -0,0 +1,26 @@ +#pragma once + +// Shared fixture for the 3D GLRLM tests: the settings a 3D GLRLM assertion runs on. + +#include "test_main_nyxus.h" // Fsettings, NyxSetting and run_3d_feature_on_volume, with the roi_cache graph + +// D3_GLRLM_feature::calculate() reads SOFTNAN, IBSI and GLRLM_GREYDEPTH; 'grey_depth' is inert for +// this family and passed only so a caller can state the profile it reproduces. 'glrlm_grey_depth' +// selects the binning by its sign: negative is a PyRadiomics-style bin count, positive a MATLAB-style +// level count, and 0 no binning at all. +static Fsettings make_glrlm3d_settings (int grey_depth, int glrlm_grey_depth) +{ + Fsettings s; + s.resize((int)NyxSetting::__COUNT__); + s[(int)NyxSetting::SOFTNAN].rval = 0.0; + s[(int)NyxSetting::TINY].rval = 0.0; + s[(int)NyxSetting::SINGLEROI].bval = false; + s[(int)NyxSetting::GREYDEPTH].ival = grey_depth; + s[(int)NyxSetting::PIXELSIZEUM].rval = 100; + s[(int)NyxSetting::PIXELDISTANCE].ival = 5; + s[(int)NyxSetting::USEGPU].bval = false; + s[(int)NyxSetting::VERBOSLVL].ival = 0; + s[(int)NyxSetting::IBSI].bval = false; + s[(int)NyxSetting::GLRLM_GREYDEPTH].ival = glrlm_grey_depth; + return s; +} diff --git a/tests/test_3d_glrlm_regression.h b/tests/test_3d_glrlm_regression.h index 0d5dd6fd1..d0f0963e7 100644 --- a/tests/test_3d_glrlm_regression.h +++ b/tests/test_3d_glrlm_regression.h @@ -10,6 +10,7 @@ #include "../src/nyx/features/3d_glrlm.h" #include "../src/nyx/helpers/fsystem.h" #include "test_ref_vals.h" // ref_vals_map, and the / it already includes +#include "test_3d_glrlm_common.h" // make_glrlm3d_settings // Drift guards on the segmented phantom (ut_inten.nii + ut_mask57.nii, label 57), at binCount-20 // grey binning, averaged over the 13 3D angles. Nyxus' own output, so these claim no oracle @@ -134,18 +135,7 @@ static void run_3d_glrlm_pipeline (Environment& e, int grey_depth, int glrlm_gre ASSERT_NO_THROW(allocateTrivialRoisBuffers_3D(batch, e.roiData, e.hostCache)); // (5) feature settings - Fsettings s; - s.resize((int)NyxSetting::__COUNT__); - s[(int)NyxSetting::SOFTNAN].rval = 0.0; - s[(int)NyxSetting::TINY].rval = 0.0; - s[(int)NyxSetting::SINGLEROI].bval = false; - s[(int)NyxSetting::GREYDEPTH].ival = grey_depth; - s[(int)NyxSetting::PIXELSIZEUM].rval = 100; - s[(int)NyxSetting::PIXELDISTANCE].ival = 5; - s[(int)NyxSetting::USEGPU].bval = false; - s[(int)NyxSetting::VERBOSLVL].ival = 0; - s[(int)NyxSetting::IBSI].bval = false; - s[(int)NyxSetting::GLRLM_GREYDEPTH].ival = glrlm_grey_depth; + Fsettings s = make_glrlm3d_settings (grey_depth, glrlm_grey_depth); // (6) feature extraction LR& r = e.roiData[label]; diff --git a/tests/test_3d_glszm_analytic.h b/tests/test_3d_glszm_analytic.h index 47f7e84d3..401ce92f0 100644 --- a/tests/test_3d_glszm_analytic.h +++ b/tests/test_3d_glszm_analytic.h @@ -9,7 +9,7 @@ // bench_glszm_3d_two_large_zones -- a 64 x 64 x 32 volume, slices 0-15 at intensity 1 and slices // 16-31 at intensity 2. Each half is one 26-connected zone of L = 64 * 64 * 16 = 65,536 voxels, and -// L^2 = 2^32 is past INT_MAX -- in 32-bit arithmetic it is exactly 0 -- so a size emphasis is right +// L^2 = 2^32 is past INT_MAX, so a size emphasis is right // here only if j^2 is taken in double. With two zones, both of size L: // // SAE = (1/L^2 + 1/L^2) / 2 = 1 / L^2 LAE = (L^2 + L^2) / 2 = L^2 diff --git a/tests/test_3d_glszm_common.h b/tests/test_3d_glszm_common.h index ff4aa9de0..9511d94ef 100644 --- a/tests/test_3d_glszm_common.h +++ b/tests/test_3d_glszm_common.h @@ -17,7 +17,7 @@ #include "../src/nyx/features/3d_glszm.h" // D3_GLSZM_feature, and SimpleCube / PixIntens with it #include "../src/nyx/helpers/fsystem.h" // fs::path, fs::exists -#include "test_main_nyxus.h" // agrees_gt, , , and the Environment / globals / roi_cache graph +#include "test_main_nyxus.h" // agrees_gt, run_3d_feature_on_volume, , , and the Environment / globals / roi_cache graph // Both 3D phantoms are defined once, in test_3d_glcm_pyradiomics.h, and every 3D family reaches them // by declaration -- test_all.cc compiles the headers into one translation unit. get_3d_compat_phantom @@ -199,11 +199,8 @@ static const std::vector glszm_3d_gapped_volume // rather than 1 so that a zone landing on the wrong row is a visibly wrong level. static const std::vector glszm_3d_constant_volume (8, 7); -// Runs the family on a literal volume rather than on a phantom read from disk: an LR carrying that -// volume as its voxel cube, its extrema, and one Pixel3 per non-background voxel, which is the Np -// ZonePercentage divides by. It is the same calculate() the phantom assertions run -- the fixture is -// the only thing that changes -- so a matrix pinned here is pinned on the production path, not on a -// re-implementation of it. +// Runs the family on a literal volume rather than on a phantom read from disk. The voxel cloud it +// builds is the Np ZonePercentage divides by, so a matrix pinned here is pinned on the production path. static void run_3d_glszm_on_volume ( std::vector>& fvals, const std::vector& voxels, @@ -211,30 +208,7 @@ static void run_3d_glszm_on_volume ( const Fsettings& s, D3_GLSZM_feature& f) { - ASSERT_EQ (voxels.size(), size_t(w) * size_t(h) * size_t(d)); - - // An LR starts at the empty running-extrema state (aux_min = +inf, aux_max = 0), which is what - // the loop below accumulates into -- the same state the real prescan hands calculate(). - LR r; - r.aux_image_cube = SimpleCube (voxels, w, h, d); - for (int z = 0; z < d; z++) - for (int y = 0; y < h; y++) - for (int x = 0; x < w; x++) - { - PixIntens v = r.aux_image_cube.zyx (z, y, x); - if (!v) - continue; // background, outside the ROI - r.raw_pixels_3D.push_back (Pixel3 (x, y, z, v)); - if (v < r.aux_min) - r.aux_min = v; - if (v > r.aux_max) - r.aux_max = v; - } - - ASSERT_NO_THROW(r.initialize_fvals()); - ASSERT_NO_THROW(f.calculate(r, s)); - f.save_value(r.fvals); - fvals = r.fvals; + run_3d_feature_on_volume (fvals, voxels, w, h, d, s, f); } // Resolves a 3D feature name to its code and checks it is the one the caller expects, so a renamed diff --git a/tests/test_all.cc b/tests/test_all.cc index dd048c22b..abb83f73d 100644 --- a/tests/test_all.cc +++ b/tests/test_all.cc @@ -3292,12 +3292,14 @@ TEST(TEST_NYXUS, TEST_2D_GLRLM_RE_IBSI) ASSERT_NO_THROW(test_2d_glrlm_re_ibsi()); } -//***** IBSI tests of GLSZM ***** +//***** closed-form tests of GLSZM ***** TEST(TEST_NYXUS, TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC) { ASSERT_NO_THROW(test_2d_glszm_large_zone_size_emphasis_analytic()); } +//***** IBSI tests of GLSZM ***** + TEST(TEST_NYXUS, TEST_2D_GLSZM_SAE_IBSI) { ASSERT_NO_THROW(test_2d_glszm_sae_ibsi()); } diff --git a/tests/test_main_nyxus.h b/tests/test_main_nyxus.h index ac02c2274..a746cbf25 100644 --- a/tests/test_main_nyxus.h +++ b/tests/test_main_nyxus.h @@ -212,3 +212,44 @@ inline void write_tiled_plane_u16 (const fs::path& f, uint32_t W, uint32_t H, ui ASSERT_EQ(TIFFWriteDirectory (t), 1) << f.string(); TIFFClose (t); } + +// Runs a 3D feature method on a literal volume rather than on a phantom read from disk, for any family +// whose calculate() reads the voxel cube and the voxel cloud of an LR. Lives here rather than in a family +// header because 3D tests of more than one family run it (SPEC 6.3.1). +// The LR carries the volume as its voxel cube, its extrema, and one Pixel3 per non-background voxel, +// which is the voxel count a percentage feature divides by. It is the same calculate() the phantom +// assertions run -- the fixture is the only thing that changes -- so a value pinned here is pinned on +// the production path, not on a re-implementation of it. +template +static void run_3d_feature_on_volume ( + std::vector>& fvals, + const std::vector& voxels, + int w, int h, int d, + const Fsettings& s, + FeatureMethod& f) +{ + ASSERT_EQ (voxels.size(), size_t(w) * size_t(h) * size_t(d)); + + // An LR starts at the empty running-extrema state (aux_min = +inf, aux_max = 0), which is what + // the loop below accumulates into -- the same state the real prescan hands calculate(). + LR r; + r.aux_image_cube = SimpleCube (voxels, w, h, d); + for (int z = 0; z < d; z++) + for (int y = 0; y < h; y++) + for (int x = 0; x < w; x++) + { + PixIntens v = r.aux_image_cube.zyx (z, y, x); + if (!v) + continue; // background, outside the ROI + r.raw_pixels_3D.push_back (Pixel3 (x, y, z, v)); + if (v < r.aux_min) + r.aux_min = v; + if (v > r.aux_max) + r.aux_max = v; + } + + ASSERT_NO_THROW(r.initialize_fvals()); + ASSERT_NO_THROW(f.calculate(r, s)); + f.save_value(r.fvals); + fvals = r.fvals; +} diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index c5ef626e2..5676468ae 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -277,7 +277,7 @@ was never written pass. | Data | built inline in `test_3d_glszm_large_zone_size_emphasis_analytic()` (`tests/test_3d_glszm_analytic.h`) | | ROI | all 131,072 voxels of a 64×64×32 volume, slices 0-15 at intensity 1 and slices 16-31 at 2 | | Shape | two 26-connected zones of `L = 65,536` voxels, so the size-zone matrix has two cells, both in column `L` | -| Why it exists | `L^2 = 2^32` is past `INT_MAX` -- in 32-bit arithmetic it is exactly 0 -- so `3GLSZM_SAE = 1/L^2` and `3GLSZM_LAE = L^2` are right only if the square of the zone size is taken in double | +| Why it exists | `L^2 = 2^32` is past `INT_MAX`, so `3GLSZM_SAE = 1/L^2` and `3GLSZM_LAE = L^2` are right only if the square of the zone size is taken in double | Recipes: `glszm3d.analytic_two_large_zones`. From 49045e2413a64765065e294250aecb92b9055131 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 14:14:11 -0700 Subject: [PATCH 07/12] refactor(texture): state each GLRLM square where it is taken The run-length comment sits on SRE and the grey-level comment on LGLRE, 2D and 3D, each above the term it describes. test_3d_glrlm_regression.h and test_2d_glrlm_analytic.h include only what their common header does not already bring in. --- src/nyx/features/3d_glrlm.cpp | 5 +++-- src/nyx/features/glrlm.cpp | 5 +++-- tests/test_2d_glrlm_analytic.h | 6 ++---- tests/test_3d_glrlm_regression.h | 5 +---- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/nyx/features/3d_glrlm.cpp b/src/nyx/features/3d_glrlm.cpp index 98f9763aa..99f52e624 100644 --- a/src/nyx/features/3d_glrlm.cpp +++ b/src/nyx/features/3d_glrlm.cpp @@ -342,10 +342,9 @@ double D3_GLRLM_feature::calc_SRE (const SimpleMatrix &P, const double sum_ } } + // Run lengths are squared in double: j^2 passes INT_MAX at a run of 46,341. for (int j = 1; j <= Nr; ++j) { - // Run lengths and grey levels are squared in double: j^2 passes INT_MAX at a run of 46,341, - // and a grey level times a run passes UINT_MAX once their product reaches 65,536. f += rj[j] / (double(j) * double(j)); } @@ -580,6 +579,8 @@ double D3_GLRLM_feature::calc_LGLRE (const SimpleMatrix &P, const std::vect double f = 0.0; for (int i = 1; i <= Ng; i++) { + // Grey levels are taken in double: a level squared passes UINT_MAX at 65,536, and so does a + // level times a run once their product reaches 65,536. double inten = (double) I[i - 1]; for (int j = 1; j <= Nr; j++) { diff --git a/src/nyx/features/glrlm.cpp b/src/nyx/features/glrlm.cpp index a59477a4b..b78d03298 100644 --- a/src/nyx/features/glrlm.cpp +++ b/src/nyx/features/glrlm.cpp @@ -378,8 +378,7 @@ void GLRLMFeature::calc_SRE(AngledFtrs& af) } } - // Run lengths and grey levels are squared in double: j^2 passes INT_MAX at a run of 46,341, - // and a grey level times a run passes UINT_MAX once their product reaches 65,536. + // Run lengths are squared in double: j^2 passes INT_MAX at a run of 46,341. for (int j = 1; j <= Nr; ++j) { f += rj[j] / (double(j) * double(j)); } @@ -713,6 +712,8 @@ void GLRLMFeature::calc_LGLRE (AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { + // Grey levels are taken in double: a level squared passes UINT_MAX at 65,536, and so does a + // level times a run once their product reaches 65,536. double inten = (double) I[i-1]; for (int j = 1; j <= Nr; j++) { diff --git a/tests/test_2d_glrlm_analytic.h b/tests/test_2d_glrlm_analytic.h index 26dc3f8d8..a33857064 100644 --- a/tests/test_2d_glrlm_analytic.h +++ b/tests/test_2d_glrlm_analytic.h @@ -3,10 +3,8 @@ // 2D GLRLM emphases against their closed form, on ROIs whose run lengths and grey levels are large // enough that a squared term no longer fits in 32 bits (SPEC 4, oracle `analytic`). -// gtest and are this file's own; GLRLMFeature, Feature2D, the IBSI settings recipe and the -// ROI loader arrive with the common header. -#include -#include +// Nothing of its own: gtest, , GLRLMFeature, Feature2D, the IBSI settings recipe and the +// ROI loader all arrive with the common header. #include "test_2d_glrlm_common.h" // Featurises one fully masked ROI given as (x, y, intensity) pixels, at the IBSI recipe, which keeps diff --git a/tests/test_3d_glrlm_regression.h b/tests/test_3d_glrlm_regression.h index d0f0963e7..81b5536c0 100644 --- a/tests/test_3d_glrlm_regression.h +++ b/tests/test_3d_glrlm_regression.h @@ -1,14 +1,11 @@ #pragma once -#include +// gtest, , fs and the roi_cache graph arrive with test_3d_glrlm_common.h. #include -#include #include #include "../src/nyx/environment.h" #include "../src/nyx/featureset.h" -#include "../src/nyx/roi_cache.h" #include "../src/nyx/features/3d_glrlm.h" -#include "../src/nyx/helpers/fsystem.h" #include "test_ref_vals.h" // ref_vals_map, and the / it already includes #include "test_3d_glrlm_common.h" // make_glrlm3d_settings From f50b517cfb10bf645c8cc2a1cbcebb8fc84898b6 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 16:19:40 -0700 Subject: [PATCH 08/12] test(texture): stop each GLRLM closed-form test at its first mismatch Every call to the 2D and 3D closed-form assertion helpers is wrapped in ASSERT_NO_FATAL_FAILURE, so a wrong value stops the test there rather than reporting the same defect once per direction and feature. The 3D analytic runner labels its grey-depth argument, which GLRLM does not read. --- tests/test_2d_glrlm_analytic.h | 24 ++++++++++++------------ tests/test_3d_glrlm_analytic.h | 26 +++++++++++++------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/test_2d_glrlm_analytic.h b/tests/test_2d_glrlm_analytic.h index a33857064..c934e0d5f 100644 --- a/tests/test_2d_glrlm_analytic.h +++ b/tests/test_2d_glrlm_analytic.h @@ -47,12 +47,12 @@ void test_2d_glrlm_long_run_emphasis_analytic() ASSERT_NO_FATAL_FAILURE (run_2d_glrlm_on_pixels (roidata, intensity)); const double L2 = double(L) * double(L); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRE, 0, 1.0 / L2); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRE, 0, L2); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, 0, 0.625 / L2); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, 0, 2.5 / L2); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, 0, 0.625 * L2); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, 0, 2.5 * L2); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRE, 0, 1.0 / L2)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRE, 0, L2)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, 0, 0.625 / L2)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, 0, 2.5 / L2)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, 0, 0.625 * L2)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, 0, 2.5 * L2)); } // bench_glrlm_2d_high_grey_pair -- two adjacent pixels at intensities 1 and G = 70,000. Every @@ -73,11 +73,11 @@ void test_2d_glrlm_high_grey_level_emphasis_analytic() high = (1.0 + G * G) / 2.0; for (int angle = 0; angle < 4; angle++) { - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LGLRE, angle, low); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, angle, low); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, angle, low); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_HGLRE, angle, high); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, angle, high); - assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, angle, high); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LGLRE, angle, low)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, angle, low)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, angle, low)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_HGLRE, angle, high)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, angle, high)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, angle, high)); } } diff --git a/tests/test_3d_glrlm_analytic.h b/tests/test_3d_glrlm_analytic.h index 802c3fbd2..49ebb60f9 100644 --- a/tests/test_3d_glrlm_analytic.h +++ b/tests/test_3d_glrlm_analytic.h @@ -17,7 +17,7 @@ static void run_3d_glrlm_on_volume ( int w, int h, int d) { D3_GLRLM_feature f; - run_3d_feature_on_volume (fvals, voxels, w, h, d, make_glrlm3d_settings (64, 0), f); + run_3d_feature_on_volume (fvals, voxels, w, h, d, make_glrlm3d_settings (64/*greydepth, inert for GLRLM*/, 0/*no binning*/), f); } static void assert_3d_glrlm_closed_form (const std::vector>& fvals, Feature3D fcode, int angle, double expected) @@ -47,12 +47,12 @@ void test_3d_glrlm_long_run_emphasis_analytic() const int along_x = 12; const double L2 = double(L) * double(L); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRE, along_x, 1.0 / L2); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRE, along_x, L2); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, along_x, 0.625 / L2); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, along_x, 2.5 / L2); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, along_x, 0.625 * L2); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, along_x, 2.5 * L2); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRE, along_x, 1.0 / L2)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRE, along_x, L2)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, along_x, 0.625 / L2)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, along_x, 2.5 / L2)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, along_x, 0.625 * L2)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, along_x, 2.5 * L2)); } // bench_glrlm_3d_high_grey_pair -- two adjacent voxels at intensities 1 and G = 70,000. Every one of @@ -73,11 +73,11 @@ void test_3d_glrlm_high_grey_level_emphasis_analytic() high = (1.0 + G * G) / 2.0; for (int angle = 0; angle < 13; angle++) { - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LGLRE, angle, low); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, angle, low); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, angle, low); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_HGLRE, angle, high); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, angle, high); - assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, angle, high); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LGLRE, angle, low)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, angle, low)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, angle, low)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_HGLRE, angle, high)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, angle, high)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, angle, high)); } } From ffa2eb4b0970049a5b891bb2238644e7dbe23a38 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Wed, 14 Oct 2026 17:33:24 -0700 Subject: [PATCH 09/12] test(texture): assert every long-run direction and its _AVE The long-run fixtures assert all four 2D directions and all thirteen 3D directions, not only the one along the line: off the line every pixel or voxel is a run of length 1, so those values and each _AVE have a closed form, and the _AVE carries the past-INT_MAX value into the mean. The twelve _AVE features get their own analytic rows in the registry. Every analytic assertion and registry row states why its band is rel=1e-12 and not SPEC 7's abs 1e-9: the values run from below 1e-9 to past 1e9. The 3D GLRLM PyRadiomics tests build their settings with make_glrlm3d_settings(), so the family has one recipe. --- tests/test_2d_glrlm_analytic.h | 23 ++++++++ tests/test_2d_glszm_analytic.h | 2 + tests/test_3d_glrlm_analytic.h | 25 ++++++++ tests/test_3d_glrlm_pyradiomics.h | 34 ++--------- tests/test_3d_glszm_analytic.h | 2 + tests/vetting/benchmarks.md | 4 +- tests/vetting/config_recipes.md | 11 ++-- tests/vetting/oracle_coverage.csv | 98 +++++++++++++++++-------------- tests/vetting/report_output.csv | 98 +++++++++++++++++-------------- tests/vetting/report_output.md | 12 ++-- 10 files changed, 182 insertions(+), 127 deletions(-) diff --git a/tests/test_2d_glrlm_analytic.h b/tests/test_2d_glrlm_analytic.h index c934e0d5f..b54ba511b 100644 --- a/tests/test_2d_glrlm_analytic.h +++ b/tests/test_2d_glrlm_analytic.h @@ -22,6 +22,8 @@ static void run_2d_glrlm_on_pixels (LR& roidata, const std::vector& f.save_value (roidata.fvals); } +// rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these values run from below 1e-9 to past 1e9, +// so an absolute 1e-9 would accept a small emphasis of 0 and lies below a large one's last bit. static void assert_2d_glrlm_closed_form (const LR& roidata, Feature2D fcode, int angle, double expected) { const double actual = roidata.fvals[(int)fcode][angle]; @@ -36,6 +38,10 @@ static void assert_2d_glrlm_closed_form (const LR& roidata, Feature2D fcode, int // SRE = 1/L^2 LRE = L^2 // SRLGLE = (1 + 1/4) / 2 / L^2 SRHGLE = (1 + 4) / 2 / L^2 // LRLGLE = (1 + 1/4) / 2 * L^2 LRHGLE = (1 + 4) / 2 * L^2 +// +// At 45, 90 and 135 degrees a one-pixel-high row has no neighbour, so every pixel is a run of +// length 1: 2L runs, half at each level, giving SRE = LRE = 1, SRLGLE = LRLGLE = (1 + 1/4) / 2 and +// SRHGLE = LRHGLE = (1 + 4) / 2. Each _AVE is the mean of the four directions. void test_2d_glrlm_long_run_emphasis_analytic() { const size_t L = 46656; @@ -53,6 +59,23 @@ void test_2d_glrlm_long_run_emphasis_analytic() ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, 0, 2.5 / L2)); ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, 0, 0.625 * L2)); ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, 0, 2.5 * L2)); + + // every other direction, and the mean over all 4 + for (int angle = 1; angle < 4; angle++) + { + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRE, angle, 1.0)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRE, angle, 1.0)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE, angle, 0.625)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE, angle, 2.5)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE, angle, 0.625)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE, angle, 2.5)); + } + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRE_AVE, 0, (1.0 / L2 + 3 * 1.0) / 4)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRE_AVE, 0, (L2 + 3 * 1.0) / 4)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRLGLE_AVE, 0, (0.625 / L2 + 3 * 0.625) / 4)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_SRHGLE_AVE, 0, (2.5 / L2 + 3 * 2.5) / 4)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRLGLE_AVE, 0, (0.625 * L2 + 3 * 0.625) / 4)); + ASSERT_NO_FATAL_FAILURE (assert_2d_glrlm_closed_form (roidata, Feature2D::GLRLM_LRHGLE_AVE, 0, (2.5 * L2 + 3 * 2.5) / 4)); } // bench_glrlm_2d_high_grey_pair -- two adjacent pixels at intensities 1 and G = 70,000. Every diff --git a/tests/test_2d_glszm_analytic.h b/tests/test_2d_glszm_analytic.h index ae9d255ec..9001b6d6d 100644 --- a/tests/test_2d_glszm_analytic.h +++ b/tests/test_2d_glszm_analytic.h @@ -43,6 +43,8 @@ void test_2d_glszm_large_zone_size_emphasis_analytic() const double L = 216.0 * 216.0, L2 = L * L; + // rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these values run from below 1e-9 to past 1e9, + // so an absolute 1e-9 would accept a small emphasis of 0 and lies below a large one's last bit. ASSERT_NEAR (roidata.fvals[(int)Feature2D::GLSZM_SAE][0], 1.0 / L2, 1e-12 / L2); ASSERT_NEAR (roidata.fvals[(int)Feature2D::GLSZM_LAE][0], L2, 1e-12 * L2); } diff --git a/tests/test_3d_glrlm_analytic.h b/tests/test_3d_glrlm_analytic.h index 49ebb60f9..4a877b63e 100644 --- a/tests/test_3d_glrlm_analytic.h +++ b/tests/test_3d_glrlm_analytic.h @@ -20,6 +20,8 @@ static void run_3d_glrlm_on_volume ( run_3d_feature_on_volume (fvals, voxels, w, h, d, make_glrlm3d_settings (64/*greydepth, inert for GLRLM*/, 0/*no binning*/), f); } +// rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these values run from below 1e-9 to past 1e9, +// so an absolute 1e-9 would accept a small emphasis of 0 and lies below a large one's last bit. static void assert_3d_glrlm_closed_form (const std::vector>& fvals, Feature3D fcode, int angle, double expected) { const double actual = fvals[(int)fcode][angle]; @@ -35,6 +37,10 @@ static void assert_3d_glrlm_closed_form (const std::vector>& // SRE = 1/L^2 LRE = L^2 // SRLGLE = (1 + 1/4) / 2 / L^2 SRHGLE = (1 + 4) / 2 / L^2 // LRLGLE = (1 + 1/4) / 2 * L^2 LRHGLE = (1 + 4) / 2 * L^2 +// +// The other 12 directions leave the line, so every voxel is a run of length 1: 2L runs, half at +// each level, giving SRE = LRE = 1, SRLGLE = LRLGLE = (1 + 1/4) / 2 and SRHGLE = LRHGLE = (1 + 4) / 2. +// Each _AVE is the mean of the 13 directions. void test_3d_glrlm_long_run_emphasis_analytic() { const int L = 46656; @@ -53,6 +59,25 @@ void test_3d_glrlm_long_run_emphasis_analytic() ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, along_x, 2.5 / L2)); ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, along_x, 0.625 * L2)); ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, along_x, 2.5 * L2)); + + // every other direction, and the mean over all 13 + for (int angle = 0; angle < 13; angle++) + { + if (angle == along_x) + continue; + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRE, angle, 1.0)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRE, angle, 1.0)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE, angle, 0.625)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE, angle, 2.5)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE, angle, 0.625)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE, angle, 2.5)); + } + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRE_AVE, 0, (1.0 / L2 + 12 * 1.0) / 13)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRE_AVE, 0, (L2 + 12 * 1.0) / 13)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRLGLE_AVE, 0, (0.625 / L2 + 12 * 0.625) / 13)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_SRHGLE_AVE, 0, (2.5 / L2 + 12 * 2.5) / 13)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRLGLE_AVE, 0, (0.625 * L2 + 12 * 0.625) / 13)); + ASSERT_NO_FATAL_FAILURE (assert_3d_glrlm_closed_form (fvals, Feature3D::GLRLM_LRHGLE_AVE, 0, (2.5 * L2 + 12 * 2.5) / 13)); } // bench_glrlm_3d_high_grey_pair -- two adjacent voxels at intensities 1 and G = 70,000. Every one of diff --git a/tests/test_3d_glrlm_pyradiomics.h b/tests/test_3d_glrlm_pyradiomics.h index 57e13c70a..52a3904aa 100644 --- a/tests/test_3d_glrlm_pyradiomics.h +++ b/tests/test_3d_glrlm_pyradiomics.h @@ -9,6 +9,7 @@ #include "../src/nyx/features/3d_glrlm.h" #include "../src/nyx/helpers/fsystem.h" #include "test_ref_vals.h" // ref_vals_map, and the / it already includes +#include "test_3d_glrlm_common.h" // make_glrlm3d_settings // PyRadiomics 3.0.1 on the compat phantom (compat_int/compat_int_mri.nii + // compat_seg/compat_seg_liver.nii, label 1) at binCount 20, recipe glrlm3d.pyradiomics_bincount20. @@ -439,23 +440,9 @@ void assert_3d_glrlm_feature_pyradiomics(const Nyxus::Feature3D& expecting_fcode // buffers ASSERT_NO_THROW(allocateTrivialRoisBuffers_3D(batch, e.roiData, e.hostCache)); - // (3) common feature extraction settings - - Fsettings s; - s.resize((int)NyxSetting::__COUNT__); - s[(int)NyxSetting::SOFTNAN].rval = 0.0; - s[(int)NyxSetting::TINY].rval = 0.0; - s[(int)NyxSetting::SINGLEROI].bval = false; - s[(int)NyxSetting::GREYDEPTH].ival = 100; - s[(int)NyxSetting::PIXELSIZEUM].rval = 100; - s[(int)NyxSetting::PIXELDISTANCE].ival = 5; - s[(int)NyxSetting::USEGPU].bval = false; - s[(int)NyxSetting::VERBOSLVL].ival = 0; - s[(int)NyxSetting::IBSI].bval = false; - - // (4) GLRLM-specific feature settings mocking the pyRadiomics recipe above - - s[(int)NyxSetting::GLRLM_GREYDEPTH].ival = -20; // intentionally negative to activate radiomics binCount-based grey-binning + // (3) feature settings mocking the pyRadiomics recipe above: GLRLM_GREYDEPTH = -20 is radiomics + // binCount-based grey binning + Fsettings s = make_glrlm3d_settings (100, -20); // (5) feature extraction @@ -521,18 +508,7 @@ void test_3d_glrlm_ave_pyradiomics() ASSERT_TRUE(scanTrivialRois_3D(e, batch, ipath, mpath, 0/*t_index*/, 0/*channel*/)); ASSERT_NO_THROW(allocateTrivialRoisBuffers_3D(batch, e.roiData, e.hostCache)); - Fsettings s; - s.resize((int)NyxSetting::__COUNT__); - s[(int)NyxSetting::SOFTNAN].rval = 0.0; - s[(int)NyxSetting::TINY].rval = 0.0; - s[(int)NyxSetting::SINGLEROI].bval = false; - s[(int)NyxSetting::GREYDEPTH].ival = 100; - s[(int)NyxSetting::PIXELSIZEUM].rval = 100; - s[(int)NyxSetting::PIXELDISTANCE].ival = 5; - s[(int)NyxSetting::USEGPU].bval = false; - s[(int)NyxSetting::VERBOSLVL].ival = 0; - s[(int)NyxSetting::IBSI].bval = false; - s[(int)NyxSetting::GLRLM_GREYDEPTH].ival = -20; // radiomics binCount-based grey binning + Fsettings s = make_glrlm3d_settings (100, -20 /*radiomics binCount-based grey binning*/); LR& r = e.roiData[label]; ASSERT_NO_THROW(r.initialize_fvals()); diff --git a/tests/test_3d_glszm_analytic.h b/tests/test_3d_glszm_analytic.h index 401ce92f0..9c620b97b 100644 --- a/tests/test_3d_glszm_analytic.h +++ b/tests/test_3d_glszm_analytic.h @@ -30,6 +30,8 @@ void test_3d_glszm_large_zone_size_emphasis_analytic() const double L = 64.0 * 64.0 * 16.0, L2 = L * L; + // rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these values run from below 1e-9 to past 1e9, + // so an absolute 1e-9 would accept a small emphasis of 0 and lies below a large one's last bit. ASSERT_NEAR (fvals[(int)Feature3D::GLSZM_SAE][0], 1.0 / L2, 1e-12 / L2); ASSERT_NEAR (fvals[(int)Feature3D::GLSZM_LAE][0], L2, 1e-12 * L2); } diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index 5676468ae..329864a6c 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -315,7 +315,7 @@ Tests reaching it today: `test_2d_glszm_analytic.h`. | Data | built inline in `test_2d_glrlm_long_run_emphasis_analytic()` (`tests/test_2d_glrlm_analytic.h`) | | ROI | one row of 93,312 pixels, the left half at intensity 1 and the right half at 2 | | Shape | at 0 degrees, two runs of `L = 46,656`, one per level | -| Why it exists | the six run-length emphases at 0 degrees, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | +| Why it exists | the six run-length emphases in all 4 directions and their `_AVE`, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | Recipes: `glrlm.analytic_two_long_runs`. @@ -345,7 +345,7 @@ Tests reaching it today: `test_2d_glrlm_analytic.h`. | Data | built inline in `test_3d_glrlm_long_run_emphasis_analytic()` (`tests/test_3d_glrlm_analytic.h`) | | ROI | a 93,312×1×1 line, the first half at intensity 1 and the second at 2 | | Shape | along x, direction slot 12, two runs of `L = 46,656`, one per level | -| Why it exists | the six run-length emphases along x, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | +| Why it exists | the six run-length emphases in all 13 directions and their `_AVE`, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | Recipes: `glrlm3d.analytic_two_long_runs`. diff --git a/tests/vetting/config_recipes.md b/tests/vetting/config_recipes.md index fd69215e6..573fdfd96 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -476,10 +476,11 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `test_2d_glrlm_long_run_emphasis_analytic()`, the left half at intensity 1 and the right half at 2 — at `make_2d_glrlm_ibsi_settings()` (`IBSI=true`), which keeps the two levels as they are. Oracle: `analytic`. Used by `test_2d_glrlm_analytic.h`, for `GLRLM_SRE`, `GLRLM_LRE` and the four - run-length-and-grey-level emphases, at 0 degrees. + run-length-and-grey-level emphases in all four directions, and their `_AVE` twins. - **What it is for.** At 0 degrees the row is two runs of length `L`, one at each level. `L^2 = 2,176,782,336` is past `INT_MAX` and `2^2 * L^2` past `UINT_MAX`, so the values are right only if - the run-length terms are taken in double. + the run-length terms are taken in double. At 45, 90 and 135 degrees every pixel is a run of length + 1, so each `_AVE` has a closed form too, and carries the 0-degree value into the mean. - The band is `rel=1e-12`, because `LRE` is 2.2e9 and an absolute 1e-9 is below its last bit. ## glrlm.analytic_high_grey_pair @@ -748,10 +749,12 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `test_3d_glrlm_long_run_emphasis_analytic()`, the first half at intensity 1 and the second at 2 — at `GREYDEPTH=64`, `IBSI=false` and `GLRLM_GREYDEPTH=0`, so the two levels are read as they are. Oracle: `analytic`. Used by `test_3d_glrlm_analytic.h`, for `3GLRLM_SRE`, `3GLRLM_LRE` and the four - run-length-and-grey-level emphases, in direction slot 12 (`{dz=0, dy=0, dx=1}`, along the line). + run-length-and-grey-level emphases in all 13 directions, and their `_AVE` twins. Direction slot 12 + (`{dz=0, dy=0, dx=1}`) runs along the line. - **What it is for.** Along the line the volume is two runs of length `L`, one at each level. `L^2 = 2,176,782,336` is past `INT_MAX` and `2^2 * L^2` past `UINT_MAX`, so the values are right only if - the run-length terms are taken in double. + the run-length terms are taken in double. The other 12 directions leave the line, so every voxel is + a run of length 1, and each `_AVE` has a closed form that carries the along-the-line value. - The band is `rel=1e-12`, because `LRE` is 2.2e9 and an absolute 1e-9 is below its last bit. ## glrlm3d.analytic_high_grey_pair diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index 3e59a1340..d0d787dbb 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -264,9 +264,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLCM_SUMENTROPY_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=5e-3,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLCM_SUMVARIANCE_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, @@ -276,23 +276,25 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=5e-3,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_LGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs -2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair -2D,GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, -2D,GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair +2D,GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, +2D,GLRLM_SRE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, +2D,GLRLM_LRE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_GLNN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLNN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_RLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_RLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, @@ -303,10 +305,14 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_RE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=5e-3,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_RE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_LGLRE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, 2D,GLRLM_HGLRE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_HGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRLGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_SRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRHGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_SRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRLGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRHGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRLGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_SRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRHGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_SRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_SRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRLGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_LRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRHGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_LRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, +2D,GLRLM_LRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLDZM_SDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_SDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_SDE_MIRP,ibsi_digital_phantom 2D,GLDZM_LDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_LDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LDE_MIRP,ibsi_digital_phantom 2D,GLDZM_LGLZE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_LGLZE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LGLZE_MIRP,ibsi_digital_phantom @@ -326,9 +332,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLDZM_ZDV,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,ibsi_digital_phantom 2D,GLDZM_ZDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,ibsi_digital_phantom 2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom -2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones 2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom -2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones 2D,GLSZM_GLN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,ibsi_digital_phantom 2D,GLSZM_GLNN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,ibsi_digital_phantom 2D,GLSZM_SZN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,ibsi_digital_phantom @@ -391,7 +397,7 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GABOR,gabor,vetted,skimage,agreed,gabor.python_raw_defaults,rel=1e-3,test_2d_gabor_skimage.cc,,,,in-tree,"Vetted vs scikit-image 0.26.0 at the default lists gabor_freqs=[4,16,32,64], gabor_thetas=[0,45,90,135] deg as GaborOptions::parse_input builds them (f0={4,16,32,64}, theta={0,pi/4,pi/2,3pi/4} rad) - the config the Python API always runs and a CLI run that passes both flags. All 16 pins reproduced exactly by gen_gabor_skimage.py (max |diff| 0.000e+00). This config point was added 2026-08 because the family's only vetted row covered gabor.cpp_static_defaults, a different frequency and angle set whose values differ from this one by up to 0.84 absolute on the same ROI - so no in-tree assertion covered what users compute. UNITS: the recipe is named 'python_raw' because parse_input converts the angles (deg->rad) and passes the frequencies through untouched, while nyxus.py and the CLI help both document gabor_freqs as denominators of pi and nothing in the tree divides by pi; the assertion covers the numbers that reach the filter, not the documented units contract, which is an unresolved source question (vetting report section 8 item 4). SCOPE of oracle=skimage (SPEC 4 allows one token per row; the claim is narrower than the token): skimage supplies the KERNEL at the non-degenerate (f0,theta) points - gabor_kernel(frequency=f0/2pi, sigma_x=sig2lam*2pi/f0, sigma_y=sigma_x/gamma, offset=0) cropped to the Nyxus 16x16 grid - while the count-ratio SCORE is Nyxus' own WND-CHARM definition reproduced in the generator, because skimage has no native equivalent to compare the whole feature against. A full-feature oracle would be wndcharm; not built in this tree, recorded in not_covered.md. SCOPE 2: the GPU path is NOT vetted - calculate_gpu (FFT convolution) diverges from the direct-convolution CPU path on these ROIs; the assertion covers the in-RAM CPU path only, and the GPU path's plumbing guard is TEST_NYXUS.TEST_2D_GABOR_GPU_RUNS_MECHANICS. SCOPE 3: the 16x16 kernel crop is part of the recipe rather than a detail - at gamma=0.1 only 7.9-47.6 percent of the kernel's L1 mass falls inside that window at the low frequencies, and scoring off skimage's own filtering (skimage.filters.gabor, untruncated support, zero-padded border) moves values by up to 1.005; generator part D2 re-runs that control. See audit/gabor_2d_skimage_vetting_report.md.",TEST_NYXUS.TEST_2D_GABOR_PYTHON_RAW_DEFAULTS_SKIMAGE,bench_dsb2018_2d 2D,MEAN_FRAC,radial,regression,,disagreed,radial.shape2d_native,rel=1e-9,test_2d_radial_regression.h;test_2d_radial_invariant.h,,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",convention-mismatch,in-tree,"Not CellProfiler-vettable: CP's MeanFrac is normalised by the ROI mean intensity and lands near 1, Nyxus' is the bin's raw mean intensity. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the raw-bin-mean convention (intensity range, and the reconstruction of the ROI total together with FRAC_AT_D) is characterized by TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION, not asserted as an invariant, because CellProfiler's normalised MeanFrac satisfies neither. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1.",TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,bench_shape8_concave_holed 2D,RADIAL_CV,radial,regression,,disagreed,radial.shape2d_native,rel=1e-9,test_2d_radial_regression.h;test_2d_radial_invariant.h,,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",convention-mismatch,in-tree,"Not CellProfiler-vettable: CP takes the CV of the 8 wedge means over the non-empty wedges, Nyxus the CV of the 8 wedge sums over all 8. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the sqrt(num_bins-1) bound and the empty-bin zero hold under either wedge convention and are asserted by the two invariants named in test_name. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1.",TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_CV_IS_WITHIN_ITS_BOUND_INVARIANT;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,bench_shape8_concave_holed -2D,ZERNIKE2D,zernike,vetted,analytic,agreed,zernike.shape2d_native,rel=1e-12,test_2d_zernike_analytic.h;test_2d_zernike_regression.h;test_2d_zernike_invariant.h;test_2d_zernike_mechanics.h,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",,in-tree,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count).",TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,bench_shape8_concave_holed +2D,ZERNIKE2D,zernike,vetted,analytic,agreed,zernike.shape2d_native,rel=1e-12,test_2d_zernike_analytic.h;test_2d_zernike_regression.h;test_2d_zernike_invariant.h;test_2d_zernike_mechanics.h,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",,in-tree,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count). The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,bench_shape8_concave_holed 2D,SPAT_MOMENT_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md.",, 2D,SPAT_MOMENT_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md.",, 2D,SPAT_MOMENT_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md.",, @@ -690,8 +696,8 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3LEAST_AXIS_LEN,morphology,vetted,pyradiomics,agreed,morphology3d.pyradiomics_anisotropic,rel=1e-9,test_3d_morphology_pyradiomics.h,test_3d_morphology_pyradiomics.h,,,in-tree,"PyRadiomics 3.0.1 LeastAxisLength=83.765297555890839 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py. pyradiomics normalizes the covariance by N, Nyxus by N-1, so Nyxus is asserted against the pin times sqrt(N/(N-1)), N=274432 (Nyxus normalization, not a tolerance), at rel=1e-9.",TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_LEAST_AXIS_LEN_PYRADIOMICS, 3D,3ELONGATION,morphology,vetted,pyradiomics,agreed,morphology3d.pyradiomics_anisotropic,rel=1e-9,test_3d_morphology_pyradiomics.h,test_3d_morphology_pyradiomics.h,,,in-tree,"PyRadiomics 3.0.1 Elongation=0.64206222930112822 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9.",TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_ELONGATION_PYRADIOMICS, 3D,3FLATNESS,morphology,vetted,pyradiomics,agreed,morphology3d.pyradiomics_anisotropic,rel=1e-9,test_3d_morphology_pyradiomics.h,test_3d_morphology_pyradiomics.h,,,in-tree,"PyRadiomics 3.0.1 Flatness=0.46852288961977678 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9.",TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_FLATNESS_PYRADIOMICS, -3D,3MESH_VOLUME,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation.",, -3D,3VOLUME_CONVEXHULL,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation.",, +3D,3MESH_VOLUME,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",, +3D,3VOLUME_CONVEXHULL,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",, 3D,3GLCM_ACOR,glcm,vetted,pyradiomics,agreed,glcm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glcm_pyradiomics.h;test_3d_glcm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only).",, 3D,3GLCM_ASM,glcm,vetted,pyradiomics,agreed,glcm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glcm_pyradiomics.h;test_3d_glcm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only).",, 3D,3GLCM_CLUPROM,glcm,vetted,pyradiomics,agreed,glcm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glcm_pyradiomics.h;test_3d_glcm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only).",, @@ -976,9 +982,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_ut_phantom,rel=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md.",TEST_NYXUS.TEST_3D_GLSZM_LAHGLE_REGRESSION,bench_ut57_3d 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md.",TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,bench_ut57_3d 3D,3GLSZM_SAE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLSZM_SAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones +3D,3GLSZM_SAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones 3D,3GLSZM_LAE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLSZM_LAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones +3D,3GLSZM_LAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones 3D,3GLSZM_GLN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_GLNN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_SZN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant @@ -994,9 +1000,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_LALGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, @@ -1006,23 +1012,25 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_RV,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=2e-3,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference.",, 3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs -3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair -3D,3GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_SRE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_LRE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_GLNN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_RLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, @@ -1033,10 +1041,14 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_RE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=2e-3,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual 6.2e-4. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference.",, 3D,3GLRLM_LGLRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_HGLRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_SRLGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_SRHGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_LRLGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_LRHGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_SRLGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_SRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRHGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_SRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRLGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_LRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRHGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, +3D,3GLRLM_LRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs IMQ,FOCUS_SCORE,imq,vetted,opencv,agreed,imq.laplacian_ksize1_zeropad,abs=1e-9,test_imq_opencv.h,,,,audit,"vetted vs OpenCV cv2.Laplacian(roi, CV_64F, ksize=1, BORDER_CONSTANT).var() = 34.956597222222221 (cv2 4.13.0, gen_imq_opencv.py), the Pech-Pacheco et al. (2000) variance-of-the-Laplacian focus measure. The generator asserts cv2's filtered image equals Nyxus' laplacian() cell for cell before comparing any scalar, so the convolution is proved and only the variance step is under test; Nyxus reproduces the scalar to 7.1e-15 absolute (2.0e-16 relative), which is summation order alone. Band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. SCOPE: ksize=1, the only kernel calculate() selects. laplacian()'s ksize>1 kernel is cv2.Laplacian's ksize=3 aperture exactly: both stencils are pinned from cv2's unit-spike response in test_imq_opencv.h (TEST_IMQ_FOCUS_SCORE_KERNEL_PER_CALL_OPENCV) and the generator asserts the ksize=3 filtered fixture equal to cv2's cell for cell. The out-of-core path shares the in-RAM scoring code and is held bit-equal to it by test_imq_invariant.h (an invariant, not vetting). Report: audit/imq_opencv_vetting_report.md; matrix/imq.md.",TEST_NYXUS.TEST_IMQ_FOCUS_SCORE_OPENCV,bench_imq_quality_roi IMQ,LOCAL_FOCUS_SCORE,imq,vetted,opencv,agreed,imq.laplacian_ksize1_zeropad,abs=1e-9,test_imq_opencv.h,,,,audit,"vetted vs OpenCV: the mean of cv2.Laplacian(tile, CV_64F, ksize=1, BORDER_CONSTANT).var() over the 2x2 grid of 4x6 tiles get_local_focus_score() cuts the 8x12 fixture into at scale=2 = 28.341145833333336 (cv2 4.13.0, gen_imq_opencv.py, which asserts the tile count and prints each tile's score). Nyxus reproduces it to 7.1e-15 absolute (2.5e-16 relative); band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. Negative control: the one-tile value a truncated y < height-M loop bound gives, 7.5763888888888902, is asserted to sit 73% away, so the pin tells the full tiling from the truncated one. Report: audit/imq_opencv_vetting_report.md; matrix/imq.md. ORACLE SPLIT (not_covered.md section E): OpenCV supplies each tile's Laplacian and population variance; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row.",TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_OPENCV,bench_imq_quality_roi IMQ,LOCAL_FOCUS_SCORE,imq,vetted,analytic,agreed,imq.local_focus_single_spike,abs=0,test_imq_analytic.h,,,,in-tree,"vetted against a closed form, no generator: a single spike of height v clear of the tile edge has a ksize=1 Laplacian of -4v at the spike and +v at its four neighbours, so its tile scores exactly 20v^2/P and every all-zero tile scores 0. test_imq_analytic.h places the spike in each of the scale^2 = 4 tiles in turn on 8x12, 9x12, 8x13 and 9x13 ROIs (a 2x2 grid of 4x6 tiles in all four) and asserts 20*36/24/4 = 7.5 for every placement, and 4x that with a spike in every tile. Exact band: integer arithmetic, exact in double. Both side parities are needed: a y < height-M loop bound stops after the first tile on an even side but reaches the second on an odd one. Which pixels belong to no tile, and the soft-NaN an ROI no tile fits returns, are Nyxus conventions pinned as mechanics in test_imq_mechanics.h, not vetted. See matrix/imq.md.",TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_EACH_TILE_ANALYTIC;TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_ALL_TILES_ANALYTIC, diff --git a/tests/vetting/report_output.csv b/tests/vetting/report_output.csv index 0b1d479a2..3993c1fb3 100644 --- a/tests/vetting/report_output.csv +++ b/tests/vetting/report_output.csv @@ -264,9 +264,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glcm,GLCM_SUMENTROPY_AVE,vetted,ibsi,glcm.ibsi_identity,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_entropy_ave_ibsi,test_2d_glcm_sum_entropy_ave_regression,,3,1,"log-based: Nyxus sums through fast_log10 with an EPSILON guard, so it lands 1e-3..3e-3 from both tools instead of on them; asserted at rel=5e-3 | angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." 2D,glcm,GLCM_SUMVARIANCE_AVE,vetted,ibsi,glcm.ibsi_identity,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_variance_ave_ibsi,test_2d_glcm_sum_variance_ave_regression,,3,1,"angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." 2D,glrlm,GLRLM_SRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_SRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_LRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_GLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ibsi,test_2d_glrlm_gln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_GLNN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glnn_ibsi,test_2d_glrlm_glnn_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rln_ibsi,test_2d_glrlm_rln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" @@ -276,23 +276,25 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glrlm,GLRLM_RV,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rv_ibsi,test_2d_glrlm_rv_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_re_ibsi,test_2d_glrlm_re_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_LGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_lglre_ibsi,test_2d_glrlm_lglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_HGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_HGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_HGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." -2D,glrlm,GLRLM_SRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." -2D,glrlm,GLRLM_LRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." +2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." +2D,glrlm,GLRLM_SRE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." +2D,glrlm,GLRLM_LRE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_GLN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ave_ibsi,test_2d_glrlm_gln_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_GLNN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glnn_ave_ibsi,test_2d_glrlm_glnn_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_GLNN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_RLN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rln_ave_ibsi,test_2d_glrlm_rln_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_RLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." @@ -303,10 +305,14 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glrlm,GLRLM_RE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_re_ave_ibsi,test_2d_glrlm_re_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_RE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=5e-3; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to 1.1e-3, the fast_log10 + EPSILON accuracy choice this family's only logarithmic sum carries. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_LGLRE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lglre_ave_ibsi,test_2d_glrlm_lglre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted." 2D,glrlm,GLRLM_HGLRE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ave_ibsi,test_2d_glrlm_hglre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_HGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRLGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_srlgle_ave_ibsi,test_2d_glrlm_srlgle_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRHGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_srhgle_ave_ibsi,test_2d_glrlm_srhgle_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRLGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lrlgle_ave_ibsi,test_2d_glrlm_lrlgle_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRHGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lrhgle_ave_ibsi,test_2d_glrlm_lrhgle_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_SRLGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ave_ibsi,test_2d_glrlm_srlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_SRLGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ave_ibsi,test_2d_glrlm_srlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRHGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ave_ibsi,test_2d_glrlm_srhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_SRHGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ave_ibsi,test_2d_glrlm_srhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRLGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ave_ibsi,test_2d_glrlm_lrlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_LRLGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ave_ibsi,test_2d_glrlm_lrlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRHGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ave_ibsi,test_2d_glrlm_lrhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." +2D,glrlm,GLRLM_LRHGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ave_ibsi,test_2d_glrlm_lrhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,gldzm,GLDZM_SDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_SDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_SDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_sde_ibsi;test_2d_gldzm_sde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_sde_ibsi;test_2d_gldzm_sde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_LDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_LDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_lde_ibsi;test_2d_gldzm_lde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_lde_ibsi;test_2d_gldzm_lde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_LGLZE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_LGLZE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LGLZE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_lglze_ibsi;test_2d_gldzm_lglze_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_lglze_ibsi;test_2d_gldzm_lglze_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" @@ -326,9 +332,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,gldzm,GLDZM_ZDV,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,,,audit,mirp,test_2d_gldzm_zdv_mirp,,,1,0,vetted by mirp only; the IBSI file never held a published value for it,test_2d_gldzm_zdv_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_ZDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,glszm,GLSZM_SAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" -2D,glszm,GLSZM_SAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic." +2D,glszm,GLSZM_SAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glszm,GLSZM_LAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" -2D,glszm,GLSZM_LAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic." +2D,glszm,GLSZM_LAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glszm,GLSZM_GLN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,test_2d_glszm_gln_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_GLNN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,test_2d_glszm_glnn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_SZN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,test_2d_glszm_szn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" @@ -391,7 +397,7 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,gabor,GABOR,vetted,skimage,gabor.python_raw_defaults,rel=1e-3,agreed,bench_dsb2018_2d,TEST_NYXUS.TEST_2D_GABOR_PYTHON_RAW_DEFAULTS_SKIMAGE,,,in-tree,skimage,test_2d_gabor_cpp_static_defaults_skimage;test_2d_gabor_python_raw_defaults_skimage,,test_2d_gabor_gpu_runs_mechanics,2,0,"two config points, both oracle-asserted on bench_dsb2018_2d. skimage supplies the KERNEL; the f0=0 member and the WND-CHARM count-ratio SCORE are analytic (skimage has no native equivalent of the score, and gabor_kernel cannot express frequency 0). No regression file exists: every pinned value carries an oracle claim. The GPU path carries no oracle claim and is guarded size-only by the mechanics case",test_2d_gabor_python_raw_defaults_skimage,agree,row+config,audit/gabor_2d_skimage_vetting_report.md,audit/gabor_2d_golden_regen.md,matrix/gabor.md,"Vetted vs scikit-image 0.26.0 at the default lists gabor_freqs=[4,16,32,64], gabor_thetas=[0,45,90,135] deg as GaborOptions::parse_input builds them (f0={4,16,32,64}, theta={0,pi/4,pi/2,3pi/4} rad) - the config the Python API always runs and a CLI run that passes both flags. All 16 pins reproduced exactly by gen_gabor_skimage.py (max |diff| 0.000e+00). This config point was added 2026-08 because the family's only vetted row covered gabor.cpp_static_defaults, a different frequency and angle set whose values differ from this one by up to 0.84 absolute on the same ROI - so no in-tree assertion covered what users compute. UNITS: the recipe is named 'python_raw' because parse_input converts the angles (deg->rad) and passes the frequencies through untouched, while nyxus.py and the CLI help both document gabor_freqs as denominators of pi and nothing in the tree divides by pi; the assertion covers the numbers that reach the filter, not the documented units contract, which is an unresolved source question (vetting report section 8 item 4). SCOPE of oracle=skimage (SPEC 4 allows one token per row; the claim is narrower than the token): skimage supplies the KERNEL at the non-degenerate (f0,theta) points - gabor_kernel(frequency=f0/2pi, sigma_x=sig2lam*2pi/f0, sigma_y=sigma_x/gamma, offset=0) cropped to the Nyxus 16x16 grid - while the count-ratio SCORE is Nyxus' own WND-CHARM definition reproduced in the generator, because skimage has no native equivalent to compare the whole feature against. A full-feature oracle would be wndcharm; not built in this tree, recorded in not_covered.md. SCOPE 2: the GPU path is NOT vetted - calculate_gpu (FFT convolution) diverges from the direct-convolution CPU path on these ROIs; the assertion covers the in-RAM CPU path only, and the GPU path's plumbing guard is TEST_NYXUS.TEST_2D_GABOR_GPU_RUNS_MECHANICS. SCOPE 3: the 16x16 kernel crop is part of the recipe rather than a detail - at gamma=0.1 only 7.9-47.6 percent of the kernel's L1 mass falls inside that window at the low frequencies, and scoring off skimage's own filtering (skimage.filters.gabor, untruncated support, zero-padded border) moves values by up to 1.005; generator part D2 re-runs that control. See audit/gabor_2d_skimage_vetting_report.md." 2D,radial,MEAN_FRAC,regression,,radial.shape2d_native,rel=1e-9,disagreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,convention-mismatch,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",in-tree,,,test_2d_radial_bin_conventions_regression;test_2d_radial_distribution_regression,test_2d_radial_bin_index_mechanics;test_2d_radial_empty_bins_are_zero_invariant,0,2,"8-bin vector, every bin asserted separately. Not CellProfiler-vettable: CP's MeanFrac is dimensionless (bin mean over ROI mean, ~1), Nyxus returns the raw bin mean intensity.",test_2d_radial_bin_conventions_regression;test_2d_radial_distribution_regression;test_2d_radial_empty_bins_are_zero_invariant,agree,row,audit/radial_2d_cellprofiler_vetting_report.md,audit/radial_2d_golden_regen.md,matrix/radial.md,"Not CellProfiler-vettable: CP's MeanFrac is normalised by the ROI mean intensity and lands near 1, Nyxus' is the bin's raw mean intensity. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the raw-bin-mean convention (intensity range, and the reconstruction of the ROI total together with FRAC_AT_D) is characterized by TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION, not asserted as an invariant, because CellProfiler's normalised MeanFrac satisfies neither. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1." 2D,radial,RADIAL_CV,regression,,radial.shape2d_native,rel=1e-9,disagreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_CV_IS_WITHIN_ITS_BOUND_INVARIANT;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,convention-mismatch,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",in-tree,,,test_2d_radial_distribution_regression,test_2d_radial_bin_index_mechanics;test_2d_radial_cv_is_within_its_bound_invariant;test_2d_radial_empty_bins_are_zero_invariant,0,1,"8-bin vector, every bin asserted separately. Not CellProfiler-vettable: CP takes the CV of the eight wedge MEANS over the NON-EMPTY wedges, Nyxus the CV of the eight wedge SUMS over all eight.",test_2d_radial_cv_is_within_its_bound_invariant;test_2d_radial_distribution_regression;test_2d_radial_empty_bins_are_zero_invariant,agree,row,audit/radial_2d_cellprofiler_vetting_report.md,audit/radial_2d_golden_regen.md,matrix/radial.md,"Not CellProfiler-vettable: CP takes the CV of the 8 wedge means over the non-empty wedges, Nyxus the CV of the 8 wedge sums over all 8. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the sqrt(num_bins-1) bound and the empty-bin zero hold under either wedge convention and are asserted by the two invariants named in test_name. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1." -2D,zernike,ZERNIKE2D,vetted,analytic,zernike.shape2d_native,rel=1e-12,agreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",in-tree,analytic,test_2d_zernike_moments_analytic,test_2d_zernike_moments_regression,test_2d_zernike_every_pixel_is_inside_the_unit_disk_mechanics;test_2d_zernike_first_moment_about_the_centroid_vanishes_invariant;test_2d_zernike_geometry_mechanics;test_2d_zernike_index_set_matches_the_declared_count_invariant;test_2d_zernike_magnitudes_are_within_their_bound_invariant;test_2d_zernike_zeroth_moment_is_one_over_pi_invariant,1,1,"30 magnitudes, one per (n,m) with n<=9 and n-m even; every entry asserted separately. Vetted against the closed form (factorial series for R_nm) at ZernikeFeature's own geometry, which tests the Singh & Walia recurrence rather than restating it; centrosome's polynomials corroborate to 4.9e-15. NOT comparable to CellProfiler's Zernikes -- different disk and normalisation.",test_2d_zernike_moments_analytic,agree,row,audit/zernike_2d_analytic_vetting_report.md,audit/zernike_2d_golden_regen.md,,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count)." +2D,zernike,ZERNIKE2D,vetted,analytic,zernike.shape2d_native,rel=1e-12,agreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",in-tree,analytic,test_2d_zernike_moments_analytic,test_2d_zernike_moments_regression,test_2d_zernike_every_pixel_is_inside_the_unit_disk_mechanics;test_2d_zernike_first_moment_about_the_centroid_vanishes_invariant;test_2d_zernike_geometry_mechanics;test_2d_zernike_index_set_matches_the_declared_count_invariant;test_2d_zernike_magnitudes_are_within_their_bound_invariant;test_2d_zernike_zeroth_moment_is_one_over_pi_invariant,1,1,"30 magnitudes, one per (n,m) with n<=9 and n-m even; every entry asserted separately. Vetted against the closed form (factorial series for R_nm) at ZernikeFeature's own geometry, which tests the Singh & Walia recurrence rather than restating it; centrosome's polynomials corroborate to 4.9e-15. NOT comparable to CellProfiler's Zernikes -- different disk and normalisation.",test_2d_zernike_moments_analytic,agree,row,audit/zernike_2d_analytic_vetting_report.md,audit/zernike_2d_golden_regen.md,,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count). The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,moments,SPAT_MOMENT_00,vetted,skimage,moments.skimage_regionprops,rel=1e-6,agreed,,,,,in-tree,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,,,2,0,,,agree,feature,audit/moments_2d_skimage_vetting_report.md,audit/moments_2d_golden_regen.md,,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." 2D,moments,SPAT_MOMENT_01,vetted,skimage,moments.skimage_regionprops,rel=1e-6,agreed,,,,,in-tree,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,,,2,0,,,agree,feature,audit/moments_2d_skimage_vetting_report.md,audit/moments_2d_golden_regen.md,,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." 2D,moments,SPAT_MOMENT_02,vetted,skimage,moments.skimage_regionprops,rel=1e-6,agreed,,,,,in-tree,skimage,test_2d_moments_shape_skimage,,,1,0,,,agree,feature,audit/moments_2d_skimage_vetting_report.md,audit/moments_2d_golden_regen.md,,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." @@ -690,8 +696,8 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,morphology,3LEAST_AXIS_LEN,vetted,pyradiomics,morphology3d.pyradiomics_anisotropic,rel=1e-9,agreed,,TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_LEAST_AXIS_LEN_PYRADIOMICS,,,in-tree,mirp;pyradiomics,test_3d_morphology_aniso_least_axis_len_pyradiomics;test_3d_morphology_least_axis_len_mirp,,,2,0,"was >3MAJOR_AXIS_LEN before the eigenvalue-order fix, structurally impossible",test_3d_morphology_aniso_least_axis_len_pyradiomics,agree,row,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"PyRadiomics 3.0.1 LeastAxisLength=83.765297555890839 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py. pyradiomics normalizes the covariance by N, Nyxus by N-1, so Nyxus is asserted against the pin times sqrt(N/(N-1)), N=274432 (Nyxus normalization, not a tolerance), at rel=1e-9." 3D,morphology,3ELONGATION,vetted,pyradiomics,morphology3d.pyradiomics_anisotropic,rel=1e-9,agreed,,TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_ELONGATION_PYRADIOMICS,,,in-tree,mirp;pyradiomics,test_3d_morphology_aniso_elongation_pyradiomics;test_3d_morphology_elongation_mirp,,,2,0,,test_3d_morphology_aniso_elongation_pyradiomics,agree,row,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"PyRadiomics 3.0.1 Elongation=0.64206222930112822 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9." 3D,morphology,3FLATNESS,vetted,pyradiomics,morphology3d.pyradiomics_anisotropic,rel=1e-9,agreed,,TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_FLATNESS_PYRADIOMICS,,,in-tree,mirp;pyradiomics,test_3d_morphology_aniso_flatness_pyradiomics;test_3d_morphology_flatness_mirp,,,2,0,"was >1 before the eigenvalue-order fix, which is structurally impossible",test_3d_morphology_aniso_flatness_pyradiomics,agree,row,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"PyRadiomics 3.0.1 Flatness=0.46852288961977678 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9." -3D,morphology,3MESH_VOLUME,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;mirp;pyradiomics,test_3d_morphology_aniso_mesh_volume_pyradiomics;test_3d_morphology_mesh_volume_mirp;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_zero_intensity_hull_analytic,,,4,0,"IBSI volume (mesh) = MIRP morph_volume 274338.3438, pinned at rel=1e-6; also pinned against closed-form solids in the analytic file. MATLAB regionprops3 carries no mesh volume, so it holds no row for this feature",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation." -3D,morphology,3VOLUME_CONVEXHULL,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;matlab;mirp,test_3d_morphology_lattice_hull_volume_analytic;test_3d_morphology_planar_hull_volume_analytic;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_volume_convex_hull_matlab;test_3d_morphology_volume_convex_hull_mirp;test_3d_morphology_zero_intensity_hull_analytic,test_3d_morphology_volume_convex_hull_regression,,6,1,"hull of the mesh vertices = MIRP's hull 496958.3201, pinned at rel=1e-6; MATLAB regionprops3 ConvexVolume 497824 counts the rasterised hull, asserted at 0.174% in a 0.5% band; also pinned at rel=1e-12 against boxes, octahedra and rhombic prisms in the analytic file",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation." +3D,morphology,3MESH_VOLUME,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;mirp;pyradiomics,test_3d_morphology_aniso_mesh_volume_pyradiomics;test_3d_morphology_mesh_volume_mirp;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_zero_intensity_hull_analytic,,,4,0,"IBSI volume (mesh) = MIRP morph_volume 274338.3438, pinned at rel=1e-6; also pinned against closed-form solids in the analytic file. MATLAB regionprops3 carries no mesh volume, so it holds no row for this feature",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,morphology,3VOLUME_CONVEXHULL,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;matlab;mirp,test_3d_morphology_lattice_hull_volume_analytic;test_3d_morphology_planar_hull_volume_analytic;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_volume_convex_hull_matlab;test_3d_morphology_volume_convex_hull_mirp;test_3d_morphology_zero_intensity_hull_analytic,test_3d_morphology_volume_convex_hull_regression,,6,1,"hull of the mesh vertices = MIRP's hull 496958.3201, pinned at rel=1e-6; MATLAB regionprops3 ConvexVolume 497824 counts the rasterised hull, asserted at 0.174% in a 0.5% band; also pinned at rel=1e-12 against boxes, octahedra and rhombic prisms in the analytic file",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glcm,3GLCM_ACOR,vetted,pyradiomics,glcm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glcm_acor_ave_pyradiomics;test_3d_glcm_acor_pyradiomics,test_3d_glcm_acor_regression,,2,1,,,agree,feature,audit/glcm_3d_pyradiomics_vetting_report.md,audit/glcm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only)." 3D,glcm,3GLCM_ASM,vetted,pyradiomics,glcm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glcm_asm_ave_pyradiomics;test_3d_glcm_asm_pyradiomics;test_3d_glcm_ave_equivalence_pyradiomics;test_3d_glcm_equivalence_dump_pyradiomics,test_3d_glcm_asm_regression,,4,1,,,agree,feature,audit/glcm_3d_pyradiomics_vetting_report.md,audit/glcm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only)." 3D,glcm,3GLCM_CLUPROM,vetted,pyradiomics,glcm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glcm_cluprom_ave_pyradiomics;test_3d_glcm_cluprom_pyradiomics,test_3d_glcm_cluprom_regression,,2,1,,,agree,feature,audit/glcm_3d_pyradiomics_vetting_report.md,audit/glcm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only)." @@ -976,9 +982,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_LAHGLE_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lahgle_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." 3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_SAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic." +3D,glszm,3GLSZM_SAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_LAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic." +3D,glszm,3GLSZM_LAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glszm,3GLSZM_GLN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_gln_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_gln_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_GLNN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_glnn_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_glnn_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_SZN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_szn_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_szn_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." @@ -994,9 +1000,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_LALGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lalgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lalgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glrlm,3GLRLM_SRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_GLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_gln_pyradiomics,test_3d_glrlm_gln_grey64_regression;test_3d_glrlm_gln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_GLNN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_glnn_pyradiomics,test_3d_glrlm_glnn_grey64_regression;test_3d_glrlm_glnn_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rln_pyradiomics,test_3d_glrlm_rln_grey64_regression;test_3d_glrlm_rln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." @@ -1006,23 +1012,25 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_RV,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rv_pyradiomics,test_3d_glrlm_rv_grey64_regression;test_3d_glrlm_rv_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=2e-3,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_re_pyradiomics,test_3d_glrlm_re_grey64_regression;test_3d_glrlm_re_regression,,2,2,"the family's only sum over logarithms; fast_log10 puts it 3.9e-4 from PyRadiomics, so it is asserted at rel=5e-3 where the rest are at rel=1e-9",,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual 6.2e-4 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference." 3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." +3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic." -3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic." -3D,glrlm,3GLRLM_SRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_LRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_SRE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_LRE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_GLN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_gln_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_GLNN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_glnn_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_RLN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_rln_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." @@ -1033,10 +1041,14 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_RE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=2e-3,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_re_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,"same mirp mislabel as 3GLRLM_RP_AVE, and the same log tolerance as 3GLRLM_RE | also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression)",,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual 6.2e-4. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle. 3GLRLM_RE is the family's only sum over logarithms and Nyxus evaluates it through fast_log10 (helpers.h), a float-precision log2 approximation, against PyRadiomics' double numpy.log2 - that is the band, not a definitional difference." 3D,glrlm,3GLRLM_LGLRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lglre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_HGLRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_hglre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_SRLGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_srlgle_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_SRHGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_srhgle_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_LRLGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lrlgle_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_LRHGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lrhgle_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_SRLGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_SRLGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRHGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_SRHGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRLGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_LRLGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRHGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." +3D,glrlm,3GLRLM_LRHGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." IMQ,imq,FOCUS_SCORE,vetted,opencv,imq.laplacian_ksize1_zeropad,abs=1e-9,agreed,bench_imq_quality_roi,TEST_NYXUS.TEST_IMQ_FOCUS_SCORE_OPENCV,,,audit,opencv,test_imq_focus_score_opencv,,test_imq_focus_score_out_of_core_invariant;test_imq_local_focus_score_thin_roi_mechanics,1,0,,test_imq_focus_score_opencv,agree,row,audit/imq_opencv_vetting_report.md,audit/imq_golden_regen.md,matrix/imq.md,"vetted vs OpenCV cv2.Laplacian(roi, CV_64F, ksize=1, BORDER_CONSTANT).var() = 34.956597222222221 (cv2 4.13.0, gen_imq_opencv.py), the Pech-Pacheco et al. (2000) variance-of-the-Laplacian focus measure. The generator asserts cv2's filtered image equals Nyxus' laplacian() cell for cell before comparing any scalar, so the convolution is proved and only the variance step is under test; Nyxus reproduces the scalar to 7.1e-15 absolute (2.0e-16 relative), which is summation order alone. Band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. SCOPE: ksize=1, the only kernel calculate() selects. laplacian()'s ksize>1 kernel is cv2.Laplacian's ksize=3 aperture exactly: both stencils are pinned from cv2's unit-spike response in test_imq_opencv.h (TEST_IMQ_FOCUS_SCORE_KERNEL_PER_CALL_OPENCV) and the generator asserts the ksize=3 filtered fixture equal to cv2's cell for cell. The out-of-core path shares the in-RAM scoring code and is held bit-equal to it by test_imq_invariant.h (an invariant, not vetting). Report: audit/imq_opencv_vetting_report.md; matrix/imq.md." IMQ,imq,LOCAL_FOCUS_SCORE,vetted,opencv,imq.laplacian_ksize1_zeropad,abs=1e-9,agreed,bench_imq_quality_roi,TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_OPENCV,,,audit,analytic;opencv,test_imq_local_focus_score_all_tiles_analytic;test_imq_local_focus_score_each_tile_analytic;test_imq_local_focus_score_opencv,,test_imq_focus_score_out_of_core_invariant;test_imq_local_focus_score_remainder_mechanics;test_imq_local_focus_score_smallest_tiled_roi_mechanics;test_imq_local_focus_score_thin_roi_mechanics,3,0,"opencv covers each tile's Laplacian variance and their mean; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row. See not_covered.md section E",test_imq_local_focus_score_opencv,agree,row,audit/imq_opencv_vetting_report.md,audit/imq_golden_regen.md,matrix/imq.md,"vetted vs OpenCV: the mean of cv2.Laplacian(tile, CV_64F, ksize=1, BORDER_CONSTANT).var() over the 2x2 grid of 4x6 tiles get_local_focus_score() cuts the 8x12 fixture into at scale=2 = 28.341145833333336 (cv2 4.13.0, gen_imq_opencv.py, which asserts the tile count and prints each tile's score). Nyxus reproduces it to 7.1e-15 absolute (2.5e-16 relative); band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. Negative control: the one-tile value a truncated y < height-M loop bound gives, 7.5763888888888902, is asserted to sit 73% away, so the pin tells the full tiling from the truncated one. Report: audit/imq_opencv_vetting_report.md; matrix/imq.md. ORACLE SPLIT (not_covered.md section E): OpenCV supplies each tile's Laplacian and population variance; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row." IMQ,imq,LOCAL_FOCUS_SCORE,vetted,analytic,imq.local_focus_single_spike,abs=0,agreed,,TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_EACH_TILE_ANALYTIC;TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_ALL_TILES_ANALYTIC,,,in-tree,analytic;opencv,test_imq_local_focus_score_all_tiles_analytic;test_imq_local_focus_score_each_tile_analytic;test_imq_local_focus_score_opencv,,test_imq_focus_score_out_of_core_invariant;test_imq_local_focus_score_remainder_mechanics;test_imq_local_focus_score_smallest_tiled_roi_mechanics;test_imq_local_focus_score_thin_roi_mechanics,3,0,"opencv covers each tile's Laplacian variance and their mean; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row. See not_covered.md section E",test_imq_local_focus_score_all_tiles_analytic;test_imq_local_focus_score_each_tile_analytic,agree,row,audit/imq_opencv_vetting_report.md,audit/imq_golden_regen.md,matrix/imq.md,"vetted against a closed form, no generator: a single spike of height v clear of the tile edge has a ksize=1 Laplacian of -4v at the spike and +v at its four neighbours, so its tile scores exactly 20v^2/P and every all-zero tile scores 0. test_imq_analytic.h places the spike in each of the scale^2 = 4 tiles in turn on 8x12, 9x12, 8x13 and 9x13 ROIs (a 2x2 grid of 4x6 tiles in all four) and asserts 20*36/24/4 = 7.5 for every placement, and 4x that with a spike in every tile. Exact band: integer arithmetic, exact in double. Both side parities are needed: a y < height-M loop bound stops after the first tile on an even side but reaches the second on an odd one. Which pixels belong to no tile, and the soft-NaN an ROI no tile fits returns, are Nyxus conventions pinned as mechanics in test_imq_mechanics.h, not vetted. See matrix/imq.md." diff --git a/tests/vetting/report_output.md b/tests/vetting/report_output.md index b466dbf3e..5cd9808ca 100644 --- a/tests/vetting/report_output.md +++ b/tests/vetting/report_output.md @@ -32,11 +32,11 @@ regression: 121 invariant: 0 untested: 0 ## Verdicts -1048 of 1048 assertion rows agree with the tree. +1060 of 1060 assertion rows agree with the tree. | verdict | rows | meaning | |---|---:|---| -| `agree` | 1048 | the claim and the tree say the same thing | +| `agree` | 1060 | the claim and the tree say the same thing | ### How far each verdict reaches @@ -46,7 +46,7 @@ regression: 121 invariant: 0 untested: 0 | scope | rows | what was compared | |---|---:|---| | `feature` | 533 | `test_name` is empty, so the tree was read for the feature and not for this row's own assertion | -| `row` | 306 | the case named in `test_name` asserts this feature, at this row's kind; its configuration is unchecked, the family declaring no recipe reader | +| `row` | 318 | the case named in `test_name` asserts this feature, at this row's kind; its configuration is unchecked, the family declaring no recipe reader | | `row+config` | 209 | the case named in `test_name` asserts this feature at this `config_recipe` | ## Every oracle a feature was matched against @@ -62,7 +62,7 @@ that alone understates every family that corroborates. | 2D | glcm | . | . | . | 55 | . | . | 59 | . | 59 | . | . | | 2D | gldm | . | . | . | 14 | . | . | . | . | 14 | . | . | | 2D | gldzm | . | . | . | 14 | . | . | 16 | . | . | . | 2 | -| 2D | glrlm | 8 | . | . | 32 | . | . | 32 | . | 32 | . | . | +| 2D | glrlm | 14 | . | . | 32 | . | . | 32 | . | 32 | . | . | | 2D | glszm | 2 | . | . | 16 | . | . | 16 | . | . | . | . | | 2D | intensity_histogram | 26 | . | . | 16 | . | . | 23 | . | . | . | 4 | | 2D | moments | . | . | . | . | . | . | . | . | . | 118 | 62 | @@ -76,13 +76,13 @@ that alone understates every family that corroborates. | 3D | glcm | . | . | . | . | . | . | . | . | 59 | . | . | | 3D | gldm | . | . | . | . | . | . | . | . | 14 | . | . | | 3D | gldzm | . | . | . | . | . | . | 16 | . | . | . | 2 | -| 3D | glrlm | 8 | . | . | . | . | . | . | . | 32 | . | . | +| 3D | glrlm | 14 | . | . | . | . | . | . | . | 32 | . | . | | 3D | glszm | 2 | . | . | . | . | . | . | . | 16 | . | . | | 3D | morphology | 2 | . | . | . | . | 2 | 8 | . | 6 | . | 6 | | 3D | ngldm | . | . | . | . | . | . | 16 | . | . | . | 3 | | 3D | ngtdm | . | . | . | . | . | . | . | . | 5 | . | . | | IMQ | imq | 1 | 2 | . | . | . | . | . | 2 | . | . | 2 | -| | **all** | **61** | **9** | **2** | **181** | **20** | **95** | **208** | **2** | **272** | **127** | **121** | +| | **all** | **73** | **9** | **2** | **181** | **20** | **95** | **208** | **2** | **272** | **127** | **121** | ## By dimensionality From dac2ce928fcb093d573e4d2a74c1660eb5aab3a4 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Thu, 15 Oct 2026 06:59:41 -0700 Subject: [PATCH 10/12] test(vetting): describe 3D HGLRE by what it does, not a quoted line The 3D high-grey-pair recipe, its benchmarks.md entry and the 3GLRLM_HGLRE analytic row say that HGLRE converts the level to double before squaring it in every version of the code, rather than quoting an expression. test_3d_glrlm_pyradiomics.h includes only what test_3d_glrlm_common.h does not already bring in. --- tests/test_3d_glrlm_pyradiomics.h | 4 +--- tests/vetting/benchmarks.md | 2 +- tests/vetting/config_recipes.md | 6 +++--- tests/vetting/oracle_coverage.csv | 2 +- tests/vetting/report_output.csv | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/tests/test_3d_glrlm_pyradiomics.h b/tests/test_3d_glrlm_pyradiomics.h index 52a3904aa..3eadb1f8b 100644 --- a/tests/test_3d_glrlm_pyradiomics.h +++ b/tests/test_3d_glrlm_pyradiomics.h @@ -1,13 +1,11 @@ #pragma once -#include +// gtest, fs and the roi_cache graph arrive with test_3d_glrlm_common.h. #include #include #include "../src/nyx/environment.h" #include "../src/nyx/featureset.h" -#include "../src/nyx/roi_cache.h" #include "../src/nyx/features/3d_glrlm.h" -#include "../src/nyx/helpers/fsystem.h" #include "test_ref_vals.h" // ref_vals_map, and the / it already includes #include "test_3d_glrlm_common.h" // make_glrlm3d_settings diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index 329864a6c..c4e14bde5 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -360,7 +360,7 @@ Tests reaching it today: `test_3d_glrlm_analytic.h`. | Data | built inline in `test_3d_glrlm_high_grey_level_emphasis_analytic()` (`tests/test_3d_glrlm_analytic.h`) | | ROI | two adjacent voxels at intensities 1 and `G = 70,000` | | Shape | two runs of length 1 in every one of the 13 directions | -| Why it exists | the six grey-level emphases in all 13 directions, with `G^2` past `UINT_MAX`; `3GLRLM_HGLRE` multiplies the level as `double(inten) * double(inten)`, so for it the fixture pins the value without telling a 32-bit square from a double one | +| Why it exists | the six grey-level emphases in all 13 directions, with `G^2` past `UINT_MAX`; `3GLRLM_HGLRE` converts the level to double before squaring it in every version of the code, so for it the fixture pins the value without telling a 32-bit square from a double one | Recipes: `glrlm3d.analytic_high_grey_pair`. diff --git a/tests/vetting/config_recipes.md b/tests/vetting/config_recipes.md index 573fdfd96..5ac95c2c7 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -763,9 +763,9 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `glrlm3d.analytic_two_long_runs`. Oracle: `analytic`. Used by `test_3d_glrlm_analytic.h`, for the six grey-level emphases, in all 13 directions. - **What it is for.** Every direction sees two runs of length 1. `G^2 = 4.9e9` is past `UINT_MAX`, so - the values are right only if the grey level is squared in double. `3GLRLM_HGLRE` multiplies the level - as `double(inten) * double(inten)`, so for it the fixture pins the value without telling a 32-bit - square from a double one. + the values are right only if the grey level is squared in double. `3GLRLM_HGLRE` converts the level to double + before squaring it in every version of the code, so for it the fixture pins the value without telling + a 32-bit square from a double one. - The band is `rel=1e-12`, because `HGLRE` is 2.45e9 and an absolute 1e-9 is below its last bit. ## ngldm3d.regression_ut_phantom diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index d0d787dbb..a4b37b21f 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -1014,7 +1014,7 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_LGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_LGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair +3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE converts the level to double before squaring it in every version of the code, so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair diff --git a/tests/vetting/report_output.csv b/tests/vetting/report_output.csv index 3993c1fb3..9e9896a9c 100644 --- a/tests/vetting/report_output.csv +++ b/tests/vetting/report_output.csv @@ -1014,7 +1014,7 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_LGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_LGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_lglre_pyradiomics,test_3d_glrlm_lglre_grey64_regression;test_3d_glrlm_lglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LGLRE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE multiplies the level as double(inten) * double(inten), so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE converts the level to double before squaring it in every version of the code, so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." From 146d1a1093f3d8bd07cf1db2a9b12925aa060a71 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Thu, 15 Oct 2026 09:01:54 -0700 Subject: [PATCH 11/12] test(texture): name each 3D GLRLM fixture include where it comes from test_3d_glrlm_common.h includes feature_settings.h for Fsettings and NyxSetting rather than reaching them through test_main_nyxus.h, the PyRadiomics recipe's step comments run in order, and the GPU GLSZM comment says the zone size is squared in floating point. --- src/nyx/gpu/glszm.cu | 2 +- tests/test_3d_glrlm_common.h | 3 ++- tests/test_3d_glrlm_pyradiomics.h | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/nyx/gpu/glszm.cu b/src/nyx/gpu/glszm.cu index da3e7c2c7..998bcda74 100644 --- a/src/nyx/gpu/glszm.cu +++ b/src/nyx/gpu/glszm.cu @@ -117,7 +117,7 @@ namespace NyxusGpu return; float s = SJ[j]; - // Zone sizes are squared in float, the accumulators' type: j^2 passes INT_MAX at a zone of 46,341. + // Zone sizes are squared in floating point: j^2 passes INT_MAX at a zone of 46,341. atomicAdd(&state[f_SAE], s / (float(j) * float(j))); atomicAdd(&state[f_LAE], s * (float(j) * float(j))); atomicAdd(&state[f_SZN], s * s); diff --git a/tests/test_3d_glrlm_common.h b/tests/test_3d_glrlm_common.h index 55d7ca7e7..f8c41cb24 100644 --- a/tests/test_3d_glrlm_common.h +++ b/tests/test_3d_glrlm_common.h @@ -2,7 +2,8 @@ // Shared fixture for the 3D GLRLM tests: the settings a 3D GLRLM assertion runs on. -#include "test_main_nyxus.h" // Fsettings, NyxSetting and run_3d_feature_on_volume, with the roi_cache graph +#include "../src/nyx/feature_settings.h" // Fsettings, NyxSetting +#include "test_main_nyxus.h" // run_3d_feature_on_volume, with the roi_cache graph // D3_GLRLM_feature::calculate() reads SOFTNAN, IBSI and GLRLM_GREYDEPTH; 'grey_depth' is inert for // this family and passed only so a caller can state the profile it reproduces. 'glrlm_grey_depth' diff --git a/tests/test_3d_glrlm_pyradiomics.h b/tests/test_3d_glrlm_pyradiomics.h index 3eadb1f8b..4077f1b71 100644 --- a/tests/test_3d_glrlm_pyradiomics.h +++ b/tests/test_3d_glrlm_pyradiomics.h @@ -442,7 +442,7 @@ void assert_3d_glrlm_feature_pyradiomics(const Nyxus::Feature3D& expecting_fcode // binCount-based grey binning Fsettings s = make_glrlm3d_settings (100, -20); - // (5) feature extraction + // (4) feature extraction // make it find the feature code by name int fcode = -1; @@ -456,11 +456,11 @@ void assert_3d_glrlm_feature_pyradiomics(const Nyxus::Feature3D& expecting_fcode D3_GLRLM_feature f; ASSERT_NO_THROW(f.calculate(r, s)); - // (6) get values + // (5) get values f.save_value(r.fvals); - // (7) verdict, one direction at a time + // (6) verdict, one direction at a time // // The base feature holds one value per 3D angle, so each angle is compared against its own // PyRadiomics value. Averaging here instead -- which is what this assertion used to do -- lets From a93c8dc43d5bb78a0984d278c7b22435e886bcea Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Fri, 16 Oct 2026 10:20:15 -0700 Subject: [PATCH 12/12] test(texture): size the overflow fixtures so the old squares wrap to zero The 2D GLSZM and the 2D and 3D GLRLM long-run fixtures used zones and runs of 46,656. Its square is past INT_MAX but not past UINT_MAX, and a compiler that reads the overflowed signed product as unsigned gets it exactly, so some assertions passed without the fix. They now use 65,536, whose square 2^32 wraps to 0 in 32 bits however the product is read: the 2D GLSZM ROI is a 256x512 rectangle, the GLRLM lines are 131,072 long. With src/ at the base commit every one of the six analytic tests fails, all 12 long-run features included. A compiler may still compute a signed square exactly by widening the loop index to 64 bits, which clang 22 on x86-64 does at any size; UBSan reports the overflow there. - Registry: the GLSZM/GLRLM tolerance sentence is removed from the ZERNIKE2D analytic row and the two morphology3d.analytic_lattice_solids rows, which it does not describe. The zone and run rows, recipes, benchmarks and the GLSZM matrix describe the 65,536 fixtures. report_output.* regenerated. - Each GLSZM/GLRLM square taken in double carries a comment saying why. - run_3d_gldm_on_volume delegates to run_3d_feature_on_volume, so the 3D families share one runner, and that runner sets the ROI's bounding box for a calculate() that places voxels through it. --- src/nyx/features/3d_glrlm.cpp | 20 +++++----- src/nyx/features/3d_glszm.cpp | 2 +- src/nyx/features/glrlm.cpp | 20 +++++----- src/nyx/features/glszm.cpp | 2 +- tests/test_2d_glrlm_analytic.h | 10 +++-- tests/test_2d_glszm_analytic.h | 12 +++--- tests/test_3d_gldm_common.h | 32 ++-------------- tests/test_3d_glrlm_analytic.h | 11 +++--- tests/test_3d_glszm_analytic.h | 4 +- tests/test_main_nyxus.h | 6 +++ tests/vetting/benchmarks.md | 32 ++++++++-------- tests/vetting/config_recipes.md | 33 ++++++++-------- tests/vetting/matrix/glszm.md | 2 +- tests/vetting/oracle_coverage.csv | 62 +++++++++++++++---------------- tests/vetting/report_output.csv | 62 +++++++++++++++---------------- 15 files changed, 150 insertions(+), 160 deletions(-) diff --git a/src/nyx/features/3d_glrlm.cpp b/src/nyx/features/3d_glrlm.cpp index 99f52e624..e49620a37 100644 --- a/src/nyx/features/3d_glrlm.cpp +++ b/src/nyx/features/3d_glrlm.cpp @@ -367,7 +367,7 @@ double D3_GLRLM_feature::calc_LRE (const SimpleMatrix &P, const double sum_ { for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (double(j) * double(j)); + f += P.matlab(i, j) * (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 } } @@ -604,7 +604,7 @@ double D3_GLRLM_feature::calc_HGLRE (const SimpleMatrix &P, const std::vect double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) * (inten * inten); @@ -627,10 +627,10 @@ double D3_GLRLM_feature::calc_SRLGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) / (inten * inten * (double(j) * double(j))); + f += P.matlab(i, j) / (inten * inten * (double(j) * double(j))); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / sum_p; @@ -650,10 +650,10 @@ double D3_GLRLM_feature::calc_SRHGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (inten * inten) / (double(j) * double(j)); + f += P.matlab(i, j) * (inten * inten) / (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / sum_p; @@ -673,10 +673,10 @@ double D3_GLRLM_feature::calc_LRLGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (double(j) * double(j)) / (inten * inten); + f += P.matlab(i, j) * (double(j) * double(j)) / (inten * inten); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / sum_p; @@ -696,10 +696,10 @@ double D3_GLRLM_feature::calc_LRHGLE (const SimpleMatrix &P, const std::vec double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (inten * inten * (double(j) * double(j))); + f += P.matlab(i, j) * (inten * inten * (double(j) * double(j))); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / sum_p; diff --git a/src/nyx/features/3d_glszm.cpp b/src/nyx/features/3d_glszm.cpp index e8e568660..07377dbc3 100644 --- a/src/nyx/features/3d_glszm.cpp +++ b/src/nyx/features/3d_glszm.cpp @@ -835,7 +835,7 @@ double D3_GLSZM_feature::calc_LAE() // Calculate feature. 'sj' is expected to have been initialized in calc_sums_of_P() double f = 0.0; for (int j = 1; j <= Ns; j++) - f += sj[j] * (double(j) * double(j)); + f += sj[j] * (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 double retval = f / Nz; return retval; } diff --git a/src/nyx/features/glrlm.cpp b/src/nyx/features/glrlm.cpp index b78d03298..5cce29ede 100644 --- a/src/nyx/features/glrlm.cpp +++ b/src/nyx/features/glrlm.cpp @@ -411,7 +411,7 @@ void GLRLMFeature::calc_LRE(AngledFtrs& af) { for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (double(j) * double(j)); + f += P.matlab(i, j) * (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 } } @@ -746,7 +746,7 @@ void GLRLMFeature::calc_HGLRE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { f += P.matlab(i, j) * (inten * inten); @@ -778,10 +778,10 @@ void GLRLMFeature::calc_SRLGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i-1]; + double inten = (double) I[i-1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) / (inten * inten * (double(j) * double(j))); + f += P.matlab(i, j) / (inten * inten * (double(j) * double(j))); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / double(sum_p[ai]); @@ -810,10 +810,10 @@ void GLRLMFeature::calc_SRHGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i-1]; + double inten = (double) I[i-1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (inten * inten) / (double(j) * double(j)); + f += P.matlab(i, j) * (inten * inten) / (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / double(sum_p[ai]); @@ -841,10 +841,10 @@ void GLRLMFeature::calc_LRLGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i-1]; + double inten = (double) I[i-1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (double(j) * double(j)) / (inten * inten); + f += P.matlab(i, j) * (double(j) * double(j)) / (inten * inten); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / double(sum_p[ai]); @@ -873,10 +873,10 @@ void GLRLMFeature::calc_LRHGLE(AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - double inten = (double) I[i - 1]; + double inten = (double) I[i - 1]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * (inten * inten * (double(j) * double(j))); + f += P.matlab(i, j) * (inten * inten * (double(j) * double(j))); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / double(sum_p[ai]); diff --git a/src/nyx/features/glszm.cpp b/src/nyx/features/glszm.cpp index 0c44fca1e..0848faa17 100644 --- a/src/nyx/features/glszm.cpp +++ b/src/nyx/features/glszm.cpp @@ -437,7 +437,7 @@ double GLSZMFeature::calc_LAE() double f = 0.0; for (int j = 1; j <= Ns; j++) { - f += sj[j] * (double(j) * double(j)); + f += sj[j] * (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 } double retval = f / sum_p; return retval; diff --git a/tests/test_2d_glrlm_analytic.h b/tests/test_2d_glrlm_analytic.h index b54ba511b..60398d373 100644 --- a/tests/test_2d_glrlm_analytic.h +++ b/tests/test_2d_glrlm_analytic.h @@ -30,10 +30,12 @@ static void assert_2d_glrlm_closed_form (const LR& roidata, Feature2D fcode, int ASSERT_NEAR (actual, expected, 1e-12 * expected) << "feature " << (int)fcode << " angle " << angle; } -// bench_glrlm_2d_two_long_runs -- one row of 2L pixels, L = 46,656, the left half at intensity 1 and +// bench_glrlm_2d_two_long_runs -- one row of 2L pixels, L = 65,536, the left half at intensity 1 and // the right half at intensity 2. At 0 degrees that is two runs, one of length L at each level, and -// L^2 = 2,176,782,336 is past INT_MAX while 2^2 * L^2 is past UINT_MAX, so every run-length term is -// right here only if it is taken in double. Over the Nr = 2 runs: +// L^2 = 2^32 wraps to exactly 0 in 32 bits whether the product is read signed or unsigned, so every +// run-length term is right here only if it is taken in double. A run between 46,341 and 65,535 also +// overflows an int, but a compiler that reads the overflowed product as unsigned still gets its +// square exactly. Over the Nr = 2 runs: // // SRE = 1/L^2 LRE = L^2 // SRLGLE = (1 + 1/4) / 2 / L^2 SRHGLE = (1 + 4) / 2 / L^2 @@ -44,7 +46,7 @@ static void assert_2d_glrlm_closed_form (const LR& roidata, Feature2D fcode, int // SRHGLE = LRHGLE = (1 + 4) / 2. Each _AVE is the mean of the four directions. void test_2d_glrlm_long_run_emphasis_analytic() { - const size_t L = 46656; + const size_t L = 65536; std::vector intensity; for (size_t x = 0; x < 2 * L; x++) intensity.push_back ({ x, 0, x < L ? 1u : 2u }); diff --git a/tests/test_2d_glszm_analytic.h b/tests/test_2d_glszm_analytic.h index 9001b6d6d..058c4d34f 100644 --- a/tests/test_2d_glszm_analytic.h +++ b/tests/test_2d_glszm_analytic.h @@ -7,9 +7,11 @@ // arrive with the common header. #include "test_2d_glszm_common.h" -// bench_glszm_2d_two_large_zones -- a 216 x 432 rectangle, the top half at intensity 1 and the -// bottom half at intensity 2. Each half is one zone of L = 216 * 216 = 46,656 pixels, and L^2 = -// 2,176,782,336 is past INT_MAX, so a size emphasis is right here only if j^2 is taken in double. +// bench_glszm_2d_two_large_zones -- a 256 x 512 rectangle, the top half at intensity 1 and the +// bottom half at intensity 2. Each half is one zone of L = 256 * 256 = 65,536 pixels, and L^2 = 2^32 +// wraps to exactly 0 in 32 bits whether the product is read signed or unsigned, so a size emphasis +// is right here only if j^2 is taken in double. A zone between 46,341 and 65,535 also overflows an +// int, but a compiler that reads the overflowed product as unsigned still gets its square exactly. // With two zones, both of size L, the size-zone matrix has one column that matters and: // // SAE = (1/L^2 + 1/L^2) / 2 = 1 / L^2 LAE = (L^2 + L^2) / 2 = L^2 @@ -17,7 +19,7 @@ // Read at IBSI=true, which keeps the two levels as they are. static void make_glszm_2d_two_large_zones (std::vector& intensity, std::vector& mask) { - const size_t side = 216; + const size_t side = 256; intensity.clear(); mask.clear(); for (size_t y = 0; y < 2 * side; y++) @@ -41,7 +43,7 @@ void test_2d_glszm_large_zone_size_emphasis_analytic() roidata.initialize_fvals(); f.save_value (roidata.fvals); - const double L = 216.0 * 216.0, + const double L = 256.0 * 256.0, L2 = L * L; // rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these values run from below 1e-9 to past 1e9, // so an absolute 1e-9 would accept a small emphasis of 0 and lies below a large one's last bit. diff --git a/tests/test_3d_gldm_common.h b/tests/test_3d_gldm_common.h index 2e52e5234..b699cff05 100644 --- a/tests/test_3d_gldm_common.h +++ b/tests/test_3d_gldm_common.h @@ -17,7 +17,7 @@ #include "../src/nyx/features/3d_gldm.h" // D3_GLDM_feature, and SimpleCube / PixIntens with it #include "../src/nyx/helpers/fsystem.h" // fs::path, fs::exists -#include "test_main_nyxus.h" // agrees_gt, , , and the Environment / globals / roi_cache graph +#include "test_main_nyxus.h" // agrees_gt, run_3d_feature_on_volume, , , and the Environment / globals / roi_cache graph // Both 3D phantoms are defined once, in test_3d_glcm_pyradiomics.h, and every 3D family reaches them // by declaration -- test_all.cc compiles the headers into one translation unit. get_3d_compat_phantom @@ -119,9 +119,8 @@ static void extract_3d_gldm ( ASSERT_NO_FATAL_FAILURE(extract_3d_gldm (fvals, cube, lo, hi, ipath, mpath, label, s, f)); } -// The same run on a volume written out as a literal rather than loaded from a phantom: the voxels -// become an ROI, the running extrema are accumulated the way the real prescan leaves them, and -// calculate() reads it. 'f' outlives the call for the same reason as above. +// The same run on a volume written out as a literal rather than loaded from a phantom, through the +// runner every 3D family shares. 'f' outlives the call for the same reason as above. static void run_3d_gldm_on_volume ( std::vector>& fvals, const std::vector& voxels, @@ -129,30 +128,7 @@ static void run_3d_gldm_on_volume ( const Fsettings& s, D3_GLDM_feature& f) { - ASSERT_EQ (voxels.size(), size_t(w) * size_t(h) * size_t(d)); - - // An LR starts at the empty running-extrema state (aux_min = +inf, aux_max = 0), which is what - // the loop below accumulates into -- the same state the real prescan hands calculate(). - LR r; - r.aux_image_cube = SimpleCube (voxels, w, h, d); - for (int z = 0; z < d; z++) - for (int y = 0; y < h; y++) - for (int x = 0; x < w; x++) - { - PixIntens v = r.aux_image_cube.zyx (z, y, x); - if (!v) - continue; // background, outside the ROI - r.raw_pixels_3D.push_back (Pixel3 (x, y, z, v)); - if (v < r.aux_min) - r.aux_min = v; - if (v > r.aux_max) - r.aux_max = v; - } - - ASSERT_NO_THROW(r.initialize_fvals()); - ASSERT_NO_THROW(f.calculate(r, s)); - f.save_value(r.fvals); - fvals = r.fvals; + run_3d_feature_on_volume (fvals, voxels, w, h, d, s, f); } // Resolves a 3D feature name to its code and checks it is the one the caller expects, so a renamed diff --git a/tests/test_3d_glrlm_analytic.h b/tests/test_3d_glrlm_analytic.h index 4a877b63e..7efef72c2 100644 --- a/tests/test_3d_glrlm_analytic.h +++ b/tests/test_3d_glrlm_analytic.h @@ -28,11 +28,12 @@ static void assert_3d_glrlm_closed_form (const std::vector>& ASSERT_NEAR (actual, expected, 1e-12 * expected) << "feature " << (int)fcode << " angle " << angle; } -// bench_glrlm_3d_two_long_runs -- a 2L x 1 x 1 line of voxels, L = 46,656, the first half at +// bench_glrlm_3d_two_long_runs -- a 2L x 1 x 1 line of voxels, L = 65,536, the first half at // intensity 1 and the second at intensity 2. Direction slot 12 is {dz=0, dy=0, dx=1}, along the -// line, and sees two runs, one of length L at each level; L^2 = 2,176,782,336 is past INT_MAX and -// 2^2 * L^2 is past UINT_MAX, so every run-length term is right here only if it is taken in double. -// Over its Nr = 2 runs: +// line, and sees two runs, one of length L at each level; L^2 = 2^32 wraps to exactly 0 in 32 bits +// whether the product is read signed or unsigned, so every run-length term is right here only if it +// is taken in double. A run between 46,341 and 65,535 also overflows an int, but a compiler that +// reads the overflowed product as unsigned still gets its square exactly. Over its Nr = 2 runs: // // SRE = 1/L^2 LRE = L^2 // SRLGLE = (1 + 1/4) / 2 / L^2 SRHGLE = (1 + 4) / 2 / L^2 @@ -43,7 +44,7 @@ static void assert_3d_glrlm_closed_form (const std::vector>& // Each _AVE is the mean of the 13 directions. void test_3d_glrlm_long_run_emphasis_analytic() { - const int L = 46656; + const int L = 65536; std::vector voxels (2 * size_t(L)); for (size_t x = 0; x < voxels.size(); x++) voxels[x] = x < size_t(L) ? 1 : 2; diff --git a/tests/test_3d_glszm_analytic.h b/tests/test_3d_glszm_analytic.h index 9c620b97b..28076aa9d 100644 --- a/tests/test_3d_glszm_analytic.h +++ b/tests/test_3d_glszm_analytic.h @@ -9,8 +9,8 @@ // bench_glszm_3d_two_large_zones -- a 64 x 64 x 32 volume, slices 0-15 at intensity 1 and slices // 16-31 at intensity 2. Each half is one 26-connected zone of L = 64 * 64 * 16 = 65,536 voxels, and -// L^2 = 2^32 is past INT_MAX, so a size emphasis is right -// here only if j^2 is taken in double. With two zones, both of size L: +// L^2 = 2^32 wraps to exactly 0 in 32 bits whether the product is read signed or unsigned, so a size +// emphasis is right here only if j^2 is taken in double. With two zones, both of size L: // // SAE = (1/L^2 + 1/L^2) / 2 = 1 / L^2 LAE = (L^2 + L^2) / 2 = L^2 // diff --git a/tests/test_main_nyxus.h b/tests/test_main_nyxus.h index a746cbf25..d0d316747 100644 --- a/tests/test_main_nyxus.h +++ b/tests/test_main_nyxus.h @@ -248,6 +248,12 @@ static void run_3d_feature_on_volume ( r.aux_max = v; } + // the cube is the ROI's bounding box, its corner at the origin, as the real prescan records it + // for a feature method that places the voxel cloud in the cube through the box + r.aabb.init_x (0); r.aabb.update_x (w - 1); + r.aabb.init_y (0); r.aabb.update_y (h - 1); + r.aabb.init_z (0); r.aabb.update_z (d - 1); + ASSERT_NO_THROW(r.initialize_fvals()); ASSERT_NO_THROW(f.calculate(r, s)); f.save_value(r.fvals); diff --git a/tests/vetting/benchmarks.md b/tests/vetting/benchmarks.md index c4e14bde5..a42e3c268 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -277,7 +277,7 @@ was never written pass. | Data | built inline in `test_3d_glszm_large_zone_size_emphasis_analytic()` (`tests/test_3d_glszm_analytic.h`) | | ROI | all 131,072 voxels of a 64×64×32 volume, slices 0-15 at intensity 1 and slices 16-31 at 2 | | Shape | two 26-connected zones of `L = 65,536` voxels, so the size-zone matrix has two cells, both in column `L` | -| Why it exists | `L^2 = 2^32` is past `INT_MAX`, so `3GLSZM_SAE = 1/L^2` and `3GLSZM_LAE = L^2` are right only if the square of the zone size is taken in double | +| Why it exists | `L^2 = 2^32` wraps to exactly 0 in 32 bits, read signed or unsigned, so `3GLSZM_SAE = 1/L^2` and `3GLSZM_LAE = L^2` are right only if the square of the zone size is taken in double | Recipes: `glszm3d.analytic_two_large_zones`. @@ -285,22 +285,24 @@ Tests reaching it today: `test_3d_glszm_analytic.h`. **One of six 32-bit range fixtures.** Each of the six below is built so that a squared term of a size-zone or run-length emphasis lies past the 32-bit range while every feature it feeds keeps a -closed form: a zone or run of `L >= 46,341` puts `L^2` past `INT_MAX`, and a grey level -`G >= 65,536` puts `G^2` past `UINT_MAX`. All are read with no binning (2D at `IBSI=true`, 3D at a +closed form. A zone or run of `L >= 46,341` puts `L^2` past `INT_MAX`, but up to `L = 65,535` a +compiler that reads the overflowed product as unsigned still gets `L^2` exactly, so the zone and +run fixtures use `L = 65,536`, whose square `2^32` wraps to 0 in 32 bits however the product is +read. A grey level `G >= 65,536` puts `G^2` past `UINT_MAX`. All are read with no binning (2D at `IBSI=true`, 3D at a family grey depth of 0), so the levels written are the levels used. Each carries two levels, because a ROI of one intensity is intercepted before any matrix is built. Each has its own recipe, named on its `Recipes:` line, and its own `analytic` rows in the registry. --- -## `bench_glszm_2d_two_large_zones` — two 2D zones of 46,656 pixels +## `bench_glszm_2d_two_large_zones` — two 2D zones whose squared size is 2^32 | | | |---|---| | Data | `make_glszm_2d_two_large_zones()` in `tests/test_2d_glszm_analytic.h` | -| ROI | a 216×432 rectangle, the top half at intensity 1 and the bottom half at 2 | -| Shape | two zones of `L = 46,656` pixels | -| Why it exists | `GLSZM_SAE = 1/L^2` and `GLSZM_LAE = L^2`, with `L^2` past `INT_MAX` | +| ROI | a 256×512 rectangle, the top half at intensity 1 and the bottom half at 2 | +| Shape | two zones of `L = 65,536` pixels | +| Why it exists | `GLSZM_SAE = 1/L^2` and `GLSZM_LAE = L^2`, with `L^2 = 2^32`, which wraps to 0 in 32 bits | Recipes: `glszm.analytic_two_large_zones`. @@ -308,14 +310,14 @@ Tests reaching it today: `test_2d_glszm_analytic.h`. --- -## `bench_glrlm_2d_two_long_runs` — two 2D runs of 46,656 pixels +## `bench_glrlm_2d_two_long_runs` — two 2D runs of 65,536 pixels | | | |---|---| | Data | built inline in `test_2d_glrlm_long_run_emphasis_analytic()` (`tests/test_2d_glrlm_analytic.h`) | -| ROI | one row of 93,312 pixels, the left half at intensity 1 and the right half at 2 | -| Shape | at 0 degrees, two runs of `L = 46,656`, one per level | -| Why it exists | the six run-length emphases in all 4 directions and their `_AVE`, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | +| ROI | one row of 131,072 pixels, the left half at intensity 1 and the right half at 2 | +| Shape | at 0 degrees, two runs of `L = 65,536`, one per level | +| Why it exists | the six run-length emphases in all 4 directions and their `_AVE`, with `L^2 = 2^32`, which wraps to 0 in 32 bits | Recipes: `glrlm.analytic_two_long_runs`. @@ -338,14 +340,14 @@ Tests reaching it today: `test_2d_glrlm_analytic.h`. --- -## `bench_glrlm_3d_two_long_runs` — two 3D runs of 46,656 voxels +## `bench_glrlm_3d_two_long_runs` — two 3D runs of 65,536 voxels | | | |---|---| | Data | built inline in `test_3d_glrlm_long_run_emphasis_analytic()` (`tests/test_3d_glrlm_analytic.h`) | -| ROI | a 93,312×1×1 line, the first half at intensity 1 and the second at 2 | -| Shape | along x, direction slot 12, two runs of `L = 46,656`, one per level | -| Why it exists | the six run-length emphases in all 13 directions and their `_AVE`, with `L^2` past `INT_MAX` and `4 L^2` past `UINT_MAX` | +| ROI | a 131,072×1×1 line, the first half at intensity 1 and the second at 2 | +| Shape | along x, direction slot 12, two runs of `L = 65,536`, one per level | +| Why it exists | the six run-length emphases in all 13 directions and their `_AVE`, with `L^2 = 2^32`, which wraps to 0 in 32 bits | Recipes: `glrlm3d.analytic_two_long_runs`. diff --git a/tests/vetting/config_recipes.md b/tests/vetting/config_recipes.md index 5ac95c2c7..fc6024c9d 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -431,15 +431,16 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g only, in `test_2d_glszm_regression.h`, and no oracle row claims them. ## glszm.analytic_two_large_zones -- `bench_glszm_2d_two_large_zones` — a 216x432 rectangle built in +- `bench_glszm_2d_two_large_zones` — a 256x512 rectangle built in `test_2d_glszm_large_zone_size_emphasis_analytic()`, the top half at intensity 1 and the bottom half at 2 — at `IBSI=true` and `GREYDEPTH=0`, so the two levels are read as they are. Oracle: `analytic`. Used by `test_2d_glszm_analytic.h`, for `GLSZM_SAE` and `GLSZM_LAE` only. Config matrix: `matrix/glszm.md`. -- **What it is for.** Each half is one zone of `L = 46,656` pixels, so the matrix has two cells, both - in column `L`, and `SAE = 1/L^2`, `LAE = L^2` exactly. `L^2 = 2,176,782,336` is past `INT_MAX`, so - the values are right only if the square of the zone size is taken in double. -- The band is `rel=1e-12` rather than SPEC 7's absolute exact tier, because `LAE` is 2.2e9 and an +- **What it is for.** Each half is one zone of `L = 65,536` pixels, so the matrix has two cells, both + in column `L`, and `SAE = 1/L^2`, `LAE = L^2` exactly. `L^2 = 2^32` wraps to 0 in 32 bits, read + signed or unsigned, so the values are right only if the square of the zone size is taken in + double. +- The band is `rel=1e-12` rather than SPEC 7's absolute exact tier, because `LAE` is 4.3e9 and an absolute 1e-9 is below its last bit. ## glrlm.ibsi_ng128 @@ -472,16 +473,16 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `test_2d_glrlm_regression.h`; no oracle row claims it. ## glrlm.analytic_two_long_runs -- `bench_glrlm_2d_two_long_runs` — one row of `2L` pixels, `L = 46,656`, built in +- `bench_glrlm_2d_two_long_runs` — one row of `2L` pixels, `L = 65,536`, built in `test_2d_glrlm_long_run_emphasis_analytic()`, the left half at intensity 1 and the right half at 2 — at `make_2d_glrlm_ibsi_settings()` (`IBSI=true`), which keeps the two levels as they are. Oracle: `analytic`. Used by `test_2d_glrlm_analytic.h`, for `GLRLM_SRE`, `GLRLM_LRE` and the four run-length-and-grey-level emphases in all four directions, and their `_AVE` twins. - **What it is for.** At 0 degrees the row is two runs of length `L`, one at each level. `L^2 = - 2,176,782,336` is past `INT_MAX` and `2^2 * L^2` past `UINT_MAX`, so the values are right only if - the run-length terms are taken in double. At 45, 90 and 135 degrees every pixel is a run of length + 2^32` wraps to 0 in 32 bits, read signed or unsigned, so the values are right only if the + run-length terms are taken in double. At 45, 90 and 135 degrees every pixel is a run of length 1, so each `_AVE` has a closed form too, and carries the 0-degree value into the mean. -- The band is `rel=1e-12`, because `LRE` is 2.2e9 and an absolute 1e-9 is below its last bit. +- The band is `rel=1e-12`, because `LRE` is 4.3e9 and an absolute 1e-9 is below its last bit. ## glrlm.analytic_high_grey_pair - `bench_glrlm_2d_high_grey_pair` — two adjacent pixels at intensities 1 and `G = 70,000`, built in @@ -745,17 +746,17 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `glrlm3d.regression_ut_phantom` — the two bin the same voxels differently by construction. ## glrlm3d.analytic_two_long_runs -- `bench_glrlm_3d_two_long_runs` — a `2L x 1 x 1` line of voxels, `L = 46,656`, built in +- `bench_glrlm_3d_two_long_runs` — a `2L x 1 x 1` line of voxels, `L = 65,536`, built in `test_3d_glrlm_long_run_emphasis_analytic()`, the first half at intensity 1 and the second at 2 — at `GREYDEPTH=64`, `IBSI=false` and `GLRLM_GREYDEPTH=0`, so the two levels are read as they are. Oracle: `analytic`. Used by `test_3d_glrlm_analytic.h`, for `3GLRLM_SRE`, `3GLRLM_LRE` and the four run-length-and-grey-level emphases in all 13 directions, and their `_AVE` twins. Direction slot 12 (`{dz=0, dy=0, dx=1}`) runs along the line. - **What it is for.** Along the line the volume is two runs of length `L`, one at each level. `L^2 = - 2,176,782,336` is past `INT_MAX` and `2^2 * L^2` past `UINT_MAX`, so the values are right only if - the run-length terms are taken in double. The other 12 directions leave the line, so every voxel is + 2^32` wraps to 0 in 32 bits, read signed or unsigned, so the values are right only if the + run-length terms are taken in double. The other 12 directions leave the line, so every voxel is a run of length 1, and each `_AVE` has a closed form that carries the along-the-line value. -- The band is `rel=1e-12`, because `LRE` is 2.2e9 and an absolute 1e-9 is below its last bit. +- The band is `rel=1e-12`, because `LRE` is 4.3e9 and an absolute 1e-9 is below its last bit. ## glrlm3d.analytic_high_grey_pair - `bench_glrlm_3d_high_grey_pair` — two adjacent voxels at intensities 1 and `G = 70,000`, built in @@ -1058,9 +1059,9 @@ oracle for the Nyxus-original features); it is not built in this tree, and the g `GREYDEPTH=64`, `IBSI=false` and `GLSZM_GREYDEPTH=0`, so the two levels are read as they are. Oracle: `analytic`. Used by `test_3d_glszm_analytic.h`, for `3GLSZM_SAE` and `3GLSZM_LAE` only. - **What it is for.** Each half is one 26-connected zone of `L = 65,536` voxels, so the matrix has - two cells, both in column `L`, and `SAE = 1/L^2`, `LAE = L^2` exactly. `L^2 = 2^32` is past - `INT_MAX`, so the values are right only if the square of the zone size is taken in double. A zone - of 46,341 voxels already needs that, and a whole-organ ROI reaches it routinely; the family's + two cells, both in column `L`, and `SAE = 1/L^2`, `LAE = L^2` exactly. `L^2 = 2^32` wraps to 0 in + 32 bits, read signed or unsigned, so the values are right only if the square of the zone size is + taken in double. A zone of 46,341 voxels already needs that, and a whole-organ ROI reaches it routinely; the family's PyRadiomics fixtures stop at a largest zone of 634 voxels. - The band is `rel=1e-12` rather than SPEC 7's absolute exact tier, because `LAE` is 4.3e9 and an absolute 1e-9 is below its last bit. diff --git a/tests/vetting/matrix/glszm.md b/tests/vetting/matrix/glszm.md index f253d1d7b..94ad897f0 100644 --- a/tests/vetting/matrix/glszm.md +++ b/tests/vetting/matrix/glszm.md @@ -20,7 +20,7 @@ configure once the discretisation is fixed. |---|---|---|---|---| | True | none (identity on an already-discrete fixture) | phantom's own 1..6 | VALID, 15 features | `glszm.ibsi_phantom_2d` — mirp + ibsi, at SPEC §7's exact tier | | True | none | phantom's own 1..6 | VALID, 1 feature at a wider band | `GLSZM_ZE` — same oracles, `rel=4e-3`, the `fast_log10` residual | -| True | none | 1 and 2, zones of 46,656 | VALID, 2 features | `GLSZM_SAE`, `GLSZM_LAE` on zones whose squared size is past `INT_MAX` — analytic, `rel=1e-12`, `test_2d_glszm_analytic.h` | +| True | none | 1 and 2, zones of 65,536 | VALID, 2 features | `GLSZM_SAE`, `GLSZM_LAE` on zones whose squared size, 2^32, wraps to 0 in 32 bits — analytic, `rel=1e-12`, `test_2d_glszm_analytic.h` | | False | MATLAB (`GREYDEPTH > 0`) | 64 | VALID-prod-only, all 16 | no oracle reproduces it → `test_2d_glszm_regression.h` | | False | radiomics (`GREYDEPTH < 0`) | any | NOT MEASURED | see below | | any | any | ROI with `aux_min == aux_max` | INVALID | degenerate — a blank ROI has no zones; `calculate()` returns NaN before building a matrix, guarded in code rather than by an oracle | diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index a4b37b21f..d4bbef64d 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -264,9 +264,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLCM_SUMENTROPY_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=5e-3,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLCM_SUMVARIANCE_AVE,glcm,vetted,ibsi,agreed,glcm.ibsi_identity,rel=1e-9,test_2d_glcm_mirp.h;test_2d_glcm_pyradiomics.h;test_2d_glcm_ibsi.h;test_2d_glcm_regression.h,,,,in-tree,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step.",, 2D,GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, -2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, 2D,GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A",, @@ -280,21 +280,21 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_HGLRE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, 2D,GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_LRLGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_LRHGLE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm.analytic_high_grey_pair,rel=1e-12,test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_ibsi.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_2d_high_grey_pair 2D,GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, -2D,GLRLM_SRE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, -2D,GLRLM_LRE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_GLNN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_GLNN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, 2D,GLRLM_RLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_RLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md.",, @@ -306,13 +306,13 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLRLM_LGLRE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_LGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted.",, 2D,GLRLM_HGLRE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h,,,,in-tree,"Angle average of GLRLM_HGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted.",, 2D,GLRLM_SRLGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_SRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_SRHGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_SRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_SRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_SRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRLGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_LRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLRLM_LRHGLE_AVE,glrlm,vetted,ibsi,agreed,glrlm.ibsi_ng128,rel=1e-9,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"Angle average of GLRLM_LRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted.",, -2D,GLRLM_LRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs +2D,GLRLM_LRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm.analytic_two_long_runs,rel=1e-12,test_2d_glrlm_ibsi.h;test_2d_glrlm_mirp.h;test_2d_glrlm_pyradiomics.h;test_2d_glrlm_regression.h;test_2d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_2d_two_long_runs 2D,GLDZM_SDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_SDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_SDE_MIRP,ibsi_digital_phantom 2D,GLDZM_LDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_LDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LDE_MIRP,ibsi_digital_phantom 2D,GLDZM_LGLZE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_LGLZE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LGLZE_MIRP,ibsi_digital_phantom @@ -332,9 +332,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GLDZM_ZDV,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,ibsi_digital_phantom 2D,GLDZM_ZDE,gldzm,vetted,mirp,agreed,gldzm.ibsi_phantom_2d,abs=1e-9,test_2d_gldzm_ibsi.h;test_2d_gldzm_mirp.h,,,,audit,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py",TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,ibsi_digital_phantom 2D,GLSZM_SAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,ibsi_digital_phantom -2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_SAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 256x512 rectangle whose two halves, at levels 1 and 2, are two zones of L = 65,536 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones 2D,GLSZM_LAE,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,ibsi_digital_phantom -2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones +2D,GLSZM_LAE,glszm,vetted,analytic,agreed,glszm.analytic_two_large_zones,rel=1e-12,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h;test_2d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 256x512 rectangle whose two halves, at levels 1 and 2, are two zones of L = 65,536 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_2d_two_large_zones 2D,GLSZM_GLN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,ibsi_digital_phantom 2D,GLSZM_GLNN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,ibsi_digital_phantom 2D,GLSZM_SZN,glszm,vetted,mirp,agreed,glszm.ibsi_phantom_2d,abs=1e-9,test_2d_glszm_ibsi.h;test_2d_glszm_mirp.h;test_2d_glszm_regression.h,,,,audit,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md",TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,ibsi_digital_phantom @@ -397,7 +397,7 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,GABOR,gabor,vetted,skimage,agreed,gabor.python_raw_defaults,rel=1e-3,test_2d_gabor_skimage.cc,,,,in-tree,"Vetted vs scikit-image 0.26.0 at the default lists gabor_freqs=[4,16,32,64], gabor_thetas=[0,45,90,135] deg as GaborOptions::parse_input builds them (f0={4,16,32,64}, theta={0,pi/4,pi/2,3pi/4} rad) - the config the Python API always runs and a CLI run that passes both flags. All 16 pins reproduced exactly by gen_gabor_skimage.py (max |diff| 0.000e+00). This config point was added 2026-08 because the family's only vetted row covered gabor.cpp_static_defaults, a different frequency and angle set whose values differ from this one by up to 0.84 absolute on the same ROI - so no in-tree assertion covered what users compute. UNITS: the recipe is named 'python_raw' because parse_input converts the angles (deg->rad) and passes the frequencies through untouched, while nyxus.py and the CLI help both document gabor_freqs as denominators of pi and nothing in the tree divides by pi; the assertion covers the numbers that reach the filter, not the documented units contract, which is an unresolved source question (vetting report section 8 item 4). SCOPE of oracle=skimage (SPEC 4 allows one token per row; the claim is narrower than the token): skimage supplies the KERNEL at the non-degenerate (f0,theta) points - gabor_kernel(frequency=f0/2pi, sigma_x=sig2lam*2pi/f0, sigma_y=sigma_x/gamma, offset=0) cropped to the Nyxus 16x16 grid - while the count-ratio SCORE is Nyxus' own WND-CHARM definition reproduced in the generator, because skimage has no native equivalent to compare the whole feature against. A full-feature oracle would be wndcharm; not built in this tree, recorded in not_covered.md. SCOPE 2: the GPU path is NOT vetted - calculate_gpu (FFT convolution) diverges from the direct-convolution CPU path on these ROIs; the assertion covers the in-RAM CPU path only, and the GPU path's plumbing guard is TEST_NYXUS.TEST_2D_GABOR_GPU_RUNS_MECHANICS. SCOPE 3: the 16x16 kernel crop is part of the recipe rather than a detail - at gamma=0.1 only 7.9-47.6 percent of the kernel's L1 mass falls inside that window at the low frequencies, and scoring off skimage's own filtering (skimage.filters.gabor, untruncated support, zero-padded border) moves values by up to 1.005; generator part D2 re-runs that control. See audit/gabor_2d_skimage_vetting_report.md.",TEST_NYXUS.TEST_2D_GABOR_PYTHON_RAW_DEFAULTS_SKIMAGE,bench_dsb2018_2d 2D,MEAN_FRAC,radial,regression,,disagreed,radial.shape2d_native,rel=1e-9,test_2d_radial_regression.h;test_2d_radial_invariant.h,,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",convention-mismatch,in-tree,"Not CellProfiler-vettable: CP's MeanFrac is normalised by the ROI mean intensity and lands near 1, Nyxus' is the bin's raw mean intensity. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the raw-bin-mean convention (intensity range, and the reconstruction of the ROI total together with FRAC_AT_D) is characterized by TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION, not asserted as an invariant, because CellProfiler's normalised MeanFrac satisfies neither. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1.",TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,bench_shape8_concave_holed 2D,RADIAL_CV,radial,regression,,disagreed,radial.shape2d_native,rel=1e-9,test_2d_radial_regression.h;test_2d_radial_invariant.h,,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",convention-mismatch,in-tree,"Not CellProfiler-vettable: CP takes the CV of the 8 wedge means over the non-empty wedges, Nyxus the CV of the 8 wedge sums over all 8. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the sqrt(num_bins-1) bound and the empty-bin zero hold under either wedge convention and are asserted by the two invariants named in test_name. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1.",TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_CV_IS_WITHIN_ITS_BOUND_INVARIANT;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,bench_shape8_concave_holed -2D,ZERNIKE2D,zernike,vetted,analytic,agreed,zernike.shape2d_native,rel=1e-12,test_2d_zernike_analytic.h;test_2d_zernike_regression.h;test_2d_zernike_invariant.h;test_2d_zernike_mechanics.h,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",,in-tree,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count). The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,bench_shape8_concave_holed +2D,ZERNIKE2D,zernike,vetted,analytic,agreed,zernike.shape2d_native,rel=1e-12,test_2d_zernike_analytic.h;test_2d_zernike_regression.h;test_2d_zernike_invariant.h;test_2d_zernike_mechanics.h,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",,in-tree,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count).",TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,bench_shape8_concave_holed 2D,SPAT_MOMENT_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md.",, 2D,SPAT_MOMENT_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md.",, 2D,SPAT_MOMENT_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md.",, @@ -696,8 +696,8 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3LEAST_AXIS_LEN,morphology,vetted,pyradiomics,agreed,morphology3d.pyradiomics_anisotropic,rel=1e-9,test_3d_morphology_pyradiomics.h,test_3d_morphology_pyradiomics.h,,,in-tree,"PyRadiomics 3.0.1 LeastAxisLength=83.765297555890839 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py. pyradiomics normalizes the covariance by N, Nyxus by N-1, so Nyxus is asserted against the pin times sqrt(N/(N-1)), N=274432 (Nyxus normalization, not a tolerance), at rel=1e-9.",TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_LEAST_AXIS_LEN_PYRADIOMICS, 3D,3ELONGATION,morphology,vetted,pyradiomics,agreed,morphology3d.pyradiomics_anisotropic,rel=1e-9,test_3d_morphology_pyradiomics.h,test_3d_morphology_pyradiomics.h,,,in-tree,"PyRadiomics 3.0.1 Elongation=0.64206222930112822 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9.",TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_ELONGATION_PYRADIOMICS, 3D,3FLATNESS,morphology,vetted,pyradiomics,agreed,morphology3d.pyradiomics_anisotropic,rel=1e-9,test_3d_morphology_pyradiomics.h,test_3d_morphology_pyradiomics.h,,,in-tree,"PyRadiomics 3.0.1 Flatness=0.46852288961977678 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9.",TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_FLATNESS_PYRADIOMICS, -3D,3MESH_VOLUME,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",, -3D,3VOLUME_CONVEXHULL,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",, +3D,3MESH_VOLUME,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation.",, +3D,3VOLUME_CONVEXHULL,morphology,vetted,analytic,agreed,morphology3d.analytic_lattice_solids,rel=1e-12,test_3d_morphology_analytic.h,,,,in-tree,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation.",, 3D,3GLCM_ACOR,glcm,vetted,pyradiomics,agreed,glcm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glcm_pyradiomics.h;test_3d_glcm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only).",, 3D,3GLCM_ASM,glcm,vetted,pyradiomics,agreed,glcm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glcm_pyradiomics.h;test_3d_glcm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only).",, 3D,3GLCM_CLUPROM,glcm,vetted,pyradiomics,agreed,glcm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glcm_pyradiomics.h;test_3d_glcm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only).",, @@ -982,9 +982,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_ut_phantom,rel=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md.",TEST_NYXUS.TEST_3D_GLSZM_LAHGLE_REGRESSION,bench_ut57_3d 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md.",TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,bench_ut57_3d 3D,3GLSZM_SAE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLSZM_SAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones +3D,3GLSZM_SAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones 3D,3GLSZM_LAE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant -3D,3GLSZM_LAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones +3D,3GLSZM_LAE,glszm,vetted,analytic,agreed,glszm3d.analytic_two_large_zones,rel=1e-12,test_3d_glszm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,bench_glszm_3d_two_large_zones 3D,3GLSZM_GLN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_GLNN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_SZN,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant @@ -1000,9 +1000,9 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLSZM_LALGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLSZM_LAHGLE,glszm,regression,,,glszm3d.regression_constant_roi,abs=1e-9,test_3d_glszm_regression.h,,,,in-tree,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md.",TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,bench_cube2_constant 3D,3GLRLM_SRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_GLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_GLNN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_RLN,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, @@ -1016,21 +1016,21 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_HGLRE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, 3D,3GLRLM_HGLRE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE converts the level to double before squaring it in every version of the code, so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_SRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_SRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_LRLGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRLGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_LRHGLE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle.",, -3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRHGLE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_high_grey_pair,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,bench_glrlm_3d_high_grey_pair 3D,3GLRLM_SRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_SRE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_LRE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_GLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_GLNN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_RLN_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, @@ -1042,13 +1042,13 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 3D,3GLRLM_LGLRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_HGLRE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, 3D,3GLRLM_SRLGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_SRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_SRHGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_SRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_SRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRLGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_LRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRLGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs 3D,3GLRLM_LRHGLE_AVE,glrlm,vetted,pyradiomics,agreed,glrlm3d.pyradiomics_bincount20,rel=1e-9,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,audit,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle.",, -3D,3GLRLM_LRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs +3D,3GLRLM_LRHGLE_AVE,glrlm,vetted,analytic,agreed,glrlm3d.analytic_two_long_runs,rel=1e-12,test_3d_glrlm_pyradiomics.h;test_3d_glrlm_regression.h;test_nyxus.py;test_3d_glrlm_analytic.h,,,,in-tree,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit.",TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,bench_glrlm_3d_two_long_runs IMQ,FOCUS_SCORE,imq,vetted,opencv,agreed,imq.laplacian_ksize1_zeropad,abs=1e-9,test_imq_opencv.h,,,,audit,"vetted vs OpenCV cv2.Laplacian(roi, CV_64F, ksize=1, BORDER_CONSTANT).var() = 34.956597222222221 (cv2 4.13.0, gen_imq_opencv.py), the Pech-Pacheco et al. (2000) variance-of-the-Laplacian focus measure. The generator asserts cv2's filtered image equals Nyxus' laplacian() cell for cell before comparing any scalar, so the convolution is proved and only the variance step is under test; Nyxus reproduces the scalar to 7.1e-15 absolute (2.0e-16 relative), which is summation order alone. Band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. SCOPE: ksize=1, the only kernel calculate() selects. laplacian()'s ksize>1 kernel is cv2.Laplacian's ksize=3 aperture exactly: both stencils are pinned from cv2's unit-spike response in test_imq_opencv.h (TEST_IMQ_FOCUS_SCORE_KERNEL_PER_CALL_OPENCV) and the generator asserts the ksize=3 filtered fixture equal to cv2's cell for cell. The out-of-core path shares the in-RAM scoring code and is held bit-equal to it by test_imq_invariant.h (an invariant, not vetting). Report: audit/imq_opencv_vetting_report.md; matrix/imq.md.",TEST_NYXUS.TEST_IMQ_FOCUS_SCORE_OPENCV,bench_imq_quality_roi IMQ,LOCAL_FOCUS_SCORE,imq,vetted,opencv,agreed,imq.laplacian_ksize1_zeropad,abs=1e-9,test_imq_opencv.h,,,,audit,"vetted vs OpenCV: the mean of cv2.Laplacian(tile, CV_64F, ksize=1, BORDER_CONSTANT).var() over the 2x2 grid of 4x6 tiles get_local_focus_score() cuts the 8x12 fixture into at scale=2 = 28.341145833333336 (cv2 4.13.0, gen_imq_opencv.py, which asserts the tile count and prints each tile's score). Nyxus reproduces it to 7.1e-15 absolute (2.5e-16 relative); band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. Negative control: the one-tile value a truncated y < height-M loop bound gives, 7.5763888888888902, is asserted to sit 73% away, so the pin tells the full tiling from the truncated one. Report: audit/imq_opencv_vetting_report.md; matrix/imq.md. ORACLE SPLIT (not_covered.md section E): OpenCV supplies each tile's Laplacian and population variance; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row.",TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_OPENCV,bench_imq_quality_roi IMQ,LOCAL_FOCUS_SCORE,imq,vetted,analytic,agreed,imq.local_focus_single_spike,abs=0,test_imq_analytic.h,,,,in-tree,"vetted against a closed form, no generator: a single spike of height v clear of the tile edge has a ksize=1 Laplacian of -4v at the spike and +v at its four neighbours, so its tile scores exactly 20v^2/P and every all-zero tile scores 0. test_imq_analytic.h places the spike in each of the scale^2 = 4 tiles in turn on 8x12, 9x12, 8x13 and 9x13 ROIs (a 2x2 grid of 4x6 tiles in all four) and asserts 20*36/24/4 = 7.5 for every placement, and 4x that with a spike in every tile. Exact band: integer arithmetic, exact in double. Both side parities are needed: a y < height-M loop bound stops after the first tile on an even side but reaches the second on an odd one. Which pixels belong to no tile, and the soft-NaN an ROI no tile fits returns, are Nyxus conventions pinned as mechanics in test_imq_mechanics.h, not vetted. See matrix/imq.md.",TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_EACH_TILE_ANALYTIC;TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_ALL_TILES_ANALYTIC, diff --git a/tests/vetting/report_output.csv b/tests/vetting/report_output.csv index 9e9896a9c..bfada1945 100644 --- a/tests/vetting/report_output.csv +++ b/tests/vetting/report_output.csv @@ -264,9 +264,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glcm,GLCM_SUMENTROPY_AVE,vetted,ibsi,glcm.ibsi_identity,rel=5e-3,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_entropy_ave_ibsi,test_2d_glcm_sum_entropy_ave_regression,,3,1,"log-based: Nyxus sums through fast_log10 with an EPSILON guard, so it lands 1e-3..3e-3 from both tools instead of on them; asserted at rel=5e-3 | angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=5e-3 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMENTROPY (P6QZ) (= 1.6): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 1.601240106). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." 2D,glcm,GLCM_SUMVARIANCE_AVE,vetted,ibsi,glcm.ibsi_identity,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glcm_family_mirp;test_2d_glcm_family_pyradiomics;test_2d_glcm_sum_variance_ave_ibsi,test_2d_glcm_sum_variance_ave_regression,,3,1,"angle average; the tools report one value over the angle set, so it shares its base feature's golden",,agree,feature,audit/glcm_2d_ibsi_vetting_report.md,audit/glcm_2d_golden_regen.md,matrix/glcm.md,"Also asserted against pyradiomics v3.0.1 on the dense phantom of test_2d_glcm_common.h at rel<=rel=1e-9 (test_2d_glcm_pyradiomics.h, test_2d_glcm_mirp.h), so the oracle this row names is one the tree actually compares against. | Asserted in test_2d_glcm_ibsi.h against the IBSI consensus for SUMVARIANCE (OEEB) (= 5.47): that consensus is quoted for the 2D-averaged aggregation, so it is the golden of the angle average itself, and the _AVE feature reproduces its base feature's 4-angle mean exactly (both 5.472932478). Was vetted from an offline run only (source=tracker), with nothing in the tree asserting the angle-averaging step." 2D,glrlm,GLRLM_SRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_SRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ibsi,test_2d_glrlm_sre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" -2D,glrlm,GLRLM_LRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ibsi,test_2d_glrlm_lre_regression,,4,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_GLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ibsi,test_2d_glrlm_gln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_GLNN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glnn_ibsi,test_2d_glrlm_glnn_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" 2D,glrlm,GLRLM_RLN,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rln_ibsi,test_2d_glrlm_rln_regression,,3,1,,,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | test_3d_glrlm_regression.h ORPHANED (not #included; never run) - left per decision A" @@ -280,21 +280,21 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glrlm,GLRLM_HGLRE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted." 2D,glrlm,GLRLM_HGLRE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ibsi;test_2d_glrlm_high_grey_level_emphasis_analytic,test_2d_glrlm_hglre_regression,,4,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ibsi,test_2d_glrlm_srlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ibsi,test_2d_glrlm_srhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRLGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRLGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ibsi,test_2d_glrlm_lrlgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRHGLE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions. IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 46,656 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. At 0 degrees, along the row that is two runs of L = 65,536 pixels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRHGLE,vetted,analytic,glrlm.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_2d_high_grey_pair,TEST_NYXUS.TEST_2D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_high_grey_level_emphasis_analytic;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ibsi,test_2d_glrlm_lrhgle_regression,,5,1,,test_2d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_high_grey_pair, recipe glrlm.analytic_high_grey_pair: two adjacent pixels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all four in-slice directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." -2D,glrlm,GLRLM_SRE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_sre_ave_ibsi,test_2d_glrlm_sre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRE_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." -2D,glrlm,GLRLM_LRE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lre_ave_ibsi,test_2d_glrlm_lre_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_GLN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_gln_ave_ibsi,test_2d_glrlm_gln_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_GLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_GLNN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_glnn_ave_ibsi,test_2d_glrlm_glnn_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_GLNN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." 2D,glrlm,GLRLM_RLN_AVE,vetted,pyradiomics,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_rln_ave_ibsi,test_2d_glrlm_rln_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_pyradiomics_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_RLN, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md." @@ -306,13 +306,13 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,glrlm,GLRLM_LGLRE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_lglre_ave_ibsi,test_2d_glrlm_lglre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LGLRE = 0.604) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.6044 (matches the IBSI reference); ibsi=false gives 0.1147 on the same fixture -- default-mode values are NOT vetted." 2D,glrlm,GLRLM_HGLRE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_hglre_ave_ibsi,test_2d_glrlm_hglre_ave_regression,,3,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_HGLRE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM HGLRE = 9.82) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 9.824 (matches the IBSI reference); ibsi=false gives 4087.74 on the same fixture -- default-mode values are NOT vetted." 2D,glrlm,GLRLM_SRLGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ave_ibsi,test_2d_glrlm_srlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRLGLE = 0.294) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 0.2940 (matches the IBSI reference); ibsi=false gives 0.1036 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRLGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ave_ibsi,test_2d_glrlm_srlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRLGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srlgle_ave_ibsi,test_2d_glrlm_srlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_SRHGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ave_ibsi,test_2d_glrlm_srhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_SRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM SRHGLE = 8.57) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 8.573 (matches the IBSI reference); ibsi=false gives 3545.21 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_SRHGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ave_ibsi,test_2d_glrlm_srhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_SRHGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_srhgle_ave_ibsi,test_2d_glrlm_srhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRLGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ave_ibsi,test_2d_glrlm_lrlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRLGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRLGLE = 3.14) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 3.144 (matches the IBSI reference); ibsi=false gives 0.1614 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRLGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ave_ibsi,test_2d_glrlm_lrlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRLGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrlgle_ave_ibsi,test_2d_glrlm_lrlgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glrlm,GLRLM_LRHGLE_AVE,vetted,ibsi,glrlm.ibsi_ng128,rel=1e-9,agreed,,,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ave_ibsi,test_2d_glrlm_lrhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",,agree,feature,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"Angle average of GLRLM_LRHGLE, asserted per slice against the same golden as its base. Asserted on the IBSI digital phantom in test_2d_glrlm_ibsi.h (IBSI consensus), test_2d_glrlm_pyradiomics.h (pyradiomics v3.0.1) and test_2d_glrlm_mirp.h (mirp 2.6.0) at rel<=rel=1e-9; the two tools agree with each other to ~1e-15 and Nyxus reproduces them to double precision. Was vetted from an offline run only (source=tracker), with target_test naming a file that did not exist. Evidence: tests/vetting/audit/glrlm_2d_*_vetting_report.md. | vetted vs IBSI digital-phantom consensus (GLRLM LRHGLE = 17.4) at 1% in test_2d_glrlm_ibsi.h, ibsi=True Ng=128, averaged over the 4 phantom slices x 4 directions (_AVE direction-mean, same grand mean). IBSI is the reference table (§4); no tool run at CI time. CONFIG SCOPE (measured): ibsi=true gives 17.387 (matches the IBSI reference); ibsi=false gives 7358.78 on the same fixture -- default-mode values are NOT vetted." -2D,glrlm,GLRLM_LRHGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ave_ibsi,test_2d_glrlm_lrhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 46,656, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glrlm,GLRLM_LRHGLE_AVE,vetted,analytic,glrlm.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_2d_two_long_runs,TEST_NYXUS.TEST_2D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp;pyradiomics,test_2d_glrlm_family_mirp;test_2d_glrlm_family_pyradiomics;test_2d_glrlm_long_run_emphasis_analytic;test_2d_glrlm_lrhgle_ave_ibsi,test_2d_glrlm_lrhgle_ave_regression,,4,1,"angle average; the tools report one value over the 4 directions, so it shares its base feature's golden",test_2d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_2d_ibsi_vetting_report.md,audit/glrlm_2d_golden_regen.md,,"vetted against its closed form on bench_glrlm_2d_two_long_runs, recipe glrlm.analytic_two_long_runs: one line of 2L pixels, L = 65,536, half at level 1 and half at level 2. At 0 degrees the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 4 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,gldzm,GLDZM_SDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_SDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_SDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_sde_ibsi;test_2d_gldzm_sde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_sde_ibsi;test_2d_gldzm_sde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_LDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_LDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_lde_ibsi;test_2d_gldzm_lde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_lde_ibsi;test_2d_gldzm_lde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_LGLZE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_LGLZE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_LGLZE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_lglze_ibsi;test_2d_gldzm_lglze_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_lglze_ibsi;test_2d_gldzm_lglze_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" @@ -332,9 +332,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,gldzm,GLDZM_ZDV,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDV_MIRP,,,audit,mirp,test_2d_gldzm_zdv_mirp,,,1,0,vetted by mirp only; the IBSI file never held a published value for it,test_2d_gldzm_zdv_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,gldzm,GLDZM_ZDE,vetted,mirp,gldzm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLDZM_ZDE_IBSI;TEST_NYXUS.TEST_2D_GLDZM_ZDE_MIRP,,,audit,ibsi;mirp,test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,,,2,0,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 1.3e-15 absolute",test_2d_gldzm_zde_ibsi;test_2d_gldzm_zde_mirp,agree,row,audit/gldzm_2d_mirp_vetting_report.md,audit/gldzm_2d_golden_regen.md,matrix/gldzm.md,"vetted vs mirp 2.6.0 on the four IBSI phantom slices (by_slice, no discretisation - the phantom is already discrete 1..6), recipe gldzm.ibsi_phantom_2d. Backed per slice AND by the four-slice mean: mirp computes each slice on its own, so both quantities are pinned in test_2d_gldzm_mirp.h at SPEC 7's exact tier, an absolute 1e-9 band (worst absolute residual 1.3e-15 over the 16 features x 4 slices plus the 16 means; worst relative 7.0e-16). The mean alone is blind to errors in two slices that cancel, which is the shape this family's zone connectivity defect actually took. The same means are pinned against the published IBSI consensus in test_2d_gldzm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to (worst residual there 0.35%). gen_gldzm_mirp.py" 2D,glszm,GLSZM_SAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" -2D,glszm,GLSZM_SAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glszm,GLSZM_SAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_large_zone_size_emphasis_analytic;test_2d_glszm_sae_ibsi;test_2d_glszm_sae_mirp,test_2d_glszm_sae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 256x512 rectangle whose two halves, at levels 1 and 2, are two zones of L = 65,536 pixels each, read at IBSI=true. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glszm,GLSZM_LAE,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_LAE_IBSI;TEST_NYXUS.TEST_2D_GLSZM_LAE_MIRP,,,audit,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" -2D,glszm,GLSZM_LAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 216x432 rectangle whose two halves, at levels 1 and 2, are two zones of L = 46,656 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,glszm,GLSZM_LAE,vetted,analytic,glszm.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_2d_two_large_zones,TEST_NYXUS.TEST_2D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;ibsi;mirp,test_2d_glszm_lae_ibsi;test_2d_glszm_lae_mirp;test_2d_glszm_large_zone_size_emphasis_analytic,test_2d_glszm_lae_regression,,3,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_large_zone_size_emphasis_analytic,agree,row,audit/glszm_2d_ibsi_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted against its closed form on bench_glszm_2d_two_large_zones, recipe glszm.analytic_two_large_zones: a 256x512 rectangle whose two halves, at levels 1 and 2, are two zones of L = 65,536 pixels each, read at IBSI=true. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 2D,glszm,GLSZM_GLN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,test_2d_glszm_gln_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_gln_ibsi;test_2d_glszm_gln_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_GLNN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_GLNN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_GLNN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,test_2d_glszm_glnn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_glnn_ibsi;test_2d_glszm_glnn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" 2D,glszm,GLSZM_SZN,vetted,mirp,glszm.ibsi_phantom_2d,abs=1e-9,agreed,ibsi_digital_phantom,TEST_NYXUS.TEST_2D_GLSZM_SZN_IBSI;TEST_NYXUS.TEST_2D_GLSZM_SZN_MIRP,,,audit,ibsi;mirp,test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,test_2d_glszm_szn_regression,,2,1,"asserted against both oracles by design: IBSI fixes the definition at its published 3-significant-figure precision, mirp fixes the digits at 2.0e-16",test_2d_glszm_szn_ibsi;test_2d_glszm_szn_mirp,agree,row,audit/glszm_2d_mirp_vetting_report.md,audit/glszm_2d_golden_regen.md,matrix/glszm.md,"vetted vs mirp 2.6.0 feature extraction on the four IBSI phantom slices (by_slice=True, base_discretisation_method=none), recipe glszm.ibsi_phantom_2d; agreement within 2.0e-16 relative (7.1e-15 absolute) worst case, asserted on each slice AND on the four-slice mean at SPEC 7's exact tier -- an ABSOLUTE 1e-9 band -- in test_2d_glszm_mirp.h. PyRadiomics 3.0.1 was run on the same fixture and recipe and agrees with these goldens to 7.0e-16, so the row's former oracle=pyradiomics claim is corroborated rather than dropped; only mirp's values are pinned, a second identical table being redundancy and not coverage. The same quantities are pinned against the published IBSI consensus in test_2d_glszm_ibsi.h at rel=1e-2, the 3-significant-figure precision those values are published to. Nyxus' default mode (ibsi=false) computes a different quantity on the same fixture and is drift-pinned only, in test_2d_glszm_regression.h. gen_glszm_mirp.py; tests/vetting/audit/glszm_2d_mirp_vetting_report.md" @@ -397,7 +397,7 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 2D,gabor,GABOR,vetted,skimage,gabor.python_raw_defaults,rel=1e-3,agreed,bench_dsb2018_2d,TEST_NYXUS.TEST_2D_GABOR_PYTHON_RAW_DEFAULTS_SKIMAGE,,,in-tree,skimage,test_2d_gabor_cpp_static_defaults_skimage;test_2d_gabor_python_raw_defaults_skimage,,test_2d_gabor_gpu_runs_mechanics,2,0,"two config points, both oracle-asserted on bench_dsb2018_2d. skimage supplies the KERNEL; the f0=0 member and the WND-CHARM count-ratio SCORE are analytic (skimage has no native equivalent of the score, and gabor_kernel cannot express frequency 0). No regression file exists: every pinned value carries an oracle claim. The GPU path carries no oracle claim and is guarded size-only by the mechanics case",test_2d_gabor_python_raw_defaults_skimage,agree,row+config,audit/gabor_2d_skimage_vetting_report.md,audit/gabor_2d_golden_regen.md,matrix/gabor.md,"Vetted vs scikit-image 0.26.0 at the default lists gabor_freqs=[4,16,32,64], gabor_thetas=[0,45,90,135] deg as GaborOptions::parse_input builds them (f0={4,16,32,64}, theta={0,pi/4,pi/2,3pi/4} rad) - the config the Python API always runs and a CLI run that passes both flags. All 16 pins reproduced exactly by gen_gabor_skimage.py (max |diff| 0.000e+00). This config point was added 2026-08 because the family's only vetted row covered gabor.cpp_static_defaults, a different frequency and angle set whose values differ from this one by up to 0.84 absolute on the same ROI - so no in-tree assertion covered what users compute. UNITS: the recipe is named 'python_raw' because parse_input converts the angles (deg->rad) and passes the frequencies through untouched, while nyxus.py and the CLI help both document gabor_freqs as denominators of pi and nothing in the tree divides by pi; the assertion covers the numbers that reach the filter, not the documented units contract, which is an unresolved source question (vetting report section 8 item 4). SCOPE of oracle=skimage (SPEC 4 allows one token per row; the claim is narrower than the token): skimage supplies the KERNEL at the non-degenerate (f0,theta) points - gabor_kernel(frequency=f0/2pi, sigma_x=sig2lam*2pi/f0, sigma_y=sigma_x/gamma, offset=0) cropped to the Nyxus 16x16 grid - while the count-ratio SCORE is Nyxus' own WND-CHARM definition reproduced in the generator, because skimage has no native equivalent to compare the whole feature against. A full-feature oracle would be wndcharm; not built in this tree, recorded in not_covered.md. SCOPE 2: the GPU path is NOT vetted - calculate_gpu (FFT convolution) diverges from the direct-convolution CPU path on these ROIs; the assertion covers the in-RAM CPU path only, and the GPU path's plumbing guard is TEST_NYXUS.TEST_2D_GABOR_GPU_RUNS_MECHANICS. SCOPE 3: the 16x16 kernel crop is part of the recipe rather than a detail - at gamma=0.1 only 7.9-47.6 percent of the kernel's L1 mass falls inside that window at the low frequencies, and scoring off skimage's own filtering (skimage.filters.gabor, untruncated support, zero-padded border) moves values by up to 1.005; generator part D2 re-runs that control. See audit/gabor_2d_skimage_vetting_report.md." 2D,radial,MEAN_FRAC,regression,,radial.shape2d_native,rel=1e-9,disagreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,convention-mismatch,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",in-tree,,,test_2d_radial_bin_conventions_regression;test_2d_radial_distribution_regression,test_2d_radial_bin_index_mechanics;test_2d_radial_empty_bins_are_zero_invariant,0,2,"8-bin vector, every bin asserted separately. Not CellProfiler-vettable: CP's MeanFrac is dimensionless (bin mean over ROI mean, ~1), Nyxus returns the raw bin mean intensity.",test_2d_radial_bin_conventions_regression;test_2d_radial_distribution_regression;test_2d_radial_empty_bins_are_zero_invariant,agree,row,audit/radial_2d_cellprofiler_vetting_report.md,audit/radial_2d_golden_regen.md,matrix/radial.md,"Not CellProfiler-vettable: CP's MeanFrac is normalised by the ROI mean intensity and lands near 1, Nyxus' is the bin's raw mean intensity. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the raw-bin-mean convention (intensity range, and the reconstruction of the ROI total together with FRAC_AT_D) is characterized by TEST_2D_RADIAL_BIN_CONVENTIONS_REGRESSION, not asserted as an invariant, because CellProfiler's normalised MeanFrac satisfies neither. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1." 2D,radial,RADIAL_CV,regression,,radial.shape2d_native,rel=1e-9,disagreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_RADIAL_DISTRIBUTION_REGRESSION;TEST_NYXUS.TEST_2D_RADIAL_CV_IS_WITHIN_ITS_BOUND_INVARIANT;TEST_NYXUS.TEST_2D_RADIAL_EMPTY_BINS_ARE_ZERO_INVARIANT,convention-mismatch,"cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*) -- run 2026-08-20, does not vet",in-tree,,,test_2d_radial_distribution_regression,test_2d_radial_bin_index_mechanics;test_2d_radial_cv_is_within_its_bound_invariant;test_2d_radial_empty_bins_are_zero_invariant,0,1,"8-bin vector, every bin asserted separately. Not CellProfiler-vettable: CP takes the CV of the eight wedge MEANS over the NON-EMPTY wedges, Nyxus the CV of the eight wedge SUMS over all eight.",test_2d_radial_cv_is_within_its_bound_invariant;test_2d_radial_distribution_regression;test_2d_radial_empty_bins_are_zero_invariant,agree,row,audit/radial_2d_cellprofiler_vetting_report.md,audit/radial_2d_golden_regen.md,matrix/radial.md,"Not CellProfiler-vettable: CP takes the CV of the 8 wedge means over the non-empty wedges, Nyxus the CV of the 8 wedge sums over all 8. Full run, numbers and the six divergences in tests/vetting/audit/radial_2d_cellprofiler_vetting_report.md; generator tests/vetting/oracles/gen_radial_cellprofiler.py. 8-bin vector, every bin asserted separately at rel=1e-9 by TEST_2D_RADIAL_DISTRIBUTION_REGRESSION against a measured residual of 0; the sqrt(num_bins-1) bound and the empty-bin zero hold under either wedge convention and are asserted by the two invariants named in test_name. test_2d_radial_mechanics.h pins the contour frame, centre and radius the table depends on and is deliberately credited to no feature - it characterizes known defects (report §6) that a fix must change, see not_covered.md §A.1." -2D,zernike,ZERNIKE2D,vetted,analytic,zernike.shape2d_native,rel=1e-12,agreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",in-tree,analytic,test_2d_zernike_moments_analytic,test_2d_zernike_moments_regression,test_2d_zernike_every_pixel_is_inside_the_unit_disk_mechanics;test_2d_zernike_first_moment_about_the_centroid_vanishes_invariant;test_2d_zernike_geometry_mechanics;test_2d_zernike_index_set_matches_the_declared_count_invariant;test_2d_zernike_magnitudes_are_within_their_bound_invariant;test_2d_zernike_zeroth_moment_is_one_over_pi_invariant,1,1,"30 magnitudes, one per (n,m) with n<=9 and n-m even; every entry asserted separately. Vetted against the closed form (factorial series for R_nm) at ZernikeFeature's own geometry, which tests the Singh & Walia recurrence rather than restating it; centrosome's polynomials corroborate to 4.9e-15. NOT comparable to CellProfiler's Zernikes -- different disk and normalisation.",test_2d_zernike_moments_analytic,agree,row,audit/zernike_2d_analytic_vetting_report.md,audit/zernike_2d_golden_regen.md,,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count). The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +2D,zernike,ZERNIKE2D,vetted,analytic,zernike.shape2d_native,rel=1e-12,agreed,bench_shape8_concave_holed,TEST_NYXUS.TEST_2D_ZERNIKE_MOMENTS_ANALYTIC,,"cellprofiler:MeasureObjectIntensityDistribution (ZernikeMagnitude) -- run 2026-08-20, different disk and normalisation, not comparable",in-tree,analytic,test_2d_zernike_moments_analytic,test_2d_zernike_moments_regression,test_2d_zernike_every_pixel_is_inside_the_unit_disk_mechanics;test_2d_zernike_first_moment_about_the_centroid_vanishes_invariant;test_2d_zernike_geometry_mechanics;test_2d_zernike_index_set_matches_the_declared_count_invariant;test_2d_zernike_magnitudes_are_within_their_bound_invariant;test_2d_zernike_zeroth_moment_is_one_over_pi_invariant,1,1,"30 magnitudes, one per (n,m) with n<=9 and n-m even; every entry asserted separately. Vetted against the closed form (factorial series for R_nm) at ZernikeFeature's own geometry, which tests the Singh & Walia recurrence rather than restating it; centrosome's polynomials corroborate to 4.9e-15. NOT comparable to CellProfiler's Zernikes -- different disk and normalisation.",test_2d_zernike_moments_analytic,agree,row,audit/zernike_2d_analytic_vetting_report.md,audit/zernike_2d_golden_regen.md,,"Vetted against the closed form: the factorial series for R_nm evaluated at ZernikeFeature's own geometry (unit disk on the intensity centroid, radius min(bbox w,h)). zernike.cpp uses the Singh & Walia recurrence instead, so the agreement tests the recurrence rather than restating it; centrosome's own polynomials corroborate to 4.9e-15. Measured residual 3.4e-15 worst, banded rel=1e-12 with a 1e-15 floor because (n=1,m=1) is a mathematical zero. This PR fixes a defect that made all 30 values wrong -- the angular tables were seeded at cos(theta) instead of cos(0), so every moment of repetition m used cos((m+1)*theta); see tests/vetting/audit/zernike_2d_analytic_vetting_report.md. CellProfiler's own Zernikes are NOT comparable (minimum-enclosing-circle disk, normalised by pixel count)." 2D,moments,SPAT_MOMENT_00,vetted,skimage,moments.skimage_regionprops,rel=1e-6,agreed,,,,,in-tree,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,,,2,0,,,agree,feature,audit/moments_2d_skimage_vetting_report.md,audit/moments_2d_golden_regen.md,,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." 2D,moments,SPAT_MOMENT_01,vetted,skimage,moments.skimage_regionprops,rel=1e-6,agreed,,,,,in-tree,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,,,2,0,,,agree,feature,audit/moments_2d_skimage_vetting_report.md,audit/moments_2d_golden_regen.md,,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." 2D,moments,SPAT_MOMENT_02,vetted,skimage,moments.skimage_regionprops,rel=1e-6,agreed,,,,,in-tree,skimage,test_2d_moments_shape_skimage,,,1,0,,,agree,feature,audit/moments_2d_skimage_vetting_report.md,audit/moments_2d_golden_regen.md,,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." @@ -696,8 +696,8 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,morphology,3LEAST_AXIS_LEN,vetted,pyradiomics,morphology3d.pyradiomics_anisotropic,rel=1e-9,agreed,,TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_LEAST_AXIS_LEN_PYRADIOMICS,,,in-tree,mirp;pyradiomics,test_3d_morphology_aniso_least_axis_len_pyradiomics;test_3d_morphology_least_axis_len_mirp,,,2,0,"was >3MAJOR_AXIS_LEN before the eigenvalue-order fix, structurally impossible",test_3d_morphology_aniso_least_axis_len_pyradiomics,agree,row,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"PyRadiomics 3.0.1 LeastAxisLength=83.765297555890839 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py. pyradiomics normalizes the covariance by N, Nyxus by N-1, so Nyxus is asserted against the pin times sqrt(N/(N-1)), N=274432 (Nyxus normalization, not a tolerance), at rel=1e-9." 3D,morphology,3ELONGATION,vetted,pyradiomics,morphology3d.pyradiomics_anisotropic,rel=1e-9,agreed,,TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_ELONGATION_PYRADIOMICS,,,in-tree,mirp;pyradiomics,test_3d_morphology_aniso_elongation_pyradiomics;test_3d_morphology_elongation_mirp,,,2,0,,test_3d_morphology_aniso_elongation_pyradiomics,agree,row,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"PyRadiomics 3.0.1 Elongation=0.64206222930112822 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9." 3D,morphology,3FLATNESS,vetted,pyradiomics,morphology3d.pyradiomics_anisotropic,rel=1e-9,agreed,,TEST_NYXUS.TEST_3D_MORPHOLOGY_ANISO_FLATNESS_PYRADIOMICS,,,in-tree,mirp;pyradiomics,test_3d_morphology_aniso_flatness_pyradiomics;test_3d_morphology_flatness_mirp,,,2,0,"was >1 before the eigenvalue-order fix, which is structurally impossible",test_3d_morphology_aniso_flatness_pyradiomics,agree,row,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"PyRadiomics 3.0.1 Flatness=0.46852288961977678 at voxel spacing (1.3, 0.8, 2.5), reproduced by tests/vetting/oracles/gen_morphology3d_pyradiomics.py; the ratio cancels the N vs N-1 covariance normalization, asserted directly at rel=1e-9." -3D,morphology,3MESH_VOLUME,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;mirp;pyradiomics,test_3d_morphology_aniso_mesh_volume_pyradiomics;test_3d_morphology_mesh_volume_mirp;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_zero_intensity_hull_analytic,,,4,0,"IBSI volume (mesh) = MIRP morph_volume 274338.3438, pinned at rel=1e-6; also pinned against closed-form solids in the analytic file. MATLAB regionprops3 carries no mesh volume, so it holds no row for this feature",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." -3D,morphology,3VOLUME_CONVEXHULL,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;matlab;mirp,test_3d_morphology_lattice_hull_volume_analytic;test_3d_morphology_planar_hull_volume_analytic;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_volume_convex_hull_matlab;test_3d_morphology_volume_convex_hull_mirp;test_3d_morphology_zero_intensity_hull_analytic,test_3d_morphology_volume_convex_hull_regression,,6,1,"hull of the mesh vertices = MIRP's hull 496958.3201, pinned at rel=1e-6; MATLAB regionprops3 ConvexVolume 497824 counts the rasterised hull, asserted at 0.174% in a 0.5% band; also pinned at rel=1e-12 against boxes, octahedra and rhombic prisms in the analytic file",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,morphology,3MESH_VOLUME,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;mirp;pyradiomics,test_3d_morphology_aniso_mesh_volume_pyradiomics;test_3d_morphology_mesh_volume_mirp;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_zero_intensity_hull_analytic,,,4,0,"IBSI volume (mesh) = MIRP morph_volume 274338.3438, pinned at rel=1e-6; also pinned against closed-form solids in the analytic file. MATLAB regionprops3 carries no mesh volume, so it holds no row for this feature",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h. A single voxel's 0.5-isolevel surface is the octahedron with vertices half a lattice step out (volume 1/6) and a solid w x h x d box is a bevelled box whose volume is an exact function of w, h and d, in both the general and the whole-volume (SINGLEROI) branch; a box with zero intensities gives the same. Every golden holds at rel=1e-12. No external tool is involved, so this row is independent of the MIRP row on the same feature. The shapes separate the conventions outright: counting voxels returns 1 for the single voxel against 1/6. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation." +3D,morphology,3VOLUME_CONVEXHULL,vetted,analytic,morphology3d.analytic_lattice_solids,rel=1e-12,agreed,,,,,in-tree,analytic;matlab;mirp,test_3d_morphology_lattice_hull_volume_analytic;test_3d_morphology_planar_hull_volume_analytic;test_3d_morphology_single_voxel_mesh_analytic;test_3d_morphology_volume_convex_hull_matlab;test_3d_morphology_volume_convex_hull_mirp;test_3d_morphology_zero_intensity_hull_analytic,test_3d_morphology_volume_convex_hull_regression,,6,1,"hull of the mesh vertices = MIRP's hull 496958.3201, pinned at rel=1e-6; MATLAB regionprops3 ConvexVolume 497824 counts the rasterised hull, asserted at 0.174% in a 0.5% band; also pinned at rel=1e-12 against boxes, octahedra and rhombic prisms in the analytic file",,agree,feature,audit/morphology_3d_mirp_vetting_report.md,audit/morphology_3d_golden_regen.md,,"vetted vs closed-form geometry, recipe morphology3d.analytic_lattice_solids, asserted in test_3d_morphology_analytic.h through D3_SurfaceFeature. 3VOLUME_CONVEXHULL is the volume of the convex hull of the mesh vertices, each an in-ROI voxel moved half a step towards an out-of-ROI neighbour, so on a lattice solid whose extreme voxels are known it is exact: the single voxel (1/6) and the w x h x d box (the bevelled box, in both SINGLEROI settings) are their own hulls, the octahedron |x|+|y|+|z| <= R gives 4/3 (R+1/2)^3 (R = 3, 8, 15), and the rhombic prism |x|+|y| <= R, |z| <= H gives a prism of radius R+1/2 and height 2H with two frusta of height 1/2 (R = 4, 12; H = R/2+1). A one-slice ROI gives its bevelled slab, and a box with zero intensities the uniform box's value. The solids sit hundreds of voxels from the origin and every volume holds at rel=1e-12; qhull over the same vertices reproduces each to 5e-16. No external tool is involved, so this row is independent of the MIRP and MATLAB rows on the same feature. The quick_hull kernel under the feature is checked predicate by predicate in test_3d_morphology_mechanics.h, which is mechanics and claims no vetting. Scope: ROIs whose surface has no ambiguous face (two diagonal corners inside); the phantom has none, so no value assertion reaches the 120 case-table entries that depart from the classic triangulation." 3D,glcm,3GLCM_ACOR,vetted,pyradiomics,glcm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glcm_acor_ave_pyradiomics;test_3d_glcm_acor_pyradiomics,test_3d_glcm_acor_regression,,2,1,,,agree,feature,audit/glcm_3d_pyradiomics_vetting_report.md,audit/glcm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only)." 3D,glcm,3GLCM_ASM,vetted,pyradiomics,glcm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glcm_asm_ave_pyradiomics;test_3d_glcm_asm_pyradiomics;test_3d_glcm_ave_equivalence_pyradiomics;test_3d_glcm_equivalence_dump_pyradiomics,test_3d_glcm_asm_regression,,4,1,,,agree,feature,audit/glcm_3d_pyradiomics_vetting_report.md,audit/glcm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only)." 3D,glcm,3GLCM_CLUPROM,vetted,pyradiomics,glcm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glcm_cluprom_ave_pyradiomics;test_3d_glcm_cluprom_pyradiomics,test_3d_glcm_cluprom_regression,,2,1,,,agree,feature,audit/glcm_3d_pyradiomics_vetting_report.md,audit/glcm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glcm3d.pyradiomics_bincount20, PER DIRECTION: the assertion in test_3d_glcm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glcm_3d_pyradiomics_ref_vals_by_angle), not the average of them - an average agrees whenever per-direction errors cancel. Both sides are symmetric here (Nyxus symmetrises under radiomics grey binning, 3d_glcm.cpp), so the measured residual is <= 1.2e-15. Goldens and the angle mapping from gen_glcm3d_pyradiomics.py. test_3d_glcm_regression.h pins Nyxus' own values on a different phantom and bin count and claims no oracle (drift guard only)." @@ -982,9 +982,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_ut_phantom,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_LAHGLE_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_lahgle_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom on bench_ut57_3d (label 57) at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=64 -- MATLAB-style binning, the configuration the retired 3D coverage sweep ran every 3D family at on this phantom. Establishes no vetting (SPEC 1): the values are Nyxus' own %.17g output and catch movement only. PyRadiomics has no MATLAB-binning counterpart, so this configuration has no oracle; the family's vetted rows are glszm3d.pyradiomics_bincount20 and glszm3d.pyradiomics_ibsi_gapped. Re-pinned in this pass: the file held sixteen functions that test_all.cc had never called, and its old pins reproduced at no configuration in the tree. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_ut_phantom_nobinning,rel=1e-9,,bench_ut57_3d,TEST_NYXUS.TEST_3D_GLSZM_DEFAULT_GREYDEPTH_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_default_greydepth_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_ut_phantom_nobinning on bench_ut57_3d (label 57) at GLSZM_GREYDEPTH=0 -- no binning at all, which is the value a run that passes no --3glszm/greydepth reaches the feature with. That makes this the family's default configuration rather than a variant of the other two: the background is intensity 0 here and bin 1 under MATLAB binning, so it is a different quantity and not a coarser one. Establishes no vetting (SPEC 1). Sixteen numeric pins under one gtest case, because one phantom read answers all sixteen and the matrix at this setting is as wide as the phantom's largest raw level. The same setting does have an oracle on a fixture small enough to carry one: glszm3d.pyradiomics_ibsi_gapped. test_3d_glszm_default_greydepth_mechanics separately asserts that compile_feature_settings() delivers 0 here, and test_3d_glszm_constant_roi_regression pins the soft-NaN a constant-intensity ROI comes back as -- a known defect, carried in tests/vetting/matrix/glszm3d.md as a VALID-prod-only cell. Evidence: tests/vetting/audit/glszm_3d_golden_regen.md." 3D,glszm,3GLSZM_SAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_SAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glszm,3GLSZM_SAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic;test_3d_glszm_sae_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_sae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make SAE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glszm,3GLSZM_LAE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." -3D,glszm,3GLSZM_LAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 is past INT_MAX, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glszm,3GLSZM_LAE,vetted,analytic,glszm3d.analytic_two_large_zones,rel=1e-12,agreed,bench_glszm_3d_two_large_zones,TEST_NYXUS.TEST_3D_GLSZM_LARGE_ZONE_SIZE_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lae_pyradiomics;test_3d_glszm_large_zone_size_emphasis_analytic,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lae_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,3,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_large_zone_size_emphasis_analytic,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"vetted against its closed form on bench_glszm_3d_two_large_zones, recipe glszm3d.analytic_two_large_zones: a 64x64x32 volume whose two halves, at levels 1 and 2, are two 26-connected zones of L = 65,536 voxels each, read with no binning. Two zones of one size make LAE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the square of the zone size is taken in double; a zone of 46,341 voxels or more is enough to need it, and a whole-organ ROI reaches that routinely. The family's PyRadiomics fixtures stop at a largest zone of 634 voxels. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glszm,3GLSZM_GLN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_gln_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_gln_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_GLNN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_glnn_pyradiomics;test_3d_glszm_ibsi_gapped_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_glnn_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_SZN,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_szn_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_szn_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." @@ -1000,9 +1000,9 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glszm,3GLSZM_LALGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lalgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lalgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glszm,3GLSZM_LAHGLE,regression,,glszm3d.regression_constant_roi,abs=1e-9,,bench_cube2_constant,TEST_NYXUS.TEST_3D_GLSZM_CONSTANT_ROI_REGRESSION,,,in-tree,pyradiomics,test_3d_glszm_ibsi_gapped_pyradiomics;test_3d_glszm_lahgle_pyradiomics,test_3d_glszm_constant_roi_regression;test_3d_glszm_default_greydepth_regression;test_3d_glszm_lahgle_regression,test_3d_glszm_compatibility;test_3d_glszm_default_greydepth_mechanics;test_3d_glszm_ibsi_equals_no_binning_mechanics,2,3,"the size-zone matrix all sixteen features contract is pinned cell by cell as well, read off the feature object calculate() filled, in test_3d_glszm_matrix_pyradiomics | also asserted by test_3d_glszm_compatibility (kind is neither oracle nor regression) | also asserted by test_3d_glszm_default_greydepth_mechanics (kind is neither oracle nor regression) | also asserted by test_3d_glszm_ibsi_equals_no_binning_mechanics (kind is neither oracle nor regression)",test_3d_glszm_constant_roi_regression,agree,row+config,audit/glszm_3d_pyradiomics_vetting_report.md,audit/glszm_3d_golden_regen.md,matrix/glszm3d.md,"Snapshot drift guard only, recipe glszm3d.regression_constant_roi on bench_cube2_constant -- a 2x2x2 volume of one non-background intensity at GREYDEPTH=64, IBSI=false, GLSZM_GREYDEPTH=0, with the soft-NaN sentinel set to -98765 so a zero-filled buffer cannot satisfy the assertion. Establishes no vetting (SPEC 1). What it pins is a known defect rather than an endorsed value: a constant-intensity ROI is fully populated and has sixteen finite features over it -- on this cube SAE = 1/64, LAE = 64, ZE = 0, GLV = 0, ZP = 1/8 -- and calculate()'s unconditional aux_min == aux_max intercept returns the sentinel for all sixteen instead. The intercept is doing real work at radiomics binning, where to_grayscale_radiomix divides by (max - min); it is not conditioned on that, so it also discards the two schemes that would have answered. Narrowing it changes a public feature's output on a reachable input, so it is src work on its own branch and this row pins the current behaviour rather than endorsing it -- these sixteen assertions are what fail the day it is narrowed. Banded at SPEC 7's absolute exact tier; the assertion is ASSERT_EQ, bit-exact against the sentinel, because no arithmetic runs below the intercept. The same GLSZM_GREYDEPTH on a phantom is glszm3d.regression_ut_phantom_nobinning, which says nothing about this path. Recorded in tests/vetting/matrix/glszm3d.md; evidence tests/vetting/audit/glszm_3d_pyradiomics_vetting_report.md." 3D,glrlm,3GLRLM_SRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_sre_pyradiomics,test_3d_glrlm_sre_grey64_regression;test_3d_glrlm_sre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so SRE = 1/L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lre_pyradiomics,test_3d_glrlm_lre_grey64_regression;test_3d_glrlm_lre_regression,,3,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so LRE = L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_GLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_gln_pyradiomics,test_3d_glrlm_gln_grey64_regression;test_3d_glrlm_gln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_GLNN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_glnn_pyradiomics,test_3d_glrlm_glnn_grey64_regression;test_3d_glrlm_glnn_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_RLN,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_rln_pyradiomics,test_3d_glrlm_rln_grey64_regression;test_3d_glrlm_rln_regression,,2,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." @@ -1016,21 +1016,21 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_HGLRE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." 3D,glrlm,3GLRLM_HGLRE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_hglre_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic,test_3d_glrlm_hglre_grey64_regression;test_3d_glrlm_hglre_regression,,3,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so HGLRE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. 3GLRLM_HGLRE converts the level to double before squaring it in every version of the code, so for it the fixture pins the value without telling a 32-bit square from a double one. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so SRLGLE = (1 + 1/4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srlgle_pyradiomics,test_3d_glrlm_srlgle_grey64_regression;test_3d_glrlm_srlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so SRHGLE = (1 + 4) / 2 / L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_srhgle_pyradiomics,test_3d_glrlm_srhgle_grey64_regression;test_3d_glrlm_srhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so SRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRLGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so LRLGLE = (1 + 1/4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRLGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrlgle_pyradiomics,test_3d_glrlm_lrlgle_grey64_regression;test_3d_glrlm_lrlgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRLGLE = (1 + 1/G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRHGLE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20, PER DIRECTION: test_3d_glrlm_pyradiomics.h compares all 13 directional values of this feature against PyRadiomics' own per-angle values (glrlm_3d_pyradiomics_ref_vals_by_angle), not their average - on this fixture the average agrees to 1e-16 even when the directions are paired up wrongly, so averaging cannot vet them. Measured residual <= 5.5e-16 per direction. Angle slots line up one-to-one with PyRadiomics because both order angles (dz,dy,dx); goldens and that mapping from gen_glrlm3d_pyradiomics.py. test_3d_glrlm_regression.h pins Nyxus' own values on the ut_ phantom at a different bin count and claims no oracle." -3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 46,656 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX and 2^2 * L^2 is past UINT_MAX, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, the first half at level 1 and the second at level 2, read with the levels as they are. In direction slot 12, {dz=0, dy=0, dx=1}, along the line that is two runs of L = 65,536 voxels each, one at level 1 and one at level 2, so LRHGLE = (1 + 4) / 2 * L^2 exactly, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the value is right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRHGLE,vetted,analytic,glrlm3d.analytic_high_grey_pair,rel=1e-12,agreed,bench_glrlm_3d_high_grey_pair,TEST_NYXUS.TEST_3D_GLRLM_HIGH_GREY_LEVEL_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_high_grey_level_emphasis_analytic;test_3d_glrlm_long_run_emphasis_analytic;test_3d_glrlm_lrhgle_pyradiomics,test_3d_glrlm_lrhgle_grey64_regression;test_3d_glrlm_lrhgle_regression,,4,2,,test_3d_glrlm_high_grey_level_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_high_grey_pair, recipe glrlm3d.analytic_high_grey_pair: two adjacent voxels at intensities 1 and G = 70,000, read with the levels as they are. Every direction sees two runs of length 1, so LRHGLE = (1 + G^2) / 2 exactly, asserted at rel=1e-12 in all 13 directions. THE CONFIG POINT PAST THE 32-BIT RANGE: G^2 = 4.9e9 is past UINT_MAX, so the value is right only if the grey level is squared in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_SRE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_sre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving 1/L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_LRE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lre_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving L^2; every other direction sees 2L runs of length 1, giving 1. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_GLN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_gln_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_GLNN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_glnn_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_RLN_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_rln_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." @@ -1042,13 +1042,13 @@ dim,family,feature,claim_status,claim_oracle,claim_recipe,claim_tolerance,claim_ 3D,glrlm,3GLRLM_LGLRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_lglre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_HGLRE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,pyradiomics,test_3d_glrlm_ave_pyradiomics,test_3d_glrlm_hglre_ave_grey64_regression,test_3d_glrlm_compatibility,1,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." 3D,glrlm,3GLRLM_SRLGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_SRLGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRLGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_SRHGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_SRHGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_SRHGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_srhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 / L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRLGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_LRLGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRLGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrlgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 1/4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 1/4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." 3D,glrlm,3GLRLM_LRHGLE_AVE,vetted,pyradiomics,glrlm3d.pyradiomics_bincount20,rel=1e-9,agreed,,,,,audit,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),,agree,feature,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted vs PyRadiomics 3.0.1 on the compat phantom, recipe glrlm3d.pyradiomics_bincount20. PyRadiomics reports one value per feature over its whole direction set, which is this *_AVE aggregation over the 13 3D angles; the assertion reads the stored *_AVE feature rather than recomputing it. The 13 directional values of the base feature are asserted separately and per direction. Measured residual <= 5.5e-16. test_3d_glrlm_regression.h additionally pins this feature at the grey64 profile (GLRLM_GREYDEPTH=+64), a second configuration nothing else exercises; that pin claims no oracle." -3D,glrlm,3GLRLM_LRHGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 46,656, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2,176,782,336 is past INT_MAX, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." +3D,glrlm,3GLRLM_LRHGLE_AVE,vetted,analytic,glrlm3d.analytic_two_long_runs,rel=1e-12,agreed,bench_glrlm_3d_two_long_runs,TEST_NYXUS.TEST_3D_GLRLM_LONG_RUN_EMPHASIS_ANALYTIC,,,in-tree,analytic;pyradiomics,test_3d_glrlm_ave_pyradiomics;test_3d_glrlm_long_run_emphasis_analytic,test_3d_glrlm_lrhgle_ave_grey64_regression,test_3d_glrlm_compatibility,2,1,also asserted by test_3d_glrlm_compatibility (kind is neither oracle nor regression),test_3d_glrlm_long_run_emphasis_analytic,agree,row,audit/glrlm_3d_pyradiomics_vetting_report.md,audit/glrlm_3d_golden_regen.md,,"vetted against its closed form on bench_glrlm_3d_two_long_runs, recipe glrlm3d.analytic_two_long_runs: one line of 2L voxels, L = 65,536, half at level 1 and half at level 2. At direction slot 12, along the line the line is two runs of length L, giving (1 + 4) / 2 * L^2; every other direction sees 2L runs of length 1, giving (1 + 4) / 2. The _AVE is the mean of the 13 directions, asserted at rel=1e-12. THE CONFIG POINT PAST THE 32-BIT RANGE: L^2 = 2^32 wraps to exactly 0 in 32 bits, read signed or unsigned, so the along-the-line value enters the mean right only if the run-length terms are taken in double. No generator: the reference is arithmetic. The band is rel=1e-12 rather than SPEC 7's exact tier (abs 1e-9): these emphases run from below 1e-9 to past 1e9, so an absolute 1e-9 would accept a small one of 0 and lies below a large one's last bit." IMQ,imq,FOCUS_SCORE,vetted,opencv,imq.laplacian_ksize1_zeropad,abs=1e-9,agreed,bench_imq_quality_roi,TEST_NYXUS.TEST_IMQ_FOCUS_SCORE_OPENCV,,,audit,opencv,test_imq_focus_score_opencv,,test_imq_focus_score_out_of_core_invariant;test_imq_local_focus_score_thin_roi_mechanics,1,0,,test_imq_focus_score_opencv,agree,row,audit/imq_opencv_vetting_report.md,audit/imq_golden_regen.md,matrix/imq.md,"vetted vs OpenCV cv2.Laplacian(roi, CV_64F, ksize=1, BORDER_CONSTANT).var() = 34.956597222222221 (cv2 4.13.0, gen_imq_opencv.py), the Pech-Pacheco et al. (2000) variance-of-the-Laplacian focus measure. The generator asserts cv2's filtered image equals Nyxus' laplacian() cell for cell before comparing any scalar, so the convolution is proved and only the variance step is under test; Nyxus reproduces the scalar to 7.1e-15 absolute (2.0e-16 relative), which is summation order alone. Band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. SCOPE: ksize=1, the only kernel calculate() selects. laplacian()'s ksize>1 kernel is cv2.Laplacian's ksize=3 aperture exactly: both stencils are pinned from cv2's unit-spike response in test_imq_opencv.h (TEST_IMQ_FOCUS_SCORE_KERNEL_PER_CALL_OPENCV) and the generator asserts the ksize=3 filtered fixture equal to cv2's cell for cell. The out-of-core path shares the in-RAM scoring code and is held bit-equal to it by test_imq_invariant.h (an invariant, not vetting). Report: audit/imq_opencv_vetting_report.md; matrix/imq.md." IMQ,imq,LOCAL_FOCUS_SCORE,vetted,opencv,imq.laplacian_ksize1_zeropad,abs=1e-9,agreed,bench_imq_quality_roi,TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_OPENCV,,,audit,analytic;opencv,test_imq_local_focus_score_all_tiles_analytic;test_imq_local_focus_score_each_tile_analytic;test_imq_local_focus_score_opencv,,test_imq_focus_score_out_of_core_invariant;test_imq_local_focus_score_remainder_mechanics;test_imq_local_focus_score_smallest_tiled_roi_mechanics;test_imq_local_focus_score_thin_roi_mechanics,3,0,"opencv covers each tile's Laplacian variance and their mean; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row. See not_covered.md section E",test_imq_local_focus_score_opencv,agree,row,audit/imq_opencv_vetting_report.md,audit/imq_golden_regen.md,matrix/imq.md,"vetted vs OpenCV: the mean of cv2.Laplacian(tile, CV_64F, ksize=1, BORDER_CONSTANT).var() over the 2x2 grid of 4x6 tiles get_local_focus_score() cuts the 8x12 fixture into at scale=2 = 28.341145833333336 (cv2 4.13.0, gen_imq_opencv.py, which asserts the tile count and prints each tile's score). Nyxus reproduces it to 7.1e-15 absolute (2.5e-16 relative); band is SPEC 7's exact tier, an ABSOLUTE 1e-9 via ASSERT_NEAR. Negative control: the one-tile value a truncated y < height-M loop bound gives, 7.5763888888888902, is asserted to sit 73% away, so the pin tells the full tiling from the truncated one. Report: audit/imq_opencv_vetting_report.md; matrix/imq.md. ORACLE SPLIT (not_covered.md section E): OpenCV supplies each tile's Laplacian and population variance; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row." IMQ,imq,LOCAL_FOCUS_SCORE,vetted,analytic,imq.local_focus_single_spike,abs=0,agreed,,TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_EACH_TILE_ANALYTIC;TEST_NYXUS.TEST_IMQ_LOCAL_FOCUS_SCORE_ALL_TILES_ANALYTIC,,,in-tree,analytic;opencv,test_imq_local_focus_score_all_tiles_analytic;test_imq_local_focus_score_each_tile_analytic;test_imq_local_focus_score_opencv,,test_imq_focus_score_out_of_core_invariant;test_imq_local_focus_score_remainder_mechanics;test_imq_local_focus_score_smallest_tiled_roi_mechanics;test_imq_local_focus_score_thin_roi_mechanics,3,0,"opencv covers each tile's Laplacian variance and their mean; the tile grid is Nyxus' own definition, reproduced in the generator and pinned tile by tile by the analytic row. See not_covered.md section E",test_imq_local_focus_score_all_tiles_analytic;test_imq_local_focus_score_each_tile_analytic,agree,row,audit/imq_opencv_vetting_report.md,audit/imq_golden_regen.md,matrix/imq.md,"vetted against a closed form, no generator: a single spike of height v clear of the tile edge has a ksize=1 Laplacian of -4v at the spike and +v at its four neighbours, so its tile scores exactly 20v^2/P and every all-zero tile scores 0. test_imq_analytic.h places the spike in each of the scale^2 = 4 tiles in turn on 8x12, 9x12, 8x13 and 9x13 ROIs (a 2x2 grid of 4x6 tiles in all four) and asserts 20*36/24/4 = 7.5 for every placement, and 4x that with a spike in every tile. Exact band: integer arithmetic, exact in double. Both side parities are needed: a y < height-M loop bound stops after the first tile on an even side but reaches the second on an odd one. Which pixels belong to no tile, and the soft-NaN an ROI no tile fits returns, are Nyxus conventions pinned as mechanics in test_imq_mechanics.h, not vetted. See matrix/imq.md."