diff --git a/src/pyrecest/filters/circular_ukf.py b/src/pyrecest/filters/circular_ukf.py index 066ef921d..253756e13 100644 --- a/src/pyrecest/filters/circular_ukf.py +++ b/src/pyrecest/filters/circular_ukf.py @@ -245,7 +245,7 @@ def filter_state(self) -> GaussianDistribution: @filter_state.setter def filter_state(self, new_state): new_state = _as_circular_gaussian(new_state, "filter_state") - self._filter_state = new_state + AbstractFilter.filter_state.fset(self, new_state) # ------------------------------------------------------------------ # Prediction diff --git a/tests/filters/test_circular_ukf_state_ownership.py b/tests/filters/test_circular_ukf_state_ownership.py new file mode 100644 index 000000000..e462ebfec --- /dev/null +++ b/tests/filters/test_circular_ukf_state_ownership.py @@ -0,0 +1,30 @@ +import unittest + +import numpy.testing as npt + +import pyrecest.backend +from pyrecest.backend import array +from pyrecest.distributions import GaussianDistribution +from pyrecest.filters.circular_ukf import CircularUKF + + +class CircularUKFStateOwnershipTest(unittest.TestCase): + @unittest.skipUnless( + pyrecest.backend.__backend_name__ == "numpy", + "mutable NumPy arrays required for aliasing regression", + ) + def test_assignment_copies_state(self): + filt = CircularUKF() + assigned = GaussianDistribution(array([0.5]), array([[0.7]])) + filt.filter_state = assigned + + self.assertIsNot(filt.filter_state, assigned) + assigned.mu[0] = 1.5 + assigned.C[0, 0] = 2.0 + + npt.assert_equal(filt.filter_state.mu, array([0.5])) + npt.assert_equal(filt.filter_state.C, array([[0.7]])) + + +if __name__ == "__main__": + unittest.main()