diff --git a/src/pyrecest/tracking/ellipse_geometry.py b/src/pyrecest/tracking/ellipse_geometry.py index 163e55f63..489ca7230 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): 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 000000000..9d5a9cdcb --- /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 import project_symmetric_covariance + + +def test_covariance_projection_avoids_integer_overflow() -> None: + covariance = np.array( + [ + [120, 100], + [80, 110], + ], + dtype=np.int8, + ) + + projected = np.asarray(project_symmetric_covariance(covariance)) + + npt.assert_allclose( + projected, + np.array( + [ + [120.0, 90.0], + [90.0, 110.0], + ] + ), + ) + assert np.issubdtype(projected.dtype, np.floating)