Package test_suite :: Package unit_tests :: Package _maths_fns :: Module test_kronecker_product
[hide private]
[frames] | no frames]

Source Code for Module test_suite.unit_tests._maths_fns.test_kronecker_product

  1  ############################################################################### 
  2  #                                                                             # 
  3  # Copyright (C) 2009 Edward d'Auvergne                                        # 
  4  #                                                                             # 
  5  # This file is part of the program relax.                                     # 
  6  #                                                                             # 
  7  # relax is free software; you can redistribute it and/or modify               # 
  8  # it under the terms of the GNU General Public License as published by        # 
  9  # the Free Software Foundation; either version 2 of the License, or           # 
 10  # (at your option) any later version.                                         # 
 11  #                                                                             # 
 12  # relax is distributed in the hope that it will be useful,                    # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of              # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # 
 15  # GNU General Public License for more details.                                # 
 16  #                                                                             # 
 17  # You should have received a copy of the GNU General Public License           # 
 18  # along with relax; if not, write to the Free Software                        # 
 19  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   # 
 20  #                                                                             # 
 21  ############################################################################### 
 22   
 23  # Python module imports. 
 24  from numpy import array, eye, float64, zeros 
 25  from sys import stdout 
 26  from unittest import TestCase 
 27   
 28  # relax module imports. 
 29  from maths_fns.kronecker_product import * 
 30   
 31   
