def restore_full_from_partial(x, partial):
    """
    Restore full riemannian gradient from it's partial representation
    at ManifoldElement x

    Parameters
    ----------
    x : ManifoldElement, shape (M, N)
        point at which partial gradient was computed
    partial : tuple of ManifoldElements of shapes (M, N)
        matrices M, U_p and V_p^* as partial riemannian gradient

    Returns
    -------
    out : ManifoldElement
        riemannian gradient at x
    """
    mid_proj, u_proj, v_proj = partial
    return mid_proj.rdot(x.u).dot(x.v) + u_proj.dot(x.v) + v_proj.rdot(x.u)