Author: bugman Date: Tue Oct 15 10:43:03 2013 New Revision: 21103 URL: http://svn.gna.org/viewcvs/relax?rev=21103&view=rev Log: Created a unit test for the lib.linear_algebra.matrix_exponential module. This module does not exist yet, but it will be used to replace the scipy.linalg.expm() function use in the relaxation dispersion branch. Added: trunk/test_suite/unit_tests/_lib/_linear_algebra/test_matrix_exponential.py - copied, changed from r21100, trunk/test_suite/unit_tests/_lib/_linear_algebra/test_kronecker_product.py Modified: trunk/test_suite/unit_tests/_lib/_linear_algebra/__init__.py Modified: trunk/test_suite/unit_tests/_lib/_linear_algebra/__init__.py URL: http://svn.gna.org/viewcvs/relax/trunk/test_suite/unit_tests/_lib/_linear_algebra/__init__.py?rev=21103&r1=21102&r2=21103&view=diff ============================================================================== --- trunk/test_suite/unit_tests/_lib/_linear_algebra/__init__.py (original) +++ trunk/test_suite/unit_tests/_lib/_linear_algebra/__init__.py Tue Oct 15 10:43:03 2013 @@ -22,5 +22,6 @@ __all__ = [ 'test___init__', - 'test_kronecker_prod' + 'test_kronecker_prod', + 'test_matrix_exponential' ] Copied: trunk/test_suite/unit_tests/_lib/_linear_algebra/test_matrix_exponential.py (from r21100, trunk/test_suite/unit_tests/_lib/_linear_algebra/test_kronecker_product.py) URL: http://svn.gna.org/viewcvs/relax/trunk/test_suite/unit_tests/_lib/_linear_algebra/test_matrix_exponential.py?p2=trunk/test_suite/unit_tests/_lib/_linear_algebra/test_matrix_exponential.py&p1=trunk/test_suite/unit_tests/_lib/_linear_algebra/test_kronecker_product.py&r1=21100&r2=21103&rev=21103&view=diff ============================================================================== --- trunk/test_suite/unit_tests/_lib/_linear_algebra/test_kronecker_product.py (original) +++ trunk/test_suite/unit_tests/_lib/_linear_algebra/test_matrix_exponential.py Tue Oct 15 10:43:03 2013 @@ -24,281 +24,38 @@ from unittest import TestCase # relax module imports. -from lib.linear_algebra.kronecker_product import kron_prod, transpose_12, transpose_13, transpose_14, transpose_23, transpose_24, transpose_34 +from lib.linear_algebra.matrix_exponential import matrix_exponential -class Test_kronecker_product(TestCase): - """Unit tests for the target_functions.kronecker_product relax module.""" - - def setUp(self): - """Set up data used by the unit tests.""" - - # A rank-4, 3D tensor in string form (and rank-2, 9D). - self.daeg_str = [ - ['0000', '0001', '0002', '0010', '0011', '0012', '0020', '0021', '0022'], - ['0100', '0101', '0102', '0110', '0111', '0112', '0120', '0121', '0122'], - ['0200', '0201', '0202', '0210', '0211', '0212', '0220', '0221', '0222'], - - ['1000', '1001', '1002', '1010', '1011', '1012', '1020', '1021', '1022'], - ['1100', '1101', '1102', '1110', '1111', '1112', '1120', '1121', '1122'], - ['1200', '1201', '1202', '1210', '1211', '1212', '1220', '1221', '1222'], - - ['2000', '2001', '2002', '2010', '2011', '2012', '2020', '2021', '2022'], - ['2100', '2101', '2102', '2110', '2111', '2112', '2120', '2121', '2122'], - ['2200', '2201', '2202', '2210', '2211', '2212', '2220', '2221', '2222'], - ] - print("The initial tensor:") - self.print_nice(self.daeg_str) - self.daeg = self.to_numpy(self.daeg_str) +class Test_matrix_exponential(TestCase): + """Unit tests for the lib.linear_algebra.matrix_exponential relax module.""" - def print_nice(self, daeg): - """Formatted printout of the tensor.""" - - # Loop over the rows. - for i in range(9): - # Empty row. - if i != 0 and not i % 3: - print(' |' + '-'*17 + '|' + '-'*17 + '|' + '-'*17) - - # Loop over the columns. - line = '' - for j in range(9): - # Block separator. - if not j % 3: - line = line + ' | ' - - # The matrix element. - if isinstance(daeg[i][j], str): - line = line + daeg[i][j] + " " - else: - val = "%s" % int(daeg[i, j]) - string = ['0', '0', '0', '0'] - for k in range(1, len(val)+1): - string[-k] = val[-k] - string = '%s%s%s%s' % (string[0], string[1], string[2], string[3]) - line = line + string + " " - - print(line + '|') - print('') - - - def string_transpose(self, index1, index2): - """Manually transpose self.daeg_str using the 2 given indices.""" - - # Initialise the matrix. - daegT = [] - - # The string indices. - indices = list(range(4)) - temp = indices[index1-1] - indices[index1-1] = indices[index2-1] - indices[index2-1] = temp - - # Loop over the elements. - for i in range(9): - daegT.append([]) - for j in range(9): - elem = self.daeg_str[i][j] - daegT[-1].append('%s%s%s%s' % (elem[indices[0]], elem[indices[1]], elem[indices[2]], elem[indices[3]])) - - # Return. - return daegT - - - def to_numpy(self, tensor): - """Convert the string version of the tensor into a numpy version.""" - - # Initialise. - new = zeros((9, 9), float64) - - # Loop over the elements. - for i in range(9): - for j in range(9): - new[i, j] = float(tensor[i][j]) - - # Return the tensor. - return new - - - def test_kron_prod(self): + def test_matrix_exponential(self): """Test the Kronecker product function kron_prod().""" # The 3D, rank-2 matrices. - R1 = array([[1, 4, 5], [-4, 2, 6], [-5, -6, 3]], float64) - R2 = array([[0, 1, 0], [0, 0, 0], [0, 0, 0]], float64) + R1 = array([[1, 4, 5], + [-4, 2, 6], + [-5, -6, 3]], float64) + R2 = array([[0, 1, 0], + [0, 0, 0], + [0, 0, 0]], float64) - # The Kronecker product. - C = kron_prod(R1, R2) + # The real matrix exponentials. + eR1 = array([[-1.242955024379687, -3.178944439554645, 6.804083368075889], + [-6.545353831891249, -2.604941866769356, 1.228233941393001], + [ 0.975355249080821, -7.711099455690256, -3.318642157729292]], float64) + eR2 = array([[ 1., 0., 0.], + [ 0., 1., 0.], + [ 0., 0., 1.]], float64) - # The real Kronecker product! - D = array([ - [ 0, 1, 0, 0, 4, 0, 0, 5, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, -4, 0, 0, 2, 0, 0, 6, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, -5, 0, 0, -6, 0, 0, 3, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0]], float64) - - # Print outs. - print("R1:\n%s" % R1) - print("R2:\n%s" % R2) - print("C:\n%s" % C) - print("D:\n%s" % D) + # The maths. + eR1_test = matrix_exponential(R1) + eR2_test = matrix_exponential(R2) # Checks. - self.assertEqual(C.shape, (9, 9)) - for i in range(9): - for j in range(9): - self.assertEqual(C[i, j], D[i, j]) - - - def test_transpose_12(self): - """Check the 1,2 transpose of a rank-4, 3D tensor.""" - - # Manually create the string rep of the transpose. - daegT = self.string_transpose(1, 2) - print("The real 1,2 transpose:") - self.print_nice(daegT) - - # Convert to numpy. - daegT = self.to_numpy(daegT) - - # Check. - print("The numerical 1,2 transpose:") - transpose_12(self.daeg) - self.print_nice(self.daeg) - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j])) - self.assertEqual(self.daeg[i, j], daegT[i, j]) - - - def test_transpose_13(self): - """Check the 1,3 transpose of a rank-4, 3D tensor.""" - - # Manually create the string rep of the transpose. - daegT = self.string_transpose(1, 3) - print("The real 1,3 transpose:") - self.print_nice(daegT) - - # Convert to numpy. - daegT = self.to_numpy(daegT) - - # Check. - print("The numerical 1,3 transpose:") - transpose_13(self.daeg) - self.print_nice(self.daeg) - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j])) - self.assertEqual(self.daeg[i, j], daegT[i, j]) - - - def test_transpose_14(self): - """Check the 1,4 transpose of a rank-4, 3D tensor.""" - - # Manually create the string rep of the transpose. - daegT = self.string_transpose(1, 4) - print("The real 1,4 transpose:") - self.print_nice(daegT) - - # Convert to numpy. - daegT = self.to_numpy(daegT) - - # Check. - print("The numerical 1,4 transpose:") - transpose_14(self.daeg) - self.print_nice(self.daeg) - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j])) - self.assertEqual(self.daeg[i, j], daegT[i, j]) - - - def test_transpose_23(self): - """Check the 2,3 transpose of a rank-4, 3D tensor.""" - - # Manually create the string rep of the transpose. - daegT = self.string_transpose(2, 3) - print("The real 2,3 transpose:") - self.print_nice(daegT) - - # Convert to numpy. - daegT = self.to_numpy(daegT) - - # Check. - print("The numerical 2,3 transpose:") - transpose_23(self.daeg) - self.print_nice(self.daeg) - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j])) - self.assertEqual(self.daeg[i, j], daegT[i, j]) - - - def test_transpose_24(self): - """Check the 2,4 transpose of a rank-4, 3D tensor.""" - - # Manually create the string rep of the transpose. - daegT = self.string_transpose(2, 4) - print("The real 2,4 transpose:") - self.print_nice(daegT) - - # Convert to numpy. - daegT = self.to_numpy(daegT) - - # Check. - print("The numerical 2,4 transpose:") - transpose_24(self.daeg) - self.print_nice(self.daeg) - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j])) - self.assertEqual(self.daeg[i, j], daegT[i, j]) - - - def test_transpose_34(self): - """Check the 3,4 transpose of a rank-4, 3D tensor.""" - - # Manually create the string rep of the transpose. - daegT = self.string_transpose(3, 4) - print("The real 3,4 transpose:") - self.print_nice(daegT) - - # Convert to numpy. - daegT = self.to_numpy(daegT) - - # Check. - print("The numerical 3,4 transpose:") - transpose_34(self.daeg) - self.print_nice(self.daeg) - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j])) - self.assertEqual(self.daeg[i, j], daegT[i, j]) - - - def test_transpose_reversions(self): - """Check that the transposes revert back to the original matrix.""" - - # Make a copy of the frame order matrix. - daeg_orig = self.to_numpy(self.daeg_str) - - # List of transpose functions. - Tij = [transpose_12, transpose_13, transpose_14, transpose_23, transpose_24, transpose_34] - - # Check the transpose reversions. - for transpose in Tij: - # Transpose twice. - transpose(self.daeg) - transpose(self.daeg) - - # Check. - for i in range(9): - for j in range(9): - print("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daeg_orig[i, j])) - self.assertEqual(self.daeg[i, j], daeg_orig[i, j]) + for i in range(3): + for j in range(3): + self.assertEqual(eR1_test[i, j], eR1[i, j]) + self.assertEqual(eR2_test[i, j], eR2[i, j])