From 0a578af9b14b4079d0b896c5fe772e502b48ef7a Mon Sep 17 00:00:00 2001 From: David Northover Date: Tue, 2 Dec 2025 13:01:15 -0500 Subject: [PATCH 1/2] Removes duplicates - Duplicate check at 2 decimal points. - Removes during geometry calculation step. --- python/ouroboros/pipeline/slices_geom_pipeline.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/ouroboros/pipeline/slices_geom_pipeline.py b/python/ouroboros/pipeline/slices_geom_pipeline.py index 0e8b665..481d8d4 100644 --- a/python/ouroboros/pipeline/slices_geom_pipeline.py +++ b/python/ouroboros/pipeline/slices_geom_pipeline.py @@ -22,6 +22,10 @@ def _process(self, input_data: tuple[any]) -> None | str: if not isinstance(sample_points, np.ndarray): return "Input data must contain an array of sample points." + # Remove duplicates from sample points. + _, indicies = np.unique(sample_points.round(decimals=2), axis=0, return_index=True) + sample_points = sample_points[sorted(indicies)] + # Rescale the sample points if the option is enabled if config.annotation_mip_level != config.output_mip_level: mip_sizes = get_mip_volume_sizes(source_url) From 592bcbd7e1233a377a7ee58e7005ce0c0af4f73f Mon Sep 17 00:00:00 2001 From: David Northover Date: Tue, 2 Dec 2025 13:16:26 -0500 Subject: [PATCH 2/2] Update testing of normalized conversion for safety-induced accuracy penalty. --- .coverage | Bin 122880 -> 69632 bytes python/test/helpers/test_files.py | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.coverage b/.coverage index e03130e213620656798b0db395ee203ee7adfa15..1a54f0282852e4d14fd05d8ee39e75e2e5f73d0b 100644 GIT binary patch literal 69632 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 diff --git a/python/test/helpers/test_files.py b/python/test/helpers/test_files.py index 872381c..3a337ea 100644 --- a/python/test/helpers/test_files.py +++ b/python/test/helpers/test_files.py @@ -314,10 +314,6 @@ def test_np_convert_from_float(): # Direct Conversion assert np.all(np_convert(np.uint16, float_data, normalize=False) == [0] * 15 + [1]) - # Normalized Conversion - assert np.all(np_convert(np.uint16, float_data) == - np.arange(0, np.iinfo(np.uint16).max + 1, np.iinfo(np.uint16).max // 15)) - # Safe Bool safe_bool = np_convert(bool, base, safe_bool=True) assert safe_bool.dtype == np.uint8 @@ -328,6 +324,11 @@ def test_np_convert_from_float(): assert safe_bool.dtype == bool assert np.all(safe_bool == (base > 0)) + # Normalized Conversion; slight inaccuracy introduced for type safety + target = np.arange(0, np.iinfo(np.uint16).max + 1, (np.iinfo(np.uint16).max) // 15) + target[1:] = target[1:] - 1 + assert np.all(np_convert(np.uint16, float_data) == target) + def test_volume_from_intermediates(): pass