diff --git a/tests/test_2d_moments_common.h b/tests/test_2d_moments_common.h index 5abb0d0e..b3f6ce4d 100644 --- a/tests/test_2d_moments_common.h +++ b/tests/test_2d_moments_common.h @@ -4,7 +4,6 @@ #include #include -#include #include #include @@ -53,9 +52,9 @@ static void load_geomoment_fixture(LR& roidata) { const auto intensity = static_cast(geomoment_fixture_intensity(x, y)); if (roidata.aux_area == 0) - init_label_record_3(roidata, x, y, intensity); + Nyxus::init_label_record_3(roidata, x, y, intensity); else - update_label_record_3(roidata, x, y, intensity); + Nyxus::update_label_record_3(roidata, x, y, intensity); } } @@ -100,7 +99,7 @@ static void calculate_2d_geomoment_feature_values(std::vector x) continue; if (roidata.aux_area == 0) - init_label_record_3(roidata, x, y, 1); + Nyxus::init_label_record_3(roidata, x, y, 1); else - update_label_record_3(roidata, x, y, 1); + Nyxus::update_label_record_3(roidata, x, y, 1); } for (int y = 0; y < height; y++) @@ -156,16 +155,16 @@ static void calculate_2d_wedge_geomoment_feature_values(std::vector>& fvals, const std::vector& golden_values, - const std::string& review_prefix) + const std::string& trace_prefix) { for (const auto& item : golden_values) { const double actual = fvals[static_cast(item.feature)][0]; const double scale = std::max({1.0, std::abs(item.golden_value), std::abs(actual)}); const double tolerance = 1e-6 * scale; - const std::string review_name = review_prefix + item.name; - SCOPED_TRACE(review_name); - ASSERT_TRUE(std::isfinite(actual)) << review_name << " returned a non-finite value"; - ASSERT_NEAR(actual, item.golden_value, tolerance) << review_name; + const std::string trace_name = trace_prefix + item.name; + SCOPED_TRACE(trace_name); + ASSERT_TRUE(std::isfinite(actual)) << trace_name << " returned a non-finite value"; + ASSERT_NEAR(actual, item.golden_value, tolerance) << trace_name; } } diff --git a/tests/test_2d_moments_regression.h b/tests/test_2d_moments_regression.h index 02e86d64..27d44a6c 100644 --- a/tests/test_2d_moments_regression.h +++ b/tests/test_2d_moments_regression.h @@ -48,8 +48,8 @@ static const ref_vals_list moments_2d_regression_shape_ref {Nyxus::Feature2D::WEIGHTED_HU_M2, "WEIGHTED_HU_M2", 0.00024306185106698786}, {Nyxus::Feature2D::WEIGHTED_HU_M3, "WEIGHTED_HU_M3", 1.1262214820995351e-05}, {Nyxus::Feature2D::WEIGHTED_HU_M4, "WEIGHTED_HU_M4", 7.674925625409561e-05}, - {Nyxus::Feature2D::WEIGHTED_HU_M5, "WEIGHTED_HU_M5", -1.8387946856938181e-09}, // FIX(h5): snapshot after the calcHu_imp h5 fix (skimage moments_hu on the pinned WT_NORM_CTR_MOM_*; gen_moments_skimage.py) - {Nyxus::Feature2D::WEIGHTED_HU_M6, "WEIGHTED_HU_M6", 2.1453724299933224e-07}, // FIX(h6): snapshot after the calcHu_imp h6 fix; old pin 0.004652... == WT_NORM_CTR_MOM_03, i.e. the stray "+eta03" of the precedence bug (gen_moments_skimage.py) + {Nyxus::Feature2D::WEIGHTED_HU_M5, "WEIGHTED_HU_M5", -1.8387946856938181e-09}, // skimage moments_hu over the pinned WT_NORM_CTR_MOM_* (gen_moments_skimage.py) + {Nyxus::Feature2D::WEIGHTED_HU_M6, "WEIGHTED_HU_M6", 2.1453724299933224e-07}, // distinct from WT_NORM_CTR_MOM_03; equality there means h6 lost the (eta21+eta03) grouping {Nyxus::Feature2D::WEIGHTED_HU_M7, "WEIGHTED_HU_M7", -1.3078000499389243e-09}, }; @@ -98,8 +98,8 @@ static const ref_vals_list moments_2d_regression_intensity {Nyxus::Feature2D::IMOM_WHU2, "IMOM_WHU2", 5.6161730111679807e-09}, {Nyxus::Feature2D::IMOM_WHU3, "IMOM_WHU3", 1.1923046864432925e-12}, {Nyxus::Feature2D::IMOM_WHU4, "IMOM_WHU4", 3.1287168309169019e-12}, - {Nyxus::Feature2D::IMOM_WHU5, "IMOM_WHU5", -3.578057915124686e-25}, // FIX(h5): snapshot after the calcHu_imp h5 fix (skimage moments_hu on the pinned IMOM_WNCM_*; gen_moments_skimage.py) - {Nyxus::Feature2D::IMOM_WHU6, "IMOM_WHU6", 3.297985694277869e-17}, // FIX(h6): snapshot after the calcHu_imp h6 fix; old pin 4.6265447915851515e-07 == IMOM_WNCM_03, i.e. the stray "+eta03" of the precedence bug (gen_moments_skimage.py) + {Nyxus::Feature2D::IMOM_WHU5, "IMOM_WHU5", -3.578057915124686e-25}, // skimage moments_hu over the pinned IMOM_WNCM_* (gen_moments_skimage.py) + {Nyxus::Feature2D::IMOM_WHU6, "IMOM_WHU6", 3.297985694277869e-17}, // distinct from IMOM_WNCM_03; equality there means h6 lost the (eta21+eta03) grouping {Nyxus::Feature2D::IMOM_WHU7, "IMOM_WHU7", -5.6202519491182231e-24}, }; @@ -107,12 +107,12 @@ void test_2d_moments_shape_regression() { std::vector> fvals; calculate_2d_geomoment_feature_values(fvals); - assert_2d_geomoment_features(fvals, moments_2d_regression_shape_ref_vals, "UNVETTED_NO_DIRECT_ORACLE__"); + assert_2d_geomoment_features(fvals, moments_2d_regression_shape_ref_vals, "REGRESSION__"); } void test_2d_moments_intensity_regression() { std::vector> fvals; calculate_2d_geomoment_feature_values(fvals); - assert_2d_geomoment_features(fvals, moments_2d_regression_intensity_ref_vals, "UNVETTED_NO_DIRECT_ORACLE__"); + assert_2d_geomoment_features(fvals, moments_2d_regression_intensity_ref_vals, "REGRESSION__"); } diff --git a/tests/test_2d_moments_skimage.h b/tests/test_2d_moments_skimage.h index 88225a6c..d6dea1aa 100644 --- a/tests/test_2d_moments_skimage.h +++ b/tests/test_2d_moments_skimage.h @@ -44,7 +44,7 @@ static const ref_vals_list moments_2d_skimage_shape_ref_va {Nyxus::Feature2D::HU_M2, "HU_M2", 0.0009336419753086421}, {Nyxus::Feature2D::HU_M3, "HU_M3", 0}, {Nyxus::Feature2D::HU_M4, "HU_M4", 0}, - {Nyxus::Feature2D::HU_M5, "HU_M5", 0}, // FIX(h5): oracle-exact 0 on this symmetric fixture (odd etas vanish); the old pin 4.598e-10 was summation noise of the defective h5 formula (gen_moments_skimage.py) + {Nyxus::Feature2D::HU_M5, "HU_M5", 0}, // exactly 0: the odd etas vanish on this symmetric fixture {Nyxus::Feature2D::HU_M6, "HU_M6", 0}, {Nyxus::Feature2D::HU_M7, "HU_M7", -2.3604559630908652e-10}, }; @@ -90,8 +90,8 @@ static const ref_vals_list moments_2d_skimage_intensity_re {Nyxus::Feature2D::IMOM_HU2, "IMOM_HU2", 3.7112807351259333e-08}, {Nyxus::Feature2D::IMOM_HU3, "IMOM_HU3", 2.6788774435431954e-11}, {Nyxus::Feature2D::IMOM_HU4, "IMOM_HU4", 2.8991603200922661e-12}, - {Nyxus::Feature2D::IMOM_HU5, "IMOM_HU5", -1.9898126265836865e-22}, // FIX(h5): skimage-oracle value after the calcHu_imp h5 fix; old pin encoded the 9x-bracket defect (gen_moments_skimage.py) - {Nyxus::Feature2D::IMOM_HU6, "IMOM_HU6", -6.66827346717698e-17}, // FIX(h6): skimage-oracle value after the calcHu_imp h6 fix; old pin -2.3976723312959013e-06 == IMOM_NCM_03, i.e. the stray "+eta03" of the precedence bug (gen_moments_skimage.py) + {Nyxus::Feature2D::IMOM_HU5, "IMOM_HU5", -1.9898126265836865e-22}, + {Nyxus::Feature2D::IMOM_HU6, "IMOM_HU6", -6.66827346717698e-17}, // distinct from IMOM_NCM_03; a value equal to it means h6 lost the (eta21+eta03) grouping {Nyxus::Feature2D::IMOM_HU7, "IMOM_HU7", 2.3835594243218353e-23}, }; @@ -121,30 +121,91 @@ static const ref_vals_list moments_2d_skimage_wedge_hu_ref {Nyxus::Feature2D::HU_M2, "HU_M2", 0.2921768785246152}, {Nyxus::Feature2D::HU_M3, "HU_M3", 0.06341348298776381}, {Nyxus::Feature2D::HU_M4, "HU_M4", 0.05042335332144146}, - {Nyxus::Feature2D::HU_M5, "HU_M5", 0.002851264767850148}, // defective h5 gives 0.0032935269006466807 (442x tolerance away) - {Nyxus::Feature2D::HU_M6, "HU_M6", 0.027252861297278195}, // defective h6 gives 0.02916606310377036 (1913x tolerance away) + {Nyxus::Feature2D::HU_M5, "HU_M5", 0.002851264767850148}, // a 3*(eta30+eta12)^2 -> (3*(eta30+eta12))^2 slip gives 0.0032935269006466807, 442x the tolerance + {Nyxus::Feature2D::HU_M6, "HU_M6", 0.027252861297278195}, // dropping the (eta21+eta03) grouping gives 0.02916606310377036, 1913x the tolerance {Nyxus::Feature2D::HU_M7, "HU_M7", 5.616461607732461e-06}, }; -// Vets Hu h5/h6 (and the full moment chain) against scikit-image on an asymmetric fixture -- -// the historic calcHu_imp h5 9x-bracket / h6 "+eta03"-precedence defects fail this assertion. +// Vets Hu h5/h6 (and the full moment chain) against scikit-image on an asymmetric fixture, where +// the odd-order etas are large enough that a mis-bracketed h5 or an h6 missing the (eta21+eta03) +// grouping misses by hundreds of times the tolerance. The symmetric rectangle cannot: its odd etas +// vanish, so both formulas agree there. void test_2d_moments_hu_wedge_skimage() { std::vector> fvals; calculate_2d_wedge_geomoment_feature_values(fvals); - assert_2d_geomoment_features(fvals, moments_2d_skimage_wedge_hu_ref_vals, "VERIFIABLE_WITH_3P_BUILTIN_ORACLE__"); + assert_2d_geomoment_features(fvals, moments_2d_skimage_wedge_hu_ref_vals, "SKIMAGE_ORACLE__"); } void test_2d_moments_shape_skimage() { std::vector> fvals; calculate_2d_geomoment_feature_values(fvals); - assert_2d_geomoment_features(fvals, moments_2d_skimage_shape_ref_vals, "VERIFIABLE_WITH_3P_BUILTIN_ORACLE__"); + assert_2d_geomoment_features(fvals, moments_2d_skimage_shape_ref_vals, "SKIMAGE_ORACLE__"); } void test_2d_moments_intensity_skimage() { std::vector> fvals; calculate_2d_geomoment_feature_values(fvals); - assert_2d_geomoment_features(fvals, moments_2d_skimage_intensity_ref_vals, "VERIFIABLE_WITH_3P_BUILTIN_ORACLE__"); + assert_2d_geomoment_features(fvals, moments_2d_skimage_intensity_ref_vals, "SKIMAGE_ORACLE__"); +} + +// Normalized RAW moments: NORM_SPAT_MOMENT_pq = m_pq / m_00^((p+q)/2 + 1), and IMOM_NRM_pq the +// same over the intensity-weighted raw moments. skimage has no native function for this - its +// moments_normalized() applies that exponent to the CENTRAL moments, which is a different +// quantity Nyxus exposes separately as NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq. So the oracle here +// is skimage's raw moments carried through skimage's own normalization exponent; the generator +// asserts the two are distinct so a future edit cannot quietly swap one for the other. +// Goldens: tests/vetting/oracles/gen_moments_skimage.py section D. +static const ref_vals_list moments_2d_skimage_normraw_shape_ref_vals{ + {Nyxus::Feature2D::NORM_SPAT_MOMENT_00, "NORM_SPAT_MOMENT_00", 1.0}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_01, "NORM_SPAT_MOMENT_01", 0.4450245779729475}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_02, "NORM_SPAT_MOMENT_02", 0.2674479166666667}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_03, "NORM_SPAT_MOMENT_03", 0.1807912348015099}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_10, "NORM_SPAT_MOMENT_10", 0.5363116708904752}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_11, "NORM_SPAT_MOMENT_11", 0.238671875}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_12, "NORM_SPAT_MOMENT_12", 0.14343543906367653}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_13, "NORM_SPAT_MOMENT_13", 0.09696044921875}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_20, "NORM_SPAT_MOMENT_20", 0.3875868055555556}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_21, "NORM_SPAT_MOMENT_21", 0.17248565457024395}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_22, "NORM_SPAT_MOMENT_22", 0.10365928367332176}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_23, "NORM_SPAT_MOMENT_23", 0.07007229716916162}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_30, "NORM_SPAT_MOMENT_30", 0.31508310664815414}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_31, "NORM_SPAT_MOMENT_31", 0.1402197265625}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_32, "NORM_SPAT_MOMENT_32", 0.08426832044990999}, + {Nyxus::Feature2D::NORM_SPAT_MOMENT_33, "NORM_SPAT_MOMENT_33", 0.056964263916015626}, +}; + +static const ref_vals_list moments_2d_skimage_normraw_intensity_ref_vals{ + {Nyxus::Feature2D::IMOM_NRM_00, "IMOM_NRM_00", 1.0}, + {Nyxus::Feature2D::IMOM_NRM_01, "IMOM_NRM_01", 0.039397166363954135}, + {Nyxus::Feature2D::IMOM_NRM_02, "IMOM_NRM_02", 0.001897046009773198}, + {Nyxus::Feature2D::IMOM_NRM_03, "IMOM_NRM_03", 9.951746245055554e-05}, + {Nyxus::Feature2D::IMOM_NRM_10, "IMOM_NRM_10", 0.04534163016617505}, + {Nyxus::Feature2D::IMOM_NRM_11, "IMOM_NRM_11", 0.0017522720110346945}, + {Nyxus::Feature2D::IMOM_NRM_12, "IMOM_NRM_12", 8.375967849944927e-05}, + {Nyxus::Feature2D::IMOM_NRM_13, "IMOM_NRM_13", 4.3766925283775395e-06}, + {Nyxus::Feature2D::IMOM_NRM_20, "IMOM_NRM_20", 0.002579984204506706}, + {Nyxus::Feature2D::IMOM_NRM_21, "IMOM_NRM_21", 9.892567767206171e-05}, + {Nyxus::Feature2D::IMOM_NRM_22, "IMOM_NRM_22", 4.7143264687233126e-06}, + {Nyxus::Feature2D::IMOM_NRM_23, "IMOM_NRM_23", 2.459309328437938e-07}, + {Nyxus::Feature2D::IMOM_NRM_30, "IMOM_NRM_30", 0.0001612294112519097}, + {Nyxus::Feature2D::IMOM_NRM_31, "IMOM_NRM_31", 6.155292790140729e-06}, + {Nyxus::Feature2D::IMOM_NRM_32, "IMOM_NRM_32", 2.928338360295916e-07}, + {Nyxus::Feature2D::IMOM_NRM_33, "IMOM_NRM_33", 1.5262053460086997e-08}, +}; + +void test_2d_moments_normraw_shape_skimage() +{ + std::vector> fvals; + calculate_2d_geomoment_feature_values(fvals); + assert_2d_geomoment_features(fvals, moments_2d_skimage_normraw_shape_ref_vals, "SKIMAGE_ORACLE__"); +} + +void test_2d_moments_normraw_intensity_skimage() +{ + std::vector> fvals; + calculate_2d_geomoment_feature_values(fvals); + assert_2d_geomoment_features(fvals, moments_2d_skimage_normraw_intensity_ref_vals, "SKIMAGE_ORACLE__"); } diff --git a/tests/test_all.cc b/tests/test_all.cc index 95407c37..97626e45 100644 --- a/tests/test_all.cc +++ b/tests/test_all.cc @@ -992,6 +992,16 @@ TEST(TEST_NYXUS, TEST_2D_MOMENTS_SHAPE_REGRESSION) ASSERT_NO_THROW(test_2d_moments_shape_regression()); } +TEST(TEST_NYXUS, TEST_2D_MOMENTS_NORMRAW_SHAPE_SKIMAGE) +{ + ASSERT_NO_THROW(test_2d_moments_normraw_shape_skimage()); +} + +TEST(TEST_NYXUS, TEST_2D_MOMENTS_NORMRAW_INTENSITY_SKIMAGE) +{ + ASSERT_NO_THROW(test_2d_moments_normraw_intensity_skimage()); +} + TEST(TEST_NYXUS, TEST_2D_MOMENTS_INTENSITY_SKIMAGE) { ASSERT_NO_THROW(test_2d_moments_intensity_skimage()); diff --git a/tests/vetting/TOOLS.md b/tests/vetting/TOOLS.md index 203e9b58..1465da16 100644 --- a/tests/vetting/TOOLS.md +++ b/tests/vetting/TOOLS.md @@ -36,6 +36,13 @@ research pass per tool; see per-tool detail below and the setup matrix first. method 5 — useful when checking whether a Nyxus percentile matches a tool's *native* percentile rather than a reimplementation of Nyxus' own. See `audit/intensity_histogram_2d_analytic_vetting_report.md` for why that distinction matters. +- **`skimage.measure.moments_normalized` answers the CENTRAL-moment question only.** Nyxus also + exposes normalized *raw* moments (`NORM_SPAT_MOMENT_pq`, `IMOM_NRM_pq`) = `m_pq / + m_00^((p+q)/2+1)`, for which skimage has no native function. Do not vet one against the other: + on the 48x40 moments fixture they are 0.3876 vs 0.0999 at p=2,q=0. Build the normalized raw value + from `moments()` and skimage's own exponent instead; see + `audit/moments_2d_skimage_vetting_report.md`. Related trap: Nyxus `m_pq` has p on x and q on y, so + index arrays `A[x, y]` and skimage's `moments(A)[i,j]` maps to `i==p, j==q` with no transpose. - **`radiomicsj` 2.1.2 is a phantom version** — no GitHub releases/tags; Maven Central publishes 2.1.3 … 2.1.18 (no 2.1.0/2.1.1/2.1.2). Pin **2.1.3** (earliest, nearest the requested tag) or **2.1.18** (latest). Ships a thin jar → must shade an uber-jar; has a built-in commons-cli `main()` diff --git a/tests/vetting/audit/moments_2d_coverage.csv b/tests/vetting/audit/moments_2d_coverage.csv new file mode 100644 index 00000000..86ad325e --- /dev/null +++ b/tests/vetting/audit/moments_2d_coverage.csv @@ -0,0 +1,181 @@ +Dim,Family,FeatureName,List_of_Oracles,Test_Names,Regression,Reg_Test_Name,Notes +2D,moments,SPAT_MOMENT_00,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_01,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_02,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_03,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_10,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_11,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_12,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_13,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_20,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_21,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_22,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_23,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,SPAT_MOMENT_30,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_00,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_01,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_02,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_03,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_10,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_11,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_12,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_13,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_20,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_21,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_22,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_23,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_30,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_31,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_32,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,CENTRAL_MOMENT_33,skimage,test_2d_moments_shape_skimage,N,, +2D,moments,NORM_SPAT_MOMENT_00,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_01,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_02,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_03,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_10,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_11,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_12,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_13,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_20,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_21,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_22,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_23,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_30,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_31,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_32,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_SPAT_MOMENT_33,skimage,test_2d_moments_normraw_shape_skimage,Y,test_2d_moments_shape_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,NORM_CENTRAL_MOMENT_02,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,NORM_CENTRAL_MOMENT_03,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,NORM_CENTRAL_MOMENT_11,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,NORM_CENTRAL_MOMENT_12,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,NORM_CENTRAL_MOMENT_20,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,NORM_CENTRAL_MOMENT_21,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,NORM_CENTRAL_MOMENT_30,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M1,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M2,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M3,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M4,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M5,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M6,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,HU_M7,skimage,test_2d_moments_hu_wedge_skimage;test_2d_moments_shape_skimage,N,, +2D,moments,WEIGHTED_SPAT_MOMENT_00,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_01,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_02,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_03,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_10,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_11,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_12,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_20,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_21,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_SPAT_MOMENT_30,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_02,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_03,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_11,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_12,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_20,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_21,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_CENTRAL_MOMENT_30,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_02,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_03,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_11,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_12,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_20,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_21,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WT_NORM_CTR_MOM_30,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M1,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M2,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M3,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M4,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M5,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M6,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,WEIGHTED_HU_M7,,,Y,test_2d_moments_shape_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_RM_00,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_01,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_02,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_03,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_10,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_11,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_12,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_13,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_20,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_21,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_22,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_23,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_RM_30,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_00,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_01,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_02,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_03,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_10,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_11,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_12,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_13,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_20,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_21,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_22,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_23,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_30,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_31,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_32,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_CM_33,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NRM_00,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_01,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_02,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_03,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_10,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_11,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_12,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_13,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_20,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_21,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_22,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_23,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_30,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_31,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_32,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NRM_33,skimage,test_2d_moments_normraw_intensity_skimage,Y,test_2d_moments_intensity_regression,normalized raw moment; skimage has no native function - moments_normalized() is the central-moment quantity +2D,moments,IMOM_NCM_02,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NCM_03,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NCM_11,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NCM_12,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NCM_20,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NCM_21,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_NCM_30,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU1,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU2,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU3,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU4,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU5,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU6,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_HU7,skimage,test_2d_moments_intensity_skimage,N,, +2D,moments,IMOM_WRM_00,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_01,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_02,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_03,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_10,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_11,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_12,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_20,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_21,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WRM_30,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_02,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_03,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_11,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_12,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_20,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_21,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WCM_30,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_02,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_03,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_11,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_12,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_20,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_21,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WNCM_30,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU1,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU2,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU3,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU4,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU5,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU6,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" +2D,moments,IMOM_WHU7,,,Y,test_2d_moments_intensity_regression,"distance-to-contour weighted; dist comes from the approximate min_sqdist, measured 1.372x over the exact distance, so no tool reproduces it" diff --git a/tests/vetting/audit/moments_2d_golden_regen.md b/tests/vetting/audit/moments_2d_golden_regen.md new file mode 100644 index 00000000..7687c1c8 --- /dev/null +++ b/tests/vetting/audit/moments_2d_golden_regen.md @@ -0,0 +1,96 @@ +# Regenerating the 2D moments goldens + +Every number pinned in `tests/test_2d_moments_skimage.h` comes out of a checked-in generator; +nothing there is transcribed by hand. `tests/test_2d_moments_regression.h` is a snapshot file and is +covered at the end. Run everything offline - CI never invokes a reference tool. + +## 1. Stand the tool up + +```bash +conda create -n nyxus_mirp -c conda-forge python=3.11 mirp numpy scikit-image +conda run -n nyxus_mirp python -c "import skimage, numpy; print(skimage.__version__, numpy.__version__)" +# -> 0.26.0 2.4.6 +``` + +Record what the solver resolved next to the goldens; the generator's provenance header names the +version it was last run at. + +## 2. The fixtures + +Both are built in the generator, not read from disk, and mirror +`tests/test_2d_moments_common.h` exactly: + +- **48x40 rectangle** - `I(x,y) = 10 + 3x + 5y + (x*y)%7`, every pixel in the ROI. Used for the raw, + central, normalized and intensity moment families. +- **Thin right wedge** - `0<=x<40`, `0<=y<8`, `5y <= x`. Elongated *and* skewed, so the odd-order + etas are large; this is the fixture that can discriminate an h5/h6 formula slip, which the + symmetric rectangle cannot (its odd etas vanish, so a wrong formula agrees there). + +## 3. Run the generator + +```bash +conda run -n nyxus_mirp python tests/vetting/oracles/gen_moments_skimage.py +``` + +It prints `ALL CHECKS PASSED` or `SOME CHECKS FAILED -- do not paste goldens`, and emits paste-ready +table bodies. Sections: + +| section | what it emits | +|---|---| +| A | validation that the oracle reproduces every golden the tree already pins | +| B | the weighted Hu snapshot values (skimage runs the Hu formula over Nyxus' pinned eta) | +| C | the wedge-fixture goldens, with a discriminance print for h5/h6 | +| D | the normalized **raw** moments: `NORM_SPAT_MOMENT_pq`, `IMOM_NRM_pq` | +| E | re-verification of **every** golden pinned in `test_2d_moments_skimage.h` (142, both fixtures) against this run | + +Paste a section's body into the matching `ref_vals_list` in `test_2d_moments_skimage.h`, keep the +comment above it, rebuild `runAllTests`, run `--gtest_filter=*MOMENTS*`. + +## 4. The coordinate convention (the thing most likely to go wrong) + +Nyxus `m_pq` has **p on x and q on y**. The generator therefore indexes its arrays `A[x, y]`, so +`skimage.measure.moments(A)[i, j]` lands on `i == p`, `j == q` with no transposition - and Hu's h7 +keeps its sign. Build the array the other way round and `m_12`/`m_21` swap silently: the totals +still look plausible and only the asymmetric fixture will catch it. + +## 5. Mapping skimage to Nyxus features + +| Nyxus | skimage | +|---|---| +| `SPAT_MOMENT_pq` / `IMOM_RM_pq` | `moments(A)[p, q]` - shape fixture / intensity fixture | +| `CENTRAL_MOMENT_pq` / `IMOM_CM_pq` | `moments_central(A)[p, q]` | +| `NORM_CENTRAL_MOMENT_pq` / `IMOM_NCM_pq` | `moments_normalized(mu)[p, q]` | +| `HU_M1..7` / `IMOM_HU1..7` | `moments_hu(nu)` | +| `NORM_SPAT_MOMENT_pq` / `IMOM_NRM_pq` | **no native function** - `m[p,q] / m[0,0]**((p+q)/2+1)` | +| `WEIGHTED_*`, `WT_NORM_CTR_MOM_*`, `IMOM_W*` | **none** - see section 7 | + +## 6. Convention differences to account for + +- **Normalized raw vs normalized central.** `moments_normalized()` is defined on the *central* + moments. Nyxus applies the same exponent to the *raw* moments and calls that + `NORM_SPAT_MOMENT_pq`. They are different numbers (0.3876 vs 0.0999 at p=2,q=0 on the rectangle), + and Nyxus exposes the central one separately. Section D asserts they are distinct so the two + cannot be silently interchanged. +- **`moments_normalized` returns NaN for order < 2**; the generator runs it through + `np.nan_to_num` before the Hu step, matching what Nyxus feeds its own Hu implementation. +- **h5/h6 are the discriminating invariants.** Two classic formula slips - squaring + `3*(eta30+eta12)` instead of tripling the square, and losing the `(eta21+eta03)` grouping in h6 - + are invisible on a symmetric fixture. Section C prints `|slip - correct|` against the gtest + tolerance so the wedge fixture's discriminance is proven, not assumed. A tell-tale of the h6 slip + is `HU6` coming out equal to `NCM_03`. +- **`moments_central(order=N)` leaves every entry with `p+q > N` at zero.** The tables pin moments + up to `p+q = 6` (`CENTRAL_MOMENT_33`, `IMOM_CM_33`, ...), so section E computes its matrices at + order 6; verifying those against an order-3 matrix compares them to 0 and "fails" for no reason. + `moments()` does fill the full matrix, which is why only the central families show it. +- **Noise-level pins.** Several Hu goldens are ~1e-10 or smaller, i.e. summation noise around an + exact zero. Where the oracle is exactly 0 the golden is 0; do not "restore" a tiny non-zero pin. + +## 7. The goldens no generator produces + +`tests/test_2d_moments_regression.h` pins the **weighted** (distance-to-contour) families. There is +no oracle for them: the weighting uses an approximate distance that overestimates the true one by a +measured 1.372x on this fixture, so no external tool reproduces the values - see +`moments_2d_skimage_vetting_report.md`. They are drift guards. Section B of the generator does +recompute the weighted *Hu* values, but only by running skimage's Hu formula over Nyxus' own pinned +eta - that checks the Hu step, not the weighting, and must not be read as vetting the weighted +family. diff --git a/tests/vetting/audit/moments_2d_skimage_vetting_report.md b/tests/vetting/audit/moments_2d_skimage_vetting_report.md new file mode 100644 index 00000000..20742489 --- /dev/null +++ b/tests/vetting/audit/moments_2d_skimage_vetting_report.md @@ -0,0 +1,102 @@ +# Audit: 2D moments vs a fresh scikit-image run + +**Verdict: 118 of 180 rows are vetted against scikit-image; 62 stay `regression` for a measured +reason.** The 32 rows that carried a `vetted` verdict with no in-tree oracle assertion +(`NORM_SPAT_MOMENT_ij`, `IMOM_NRM_ij`) now have one, and they reproduce skimage **exactly** - a +relative difference of 0.0e+00 on all 32. + +Covers `tests/test_2d_moments_skimage.h`, `tests/test_2d_moments_common.h` (fixtures) and +`tests/vetting/oracles/gen_moments_skimage.py`. + +## Method + +- **Tool**: scikit-image **0.26.0**, numpy 2.4.6, conda env `nyxus_mirp` + (`conda create -n nyxus_mirp -c conda-forge python=3.11 mirp numpy scikit-image`). +- **Fixtures**: the pinned 48x40 rectangle of `test_2d_moments_common.h` - + `I(x,y) = 10 + 3x + 5y + (x*y)%7` - and the thin right wedge (`5y <= x`) for the Hu invariants. +- **Convention**: Nyxus `m_pq` has `p` on x and `q` on y, so the generator indexes arrays `A[x, y]` + and skimage's `moments(A)[i, j]` lands on `i == p`, `j == q` with no transposition and no h7 sign + flip. Getting this wrong silently swaps `m_12` with `m_21`. +- **Command**: `conda run -n nyxus_mirp python tests/vetting/oracles/gen_moments_skimage.py`. + +The fixture reconstruction is self-checking: skimage's `m_00` comes out 1920 on the shape fixture +and 346635 on the intensity one, which are exactly the pinned `SPAT_MOMENT_00` / `IMOM_RM_00`. + +**Every** golden in `test_2d_moments_skimage.h` is re-verified against the run, not a sample: 142 of +142 across both fixtures, none without a skimage counterpart. The generator previously validated a +hand-picked list of 25 names, which is the kind of subset that stops covering whatever is added +later. + +## The 32 rows this PR closes + +`NORM_SPAT_MOMENT_pq` and `IMOM_NRM_pq` are **normalized raw moments**: + +``` +NORM_SPAT_MOMENT_pq = m_pq / m_00^((p+q)/2 + 1) +``` + +skimage has **no native function for this**. Its `moments_normalized()` applies that same exponent +to the **central** moments, which is a different quantity - and one Nyxus already exposes separately +as `NORM_CENTRAL_MOMENT_pq` / `IMOM_NCM_pq`. Measured on the shape fixture: + +| p,q | Nyxus `NORM_SPAT_MOMENT` | skimage `moments_normalized` | Nyxus `NORM_CENTRAL_MOMENT` | +|---|---|---|---| +| 2,0 | 0.3875868055555556 | 0.09995659722222222 | 0.09995659722222222 | +| 0,2 | 0.2674479166666667 | 0.06940104166666666 | 0.06940104166666666 | + +So the two families are not interchangeable, and the right column confirms which one +`moments_normalized` actually answers. + +**Why this is still a skimage verdict and not a circular one.** The non-trivial part - the moment +sums `m_pq` themselves - is skimage's, computed by an independent implementation from the same +pixels. The only step layered on top is the normalization exponent `(p+q)/2 + 1`, which is not a +Nyxus invention: it is the exponent skimage's own `moments_normalized` uses, just applied to the raw +matrix instead of the central one. Result over all 32 features, both fixtures: + +``` +worst relative difference: 0.0e+00 +``` + +The generator asserts, as a guard, that normalized-raw and `moments_normalized` are numerically +**distinct**, so a later edit cannot quietly swap one for the other and still pass. + +Contrast with the intensity-histogram percentiles demoted in the sibling PR: there, Nyxus' quantity +matched *none* of eighteen native percentile implementations, so the closed form was only a +restatement of Nyxus itself. Here the tool supplies the quantity and agreement is exact. + +## The 62 rows that stay `regression` + +All 62 are the distance-to-contour **weighted** moments (`WEIGHTED_SPAT_MOMENT_*`, +`WEIGHTED_CENTRAL_MOMENT_*`, `WT_NORM_CTR_MOM_*`, `WEIGHTED_HU_M*`, and the `IMOM_W*` intensity +twins). Nyxus weights each pixel by `I(p) * log(dist(p, contour) + eps)`, `eps = 0.001`, and takes +`dist` from `Pixel2::min_sqdist` - an approximate hill-descent whose own doc comment warns that it +overestimates and says to use `exact_min_sqdist` where correctness matters. + +Re-measured against current code on the pinned 48x40 fixture. For a solid rectangle the contour is +the outermost ring, so the exact Euclidean distance from a pixel to the contour is +`min(x, y, W-1-x, H-1-y)` and needs no distance transform: + +| | `WEIGHTED_SPAT_MOMENT_00` | +|---|---| +| exact distance to contour | 1821.28398639964 | +| Nyxus (pinned) | 2498.7137504625134 | +| ratio | **1.372x**, i.e. a 37.2% overestimate | + +These values therefore match no external tool by construction, which is why they are pinned as drift +guards and claim no oracle. **Fixing it is deliberately out of scope here**: it changes 62 published +feature values and swaps an O(pixels x contour) hill-descent for a distance transform, which is a +behaviour and performance change, not a vetting change. + +One correction to the record for whoever takes that on: the blast radius is smaller than previously +noted. There is exactly **one live** weighting path, +`BasicGeomoms2D::apply_dist2contour_weighting` (`src/nyx/features/2d_geomoments_basic.cpp`), plus a +whole-slide variant. A second implementation using a *different* formula, `inten / (dist + eps)`, +exists at `src/nyx/features/image_matrix.cpp` - and is **called by nothing in the repository**; and +no GPU kernel performs dist-to-contour weighting at all. + +## What this report does and does not establish + +The in-tree goldens were emitted by the generator named above, so "golden == fresh run" only shows +the pin is reproducible. The vetting claim rests on the **Nyxus vs skimage** comparison: an +independent implementation of the same published definitions, on the same pixels, in a coordinate +convention that is stated and checked rather than assumed. diff --git a/tests/vetting/audit/scan_moments_coverage.py b/tests/vetting/audit/scan_moments_coverage.py new file mode 100644 index 00000000..33a69f88 --- /dev/null +++ b/tests/vetting/audit/scan_moments_coverage.py @@ -0,0 +1,166 @@ +"""Regenerate moments_2d_coverage.csv by scanning the 2D moments tests. Stdlib only. + + python tests/vetting/audit/scan_moments_coverage.py [--check] + +The feature -> test mapping is read out of the test sources rather than written by hand, so the +artifact cannot drift from the tree. `--check` reports drift instead of rewriting, and also runs the +acceptance check from PR423-family-plan: every `vetted` row in oracle_coverage.csv must be asserted +by an oracle test, that test's oracle must be the one the row names, `current_test` must name +exactly the files that cover the feature, and no gtest function may be left unregistered. + +Coverage rule: this family pins goldens as `ref_vals_list` entries shaped +`{Nyxus::Feature2D::X, "X", value}`, and each test function asserts one whole table via +assert_2d_geomoment_features(). So a feature is covered by the function that loops the table its +entry lives in. Comments are stripped first. The kind of coverage comes from the function-name +suffix, per SPEC 2 naming, so only an oracle-suffixed function contributes an oracle token. +""" +import argparse +import csv +import io +import os +import re +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +VETTING = os.path.dirname(HERE) +TESTS = os.path.dirname(VETTING) +OUT = os.path.join(HERE, "moments_2d_coverage.csv") +REGISTRY = os.path.join(VETTING, "oracle_coverage.csv") + +SOURCES = ["test_2d_moments_skimage.h", "test_2d_moments_regression.h", "test_2d_moments_common.h"] +ORACLE_SUFFIX = {"skimage": "skimage", "pyradiomics": "pyradiomics", "mirp": "mirp", + "ibsi": "ibsi", "analytic": "analytic"} + +COMMENT = re.compile(r"//[^\n]*|/\*.*?\*/", re.S) +TABLE = re.compile(r"ref_vals_list\s+(\w+)\s*\{(.*?)\n\};", re.S) +ENTRY = re.compile(r'\{\s*Nyxus::Feature2D::(\w+)\s*,\s*"(\w+)"') +FUNC = re.compile(r"^void\s+(test_2d_moments_\w+)\s*\(", re.M) +USES = re.compile(r"assert_2d_geomoment_features\s*\([^,]+,\s*(\w+)") + + +def scan(): + """-> (feature -> {function}, function -> file, table -> {features}).""" + covers, where, tables = {}, {}, {} + for rel in SOURCES: + with open(os.path.join(TESTS, rel), encoding="utf-8", errors="replace") as fh: + text = COMMENT.sub(lambda m: "\n" * m.group(0).count("\n"), fh.read()) + for name, body in TABLE.findall(text): + feats = set() + for m in ENTRY.finditer(body): + if m.group(1) != m.group(2): + print(f"ERROR: {rel}: enum/name mismatch {m.group(1)} vs {m.group(2)}") + feats.add(m.group(1)) + tables[name] = feats + marks = [(m.start(), m.group(1)) for m in FUNC.finditer(text)] + for i, (pos, fn) in enumerate(marks): + block = text[pos:marks[i + 1][0] if i + 1 < len(marks) else len(text)] + where[fn] = os.path.basename(rel) + for tbl in USES.findall(block): + for feat in tables.get(tbl, ()): + covers.setdefault(feat, set()).add(fn) + return covers, where, tables + + +def registry_rows(): + with open(REGISTRY, newline="", encoding="utf-8") as fh: + return [r for r in csv.DictReader(fh) + if r["dim"] == "2D" and r["family"] == "moments"] + + +def split(covers, where): + oracles, asserted, regression, other = {}, {}, {}, {} + for feat, fns in covers.items(): + for fn in fns: + kind = fn.rsplit("_", 1)[-1] + if kind in ORACLE_SUFFIX: + asserted.setdefault(feat, set()).add(fn) + oracles.setdefault(feat, set()).add(ORACLE_SUFFIX[kind]) + elif kind == "regression": + regression.setdefault(feat, set()).add(fn) + else: + other.setdefault(feat, set()).add(fn) + return oracles, asserted, regression, other + + +def render(rows, oracles, asserted, regression): + buf = io.StringIO() + w = csv.writer(buf, lineterminator="\n") + w.writerow(["Dim", "Family", "FeatureName", "List_of_Oracles", "Test_Names", + "Regression", "Reg_Test_Name", "Notes"]) + for r in rows: + f = r["feature"] + note = "" + if re.match(r"^(NORM_SPAT_MOMENT|IMOM_NRM)_\d\d$", f): + note = ("normalized raw moment; skimage has no native function - moments_normalized() " + "is the central-moment quantity") + elif re.match(r"^(WEIGHTED_|WT_NORM_CTR_MOM_|IMOM_W)", f): + note = ("distance-to-contour weighted; dist comes from the approximate min_sqdist, " + "measured 1.372x over the exact distance, so no tool reproduces it") + w.writerow(["2D", "moments", f, + ";".join(sorted(oracles.get(f, ()))), + ";".join(sorted(asserted.get(f, ()))), + "Y" if f in regression else "N", + ";".join(sorted(regression.get(f, ()))), + note]) + return buf.getvalue() + + +def unregistered(where): + with open(os.path.join(TESTS, "test_all.cc"), encoding="utf-8", errors="replace") as fh: + reg = set(re.findall(r"(test_2d_moments_\w+)\s*\(\s*\)", fh.read())) + return sorted(fn for fn, src in where.items() if src.endswith(".h") and fn not in reg) + + +def disagreements(rows, oracles, asserted, regression, other, where): + out = [] + for r in rows: + f = r["feature"] + covering = asserted.get(f, set()) | regression.get(f, set()) | other.get(f, set()) + files = {where[fn] for fn in covering} + claimed = {t for t in r["current_test"].split(";") if t} + if r["status"] == "vetted" and not asserted.get(f): + out.append(f"{f}: status=vetted but no oracle test asserts it") + if r["oracle"] and r["oracle"] not in oracles.get(f, set()): + out.append(f"{f}: registry oracle={r['oracle']!r} but the tests asserting it are " + f"{sorted(oracles.get(f, ())) or 'none'}") + for stale in sorted(claimed - files): + out.append(f"{f}: current_test names {stale}, which covers nothing for it") + for gap in sorted(files - claimed): + out.append(f"{f}: {gap} covers it but current_test omits it") + return out + + +def main(argv=None): + ap = argparse.ArgumentParser() + ap.add_argument("--check", action="store_true", + help="report drift and registry disagreements instead of rewriting") + a = ap.parse_args(argv) + + covers, where, _ = scan() + oracles, asserted, regression, other = split(covers, where) + rows = registry_rows() + text = render(rows, oracles, asserted, regression) + problems = disagreements(rows, oracles, asserted, regression, other, where) + problems += [f"{fn}: defined but no TEST() in test_all.cc calls it, so it never runs" + for fn in unregistered(where)] + + if a.check: + with open(OUT, newline="", encoding="utf-8") as fh: + if fh.read() != text: + problems.insert(0, f"{os.path.basename(OUT)} is stale; rerun without --check") + for p in problems: + print("ERROR:", p) + print(f"checked {len(rows)} rows: " + f"{'clean' if not problems else str(len(problems)) + ' problem(s)'}") + return 1 if problems else 0 + + with open(OUT, "w", newline="", encoding="utf-8") as fh: + fh.write(text) + print(f"wrote {OUT} ({len(rows)} rows)") + for p in problems: + print("WARNING:", p) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/vetting/oracle_coverage.csv b/tests/vetting/oracle_coverage.csv index 0825a752..80f5ed01 100644 --- a/tests/vetting/oracle_coverage.csv +++ b/tests/vetting/oracle_coverage.csv @@ -311,186 +311,186 @@ dim,feature,family,status,oracle,agreement,config_recipe,tolerance,current_test, 2D,MEAN_FRAC,radial,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_radial_regression.h,test_2d_radial_regression.h,cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*),oracle-identified,tracker, 2D,RADIAL_CV,radial,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_radial_regression.h,test_2d_radial_regression.h,cellprofiler:MeasureObjectIntensityDistribution (RadialDistribution_*),oracle-identified,tracker, 2D,ZERNIKE2D,zernike,regression,,benign,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_zernike_regression.h,test_2d_zernike_regression.h,"none (mahotas is niche, not an accepted oracle) -> analytic/regression",no-mainstream-oracle,tracker, -2D,SPAT_MOMENT_00,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_01,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_03,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_10,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_11,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_12,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_13,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_21,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_22,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_23,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,SPAT_MOMENT_30,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,CENTRAL_MOMENT_00,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,CENTRAL_MOMENT_01,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive;suspected-bug,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,CENTRAL_MOMENT_03,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_10,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive;suspected-bug,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_11,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_12,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_13,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,CENTRAL_MOMENT_21,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_22,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,CENTRAL_MOMENT_23,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_30,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_31,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_32,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,CENTRAL_MOMENT_33,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,NORM_SPAT_MOMENT_00,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_01,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_03,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_10,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_11,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_12,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_13,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_21,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_22,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_23,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_30,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_31,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_32,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_SPAT_MOMENT_33,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_CENTRAL_MOMENT_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_CENTRAL_MOMENT_03,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,NORM_CENTRAL_MOMENT_11,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,NORM_CENTRAL_MOMENT_12,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,NORM_CENTRAL_MOMENT_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,NORM_CENTRAL_MOMENT_21,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,NORM_CENTRAL_MOMENT_30,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,HU_M1,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,HU_M2,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,HU_M3,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,HU_M4,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,HU_M5,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix; h5 9x-bracket formula fixed and vetted on the asymmetric wedge (test_2d_moments_hu_wedge_skimage; gen_moments_skimage.py) -2D,HU_M6,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix; h6 stray-eta03 precedence bug fixed and vetted on the asymmetric wedge (test_2d_moments_hu_wedge_skimage; gen_moments_skimage.py) -2D,HU_M7,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,WEIGHTED_SPAT_MOMENT_00,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_01,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_02,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_03,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_10,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_11,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_12,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_20,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_21,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_SPAT_MOMENT_30,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_02,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_03,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_11,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_12,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_20,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_21,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_CENTRAL_MOMENT_30,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_02,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_03,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_11,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_12,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_20,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_21,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WT_NORM_CTR_MOM_30,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M1,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M2,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M3,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M4,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M5,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M6,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,WEIGHTED_HU_M7,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_RM_00,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_01,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_03,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_10,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_11,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_12,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_13,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_21,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_22,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_23,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_RM_30,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_00,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_01,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive;suspected-bug,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_03,moments,vetted,skimage,exact (rel=9.0e-15),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_10,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive;suspected-bug,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_11,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_12,moments,vetted,skimage,exact (rel=6.0e-15),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_13,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_21,moments,vetted,skimage,exact (rel=1.0e-14),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_22,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_23,moments,vetted,skimage,exact (rel=1.6e-16),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_30,moments,vetted,skimage,exact (rel=2.7e-15),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_31,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_CM_32,moments,vetted,skimage,exact (rel=3.5e-16),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_CM_33,moments,vetted,skimage,exact (rel=1.9e-16),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_NRM_00,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_01,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_03,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_10,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_11,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_12,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_13,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_21,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_22,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_23,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_30,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_31,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_32,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NRM_33,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NCM_02,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NCM_03,moments,vetted,skimage,exact (rel=9.0e-15),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_NCM_11,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NCM_12,moments,vetted,skimage,exact (rel=5.9e-15),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_NCM_20,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_NCM_21,moments,vetted,skimage,exact (rel=1.0e-14),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_NCM_30,moments,vetted,skimage,exact (rel=2.7e-15),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_HU1,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_HU2,moments,vetted,skimage,agreed,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_skimage.h,test_2d_moments_skimage.h,,,tracker, -2D,IMOM_HU3,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_HU4,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_HU5,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_HU6,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted after the calcHu_imp h6 precedence fix; the old skimage flag rel=3.6e10 WAS the bug (h6 emitted the raw eta03 == IMOM_NCM_03; gen_moments_skimage.py) -2D,IMOM_HU7,moments,vetted,skimage,exact (rel=0.0e+00),moments.skimage_regionprops,exact,test_2d_moments_regression.h;test_2d_moments_skimage.h,test_2d_moments_skimage.h,Document convention or find another direct built-in oracle.,promote-after-deepdive,tracker,PROMOTED regression->vetted vs skimage regionprops after centroid-truncation fix -2D,IMOM_WRM_00,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_01,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_02,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_03,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_10,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_11,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_12,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_20,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_21,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WRM_30,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_02,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_03,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_11,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_12,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_20,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_21,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WCM_30,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_02,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_03,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_11,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_12,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_20,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_21,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WNCM_30,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU1,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU2,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU3,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU4,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU5,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU6,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" -2D,IMOM_WHU7,moments,regression,,na,"Not mode-specific. Any disagreement is a definition, coordinate-frame, spacing, aggregation, or implementation issue rather than Nyxus IBSI/radiomics mode.",,test_2d_moments_regression.h,test_2d_moments_regression.h,none (Nyxus-specific weighted moment),oracle-identified,tracker,"no mainstream oracle: skimage weighted moments correspond to Nyxus IMOM_ (non-W) family, already vetted; the W-variants are a distinct Nyxus/WIPP-specific weighting (IMOM_WRM_00=512893 vs sum-intensity=346635)" +2D,SPAT_MOMENT_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_10,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_13,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_22,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_23,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,SPAT_MOMENT_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_10,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_13,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_22,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_23,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_31,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_32,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,CENTRAL_MOMENT_33,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_SPAT_MOMENT_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_10,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_13,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_22,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_23,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_31,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_32,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_SPAT_MOMENT_33,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,NORM_CENTRAL_MOMENT_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_CENTRAL_MOMENT_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_CENTRAL_MOMENT_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_CENTRAL_MOMENT_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_CENTRAL_MOMENT_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_CENTRAL_MOMENT_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,NORM_CENTRAL_MOMENT_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M1,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M2,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M3,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M4,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M5,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M6,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,HU_M7,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,WEIGHTED_SPAT_MOMENT_00,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_01,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_02,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_03,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_10,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_11,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_12,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_20,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_21,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_SPAT_MOMENT_30,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_02,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_03,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_11,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_12,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_20,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_21,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_CENTRAL_MOMENT_30,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_02,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_03,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_11,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_12,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_20,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_21,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WT_NORM_CTR_MOM_30,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M1,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M2,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M3,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M4,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M5,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M6,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,WEIGHTED_HU_M7,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_RM_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_10,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_13,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_22,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_23,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_RM_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_10,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_13,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_22,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_23,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_31,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_32,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_CM_33,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NRM_00,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_01,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_10,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_13,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_22,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_23,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_31,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_32,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NRM_33,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h;test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md. Normalized RAW moment m_pq/m_00^((p+q)/2+1): skimage has no native function for it - moments_normalized() applies that exponent to the CENTRAL moments and is a different quantity (NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq) - so the oracle is skimage's raw moments carried through skimage's own normalization exponent. Reproduces to 0.0e+00 on all 16." +2D,IMOM_NCM_02,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NCM_03,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NCM_11,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NCM_12,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NCM_20,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NCM_21,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_NCM_30,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU1,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU2,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU3,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU4,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU5,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU6,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_HU7,moments,vetted,skimage,agreed,moments.skimage_regionprops,rel=1e-6,test_2d_moments_skimage.h,,,,in-tree,"Asserted against scikit-image 0.26.0 on the 48x40 fixture of test_2d_moments_common.h at rel<=1e-6, goldens from tests/vetting/oracles/gen_moments_skimage.py. Was vetted from an offline harness run only (source=tracker). Evidence: tests/vetting/audit/moments_2d_skimage_vetting_report.md." +2D,IMOM_WRM_00,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_01,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_02,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_03,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_10,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_11,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_12,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_20,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_21,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WRM_30,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_02,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_03,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_11,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_12,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_20,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_21,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WCM_30,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_02,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_03,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_11,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_12,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_20,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_21,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WNCM_30,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU1,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU2,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU3,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU4,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU5,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU6,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." +2D,IMOM_WHU7,moments,regression,,,moments.skimage_regionprops,rel=1e-6,test_2d_moments_regression.h,,,,in-tree,"Regression, not vetted, and the reason is measured rather than assumed: the distance-to-contour weighting I*log(dist+eps) takes dist from Pixel2::min_sqdist, an approximate hill-descent whose own doc comment warns it overestimates. On the pinned 48x40 fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - a 1.372x / 37.2% overestimate - so these values match no external tool by construction. Fixing it changes 62 feature values and is deliberately out of scope here; see tests/vetting/audit/moments_2d_skimage_vetting_report.md and Deferred-Moments.md." 2D,HISTOGRAM,intensity_histogram,vetted,analytic,agreed,,rel=1e-4,test_2d_intensity_histogram_analytic.h,,,,in-tree,"Analytic vetting: PixelIntensityFeatures::val_HISTOGRAM = TrivialHistogram::get_cust_frequencies(n_greybins), raw per-bin counts over N equal-width bins spanning [min,max] (top-inclusive, Nyxus::to_grayscale binning). Hand-derived expected vector [2,1,2] for fixture {1,1,3,5,7} with N=3 bins, asserted in test_2d_intensity_histogram_bin_counts_analytic. Distinct feature class from the scalar IH_* family: opt-in via *ALL*, not IBSI-gated, hence no ih.ibsi_fbn recipe." 2D,IH_MEAN_VAL,intensity_histogram,vetted,analytic,agreed,ih.ibsi_fbn,rel=1e-9,test_2d_intensity_histogram_regression.h;test_2d_intensity_histogram_analytic.py;test_2d_intensity_histogram_analytic.h,,,,in-tree,"No tool reports this quantity - MIRP and PyRadiomics both stay in the discretised (_IDX) domain - so the oracle is the closed form, evaluated by tests/vetting/oracles/gen_intensity_histogram_analytic.py from the published definitions rather than from intensity_histogram.cpp, and asserted at rel<=1e-9 in test_2d_intensity_histogram_analytic.h (worst measured 7.5e-15). Evidence: tests/vetting/audit/intensity_histogram_2d_*_vetting_report.md." 2D,IH_VARIANCE_VAL,intensity_histogram,vetted,analytic,agreed,ih.ibsi_fbn,rel=1e-9,test_2d_intensity_histogram_regression.h;test_2d_intensity_histogram_analytic.py;test_2d_intensity_histogram_analytic.h,,,,in-tree,"No tool reports this quantity - MIRP and PyRadiomics both stay in the discretised (_IDX) domain - so the oracle is the closed form, evaluated by tests/vetting/oracles/gen_intensity_histogram_analytic.py from the published definitions rather than from intensity_histogram.cpp, and asserted at rel<=1e-9 in test_2d_intensity_histogram_analytic.h (worst measured 7.5e-15). Evidence: tests/vetting/audit/intensity_histogram_2d_*_vetting_report.md." diff --git a/tests/vetting/oracles/gen_glrlm_mirp.py b/tests/vetting/oracles/gen_glrlm_mirp.py index e6b6f3d6..aa892013 100644 --- a/tests/vetting/oracles/gen_glrlm_mirp.py +++ b/tests/vetting/oracles/gen_glrlm_mirp.py @@ -16,6 +16,8 @@ """ import json import logging +import os +import re from importlib import metadata import numpy as np @@ -61,11 +63,39 @@ def run(): return {c: float(df.iloc[0][c]) for c in df.columns if c.endswith(SUFFIX)} +def verify_pins(header, table, computed, tol=5e-3): + """Compare EVERY golden pinned in `table` against this run. + + Checking a hand-picked subset is the failure mode this exists to avoid: it silently stops + covering whatever is added to the table later. Anything the generator cannot produce is + reported rather than skipped quietly. The tolerance is the loosest the test file asserts at, + which is the log-based GLRLM_RE band. + """ + text = re.sub(r"//[^\n]*", "", open(header, encoding="utf-8").read()) + body = text.split(table, 1)[1].split("{", 1)[1].split("};", 1)[0] + ok, checked, unknown = True, 0, [] + for name, pinned in re.findall(r'\{\s*"(\w+)"\s*,\s*([-0-9.e+]+)\s*\}', body): + if name not in computed: + unknown.append(name) + continue + got, want = computed[name], float(pinned) + if abs(got - want) > tol * max(1.0, abs(want), abs(got)): + print(" FAIL %s: oracle=%r pinned=%s" % (name, got, pinned)) + ok = False + checked += 1 + print(" verified %d pinned goldens against this run" % checked) + if unknown: + print(" not produced by this generator: %s" % ", ".join(sorted(unknown))) + ok = False + return ok + + def main(): values = run() print("// mirp %s, recipe glrlm.ibsi_ng128 (by_slice + 2d_average + no discretisation)," " IBSI digital phantom" % metadata.version("mirp")) print("// generated by tests/vetting/oracles/gen_glrlm_mirp.py") + nyxus = {} for column in sorted(MIRP_TO_NYXUS): key = column + SUFFIX if key not in values: @@ -73,9 +103,17 @@ def main(): continue feature = MIRP_TO_NYXUS[column] for n in (feature, feature + "_AVE"): + nyxus[n] = values[key] print(' {"%s", %.17g}, // %s' % (n, values[key], column)) print("\n// raw:", json.dumps(values, sort_keys=True)) + print("\n=== re-verify every pinned golden in test_2d_glrlm_mirp.h ===") + here = os.path.dirname(os.path.abspath(__file__)) + ok = verify_pins(os.path.join(here, "..", "..", "test_2d_glrlm_mirp.h"), + "glrlm_2d_mirp_ref_vals", nyxus) + print("\n%s" % ("ALL CHECKS PASSED" if ok else "SOME CHECKS FAILED -- do not paste goldens")) + return 0 if ok else 1 + if __name__ == "__main__": - main() + raise SystemExit(main()) diff --git a/tests/vetting/oracles/gen_glrlm_pyradiomics.py b/tests/vetting/oracles/gen_glrlm_pyradiomics.py index eac1c55a..41400050 100644 --- a/tests/vetting/oracles/gen_glrlm_pyradiomics.py +++ b/tests/vetting/oracles/gen_glrlm_pyradiomics.py @@ -16,6 +16,8 @@ aggregation; averaging that over the 4 slices is the IBSI 2D-averaged aggregation the test uses. """ import json +import os +import re import SimpleITK as sitk import radiomics @@ -60,11 +62,39 @@ def run(): return {k: sum(s[k] for s in per_slice) / len(per_slice) for k in per_slice[0]} +def verify_pins(header, table, computed, tol=5e-3): + """Compare EVERY golden pinned in `table` against this run. + + Checking a hand-picked subset is the failure mode this exists to avoid: it silently stops + covering whatever is added to the table later. Anything the generator cannot produce is + reported rather than skipped quietly. The tolerance is the loosest the test file asserts at, + which is the log-based GLRLM_RE band. + """ + text = re.sub(r"//[^\n]*", "", open(header, encoding="utf-8").read()) + body = text.split(table, 1)[1].split("{", 1)[1].split("};", 1)[0] + ok, checked, unknown = True, 0, [] + for name, pinned in re.findall(r'\{\s*"(\w+)"\s*,\s*([-0-9.e+]+)\s*\}', body): + if name not in computed: + unknown.append(name) + continue + got, want = computed[name], float(pinned) + if abs(got - want) > tol * max(1.0, abs(want), abs(got)): + print(" FAIL %s: oracle=%r pinned=%s" % (name, got, pinned)) + ok = False + checked += 1 + print(" verified %d pinned goldens against this run" % checked) + if unknown: + print(" not produced by this generator: %s" % ", ".join(sorted(unknown))) + ok = False + return ok + + def main(): values = run() print("// pyradiomics %s, recipe glrlm.ibsi_ng128, IBSI digital phantom (4 slices, averaged)" % radiomics.__version__) print("// generated by tests/vetting/oracles/gen_glrlm_pyradiomics.py") + nyxus = {} for pyr_name in sorted(PYRADIOMICS_TO_NYXUS): if pyr_name not in values: print("// MISSING from this pyradiomics build: %s" % pyr_name) @@ -73,9 +103,17 @@ def main(): # the per-direction feature and its _AVE twin are the same quantity, and both names must # appear literally for the coverage report to credit them for n in (feature, feature + "_AVE"): + nyxus[n] = values[pyr_name] print(' {"%s", %.17g}, // %s' % (n, values[pyr_name], pyr_name)) print("\n// raw:", json.dumps(values, sort_keys=True)) + print("\n=== re-verify every pinned golden in test_2d_glrlm_pyradiomics.h ===") + here = os.path.dirname(os.path.abspath(__file__)) + ok = verify_pins(os.path.join(here, "..", "..", "test_2d_glrlm_pyradiomics.h"), + "glrlm_2d_pyradiomics_ref_vals", nyxus) + print("\n%s" % ("ALL CHECKS PASSED" if ok else "SOME CHECKS FAILED -- do not paste goldens")) + return 0 if ok else 1 + if __name__ == "__main__": - main() + raise SystemExit(main()) diff --git a/tests/vetting/oracles/gen_intensity_histogram_analytic.py b/tests/vetting/oracles/gen_intensity_histogram_analytic.py index 650dc4c0..2dc018dd 100644 --- a/tests/vetting/oracles/gen_intensity_histogram_analytic.py +++ b/tests/vetting/oracles/gen_intensity_histogram_analytic.py @@ -30,6 +30,8 @@ `_IDX` values coincide exactly and MIRP vets both; they are not repeated here. """ import json +import os +import re import numpy as np @@ -107,6 +109,32 @@ def pct(p): } +def verify_pins(header, table, computed, tol=1e-9): + """Compare EVERY golden pinned in `table` against this run. + + Checking a hand-picked subset is the failure mode this exists to avoid: it silently stops + covering whatever is added to the table later. Anything the generator cannot produce is + reported rather than skipped quietly. + """ + text = re.sub(r"//[^\n]*", "", open(header, encoding="utf-8").read()) + body = text.split(table, 1)[1].split("{", 1)[1].split("};", 1)[0] + ok, checked, unknown = True, 0, [] + for name, pinned in re.findall(r'\{\s*"(\w+)"\s*,\s*([-0-9.e+]+)\s*\}', body): + if name not in computed: + unknown.append(name) + continue + got, want = computed[name], float(pinned) + if abs(got - want) > tol * max(1.0, abs(want), abs(got)): + print(" FAIL %s: oracle=%r pinned=%s" % (name, got, pinned)) + ok = False + checked += 1 + print(" %s: verified %d pinned goldens against this run" % (table, checked)) + if unknown: + print(" not produced by this generator: %s" % ", ".join(sorted(unknown))) + ok = False + return ok + + def main(): values = run() print("// analytic closed forms on the IBSI digital phantom, fixed bin number, %d bins" % NBINS) @@ -115,6 +143,18 @@ def main(): print(' {"%s", %.17g},' % (feature, values[feature])) print("\n// raw:", json.dumps(values, sort_keys=True)) + # Both tables this generator feeds. The robust-window tables in those same files come from the + # 17-px tail-trimming fixture, not this one, so they are deliberately not listed here. + print("\n=== re-verify every pinned golden this generator produces ===") + here = os.path.dirname(os.path.abspath(__file__)) + tests = os.path.join(here, "..", "..") + ok = verify_pins(os.path.join(tests, "test_2d_intensity_histogram_analytic.h"), + "intensity_histogram_2d_analytic_phantom_ref_vals", values) + ok &= verify_pins(os.path.join(tests, "test_2d_intensity_histogram_regression.h"), + "intensity_histogram_2d_regression_ref_vals", values) + print("\n%s" % ("ALL CHECKS PASSED" if ok else "SOME CHECKS FAILED -- do not paste goldens")) + return 0 if ok else 1 + if __name__ == "__main__": - main() + raise SystemExit(main()) diff --git a/tests/vetting/oracles/gen_intensity_histogram_mirp.py b/tests/vetting/oracles/gen_intensity_histogram_mirp.py index 7a8b5985..3127ee30 100644 --- a/tests/vetting/oracles/gen_intensity_histogram_mirp.py +++ b/tests/vetting/oracles/gen_intensity_histogram_mirp.py @@ -18,6 +18,8 @@ """ import json import logging +import os +import re from importlib import metadata import numpy as np @@ -74,19 +76,54 @@ def run(): return {c: float(df.iloc[0][c]) for c in df.columns if c.endswith(SUFFIX)} +def verify_pins(header, table, computed, tol=1e-9): + """Compare EVERY golden pinned in `table` against this run. + + Checking a hand-picked subset is the failure mode this exists to avoid: it silently stops + covering whatever is added to the table later. Anything the generator cannot produce is + reported rather than skipped quietly. + """ + text = re.sub(r"//[^\n]*", "", open(header, encoding="utf-8").read()) + body = text.split(table, 1)[1].split("{", 1)[1].split("};", 1)[0] + ok, checked, unknown = True, 0, [] + for name, pinned in re.findall(r'\{\s*"(\w+)"\s*,\s*([-0-9.e+]+)\s*\}', body): + if name not in computed: + unknown.append(name) + continue + got, want = computed[name], float(pinned) + if abs(got - want) > tol * max(1.0, abs(want), abs(got)): + print(" FAIL %s: oracle=%r pinned=%s" % (name, got, pinned)) + ok = False + checked += 1 + print(" verified %d pinned goldens against this run" % checked) + if unknown: + print(" not produced by this generator: %s" % ", ".join(sorted(unknown))) + ok = False + return ok + + def main(): values = run() print("// mirp %s, recipe ih.ibsi_fbn (fixed bin number, %d bins), IBSI digital phantom" % (metadata.version("mirp"), NBINS)) print("// generated by tests/vetting/oracles/gen_intensity_histogram_mirp.py") + nyxus = {} for column in sorted(MIRP_TO_NYXUS): key = column + SUFFIX if key not in values: print("// MISSING from this mirp build: %s" % key) continue + nyxus[MIRP_TO_NYXUS[column]] = values[key] print(' {"%s", %.17g}, // %s' % (MIRP_TO_NYXUS[column], values[key], column)) print("\n// raw:", json.dumps(values, sort_keys=True)) + print("\n=== re-verify every pinned golden in test_2d_intensity_histogram_mirp.h ===") + here = os.path.dirname(os.path.abspath(__file__)) + ok = verify_pins(os.path.join(here, "..", "..", "test_2d_intensity_histogram_mirp.h"), + "intensity_histogram_2d_mirp_ref_vals", nyxus) + print("\n%s" % ("ALL CHECKS PASSED" if ok else "SOME CHECKS FAILED -- do not paste goldens")) + return 0 if ok else 1 + if __name__ == "__main__": - main() + raise SystemExit(main()) diff --git a/tests/vetting/oracles/gen_moments_skimage.py b/tests/vetting/oracles/gen_moments_skimage.py index cc31801e..a73a542b 100644 --- a/tests/vetting/oracles/gen_moments_skimage.py +++ b/tests/vetting/oracles/gen_moments_skimage.py @@ -23,6 +23,10 @@ enough that the buggy h5/h6 formulas fail the gtest tolerance -- the regression-proof test the symmetric rectangle cannot provide -- and proves discriminance by printing |buggy - correct| against the gtest tolerance. + D. Emits the normalized RAW moments (NORM_SPAT_MOMENT_pq, IMOM_NRM_pq), for which skimage has + no native function, and guards that they are distinct from moments_normalized(). + E. Re-verifies EVERY golden pinned in test_2d_moments_skimage.h against this run - all 142, + both fixtures - rather than a hand-picked subset that silently stops covering new entries. Provenance: tool=scikit-image, version=0.26.0; numpy 2.4.6; env=nyxus_mirp (conda); generator=tests/vetting/oracles/gen_moments_skimage.py. Run offline; CI never invokes it. @@ -31,6 +35,9 @@ skimage's moments(A)[i, j] lands on i==p, j==q with no transposition (and no h7 sign flip). """ +import os +import re + import numpy as np from skimage.measure import moments, moments_central, moments_normalized, moments_hu @@ -107,6 +114,101 @@ def full_stack(a): return m, mu, nu, hu +def norm_raw(m, p, q): + """Nyxus normRawMom: m_pq / m_00^((p+q)/2 + 1). + + The exponent is skimage's own normalization exponent - moments_normalized() applies exactly + this to the CENTRAL moments - so the only thing added on top of skimage here is which moment + matrix it is applied to. Do NOT substitute moments_normalized(): that is a different quantity + (Nyxus exposes it separately as NORM_CENTRAL_MOMENT_pq / IMOM_NCM_pq). + """ + return m[p, q] / (m[0, 0] ** ((p + q) / 2.0 + 1.0)) + + +def oracle_value(name, stack_shape, stack_inten): + """Map a Nyxus feature name to its scikit-image value, or None if this family has no oracle. + + Used to re-verify EVERY pinned golden against a fresh run rather than a hand-picked subset: + a hand list silently stops covering whatever is added to the tables later. + """ + m_s, mu_s, nu_s, hu_s = stack_shape + m_i, mu_i, nu_i, hu_i = stack_inten + + mm = re.fullmatch(r"(HU_M|IMOM_HU)([1-7])", name) + if mm: + return (hu_s if mm.group(1) == "HU_M" else hu_i)[int(mm.group(2)) - 1] + + mm = re.fullmatch(r"([A-Z_]+?)_(\d)(\d)", name) + if not mm: + return None + fam, p, q = mm.group(1), int(mm.group(2)), int(mm.group(3)) + table = { + "SPAT_MOMENT": lambda: m_s[p, q], + "CENTRAL_MOMENT": lambda: mu_s[p, q], + "NORM_CENTRAL_MOMENT": lambda: nu_s[p, q], + "NORM_SPAT_MOMENT": lambda: norm_raw(m_s, p, q), + "IMOM_RM": lambda: m_i[p, q], + "IMOM_CM": lambda: mu_i[p, q], + "IMOM_NCM": lambda: nu_i[p, q], + "IMOM_NRM": lambda: norm_raw(m_i, p, q), + }.get(fam) + return None if table is None else table() + + +VERIFY_ORDER = 6 # the tables pin moments up to p+q = 6 (CENTRAL_MOMENT_33, IMOM_CM_33, ...) + + +def high_order_stack(a): + """Same quantities as full_stack, but to VERIFY_ORDER. + + moments_central(order=N) leaves every entry with p+q > N at zero, so verifying a golden like + CENTRAL_MOMENT_22 against an order-3 matrix compares it to 0 and "fails" for no reason. Hu is + still taken from the 4x4 eta block, which is all moments_hu reads. + """ + m = moments(a, order=VERIFY_ORDER) + mu = moments_central(a, order=VERIFY_ORDER) + nu = moments_normalized(mu, order=VERIFY_ORDER) + hu = hu_correct(np.nan_to_num(nu[:4, :4])) + return m, mu, nu, hu + + +def verify_every_pinned_golden(path, shape_arr, inten_arr, wedge_arr, tol=1e-6): + """Compare every golden pinned in `path` against a fresh oracle value. + + Every table is covered: the ones on the rectangle fixture and the wedge one, which is simply + the same shape families computed on the other fixture. Families with no skimage counterpart are + counted and reported, so the coverage is explicit rather than implied. + """ + stack_shape = high_order_stack(shape_arr) + stack_inten = high_order_stack(inten_arr) + stack_wedge = high_order_stack(wedge_arr) + text = open(path, encoding="utf-8").read() + text = re.sub(r"//[^\n]*", "", text) + ok = True + checked = skipped_fixture = no_oracle = 0 + for tbl, body in re.findall(r"ref_vals_list\s+(\w+)\s*\{(.*?)\n\};", + text, re.S): + wedge = "wedge" in tbl + for name, pinned in re.findall(r'\{\s*Nyxus::Feature2D::(\w+)\s*,\s*"\w+"\s*,\s*([-0-9.e+]+)\s*\}', + body): + skipped_fixture += wedge + got = (oracle_value(name, stack_wedge, stack_wedge) if wedge + else oracle_value(name, stack_shape, stack_inten)) + if got is None: + no_oracle += 1 + continue + got = float(np.nan_to_num(got)) + scale = max(1.0, abs(float(pinned)), abs(got)) + if abs(got - float(pinned)) > tol * scale: + print(f" FAIL {tbl}:{name}: oracle={got!r} pinned={pinned}") + ok = False + checked += 1 + print(f" verified {checked} pinned goldens against this run " + f"({skipped_fixture} of them on the wedge fixture); " + f"{no_oracle} with no skimage counterpart") + return ok + + def check(name, got, pinned, tol=REL_TOL): scale = max(1.0, abs(pinned), abs(got)) ok = abs(got - pinned) <= tol * scale @@ -252,6 +354,35 @@ def main(): print(f" {name}: correct={correct!r} buggy={buggy!r} |diff|={disc:.3e} tol={tol:.3e} -> {verdict}") all_ok &= disc > 10 * tol + # ------------------------------------------------- D. normalized RAW moments (rectangle) + print("\n=== D. normalized raw moments: NORM_SPAT_MOMENT_pq / IMOM_NRM_pq ===") + print("-- paste into moments_2d_skimage_normraw_shape_ref_vals --") + for p in range(4): + for q in range(4): + print('\t{Nyxus::Feature2D::NORM_SPAT_MOMENT_%d%d, "NORM_SPAT_MOMENT_%d%d", %r},' + % (p, q, p, q, float(norm_raw(m_s, p, q)))) + print("-- paste into moments_2d_skimage_normraw_intensity_ref_vals --") + for p in range(4): + for q in range(4): + print('\t{Nyxus::Feature2D::IMOM_NRM_%d%d, "IMOM_NRM_%d%d", %r},' + % (p, q, p, q, float(norm_raw(m_i, p, q)))) + + # the normalization must reproduce the pinned raw moments it is built from, and must NOT be + # confused with skimage's moments_normalized() - which answers the central-moment question + print("-- guard: normalized raw != skimage moments_normalized (they are different quantities) --") + for p, q in [(2, 0), (0, 2)]: + nr, nc = float(norm_raw(m_s, p, q)), float(nu_s[p, q]) + distinct = abs(nr - nc) > 1e-9 * max(1.0, abs(nc)) + print(f" p={p} q={q}: norm_raw={nr!r} moments_normalized={nc!r} -> " + f"{'DISTINCT' if distinct else 'IDENTICAL -- investigate'}") + all_ok &= distinct + + # ---------------------------------- E. every pinned golden, not a hand-picked subset + print("\n=== E. re-verify EVERY pinned golden in test_2d_moments_skimage.h ===") + hdr = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", + "test_2d_moments_skimage.h") + all_ok &= verify_every_pinned_golden(hdr, shp, inten, wedge_shape()) + print(f"\n{'ALL CHECKS PASSED' if all_ok else 'SOME CHECKS FAILED -- do not paste goldens'}") return 0 if all_ok else 1