1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 from numpy import array, eye, float64, zeros
25 from sys import stdout
26 from unittest import TestCase
27
28
29 from maths_fns.kronecker_product import *
30
31
33 """Unit tests for the maths_fns.kronecker_product relax module."""
34
36 """Set up data used by the unit tests."""
37
38
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
58 """Formatted print out of the tensor."""
59
60
61 for i in range(9):
62
63 if i != 0 and not i % 3:
64 print((' |' + '-'*17 + '|' + '-'*17 + '|' + '-'*17))
65
66
67 line = ''
68 for j in range(9):
69
70 if not j % 3:
71 line = line + ' | '
72
73
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
89 """Manually transpose self.daeg_str using the 2 given indices."""
90
91
92 daegT = []
93
94
95 indices = range(4)
96 temp = indices[index1-1]
97 indices[index1-1] = indices[index2-1]
98 indices[index2-1] = temp
99
100
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
108 return daegT
109
110
112 """Convert the string version of the tensor into a numpy version."""
113
114
115 new = zeros((9, 9), float64)
116
117
118 for i in range(9):
119 for j in range(9):
120 new[i, j] = float(tensor[i][j])
121
122
123 return new
124
125
127 """Test the Kronecker product function kron_prod()."""
128
129
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
134 C = kron_prod(R1, R2)
135
136
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
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
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
162 """Check the 1,2 transpose of a rank-4, 3D tensor."""
163
164
165 daegT = self.string_transpose(1, 2)
166 print("The real 1,2 transpose:")
167 self.print_nice(daegT)
168
169
170 daegT = self.to_numpy(daegT)
171
172
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
183 """Check the 1,3 transpose of a rank-4, 3D tensor."""
184
185
186 daegT = self.string_transpose(1, 3)
187 print("The real 1,3 transpose:")
188 self.print_nice(daegT)
189
190
191 daegT = self.to_numpy(daegT)
192
193
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
204 """Check the 1,4 transpose of a rank-4, 3D tensor."""
205
206
207 daegT = self.string_transpose(1, 4)
208 print("The real 1,4 transpose:")
209 self.print_nice(daegT)
210
211
212 daegT = self.to_numpy(daegT)
213
214
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
225 """Check the 2,3 transpose of a rank-4, 3D tensor."""
226
227
228 daegT = self.string_transpose(2, 3)
229 print("The real 2,3 transpose:")
230 self.print_nice(daegT)
231
232
233 daegT = self.to_numpy(daegT)
234
235
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
246 """Check the 2,4 transpose of a rank-4, 3D tensor."""
247
248
249 daegT = self.string_transpose(2, 4)
250 print("The real 2,4 transpose:")
251 self.print_nice(daegT)
252
253
254 daegT = self.to_numpy(daegT)
255
256
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
267 """Check the 3,4 transpose of a rank-4, 3D tensor."""
268
269
270 daegT = self.string_transpose(3, 4)
271 print("The real 3,4 transpose:")
272 self.print_nice(daegT)
273
274
275 daegT = self.to_numpy(daegT)
276
277
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
291 daeg_orig = self.to_numpy(self.daeg_str)
292
293
294 Tij = [transpose_12, transpose_13, transpose_14, transpose_23, transpose_24, transpose_34]
295
296
297 for transpose in Tij:
298
299 transpose(self.daeg)
300 transpose(self.daeg)
301
302
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