def METHOD_NAME(self, prior, timestamp=None, **kwargs):
    r"""The predict function
    Parameters
    ----------
    prior : :class:`~.InformationState`
        :math:`\mathbf{y}_{k-1}, Y_{k-1}`
    timestamp : :class:`datetime.datetime`, optional
        :math:`k`
    **kwargs :
        These are passed, via :meth:`~.transition_model.transition_function` to
        :meth:`~.LinearGaussianTransitionModel.matrix`
    Returns
    -------
    : :class:`~.InformationStatePrediction`
        :math:`\mathbf{y}_{k|k-1}`, the predicted information state and the predicted
        information matrix :math:`Y_{k|k-1}`
    """
    # Get the prediction interval
    predict_over_interval = self._predict_over_interval(prior, timestamp)
    # As this is Kalman-like, the control model must be capable of
    # returning a control matrix (B)
    inverse_transition_matrix = self._inverse_transition_matrix(
        prior=prior, time_interval=predict_over_interval, **kwargs)
    transition_covar = self.transition_model.covar(
        time_interval=predict_over_interval, **kwargs)
    control_matrix = self._control_matrix
    # control noise doesn't appear in the information matrix literature. It's incorporation
    # will require re-deriving the following equations.
    # control_noise = self.control_model.control_noise
    Mk = inverse_transition_matrix.T @ prior.precision @ inverse_transition_matrix
    Ck = np.linalg.inv(np.eye(prior.ndim) + Mk @ transition_covar)
    pred_info_matrix = Ck @ Mk
    pred_info_state = Ck @ inverse_transition_matrix.T @ prior.state_vector + \
        pred_info_matrix @ control_matrix @ self.control_model.control_input()
    return Prediction.from_state(prior, pred_info_state, pred_info_matrix, timestamp=timestamp,
                                 transition_model=self.transition_model)