32 -class Test_kronecker_product(TestCase):
33 """Unit tests for the maths_fns.kronecker_product relax module.""" 34
35 - def setUp(self):
36 """Set up data used by the unit tests.""" 37 38 # A rank-4, 3D tensor in string form (and rank-2, 9D). 39 self.daeg_str = [ 40 ['0000', '0001', '0002', '0010', '0011', '0012', '0020', '0021', '0022'], 41 ['0100', '0101', '0102', '0110', '0111', '0112', '0120', '0121', '0122'], 42 ['0200', '0201', '0202', '0210', '0211', '0212', '0220', '0221', '0222'], 43 44 ['1000', '1001', '1002', '1010', '1011', '1012', '1020', '1021', '1022'], 45 ['1100', '1101', '1102', '1110', '1111', '1112', '1120', '1121', '1122'], 46 ['1200', '1201', '1202', '1210', '1211', '1212', '1220', '1221', '1222'], 47 48 ['2000', '2001', '2002', '2010', '2011', '2012', '2020', '2021', '2022'], 49 ['2100', '2101', '2102', '2110', '2111', '2112', '2120', '2121', '2122'], 50 ['2200', '2201', '2202', '2210', '2211', '2212', '2220', '2221', '2222'], 51 ] 52 print("The initial tensor:") 53 self.print_nice(self.daeg_str) 54 self.daeg = self.to_numpy(self.daeg_str)
55 56
57 - def print_nice(self, daeg):
58 """Formatted print out of the tensor.""" 59 60 # Loop over the rows. 61 for i in range(9): 62 # Empty row. 63 if i != 0 and not i % 3: 64 print((' |' + '-'*17 + '|' + '-'*17 + '|' + '-'*17)) 65 66 # Loop over the columns. 67 line = '' 68 for j in range(9): 69 # Block separator. 70 if not j % 3: 71 line = line + ' | ' 72 73 # The matrix element. 74 if isinstance(daeg[i][j], str): 75 line = line + daeg[i][j] + " " 76 else: 77 val = "%s" % int(daeg[i, j]) 78 string = ['0', '0', '0', '0'] 79 for k in range(1, len(val)+1): 80 string[-k] = val[-k] 81 string = '%s%s%s%s' % (string[0], string[1], string[2], string[3]) 82 line = line + string + " " 83 84 print((line + '|')) 85 print('')
86 87
88 - def string_transpose(self, index1, index2):
89 """Manually transpose self.daeg_str using the 2 given indices.""" 90 91 # Initialise the matrix. 92 daegT = [] 93 94 # The string indices. 95 indices = range(4) 96 temp = indices[index1-1] 97 indices[index1-1] = indices[index2-1] 98 indices[index2-1] = temp 99 100 # Loop over the elements. 101 for i in range(9): 102 daegT.append([]) 103 for j in range(9): 104 elem = self.daeg_str[i][j] 105 daegT[-1].append('%s%s%s%s' % (elem[indices[0]], elem[indices[1]], elem[indices[2]], elem[indices[3]])) 106 107 # Return. 108 return daegT
109 110
111 - def to_numpy(self, tensor):
112 """Convert the string version of the tensor into a numpy version.""" 113 114 # Initialise. 115 new = zeros((9, 9), float64) 116 117 # Loop over the elements. 118 for i in range(9): 119 for j in range(9): 120 new[i, j] = float(tensor[i][j]) 121 122 # Return the tensor. 123 return new
124 125
126 - def test_kron_prod(self):
127 """Test the Kronecker product function kron_prod().""" 128 129 # The 3D, rank-2 matrices. 130 R1 = array([[1, 4, 5], [-4, 2, 6], [-5, -6, 3]], float64) 131 R2 = array([[0, 1, 0], [0, 0, 0], [0, 0, 0]], float64) 132 133 # The Kronecker product. 134 C = kron_prod(R1, R2) 135 136 # The real Kronecker product! 137 D = array([ 138 [ 0, 1, 0, 0, 4, 0, 0, 5, 0], 139 [ 0, 0, 0, 0, 0, 0, 0, 0, 0], 140 [ 0, 0, 0, 0, 0, 0, 0, 0, 0], 141 [ 0, -4, 0, 0, 2, 0, 0, 6, 0], 142 [ 0, 0, 0, 0, 0, 0, 0, 0, 0], 143 [ 0, 0, 0, 0, 0, 0, 0, 0, 0], 144 [ 0, -5, 0, 0, -6, 0, 0, 3, 0], 145 [ 0, 0, 0, 0, 0, 0, 0, 0, 0], 146 [ 0, 0, 0, 0, 0, 0, 0, 0, 0]], float64) 147 148 # Print outs. 149 print(("R1:\n%s" % R1)) 150 print(("R2:\n%s" % R2)) 151 print(("C:\n%s" % C)) 152 print(("D:\n%s" % D)) 153 154 # Checks. 155 self.assertEqual(C.shape, (9, 9)) 156 for i in range(9): 157 for j in range(9): 158 self.assertEqual(C[i, j], D[i, j])
159 160
161 - def test_transpose_12(self):
162 """Check the 1,2 transpose of a rank-4, 3D tensor.""" 163 164 # Manually create the string rep of the transpose. 165 daegT = self.string_transpose(1, 2) 166 print("The real 1,2 transpose:") 167 self.print_nice(daegT) 168 169 # Convert to numpy. 170 daegT = self.to_numpy(daegT) 171 172 # Check. 173 print("The numerical 1,2 transpose:") 174 transpose_12(self.daeg) 175 self.print_nice(self.daeg) 176 for i in range(9): 177 for j in range(9): 178 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j]))) 179 self.assertEqual(self.daeg[i, j], daegT[i, j])
180 181
182 - def test_transpose_13(self):
183 """Check the 1,3 transpose of a rank-4, 3D tensor.""" 184 185 # Manually create the string rep of the transpose. 186 daegT = self.string_transpose(1, 3) 187 print("The real 1,3 transpose:") 188 self.print_nice(daegT) 189 190 # Convert to numpy. 191 daegT = self.to_numpy(daegT) 192 193 # Check. 194 print("The numerical 1,3 transpose:") 195 transpose_13(self.daeg) 196 self.print_nice(self.daeg) 197 for i in range(9): 198 for j in range(9): 199 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j]))) 200 self.assertEqual(self.daeg[i, j], daegT[i, j])
201 202
203 - def test_transpose_14(self):
204 """Check the 1,4 transpose of a rank-4, 3D tensor.""" 205 206 # Manually create the string rep of the transpose. 207 daegT = self.string_transpose(1, 4) 208 print("The real 1,4 transpose:") 209 self.print_nice(daegT) 210 211 # Convert to numpy. 212 daegT = self.to_numpy(daegT) 213 214 # Check. 215 print("The numerical 1,4 transpose:") 216 transpose_14(self.daeg) 217 self.print_nice(self.daeg) 218 for i in range(9): 219 for j in range(9): 220 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j]))) 221 self.assertEqual(self.daeg[i, j], daegT[i, j])
222 223
224 - def test_transpose_23(self):
225 """Check the 2,3 transpose of a rank-4, 3D tensor.""" 226 227 # Manually create the string rep of the transpose. 228 daegT = self.string_transpose(2, 3) 229 print("The real 2,3 transpose:") 230 self.print_nice(daegT) 231 232 # Convert to numpy. 233 daegT = self.to_numpy(daegT) 234 235 # Check. 236 print("The numerical 2,3 transpose:") 237 transpose_23(self.daeg) 238 self.print_nice(self.daeg) 239 for i in range(9): 240 for j in range(9): 241 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j]))) 242 self.assertEqual(self.daeg[i, j], daegT[i, j])
243 244
245 - def test_transpose_24(self):
246 """Check the 2,4 transpose of a rank-4, 3D tensor.""" 247 248 # Manually create the string rep of the transpose. 249 daegT = self.string_transpose(2, 4) 250 print("The real 2,4 transpose:") 251 self.print_nice(daegT) 252 253 # Convert to numpy. 254 daegT = self.to_numpy(daegT) 255 256 # Check. 257 print("The numerical 2,4 transpose:") 258 transpose_24(self.daeg) 259 self.print_nice(self.daeg) 260 for i in range(9): 261 for j in range(9): 262 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j]))) 263 self.assertEqual(self.daeg[i, j], daegT[i, j])
264 265
266 - def test_transpose_34(self):
267 """Check the 3,4 transpose of a rank-4, 3D tensor.""" 268 269 # Manually create the string rep of the transpose. 270 daegT = self.string_transpose(3, 4) 271 print("The real 3,4 transpose:") 272 self.print_nice(daegT) 273 274 # Convert to numpy. 275 daegT = self.to_numpy(daegT) 276 277 # Check. 278 print("The numerical 3,4 transpose:") 279 transpose_34(self.daeg) 280 self.print_nice(self.daeg) 281 for i in range(9): 282 for j in range(9): 283 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daegT[i, j]))) 284 self.assertEqual(self.daeg[i, j], daegT[i, j])
285 286
288 """Check that the transposes revert back to the original matrix.""" 289 290 # Make a copy of the frame order matrix. 291 daeg_orig = self.to_numpy(self.daeg_str) 292 293 # List of transpose functions. 294 Tij = [transpose_12, transpose_13, transpose_14, transpose_23, transpose_24, transpose_34] 295 296 # Check the transpose reversions. 297 for transpose in Tij: 298 # Transpose twice. 299 transpose(self.daeg) 300 transpose(self.daeg) 301 302 # Check. 303 for i in range(9): 304 for j in range(9): 305 print(("i = %2s, j = %2s, daeg[i,j] = %s" % (i, j, daeg_orig[i, j]))) 306 self.assertEqual(self.daeg[i, j], daeg_orig[i, j])
307