diff --git a/src/nyx/features/3d_glrlm.cpp b/src/nyx/features/3d_glrlm.cpp index aa7ef9bcb..e49620a37 100644 --- a/src/nyx/features/3d_glrlm.cpp +++ b/src/nyx/features/3d_glrlm.cpp @@ -342,9 +342,10 @@ 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) { - f += rj[j] / double(j * j); + f += rj[j] / (double(j) * double(j)); } double retval = f / sum_p; @@ -366,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 * j); + f += P.matlab(i, j) * (double(j) * double(j)); // j^2 in double: an int overflows at j >= 46,341 } } @@ -578,10 +579,12 @@ 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]; + // 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++) { - f += P.matlab(i, j) / double(inten * inten); + f += P.matlab(i, j) / (inten * inten); } } double retval = f / double(sum_p); @@ -601,10 +604,10 @@ 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]; // level in double: its square passes UINT_MAX at 65,536 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); @@ -624,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++) { - auto inten = 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(inten * inten * j * 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; @@ -647,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++) { - auto inten = 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(inten * inten) / double(j * 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; @@ -670,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++) { - auto inten = 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 * j) / double(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; @@ -693,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++) { - auto inten = 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(inten * inten * j * 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 67fd5871f..07377dbc3 100644 --- a/src/nyx/features/3d_glszm.cpp +++ b/src/nyx/features/3d_glszm.cpp @@ -820,48 +820,23 @@ 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() + // 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*/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); - } - double retval = tot / Nz; + 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() { -#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); - } - double retval = tot / Nz; + for (int j = 1; j <= Ns; 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 f89e391a5..5cce29ede 100644 --- a/src/nyx/features/glrlm.cpp +++ b/src/nyx/features/glrlm.cpp @@ -378,8 +378,9 @@ void GLRLMFeature::calc_SRE(AngledFtrs& af) } } + // 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] / (j * j); + f += rj[j] / (double(j) * double(j)); } double retval = f / double(sum_p[ai]); @@ -410,7 +411,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)); // j^2 in double: an int overflows at j >= 46,341 } } @@ -711,10 +712,12 @@ void GLRLMFeature::calc_LGLRE (AngledFtrs& af) double f = 0.0; for (int i = 1; i <= Ng; i++) { - auto inten = I[i-1]; + // 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++) { - f += P.matlab(i, j) / double(inten*inten); + f += P.matlab(i, j) / (inten * inten); } } double retval = f / double(sum_p[ai]); @@ -743,10 +746,10 @@ 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]; // level in double: its square passes UINT_MAX at 65,536 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]); @@ -775,10 +778,10 @@ 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]; // level in double: its square passes UINT_MAX at 65,536 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))); // j^2 in double: an int overflows at j >= 46,341 } } double retval = f / double(sum_p[ai]); @@ -807,10 +810,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]; // level in double: its square passes UINT_MAX at 65,536 for (int j = 1; j <= Nr; j++) { - f += P.matlab(i, j) * double(inten * inten) / double(j * 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]); @@ -838,10 +841,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]; // 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 * j) / double(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]); @@ -870,10 +873,10 @@ 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]; // level in double: its square passes UINT_MAX at 65,536 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))); // 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 0f8f9e00c..0848faa17 100644 --- a/src/nyx/features/glszm.cpp +++ b/src/nyx/features/glszm.cpp @@ -421,9 +421,10 @@ 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] / (j * j); + f += sj[j] / (double(j) * double(j)); } double retval = f / sum_p; return retval; @@ -436,7 +437,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)); // j^2 in double: an int overflows at j >= 46,341 } double retval = f / sum_p; return retval; diff --git a/src/nyx/gpu/glszm.cu b/src/nyx/gpu/glszm.cu index bb0e6d303..998bcda74 100644 --- a/src/nyx/gpu/glszm.cu +++ b/src/nyx/gpu/glszm.cu @@ -117,8 +117,9 @@ namespace NyxusGpu return; float s = SJ[j]; - atomicAdd(&state[f_SAE], s / (j * j)); - atomicAdd(&state[f_LAE], s * (j * j)); + // 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); 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..60398d373 --- /dev/null +++ b/tests/test_2d_glrlm_analytic.h @@ -0,0 +1,108 @@ +#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`). + +// 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 +// 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); +} + +// 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]; + ASSERT_NEAR (actual, expected, 1e-12 * expected) << "feature " << (int)fcode << " angle " << angle; +} + +// 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^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 +// 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 = 65536; + 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_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)); + + // 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 +// 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_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_2d_glszm_analytic.h b/tests/test_2d_glszm_analytic.h new file mode 100644 index 000000000..058c4d34f --- /dev/null +++ b/tests/test_2d_glszm_analytic.h @@ -0,0 +1,52 @@ +#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 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 +// +// 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 = 256; + 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 = 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. + 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_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 new file mode 100644 index 000000000..7efef72c2 --- /dev/null +++ b/tests/test_3d_glrlm_analytic.h @@ -0,0 +1,109 @@ +#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`). + +// 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 + +// 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) +{ + D3_GLRLM_feature f; + 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]; + 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 = 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^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 +// 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 = 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; + + 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_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)); + + // 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 +// 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_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)); + } +} diff --git a/tests/test_3d_glrlm_common.h b/tests/test_3d_glrlm_common.h new file mode 100644 index 000000000..f8c41cb24 --- /dev/null +++ b/tests/test_3d_glrlm_common.h @@ -0,0 +1,27 @@ +#pragma once + +// Shared fixture for the 3D GLRLM tests: the settings a 3D GLRLM assertion runs on. + +#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' +// 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_pyradiomics.h b/tests/test_3d_glrlm_pyradiomics.h index 57e13c70a..4077f1b71 100644 --- a/tests/test_3d_glrlm_pyradiomics.h +++ b/tests/test_3d_glrlm_pyradiomics.h @@ -1,14 +1,13 @@ #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 // 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,25 +438,11 @@ 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 + // (3) feature settings mocking the pyRadiomics recipe above: GLRLM_GREYDEPTH = -20 is radiomics + // binCount-based grey binning + Fsettings s = make_glrlm3d_settings (100, -20); - 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 - - // (5) feature extraction + // (4) feature extraction // make it find the feature code by name int fcode = -1; @@ -471,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 @@ -521,18 +506,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_glrlm_regression.h b/tests/test_3d_glrlm_regression.h index 0d5dd6fd1..81b5536c0 100644 --- a/tests/test_3d_glrlm_regression.h +++ b/tests/test_3d_glrlm_regression.h @@ -1,15 +1,13 @@ #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 // 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 +132,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 new file mode 100644 index 000000000..28076aa9d --- /dev/null +++ b/tests/test_3d_glszm_analytic.h @@ -0,0 +1,37 @@ +#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 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 +// +// 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; + // 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/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 60b116c29..abb83f73d 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) { @@ -3264,6 +3292,12 @@ TEST(TEST_NYXUS, TEST_2D_GLRLM_RE_IBSI) ASSERT_NO_THROW(test_2d_glrlm_re_ibsi()); } +//***** 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) { diff --git a/tests/test_main_nyxus.h b/tests/test_main_nyxus.h index ac02c2274..d0d316747 100644 --- a/tests/test_main_nyxus.h +++ b/tests/test_main_nyxus.h @@ -212,3 +212,50 @@ 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; + } + + // 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); + fvals = r.fvals; +} 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..a42e3c268 100644 --- a/tests/vetting/benchmarks.md +++ b/tests/vetting/benchmarks.md @@ -270,6 +270,106 @@ 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` 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`. + +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`, 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 whose squared size is 2^32 + +| | | +|---|---| +| Data | `make_glszm_2d_two_large_zones()` in `tests/test_2d_glszm_analytic.h` | +| 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`. + +Tests reaching it today: `test_2d_glszm_analytic.h`. + +--- + +## `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 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`. + +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` | + +Recipes: `glrlm.analytic_high_grey_pair`. + +Tests reaching it today: `test_2d_glrlm_analytic.h`. + +--- + +## `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 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`. + +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`; `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`. + +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..fc6024c9d 100644 --- a/tests/vetting/config_recipes.md +++ b/tests/vetting/config_recipes.md @@ -430,6 +430,19 @@ 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 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 = 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 - 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 +472,27 @@ 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 = 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^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 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 + `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 +745,30 @@ 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 = 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^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 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 + `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. `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 - 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 @@ -995,6 +1053,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` 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. + ## 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..94ad897f0 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 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/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..d4bbef64d 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,,,,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",, +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 = 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",, @@ -273,14 +275,26 @@ 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_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_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. 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. 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 = 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 = 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 = 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 = 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 = 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 = 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.",, @@ -291,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 = 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 = 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 = 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 = 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 @@ -313,8 +331,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_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",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 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 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 @@ -962,7 +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 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 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 @@ -977,8 +999,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_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.",, +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 = 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.",, @@ -987,14 +1011,26 @@ 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_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_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 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 = 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 = 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 = 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 = 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 = 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 = 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.",, @@ -1005,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 = 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 = 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 = 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 = 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 c860474c8..bfada1945 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,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" +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 = 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" @@ -273,14 +275,26 @@ 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_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_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. 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. 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 = 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 = 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 = 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 = 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 = 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 = 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." @@ -291,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 = 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 = 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 = 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 = 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" @@ -313,8 +331,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,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" +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 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" @@ -897,14 +917,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 +981,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 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 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." @@ -977,8 +999,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,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." +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 = 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." @@ -987,14 +1011,26 @@ 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_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_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 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 = 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 = 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 = 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 = 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 = 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 = 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." @@ -1005,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 = 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 = 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 = 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 = 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." diff --git a/tests/vetting/report_output.md b/tests/vetting/report_output.md index 2b4e95775..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 -1020 of 1020 assertion rows agree with the tree. +1060 of 1060 assertion rows agree with the tree. | verdict | rows | meaning | |---|---:|---| -| `agree` | 1020 | 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,8 +46,8 @@ 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+config` | 207 | the case named in `test_name` asserts this feature at this `config_recipe` | +| `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,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 | 14 | . | . | 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 | 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** | **41** | **9** | **2** | **181** | **20** | **95** | **208** | **2** | **272** | **127** | **121** | +| | **all** | **73** | **9** | **2** | **181** | **20** | **95** | **208** | **2** | **272** | **127** | **121** | ## By dimensionality