-
Notifications
You must be signed in to change notification settings - Fork 239
/
test_general_linear_group_tensorflow.py
120 lines (93 loc) · 3.75 KB
/
test_general_linear_group_tensorflow.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
"""
Unit tests for General Linear group.
"""
import importlib
import os
import tensorflow as tf
import geomstats.backend as gs
import tests.helper as helper
from geomstats.general_linear_group import GeneralLinearGroup
from geomstats.special_orthogonal_group import SpecialOrthogonalGroup
RTOL = 1e-5
class TestGeneralLinearGroupTensorFlow(tf.test.TestCase):
_multiprocess_can_split_ = True
def setUp(self):
gs.random.seed(1234)
n = 3
self.group = GeneralLinearGroup(n=n)
# We generate invertible matrices using so3_group
self.so3_group = SpecialOrthogonalGroup(n=n)
@classmethod
def setUpClass(cls):
os.environ['GEOMSTATS_BACKEND'] = 'tensorflow'
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
importlib.reload(gs)
@classmethod
def tearDownClass(cls):
os.environ['GEOMSTATS_BACKEND'] = 'numpy'
importlib.reload(gs)
def test_belongs(self):
"""
A rotation matrix belongs to the matrix Lie group
of invertible matrices.
"""
rot_vec = tf.convert_to_tensor([0.2, -0.1, 0.1])
rot_mat = self.so3_group.matrix_from_rotation_vector(rot_vec)
result = self.group.belongs(rot_mat)
expected = tf.convert_to_tensor([True])
with self.test_session():
self.assertAllClose(gs.eval(result), gs.eval(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))
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 = 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))
if __name__ == '__main__':
tf.test.main()