From 1cd0338a7fd2a8e661650de6f025a6e2a652e304 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Fri, 14 Aug 2026 08:06:53 -0700 Subject: [PATCH 1/3] test(moments): assert the normalized raw moments against scikit-image 32 rows of the 2D moments family - NORM_SPAT_MOMENT_ij and IMOM_NRM_ij - carried status=vetted with source=tracker while no in-tree test asserted them against any oracle. They now have one. Both are normalized RAW moments, m_pq / m_00^((p+q)/2 + 1). skimage has no native function for that: moments_normalized() applies the 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. On the pinned 48x40 fixture the two differ plainly - 0.3876 against 0.0999 at p=2,q=0 - and the second is what NORM_CENTRAL_MOMENT_20 matches. So the oracle is skimage's raw moments carried through skimage's own normalization exponent: the moment sums, which are the non-trivial part, come from an independent implementation, and the only step layered on top is an exponent skimage itself uses. Nyxus reproduces all 32 exactly - worst relative difference 0.0e+00 - and the generator now asserts that normalized-raw and moments_normalized are numerically distinct, so a later edit cannot silently swap one for the other. - gen_moments_skimage.py gains section D, emitting the 32 goldens plus that guard. - test_2d_moments_skimage.h gains two ref-val tables and test_2d_moments_normraw_{shape,intensity}_skimage, registered in test_all.cc. - oracle_coverage.csv: all 180 rows move to source=in-tree with config_recipe=moments.skimage_regionprops and tolerance=rel=1e-6, and current_test is now derived from what the tests actually assert rather than from what the tracker-era registry claimed. That correction alone touched 72 rows in both directions: rows naming the regression file that it does not cover, and the 32 that it does cover but which did not say so. The 62 weighted (distance-to-contour) rows stay regression, and now carry the reason in-tree rather than only in a side document. Re-measured against current code: the weighting takes dist from Pixel2::min_sqdist, an approximate hill-descent its own doc comment warns overestimates, and on the pinned fixture the exact distance to the contour gives WEIGHTED_SPAT_MOMENT_00 = 1821.28398639964 against the pinned 2498.7137504625134 - 1.372x, a 37.2% overestimate. Fixing that changes 62 published feature values and swaps an O(pixels x contour) scan for a distance transform, so it is out of scope here and noted for its own branch. One correction for whoever takes it: there is exactly one live weighting path; the second implementation using a different formula (inten/(dist+eps), image_matrix.cpp) has no callers anywhere, and no GPU kernel does this weighting at all. Also, per tests/vetting/ housekeeping: - Include hygiene: test_2d_moments_common.h called init_label_record_3 / update_label_record_3 unqualified, so all three moments headers compiled only because another header earlier in test_all.cc's include order contributes a file-scope `using namespace Nyxus;`. All three now compile as the only thing in a translation unit. Its unused is dropped. - The generator re-verified a hand-picked list of 25 golden names against the fresh run. It now re-verifies EVERY golden pinned in test_2d_moments_skimage.h - 142 of 142, across both fixtures, none without a skimage counterpart - so the check cannot quietly stop covering entries added later. Doing so surfaced that moments_central(order=N) leaves entries with p+q > N at zero while moments() fills the whole matrix, so the verification computes its matrices at order 6; the tables pin up to CENTRAL_MOMENT_33. - Comments describing the history of an h5/h6 formula fix are replaced by statements of the current contract - what the value is, and what a wrong formula would produce instead - with the history left to the audit report. - New audit artifacts: moments_2d_coverage.csv, moments_2d_skimage_vetting_report.md, moments_2d_golden_regen.md, and scan_moments_coverage.py, whose --check regenerates the CSV from the test sources and enforces that the registry and the tests agree row for row with no unregistered gtest function. - TOOLS.md records the moments_normalized-vs-normalized-raw trap and the p-on-x coordinate convention. gtest 734/734; ASan+UBSan on Linux 730/730 with no sanitizer diagnostics; pytest 85 passed, 1 skipped, 7 arrow-only deselected; check_test_names, check_coverage and scan_moments_coverage all clean. --- tests/test_2d_moments_common.h | 11 +- tests/test_2d_moments_regression.h | 8 +- tests/test_2d_moments_skimage.h | 75 +++- tests/test_all.cc | 10 + tests/vetting/TOOLS.md | 7 + tests/vetting/audit/moments_2d_coverage.csv | 181 +++++++++ .../vetting/audit/moments_2d_golden_regen.md | 96 +++++ .../moments_2d_skimage_vetting_report.md | 102 +++++ tests/vetting/audit/scan_moments_coverage.py | 166 ++++++++ tests/vetting/oracle_coverage.csv | 360 +++++++++--------- tests/vetting/oracles/gen_moments_skimage.py | 131 +++++++ 11 files changed, 950 insertions(+), 197 deletions(-) create mode 100644 tests/vetting/audit/moments_2d_coverage.csv create mode 100644 tests/vetting/audit/moments_2d_golden_regen.md create mode 100644 tests/vetting/audit/moments_2d_skimage_vetting_report.md create mode 100644 tests/vetting/audit/scan_moments_coverage.py diff --git a/tests/test_2d_moments_common.h b/tests/test_2d_moments_common.h index 5abb0d0e..75dba758 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++) diff --git a/tests/test_2d_moments_regression.h b/tests/test_2d_moments_regression.h index 02e86d64..d3aec2ee 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}, }; diff --git a/tests/test_2d_moments_skimage.h b/tests/test_2d_moments_skimage.h index 88225a6c..de3a6395 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,13 +121,15 @@ 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; @@ -148,3 +150,62 @@ void test_2d_moments_intensity_skimage() calculate_2d_geomoment_feature_values(fvals); assert_2d_geomoment_features(fvals, moments_2d_skimage_intensity_ref_vals, "VERIFIABLE_WITH_3P_BUILTIN_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, "VERIFIABLE_WITH_3P_BUILTIN_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, "VERIFIABLE_WITH_3P_BUILTIN_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_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 From b746ac14607933c9bc7eccbb7cf68b9ca6924484 Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Fri, 14 Aug 2026 08:14:38 -0700 Subject: [PATCH 2/3] test(vetting): re-verify every pinned intensity-histogram golden, not a subset Both generators printed a paste-ready table and stopped there: nothing compared the numbers already pinned in the tree against the run that had just produced them. Each now re-verifies the whole table it feeds. gen_intensity_histogram_mirp.py checks all 23 goldens in test_2d_intensity_histogram_mirp.h. gen_intensity_histogram_analytic.py checks the 19 it feeds in test_2d_intensity_histogram_analytic.h and the 4 percentile drift guards it feeds in test_2d_intensity_histogram_regression.h; the robust-window tables in those same files come from the 17-px tail-trimming fixture, not this generator, so they are deliberately not in its list. Anything pinned that the generator cannot produce is reported and fails the run rather than being skipped quietly, and both scripts now exit non-zero when a check fails, so a stale pin cannot pass unnoticed. Verified: mirp 23/23, analytic 19 + 4, ALL CHECKS PASSED on both. Python-only change - no compiled artifact is affected, so the gtest and ASan results already recorded for this branch still stand. --- .../gen_intensity_histogram_analytic.py | 42 ++++++++++++++++++- .../oracles/gen_intensity_histogram_mirp.py | 39 ++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) 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()) From efd2818589ea24f47b2004b9a86097f0f0d3a97d Mon Sep 17 00:00:00 2001 From: Demian Vladi Date: Fri, 14 Aug 2026 08:14:43 -0700 Subject: [PATCH 3/3] test(vetting): re-verify every pinned GLRLM golden, not a subset Both generators printed a paste-ready table and stopped there: nothing compared the numbers already pinned in the tree against the run that had just produced them. Each now re-verifies the whole table it feeds - all 32 entries of glrlm_2d_pyradiomics_ref_vals and glrlm_2d_mirp_ref_vals, the per-direction features and their _AVE twins alike. Anything pinned that the generator cannot produce is reported and fails the run rather than being skipped quietly, and both scripts now exit non-zero when a check fails, so a stale pin cannot pass unnoticed. The comparison band is 5e-3, the loosest the test file asserts at, which is the log-based GLRLM_RE case. Verified: 32/32 against pyradiomics v3.0.1 and 32/32 against mirp 2.6.0, ALL CHECKS PASSED on both. Python-only change - no compiled artifact is affected, so the gtest and ASan results already recorded for this branch still stand. --- tests/vetting/oracles/gen_glrlm_mirp.py | 40 ++++++++++++++++++- .../vetting/oracles/gen_glrlm_pyradiomics.py | 40 ++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) 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())