Return a new :py:class:`.KalmanFilter` instance which is a shallow
        clone of this one. By "shallow", although the lists of measurements,
        etc, are cloned, the :py:class:`.MultivariateNormal` instances within
        them are not. Since :py:meth:`.predict` and :py:meth:`.update` do not
        modify the elements of these lists, it is safe to run two cloned filters
        in parallel as long as one does not directly modify the states.

        Returns:
            (KalmanFilter): A new :py:class:`KalmanFilter` instance.

def clone(self):
        """Return a new :py:class:`.KalmanFilter` instance which is a shallow
        clone of this one. By "shallow", although the lists of measurements,
        etc, are cloned, the :py:class:`.MultivariateNormal` instances within
        them are not. Since :py:meth:`.predict` and :py:meth:`.update` do not
        modify the elements of these lists, it is safe to run two cloned filters
        in parallel as long as one does not directly modify the states.

        Returns:
            (KalmanFilter): A new :py:class:`KalmanFilter` instance.

        """
        new_f = KalmanFilter(
            initial_state_estimate=self._initial_state_estimate)
        new_f._defaults = self._defaults # pylint:disable=protected-access
        new_f.state_length = self.state_length
        new_f.prior_state_estimates = list(self.prior_state_estimates)
        new_f.posterior_state_estimates = list(self.posterior_state_estimates)
        new_f.measurements = list(self.measurements)
        new_f.process_matrices = list(self.process_matrices)
        new_f.process_covariances = list(self.process_covariances)

        return new_f