def exp(self, tangent_vec, base_point, **kwargs): """Compute the Log-Euclidean exponential map. Compute the Riemannian exponential at point base_point of tangent vector tangent_vec wrt the Log-Euclidean metric. This gives a symmetric positive definite matrix. Parameters ---------- tangent_vec : array-like, shape=[..., n, n] Tangent vector at base point. base_point : array-like, shape=[..., n, n] Base point. Returns ------- exp : array-like, shape=[..., n, n] Riemannian exponential. """ log_base_point = SPDMatrices.logm(base_point) dlog_tangent_vec = SPDMatrices.differential_log( tangent_vec, base_point) exp = SymmetricMatrices.expm(log_base_point + dlog_tangent_vec) return exp
def test_expm(self): """Test of expm method.""" sym_n = SymmetricMatrices(self.n) v = gs.array([[0.0, 1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]]) result = sym_n.expm(v) c = math.cosh(1) s = math.sinh(1) e = math.exp(1) expected = gs.array([[c, s, 0.0], [s, c, 0.0], [0.0, 0.0, e]]) four_dim_v = gs.broadcast_to(v, (2, 2) + v.shape) four_dim_expected = gs.broadcast_to(expected, (2, 2) + expected.shape) four_dim_result = sym_n.expm(four_dim_v) self.assertAllClose(result, expected) self.assertAllClose(four_dim_result, four_dim_expected)
def test_expm(self): """Test of expm method.""" sym_n = SymmetricMatrices(self.n) v = gs.array([[0., 1., 0.], [1., 0., 0.], [0., 0., 1.]]) result = sym_n.expm(v) c = math.cosh(1) s = math.sinh(1) e = math.exp(1) expected = gs.array([[c, s, 0.], [s, c, 0.], [0., 0., e]]) self.assertAllClose(result, expected)
def _aux_exp(tangent_vec, sqrt_base_point, inv_sqrt_base_point): """Compute the exponential map (auxiliary function). Parameters ---------- tangent_vec : array-like, shape=[..., n, n] sqrt_base_point : array-like, shape=[..., n, n] inv_sqrt_base_point : array-like, shape=[..., n, n] Returns ------- exp : array-like, shape=[..., n, n] """ tangent_vec_at_id = Matrices.mul(inv_sqrt_base_point, tangent_vec, inv_sqrt_base_point) tangent_vec_at_id = Matrices.to_symmetric(tangent_vec_at_id) exp_from_id = SymmetricMatrices.expm(tangent_vec_at_id) exp = Matrices.mul(sqrt_base_point, exp_from_id, sqrt_base_point) return exp
def exp(self, tangent_vec, base_point): """Compute the Log-Euclidean exponential map. Compute the Riemannian exponential at point base_point of tangent vector tangent_vec wrt the Log-Euclidean metric. This gives a symmetric positive definite matrix. Parameters ---------- tangent_vec : array-like, shape=[n_samples, n, n] base_point : array-like, shape=[n_samples, n, n] Returns ------- exp : array-like, shape=[n_samples, n, n] """ log_base_point = self.space.logm(base_point) dlog_tangent_vec = self.space.differential_log(tangent_vec, base_point) exp = SymmetricMatrices.expm(log_base_point + dlog_tangent_vec) return exp
def _aux_exp(tangent_vec, sqrt_base_point, inv_sqrt_base_point): """Compute the exponential map (auxiliary function). Parameters ---------- tangent_vec : array-like, shape=[..., n, n] sqrt_base_point : array-like, shape=[..., n, n] inv_sqrt_base_point : array-like, shape=[..., n, n] Returns ------- exp : array-like, shape=[..., n, n] """ tangent_vec_at_id = gs.einsum('...ij,...jk->...ik', inv_sqrt_base_point, tangent_vec) tangent_vec_at_id = gs.einsum('...ij,...jk->...ik', tangent_vec_at_id, inv_sqrt_base_point) tangent_vec_at_id = GeneralLinear.to_symmetric(tangent_vec_at_id) exp_from_id = SymmetricMatrices.expm(tangent_vec_at_id) exp = gs.einsum('...ij,...jk->...ik', exp_from_id, sqrt_base_point) exp = gs.einsum('...ij,...jk->...ik', sqrt_base_point, exp) return exp
def test_expm(self, mat, expected): result = SymmetricMatrices.expm(gs.array(mat)) self.assertAllClose(result, gs.array(expected))