Skip to content

Commit

Permalink
kronecker: test with different dtypes
Browse files Browse the repository at this point in the history
  • Loading branch information
Bihaqo committed Oct 28, 2018
1 parent 3e4283f commit d940f94
Showing 1 changed file with 57 additions and 22 deletions.
79 changes: 57 additions & 22 deletions t3f/kronecker_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,26 @@
from t3f import variables
from t3f import kronecker as kr

class KroneckerTest(tf.test.TestCase):
class _KroneckerTest():

def testIsKronNonKron(self):
# Tests _is_kron on a non-Kronecker matrix
initializer = initializers.random_matrix(((2, 3), (3, 2)), tt_rank=2)
initializer = initializers.random_matrix(((2, 3), (3, 2)), tt_rank=2,
dtype=self.tf_dtype)
tt_mat = variables.get_variable('tt_mat', initializer=initializer)
self.assertFalse(kr._is_kron(tt_mat))

def testIsKronKron(self):
# Tests _is_kron on a Kronecker matrix
initializer = initializers.random_matrix(((2, 3), (3, 2)), tt_rank=1)
initializer = initializers.random_matrix(((2, 3), (3, 2)), tt_rank=1,
dtype=self.tf_dtype)
kron_mat = variables.get_variable('kron_mat', initializer=initializer)
self.assertTrue(kr._is_kron(kron_mat))

def testDet(self):
# Tests the determinant function
initializer = initializers.random_matrix(((2, 3, 2), (2, 3, 2)), tt_rank=1)
initializer = initializers.random_matrix(((2, 3, 2), (2, 3, 2)), tt_rank=1,
dtype=self.tf_dtype)
kron_mat = variables.get_variable('kron_mat', initializer=initializer)
init_op = tf.global_variables_initializer()
with self.test_session() as sess:
Expand All @@ -40,11 +43,13 @@ def testSlogDet(self):
# the current version is platform-dependent

tf.set_random_seed(5) # negative derminant
initializer = initializers.random_matrix(((2, 3), (2, 3)), tt_rank=1)
initializer = initializers.random_matrix(((2, 3), (2, 3)), tt_rank=1,
dtype=self.tf_dtype)
kron_neg = variables.get_variable('kron_neg', initializer=initializer)

tf.set_random_seed(1) # positive determinant
initializer = initializers.random_matrix(((2, 3), (2, 3)), tt_rank=1)
initializer = initializers.random_matrix(((2, 3), (2, 3)), tt_rank=1,
dtype=self.tf_dtype)
kron_pos = variables.get_variable('kron_pos', initializer=initializer)

init_op = tf.global_variables_initializer()
Expand All @@ -64,7 +69,8 @@ def testSlogDet(self):

def testInv(self):
# Tests the inv function
initializer = initializers.random_matrix(((2, 3, 2), (2, 3, 2)), tt_rank=1)
initializer = initializers.random_matrix(((2, 3, 2), (2, 3, 2)), tt_rank=1,
dtype=self.tf_dtype)
kron_mat = variables.get_variable('kron_mat', initializer=initializer)
init_op = tf.global_variables_initializer()
with self.test_session() as sess:
Expand All @@ -79,45 +85,50 @@ def testCholesky(self):

# generating two symmetric positive-definite tt-cores
L_1 = np.tril(np.random.normal(scale=2., size=(2, 2)))
L_1 = L_1.astype(self.np_dtype)
L_2 = np.tril(np.random.normal(scale=2., size=(3, 3)))
L_2 = L_2.astype(self.np_dtype)
K_1 = L_1.dot(L_1.T)
K_2 = L_2.dot(L_2.T)
K = np.kron(K_1, K_2)
initializer = TensorTrain([K_1[None, :, :, None],
K_2[None, :, :, None]],
tt_ranks=7*[1])
K_2[None, :, :, None]],
tt_ranks=7*[1])
kron_mat = variables.get_variable('kron_mat', initializer=initializer)
init_op = tf.global_variables_initializer()
with self.test_session() as sess:
sess.run(init_op)
desired = np.linalg.cholesky(K)
actual = ops.full(kr.cholesky(kron_mat)).eval()
self.assertAllClose(desired, actual)
self.assertAllClose(desired, actual, atol=1e-5, rtol=1e-5)

