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 os import sep
25 from numpy import complex64, load, sum
26 from unittest import TestCase
27
28
29 from lib.dispersion.ns_cpmg_2site_3d import rcpmg_3d_rankN
30 from lib.dispersion.ns_mmq_2site import rmmq_2site_rankN
31 from lib.linear_algebra.matrix_exponential import matrix_exponential as np_matrix_exponential
32 from lib.dispersion.matrix_exponential import matrix_exponential
33 from status import Status; status = Status()
34
35
37 """Unit tests for the lib.dispersion.matrix_exponential relax module."""
38
40 """Set up for all unit tests."""
41
42
43 self.data = status.install_path+sep+'test_suite'+sep+'shared_data'+sep+'dispersion'+sep+'unit_tests'+sep+'lib'+sep+'dispersion'+sep+'matrix_exponential'
44
46 """Return the data structures from the data path."""
47
48 r180x = load(fname+"_r180x"+".npy")
49 M0 = load(fname+"_M0"+".npy")
50 r10a = load(fname+"_r10a"+".npy")
51 r10b = load(fname+"_r10b"+".npy")
52 r20a = load(fname+"_r20a"+".npy")
53 r20b = load(fname+"_r20b"+".npy")
54 pA = load(fname+"_pA"+".npy")
55 dw = load(fname+"_dw"+".npy")
56 dw_orig = load(fname+"_dw_orig"+".npy")
57 kex = load(fname+"_kex"+".npy")
58 inv_tcpmg = load(fname+"_inv_tcpmg"+".npy")
59 tcp = load(fname+"_tcp"+".npy")
60 num_points = load(fname+"_num_points"+".npy")
61 power = load(fname+"_power"+".npy")
62 back_calc = load(fname+"_back_calc"+".npy")
63
64
65 pB = 1.0 - pA
66 k_BA = pA * kex
67 k_AB = pB * kex
68
69 return r180x, M0, r10a, r10b, r20a, r20b, pA, dw, dw_orig, kex, inv_tcpmg, tcp, num_points, power, back_calc, pB, k_BA, k_AB
70
71
73 """Return the data structures from the data path."""
74
75 M0 = load(fname+"_M0"+".npy")
76 r20a = load(fname+"_r20a"+".npy")
77 r20b = load(fname+"_r20b"+".npy")
78 pA = load(fname+"_pA"+".npy")
79 dw = load(fname+"_dw"+".npy")
80 dwH = load(fname+"_dwH"+".npy")
81 kex = load(fname+"_kex"+".npy")
82 inv_tcpmg = load(fname+"_inv_tcpmg"+".npy")
83 tcp = load(fname+"_tcp"+".npy")
84 num_points = load(fname+"_num_points"+".npy")
85 power = load(fname+"_power"+".npy")
86 back_calc = load(fname+"_back_calc"+".npy")
87
88
89 pB = 1.0 - pA
90 k_BA = pA * kex
91 k_AB = pB * kex
92
93 return M0, r20a, r20b, pA, dw, dwH, kex, inv_tcpmg, tcp, num_points, power, back_calc, pB, k_BA, k_AB
94
95
97 """Test the matrix_exponential() function for higher dimensional data, and compare to matrix_exponential. This uses the data from systemtest Relax_disp.test_hansen_cpmg_data_to_ns_cpmg_2site_3D."""
98
99 fname = self.data + sep+ "test_hansen_cpmg_data_to_ns_cpmg_2site_3D"
100 r180x, M0, r10a, r10b, r20a, r20b, pA, dw, dw_orig, kex, inv_tcpmg, tcp, num_points, power, back_calc, pB, k_BA, k_AB = self.return_data_ns_cpmg_2site_3d(fname)
101
102
103 NE, NS, NM, NO, ND = back_calc.shape
104
105
106 R_mat = rcpmg_3d_rankN(R1A=r10a, R1B=r10b, R2A=r20a, R2B=r20b, pA=pA, pB=pB, dw=dw, k_AB=k_AB, k_BA=k_BA, tcp=tcp)
107
108
109 Rexpo_mat = matrix_exponential(R_mat)
110
111
112 for si in range(NS):
113
114 for mi in range(NM):
115
116 num_points_si_mi = int(num_points[0, si, mi, 0])
117
118
119 for di in range(num_points_si_mi):
120
121 R_mat_i = R_mat[0, si, mi, 0, di]
122
123
124 Rexpo = np_matrix_exponential(R_mat_i)
125
126
127 Rexpo_mat_i = Rexpo_mat[0, si, mi, 0, di]
128
129 diff = Rexpo - Rexpo_mat_i
130 diff_sum = sum(diff)
131
132
133 self.assertAlmostEqual(diff_sum, 0.0)
134
135
137 """Test the matrix_exponential() function for higher dimensional data, and compare to matrix_exponential. This uses the data from systemtest Relax_disp.test_korzhnev_2005_15n_dq_data.
138 This test does the matrix exponential in complex64."""
139
140 fname = self.data + sep+ "test_korzhnev_2005_15n_dq_data"
141 M0, R20A, R20B, pA, dw, dwH, kex, inv_tcpmg, tcp, num_points, power, back_calc, pB, k_BA, k_AB = self.return_data_mmq_2site(fname)
142
143
144 NS, NM, NO = num_points.shape
145
146
147 m1_mat = rmmq_2site_rankN(R20A=R20A, R20B=R20B, dw=dw, k_AB=k_AB, k_BA=k_BA, tcp=tcp)
148 m2_mat = rmmq_2site_rankN(R20A=R20A, R20B=R20B, dw=-dw, k_AB=k_AB, k_BA=k_BA, tcp=tcp)
149
150
151 A_pos_mat = matrix_exponential(m1_mat, dtype=complex64)
152 A_neg_mat = matrix_exponential(m2_mat, dtype=complex64)
153
154
155 for si in range(NS):
156
157 for mi in range(NM):
158
159 for oi in range(NO):
160
161 num_points_i = num_points[si, mi, oi]
162
163
164 for i in range(num_points_i):
165
166
167 A_pos_i = A_pos_mat[si, mi, oi, i]
168 A_neg_i = A_neg_mat[si, mi, oi, i]
169
170
171 A_pos = np_matrix_exponential(m1_mat[si, mi, oi, i])
172 A_neg = np_matrix_exponential(m2_mat[si, mi, oi, i])
173
174
175 diff_A_pos_real = A_pos_i.real - A_pos.real
176 diff_A_pos_real_sum = sum(diff_A_pos_real)
177 diff_A_pos_imag = A_pos_i.imag - A_pos.imag
178 diff_A_pos_imag_sum = sum(diff_A_pos_imag)
179
180 diff_A_neg_real = A_neg_i.real - A_neg.real
181 diff_A_neg_real_sum = sum(diff_A_neg_real)
182 diff_A_neg_imag = A_neg_i.imag - A_neg.imag
183 diff_A_neg_imag_sum = sum(diff_A_neg_imag)
184
185
186 self.assertAlmostEqual(diff_A_pos_real_sum, 0.0, 6)
187 self.assertAlmostEqual(diff_A_pos_imag_sum, 0.0, 6)
188 self.assertAlmostEqual(diff_A_neg_real_sum, 0.0, 6)
189 self.assertAlmostEqual(diff_A_neg_imag_sum, 0.0, 6)
190
191
193 """Test the matrix_exponential() function for higher dimensional data, and compare to matrix_exponential. This uses the data from systemtest Relax_disp.test_korzhnev_2005_15n_dq_data.
194 This test does the matrix exponential in complex128."""
195
196 fname = self.data + sep+ "test_korzhnev_2005_15n_dq_data"
197 M0, R20A, R20B, pA, dw, dwH, kex, inv_tcpmg, tcp, num_points, power, back_calc, pB, k_BA, k_AB = self.return_data_mmq_2site(fname)
198
199
200 NS, NM, NO = num_points.shape
201
202
203 m1_mat = rmmq_2site_rankN(R20A=R20A, R20B=R20B, dw=dw, k_AB=k_AB, k_BA=k_BA, tcp=tcp)
204 m2_mat = rmmq_2site_rankN(R20A=R20A, R20B=R20B, dw=-dw, k_AB=k_AB, k_BA=k_BA, tcp=tcp)
205
206
207 A_pos_mat = matrix_exponential(m1_mat)
208 A_neg_mat = matrix_exponential(m2_mat)
209
210
211 for si in range(NS):
212
213 for mi in range(NM):
214
215 for oi in range(NO):
216
217 num_points_i = num_points[si, mi, oi]
218
219
220 for i in range(num_points_i):
221
222
223 A_pos_i = A_pos_mat[si, mi, oi, i]
224 A_neg_i = A_neg_mat[si, mi, oi, i]
225
226
227 A_pos = np_matrix_exponential(m1_mat[si, mi, oi, i])
228 A_neg = np_matrix_exponential(m2_mat[si, mi, oi, i])
229
230
231 diff_A_pos_real = A_pos_i.real - A_pos.real
232 diff_A_pos_real_sum = sum(diff_A_pos_real)
233 diff_A_pos_imag = A_pos_i.imag - A_pos.imag
234 diff_A_pos_imag_sum = sum(diff_A_pos_imag)
235
236 diff_A_neg_real = A_neg_i.real - A_neg.real
237 diff_A_neg_real_sum = sum(diff_A_neg_real)
238 diff_A_neg_imag = A_neg_i.imag - A_neg.imag
239 diff_A_neg_imag_sum = sum(diff_A_neg_imag)
240
241
242 self.assertAlmostEqual(diff_A_pos_real_sum, 0.0)
243 self.assertAlmostEqual(diff_A_pos_imag_sum, 0.0)
244 self.assertAlmostEqual(diff_A_neg_real_sum, 0.0)
245 self.assertAlmostEqual(diff_A_neg_imag_sum, 0.0)
246