def _check_point_on_manifold(self, x, atol, rtol): x_t = utils.transposem(x) eigvals, _ = tf.linalg.eigh(x) is_symmetric = utils.allclose(x, x_t, atol, rtol) is_pos_vals = utils.allclose(eigvals, tf.abs(eigvals), atol, rtol) is_zero_vals = utils.allclose(eigvals, tf.zeros_like(eigvals), atol, rtol) return is_symmetric & is_pos_vals & tf.logical_not(is_zero_vals)
def _check_point_on_manifold(self, x, atol, rtol): xtx = utils.transposem(x) @ x eye = tf.eye( tf.shape(xtx)[-1], batch_shape=tf.shape(xtx)[:-2], dtype=x.dtype ) is_orth = utils.allclose(xtx, eye, atol, rtol) det = tf.linalg.det(x) is_unit_det = utils.allclose(det, tf.ones_like(det), atol, rtol) return is_orth & is_unit_det
def _check_point_on_manifold(self, x, atol, rtol): xtx = utils.transposem(x) @ x shape = xtx.shape.as_list() eye = tf.eye(shape[-1], batch_shape=shape[:-2]) is_idempotent = utils.allclose(xtx, tf.cast(eye, x.dtype), atol, rtol) s = tf.linalg.svd(x, compute_uv=False) rank = tf.math.count_nonzero(s, axis=-1, dtype=tf.float32) k = tf.ones_like(rank) * int(x.shape[-1]) is_col_rank = utils.allclose(rank, k, atol, rtol) return is_idempotent & is_col_rank
def _check_vector_on_tangent(self, x, u, atol, rtol): lower_triang = tf.linalg.band_part(x, -1, 0) return utils.allclose(x, lower_triang, atol, rtol)
def _check_point_on_manifold(self, x, atol, rtol): lower_triang = tf.linalg.band_part(x, -1, 0) is_lower_triang = utils.allclose(x, lower_triang, atol, rtol) diag = tf.linalg.diag_part(x) is_pos_diag = utils.allclose(diag, tf.abs(diag), atol, rtol) return is_lower_triang & is_pos_diag
def _check_vector_on_tangent(self, x, u, atol, rtol): inner = self.inner(x, x, u) rtol = 100 * utils.get_eps(x) if rtol is None else rtol return utils.allclose(inner, tf.zeros_like(inner), atol, rtol)
def _check_point_on_manifold(self, x, atol, rtol): x_sq = tf.square(x) quad_form = -x_sq[..., :1] + tf.reduce_sum( x_sq[..., 1:], axis=-1, keepdims=True) return utils.allclose(quad_form, tf.ones_like(quad_form) * -self.k, atol, rtol)
def _check_vector_on_tangent(self, x, u, atol, rtol): inner = self.inner(x, x, u, keepdims=True) return utils.allclose(inner, tf.zeros_like(inner), atol, rtol)
def _check_point_on_manifold(self, x, atol, rtol): norm = tf.linalg.norm(x, axis=-1) return utils.allclose(norm, tf.ones_like(norm), atol, rtol)
def _check_vector_on_tangent(self, x, u, atol, rtol): diff = utils.transposem(u) + u return utils.allclose(diff, tf.zeros_like(diff), atol, rtol)
def _check_point_on_manifold(self, x, atol, rtol): xtx = utils.transposem(x) @ x eye = tf.eye( tf.shape(xtx)[-1], batch_shape=tf.shape(xtx)[:-2], dtype=xtx.dtype ) return utils.allclose(xtx, eye, atol, rtol)
def _check_vector_on_tangent(self, x, u, atol, rtol): u_t = utils.transposem(u) return utils.allclose(u, u_t, atol, rtol)
def _check_vector_on_tangent(self, x, u, atol, rtol): xtu = utils.transposem(x) @ u return utils.allclose(xtu, tf.zeros_like(xtu), atol, rtol)