VV: Require Minimum Number of Neighbors fully V&V'ed - #1694
Conversation
Signed-off-by: Jared Duffey <jared.duffey@bluequartz.net>
Signed-off-by: Jared Duffey <jared.duffey@bluequartz.net>
Signed-off-by: Jared Duffey <jared.duffey@bluequartz.net>
Signed-off-by: Jared Duffey <jared.duffey@bluequartz.net>
Summary: - Confirmed no bugs (Minor changes port) - Documented 0 deviations from DREAM3D 6.5.171 - Retired 0 tests - Augmented existing tests with 6 new test cases including a templated Class 1 (Analytical) + Class 4 (Invariant) oracle - Added V&V source-tree deliverables (report, deviations) - Added several new error checks - Removed some unused code Signed-off-by: Jared Duffey <jared.duffey@bluequartz.net>
Both remaining MTR closure gaps were authored on 2026-07-28 (BlueQuartzSoftware#1694 RequireMinNumNeighbors, BlueQuartzSoftware#1693 ITKImageWriter), taking the closure to 29/29 across all branches while develop still reports 18/29. * Record both PRs in section 1.1 with their oracle classes and state * Add a required decision on ITK removal versus the submission tag: BlueQuartzSoftware#1693 verifies ITKImageWriterFilter in the plugin slated for removal, which is correct only if the submission tags before ITK is dropped * Note that the BlueQuartzSoftware#1693 oracle fixture is format-agnostic and transfers to WriteImageFilter if the decision goes the other way * Rewrite Phase 1 as review-bound rather than effort-bound; authoring is done, what remains is the ITK decision, the merge backlog, PR BlueQuartzSoftware#1640, and backfilling oracle attestations * Promote the merge backlog to its own section: 13 of 39 reports exist only on unmerged branches and 11 of those are closure filters, so a release tag cut today would pin an incomplete evidence package * Require vv_status.py to report against a named git ref defaulting to develop, so the all-branch versus develop gap cannot be hidden * Refresh counts throughout: 39 reports authored, 26 on develop, MTR-adjacent 29 authored of 63 Signed-off-by: Michael Jackson <mike.jackson@bluequartz.net>
V&V PR Review —
|
| numFeatures | voteCount |
wall |
|---|---|---|
| 51 | 0.2 KB | 0.06 s |
| 200,001 | 800 KB | 0.13 s |
| 1,000,001 | 4 MB | 0.41 s |
| 4,000,001 | 16 MB | 1.46 s |
Cost is O(numRejectedVoxels × numFeatures) and stays hidden only while voteCount is cache-resident. 21,600 rejected voxels is tiny — scaling to a realistic count multiplies the excess directly. Mirroring the legacy reset is a small, local fix.
Each iteration rescans the entire volume even though the rejected set only shrinks, and re-does the cellDataArrayPaths "move FeatureIds to the end" shuffle plus a getDataAs<IDataArray> lookup per array per iteration. Not blocking, but a worklist would fall out of the guard work above.
Memory / out-of-core
-
std::vector<int32> neighbors(featureIds.getNumberOfTuples(), -1)(line 177) is 4 bytes per cell, allocated unconditionally even when nothing is rejected, plusbadFeatureIdIndexesat 8 bytes per rejected voxel. That is a hard in-core ceiling for large volumes. The report has no memory section at all — please add one stating the per-cell overhead so users can size jobs. - OOC storage is not actually exercised. The
simplnx-ooc-Relbuild passes, but every fixture constructs default in-memory stores and the Small IN100 test loads fully into memory, so "passes in the OOC build" means "compiles and passes there", not "verified out of core". Either add coverage or say so explicitly in the report rather than leaving it implied.
Adjacent (separate issue, not this PR)
-
src/simplnx/Utilities/DataGroupUtilities.cpp:45—for(int32_t i = 1; i < activeObjects.size(); i++)is a signed/unsigned comparison that overflows above 2^31 features. Affects every filter callingRemoveInactiveObjects.
Verification artifacts (fixture generator, matched 6.5.171/NX pipelines, NumPy reference oracle, outputs, hang repro, and the voteCount scaling measurement) are staged in ww_work/pr1694_review/ with a ReadMe.md, for OneDrive archival — not committed.
|
Sorry didn't realize I was here for re-review will review again after its updated |
Naming Conventions
Naming of variables should descriptive where needed. Loop Control Variables can use
iif warranted. Most of these conventions are enforced through the clang-tidy and clang-format configuration files. See the filesimplnx/docs/Code_Style_Guide.mdfor a more in depth explanation.Filter Checklist
The help file
simplnx/docs/Porting_Filters.mdhas documentation to help you port or write new filters. At the top is a nice checklist of items that should be noted when porting a filter.Unit Testing
The idea of unit testing is to test the filter for proper execution and error handling. How many variations on a unit test each filter needs is entirely dependent on what the filter is doing. Generally, the variations can fall into a few categories:
Code Cleanup