def test_compose_and_inverse(self): # 1. Compose transformation by its inverse on the right # Expect the group identity rot_vec = tf.convert_to_tensor([0.2, 0.1, 0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) inv_mat = self.group.inverse(mat) result = self.group.compose(mat, inv_mat) expected = self.group.identity expected = helper.to_matrix(expected) with self.test_session(): self.assertAllClose(gs.eval(result), gs.eval(expected)) # 2. Compose transformation by its inverse on the left # Expect the group identity rot_vec = tf.convert_to_tensor([0.7, 0.1, 0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) inv_mat = self.group.inverse(mat) result = self.group.compose(inv_mat, mat) expected = self.group.identity expected = helper.to_matrix(expected) with self.test_session(): self.assertAllClose(gs.eval(result), gs.eval(expected))
def test_retractation_and_lifting(self): """ Test that the riemannian exponential and the riemannian logarithm are inverse. Expect their composition to give the identity function. """ # Riemannian Log then Riemannian Exp # General case base_point = self.point_a point = self.point_b tangent_vec = self.tangent_vector_1 lifted = self.metric.lifting(point=point, base_point=base_point) result = self.metric.retraction(tangent_vec=lifted, base_point=base_point) expected = helper.to_matrix(point) self.assertAllClose(result, expected, atol=ATOL) retract = self.metric.retraction(tangent_vec=tangent_vec, base_point=base_point) result = self.metric.lifting(point=retract, base_point=base_point) expected = helper.to_matrix(tangent_vec) self.assertAllClose(result, expected, atol=ATOL)
def test_inner_product_matrix(self): result = self.metric.inner_product_matrix() expected = gs.eye(self.dimension) expected = helper.to_matrix(expected) self.assertAllClose(result, expected)
def test_inverse(self): mat = gs.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 10.]]) result = self.group.inverse(mat) expected = 1. / 3. * gs.array([[-2., -4., 3.], [-2., 11., -6.], [3., -6., 3.]]) expected = helper.to_matrix(expected) self.assertTrue(gs.allclose(result, expected))
def test_inner_product_matrix(self): result = self.metric.inner_product_matrix() expected = gs.eye(self.dimension) expected = helper.to_matrix(expected) with self.test_session(): self.assertAllClose(gs.eval(result), gs.eval(expected))
def test_group_log_and_exp(self): point = 5 * gs.eye(self.n) group_log = self.group.group_log(point) result = self.group.group_exp(group_log) expected = point expected = helper.to_matrix(expected) self.assertAllClose(result, expected)
def test_log_and_exp(self): base_point = gs.array([[5., 0., 0.], [0., 7., 2.], [0., 2., 8.]]) point = gs.array([[9., 0., 0.], [0., 5., 0.], [0., 0., 1.]]) log = self.metric.log(point=point, base_point=base_point) result = self.metric.exp(tangent_vec=log, base_point=base_point) expected = helper.to_matrix(point) self.assertAllClose(result, expected)
def test_inverse(self): mat = tf.convert_to_tensor([[1., 2., 3.], [4., 5., 6.], [7., 8., 10.]]) result = self.group.inverse(mat) expected = 1. / 3. * tf.convert_to_tensor( [[-2., -4., 3.], [-2., 11., -6.], [3., -6., 3.]]) expected = helper.to_matrix(expected) with self.test_session(): self.assertAllClose(gs.eval(result), gs.eval(expected))
def test_compose_and_inverse(self): # 1. Compose transformation by its inverse on the right # Expect the group identity rot_vec = gs.array([0.2, 0.1, 0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) inv_mat = self.group.inverse(mat) result = self.group.compose(mat, inv_mat) expected = self.group.identity expected = helper.to_matrix(expected) self.assertAllClose(result, expected) # 2. Compose transformation by its inverse on the left # Expect the group identity rot_vec = gs.array([0.7, 0.1, 0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) inv_mat = self.group.inverse(mat) result = self.group.compose(inv_mat, mat) expected = self.group.identity expected = helper.to_matrix(expected) self.assertAllClose(result, expected)
def test_log_and_exp(self): """ Test that the riemannian exponential and the riemannian logarithm are inverse. Expect their composition to give the identity function. """ # Riemannian Log then Riemannian Exp # General case base_point = self.point_a point = self.point_b log = self.metric.log(point=point, base_point=base_point) result = self.metric.exp(tangent_vec=log, base_point=base_point) expected = helper.to_matrix(point) self.assertAllClose(result, expected, atol=ATOL)
def test_make_symmetric(self): sym_mat = gs.array([[1., 2.], [2., 1.]]) result = self.space.make_symmetric(sym_mat) expected = helper.to_matrix(sym_mat) self.assertAllClose(result, expected) mat = gs.array([[1., 2., 3.], [0., 0., 0.], [3., 1., 1.]]) result = self.space.make_symmetric(mat) expected = gs.array([[[1., 1., 3.], [1., 0., 0.5], [3., 0.5, 1.]]]) self.assertAllClose(result, expected) mat = gs.array([[[1e100, 1e-100, 1e100], [1e100, 1e-100, 1e100], [1e-100, 1e-100, 1e100]]]) result = self.space.make_symmetric(mat) res = 0.5 * (1e100 + 1e-100) expected = gs.array([[[1e100, res, res], [res, 1e-100, res], [res, res, 1e100]]]) self.assertAllClose(result, expected)
def test_compose(self): # 1. Composition by identity, on the right # Expect the original transformation rot_vec = gs.array([0.2, -0.1, 0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) result = self.group.compose(mat, self.group.identity) expected = mat expected = helper.to_matrix(mat) self.assertAllClose(result, expected) # 2. Composition by identity, on the left # Expect the original transformation rot_vec = gs.array([0.2, 0.1, -0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) result = self.group.compose(self.group.identity, mat) expected = mat self.assertAllClose(result, expected)
def test_compose(self): # 1. Composition by identity, on the right # Expect the original transformation rot_vec = tf.convert_to_tensor([0.2, -0.1, 0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) result = self.group.compose(mat, self.group.identity) expected = mat expected = helper.to_matrix(mat) with self.test_session(): self.assertAllClose(gs.eval(result), gs.eval(expected)) # 2. Composition by identity, on the left # Expect the original transformation rot_vec = tf.convert_to_tensor([0.2, 0.1, -0.1]) mat = self.so3_group.matrix_from_rotation_vector(rot_vec) result = self.group.compose(self.group.identity, mat) expected = mat with self.test_session(): self.assertAllClose(gs.eval(result), gs.eval(expected))