From c2170ce2d0388e879103d66bf99f4e7660ce92b7 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:10:20 +0800 Subject: [PATCH 1/3] Avoid integer overflow when symmetrizing matrices --- src/pyrecest/tracking/ellipse_geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyrecest/tracking/ellipse_geometry.py b/src/pyrecest/tracking/ellipse_geometry.py index 163e55f633..489ca72306 100644 --- a/src/pyrecest/tracking/ellipse_geometry.py +++ b/src/pyrecest/tracking/ellipse_geometry.py @@ -37,7 +37,7 @@ def symmetrize(matrix): """Return the symmetric part of ``matrix``.""" matrix = asarray(matrix) - return 0.5 * (matrix + matrix.T) + return 0.5 * matrix + 0.5 * matrix.T def project_symmetric_covariance(covariance, minimum_eigenvalue=0.0): From 648b4f16fef6f1ea785e0e2a15571277331fffca Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:10:35 +0800 Subject: [PATCH 2/3] Add regression test for integer symmetrization overflow --- .../test_ellipse_geometry_integer_overflow.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/tracking/test_ellipse_geometry_integer_overflow.py diff --git a/tests/tracking/test_ellipse_geometry_integer_overflow.py b/tests/tracking/test_ellipse_geometry_integer_overflow.py new file mode 100644 index 0000000000..36c3866131 --- /dev/null +++ b/tests/tracking/test_ellipse_geometry_integer_overflow.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import numpy as np +import numpy.testing as npt +from pyrecest.tracking.ellipse_geometry import symmetrize + + +def test_symmetrize_avoids_integer_overflow() -> None: + matrix = np.array( + [ + [120, 100], + [80, 110], + ], + dtype=np.int8, + ) + + result = np.asarray(symmetrize(matrix)) + + npt.assert_allclose( + result, + np.array( + [ + [120.0, 90.0], + [90.0, 110.0], + ] + ), + ) + assert np.issubdtype(result.dtype, np.floating) From d438fd88cbe41f3959eda965e68ca4db20496721 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:11:52 +0800 Subject: [PATCH 3/3] Exercise integer overflow fix through public covariance API --- .../test_ellipse_geometry_integer_overflow.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/tracking/test_ellipse_geometry_integer_overflow.py b/tests/tracking/test_ellipse_geometry_integer_overflow.py index 36c3866131..9d5a9cdcb3 100644 --- a/tests/tracking/test_ellipse_geometry_integer_overflow.py +++ b/tests/tracking/test_ellipse_geometry_integer_overflow.py @@ -2,11 +2,11 @@ import numpy as np import numpy.testing as npt -from pyrecest.tracking.ellipse_geometry import symmetrize +from pyrecest.tracking import project_symmetric_covariance -def test_symmetrize_avoids_integer_overflow() -> None: - matrix = np.array( +def test_covariance_projection_avoids_integer_overflow() -> None: + covariance = np.array( [ [120, 100], [80, 110], @@ -14,10 +14,10 @@ def test_symmetrize_avoids_integer_overflow() -> None: dtype=np.int8, ) - result = np.asarray(symmetrize(matrix)) + projected = np.asarray(project_symmetric_covariance(covariance)) npt.assert_allclose( - result, + projected, np.array( [ [120.0, 90.0], @@ -25,4 +25,4 @@ def test_symmetrize_avoids_integer_overflow() -> None: ] ), ) - assert np.issubdtype(result.dtype, np.floating) + assert np.issubdtype(projected.dtype, np.floating)