class BatchKroneckerTest(tf.test.TestCase):
class _BatchKroneckerTest():

def testIsKronNonKron(self):
# Tests _is_kron on a non-Kronecker matrix batch
initializer = initializers.random_matrix_batch(((2, 3), (3, 2)), tt_rank=2,
batch_size=3)
batch_size=3,
dtype=self.tf_dtype)
tt_mat_batch = variables.get_variable('tt_mat_batch',
initializer=initializer)
initializer=initializer)
self.assertFalse(kr._is_kron(tt_mat_batch))

def testIsKronKron(self):
# Tests _is_kron on a Kronecker matrix batch
initializer = initializers.random_matrix_batch(((2, 3), (3, 2)), tt_rank=1,
batch_size=3)
batch_size=3,
dtype=self.tf_dtype)
kron_mat_batch = variables.get_variable('kron_mat_batch',
initializer=initializer)
initializer=initializer)
self.assertTrue(kr._is_kron(kron_mat_batch))

def testDet(self):
# Tests the determinant function
initializer = initializers.random_matrix_batch(((2, 3, 2), (2, 3, 2)),
tt_rank=1, batch_size=3)
tt_rank=1, batch_size=3,
dtype=self.tf_dtype)
kron_mat_batch = variables.get_variable('kron_mat_batch',
initializer=initializer)
initializer=initializer)
init_op = tf.global_variables_initializer()
with self.test_session() as sess:
sess.run(init_op)
Expand All @@ -130,9 +141,10 @@ def testSlogDet(self):

tf.set_random_seed(1) # negative and positive determinants
initializer = initializers.random_matrix_batch(((2, 3), (2, 3)), tt_rank=1,
batch_size=3)
batch_size=3,
dtype=self.tf_dtype)
kron_mat_batch = variables.get_variable('kron_mat_batch',
initializer=initializer)
initializer=initializer)

init_op = tf.global_variables_initializer()
with self.test_session() as sess:
Expand All @@ -147,9 +159,10 @@ def testSlogDet(self):
def testInv(self):
# Tests the inv function
initializer = initializers.random_matrix_batch(((2, 3, 2), (2, 3, 2)),
tt_rank=1, batch_size=3)
tt_rank=1, batch_size=3,
dtype=self.tf_dtype)
kron_mat_batch = variables.get_variable('kron_mat_batch',
initializer=initializer)
initializer=initializer)
init_op = tf.global_variables_initializer()
with self.test_session() as sess:
sess.run(init_op)
Expand All @@ -163,13 +176,15 @@ def testCholesky(self):

# generating two symmetric positive-definite tt-cores
L_1 = np.tril(np.random.normal(scale=2., size=(4, 2, 2)))
L_1 = L_1.astype(self.np_dtype)
L_2 = np.tril(np.random.normal(scale=2., size=(4, 3, 3)))
L_2 = L_2.astype(self.np_dtype)
K_1 = np.einsum('ijk,ilk->ijl', L_1, L_1)
K_2 = np.einsum('ijk,ilk->ijl', L_2, L_2)
initializer = TensorTrainBatch([K_1[:, None, :, :, None],
K_2[:, None, :, :, None]], tt_ranks=7*[1])
kron_mat_batch = variables.get_variable('kron_mat_batch',
initializer=initializer)
initializer=initializer)
init_op = tf.global_variables_initializer()
with self.test_session() as sess:
sess.run(init_op)
Expand All @@ -178,5 +193,25 @@ def testCholesky(self):
self.assertAllClose(desired, actual)


class KroneckerTestFloat32(tf.test.TestCase, _KroneckerTest):
np_dtype = np.float32
tf_dtype = tf.float32


class KroneckerTestFloat64(tf.test.TestCase, _KroneckerTest):
np_dtype = np.float64
tf_dtype = tf.float64


class BatchKroneckerTestFloat32(tf.test.TestCase, _BatchKroneckerTest):
np_dtype = np.float32
tf_dtype = tf.float32


class BatchKroneckerTestFloat64(tf.test.TestCase, _BatchKroneckerTest):
np_dtype = np.float64
tf_dtype = tf.float64


if __name__ == "__main__":
tf.test.main()

0 comments on commit d940f94

Please sign in to comment.