Chris@87
|
1 from __future__ import division, absolute_import, print_function
|
Chris@87
|
2
|
Chris@87
|
3 from numpy.testing import *
|
Chris@87
|
4 from numpy.core import *
|
Chris@87
|
5 from numpy import matrix, asmatrix, bmat
|
Chris@87
|
6 from numpy.matrixlib.defmatrix import matrix_power
|
Chris@87
|
7 from numpy.matrixlib import mat
|
Chris@87
|
8 import numpy as np
|
Chris@87
|
9 import collections
|
Chris@87
|
10
|
Chris@87
|
11 class TestCtor(TestCase):
|
Chris@87
|
12 def test_basic(self):
|
Chris@87
|
13 A = array([[1, 2], [3, 4]])
|
Chris@87
|
14 mA = matrix(A)
|
Chris@87
|
15 assert_(all(mA.A == A))
|
Chris@87
|
16
|
Chris@87
|
17 B = bmat("A,A;A,A")
|
Chris@87
|
18 C = bmat([[A, A], [A, A]])
|
Chris@87
|
19 D = array([[1, 2, 1, 2],
|
Chris@87
|
20 [3, 4, 3, 4],
|
Chris@87
|
21 [1, 2, 1, 2],
|
Chris@87
|
22 [3, 4, 3, 4]])
|
Chris@87
|
23 assert_(all(B.A == D))
|
Chris@87
|
24 assert_(all(C.A == D))
|
Chris@87
|
25
|
Chris@87
|
26 E = array([[5, 6], [7, 8]])
|
Chris@87
|
27 AEresult = matrix([[1, 2, 5, 6], [3, 4, 7, 8]])
|
Chris@87
|
28 assert_(all(bmat([A, E]) == AEresult))
|
Chris@87
|
29
|
Chris@87
|
30 vec = arange(5)
|
Chris@87
|
31 mvec = matrix(vec)
|
Chris@87
|
32 assert_(mvec.shape == (1, 5))
|
Chris@87
|
33
|
Chris@87
|
34 def test_exceptions(self):
|
Chris@87
|
35 # Check for TypeError when called with invalid string data.
|
Chris@87
|
36 assert_raises(TypeError, matrix, "invalid")
|
Chris@87
|
37
|
Chris@87
|
38 def test_bmat_nondefault_str(self):
|
Chris@87
|
39 A = array([[1, 2], [3, 4]])
|
Chris@87
|
40 B = array([[5, 6], [7, 8]])
|
Chris@87
|
41 Aresult = array([[1, 2, 1, 2],
|
Chris@87
|
42 [3, 4, 3, 4],
|
Chris@87
|
43 [1, 2, 1, 2],
|
Chris@87
|
44 [3, 4, 3, 4]])
|
Chris@87
|
45 Bresult = array([[5, 6, 5, 6],
|
Chris@87
|
46 [7, 8, 7, 8],
|
Chris@87
|
47 [5, 6, 5, 6],
|
Chris@87
|
48 [7, 8, 7, 8]])
|
Chris@87
|
49 mixresult = array([[1, 2, 5, 6],
|
Chris@87
|
50 [3, 4, 7, 8],
|
Chris@87
|
51 [5, 6, 1, 2],
|
Chris@87
|
52 [7, 8, 3, 4]])
|
Chris@87
|
53 assert_(all(bmat("A,A;A,A") == Aresult))
|
Chris@87
|
54 assert_(all(bmat("A,A;A,A", ldict={'A':B}) == Aresult))
|
Chris@87
|
55 assert_raises(TypeError, bmat, "A,A;A,A", gdict={'A':B})
|
Chris@87
|
56 assert_(all(bmat("A,A;A,A", ldict={'A':A}, gdict={'A':B}) == Aresult))
|
Chris@87
|
57 b2 = bmat("A,B;C,D", ldict={'A':A,'B':B}, gdict={'C':B,'D':A})
|
Chris@87
|
58 assert_(all(b2 == mixresult))
|
Chris@87
|
59
|
Chris@87
|
60
|
Chris@87
|
61 class TestProperties(TestCase):
|
Chris@87
|
62 def test_sum(self):
|
Chris@87
|
63 """Test whether matrix.sum(axis=1) preserves orientation.
|
Chris@87
|
64 Fails in NumPy <= 0.9.6.2127.
|
Chris@87
|
65 """
|
Chris@87
|
66 M = matrix([[1, 2, 0, 0],
|
Chris@87
|
67 [3, 4, 0, 0],
|
Chris@87
|
68 [1, 2, 1, 2],
|
Chris@87
|
69 [3, 4, 3, 4]])
|
Chris@87
|
70 sum0 = matrix([8, 12, 4, 6])
|
Chris@87
|
71 sum1 = matrix([3, 7, 6, 14]).T
|
Chris@87
|
72 sumall = 30
|
Chris@87
|
73 assert_array_equal(sum0, M.sum(axis=0))
|
Chris@87
|
74 assert_array_equal(sum1, M.sum(axis=1))
|
Chris@87
|
75 assert_equal(sumall, M.sum())
|
Chris@87
|
76
|
Chris@87
|
77 assert_array_equal(sum0, np.sum(M, axis=0))
|
Chris@87
|
78 assert_array_equal(sum1, np.sum(M, axis=1))
|
Chris@87
|
79 assert_equal(sumall, np.sum(M))
|
Chris@87
|
80
|
Chris@87
|
81
|
Chris@87
|
82 def test_prod(self):
|
Chris@87
|
83 x = matrix([[1, 2, 3], [4, 5, 6]])
|
Chris@87
|
84 assert_equal(x.prod(), 720)
|
Chris@87
|
85 assert_equal(x.prod(0), matrix([[4, 10, 18]]))
|
Chris@87
|
86 assert_equal(x.prod(1), matrix([[6], [120]]))
|
Chris@87
|
87
|
Chris@87
|
88 assert_equal(np.prod(x), 720)
|
Chris@87
|
89 assert_equal(np.prod(x, axis=0), matrix([[4, 10, 18]]))
|
Chris@87
|
90 assert_equal(np.prod(x, axis=1), matrix([[6], [120]]))
|
Chris@87
|
91
|
Chris@87
|
92 y = matrix([0, 1, 3])
|
Chris@87
|
93 assert_(y.prod() == 0)
|
Chris@87
|
94
|
Chris@87
|
95 def test_max(self):
|
Chris@87
|
96 x = matrix([[1, 2, 3], [4, 5, 6]])
|
Chris@87
|
97 assert_equal(x.max(), 6)
|
Chris@87
|
98 assert_equal(x.max(0), matrix([[4, 5, 6]]))
|
Chris@87
|
99 assert_equal(x.max(1), matrix([[3], [6]]))
|
Chris@87
|
100
|
Chris@87
|
101 assert_equal(np.max(x), 6)
|
Chris@87
|
102 assert_equal(np.max(x, axis=0), matrix([[4, 5, 6]]))
|
Chris@87
|
103 assert_equal(np.max(x, axis=1), matrix([[3], [6]]))
|
Chris@87
|
104
|
Chris@87
|
105 def test_min(self):
|
Chris@87
|
106 x = matrix([[1, 2, 3], [4, 5, 6]])
|
Chris@87
|
107 assert_equal(x.min(), 1)
|
Chris@87
|
108 assert_equal(x.min(0), matrix([[1, 2, 3]]))
|
Chris@87
|
109 assert_equal(x.min(1), matrix([[1], [4]]))
|
Chris@87
|
110
|
Chris@87
|
111 assert_equal(np.min(x), 1)
|
Chris@87
|
112 assert_equal(np.min(x, axis=0), matrix([[1, 2, 3]]))
|
Chris@87
|
113 assert_equal(np.min(x, axis=1), matrix([[1], [4]]))
|
Chris@87
|
114
|
Chris@87
|
115 def test_ptp(self):
|
Chris@87
|
116 x = np.arange(4).reshape((2, 2))
|
Chris@87
|
117 assert_(x.ptp() == 3)
|
Chris@87
|
118 assert_(all(x.ptp(0) == array([2, 2])))
|
Chris@87
|
119 assert_(all(x.ptp(1) == array([1, 1])))
|
Chris@87
|
120
|
Chris@87
|
121 def test_var(self):
|
Chris@87
|
122 x = np.arange(9).reshape((3, 3))
|
Chris@87
|
123 mx = x.view(np.matrix)
|
Chris@87
|
124 assert_equal(x.var(ddof=0), mx.var(ddof=0))
|
Chris@87
|
125 assert_equal(x.var(ddof=1), mx.var(ddof=1))
|
Chris@87
|
126
|
Chris@87
|
127 def test_basic(self):
|
Chris@87
|
128 import numpy.linalg as linalg
|
Chris@87
|
129
|
Chris@87
|
130 A = array([[1., 2.],
|
Chris@87
|
131 [3., 4.]])
|
Chris@87
|
132 mA = matrix(A)
|
Chris@87
|
133 assert_(allclose(linalg.inv(A), mA.I))
|
Chris@87
|
134 assert_(all(array(transpose(A) == mA.T)))
|
Chris@87
|
135 assert_(all(array(transpose(A) == mA.H)))
|
Chris@87
|
136 assert_(all(A == mA.A))
|
Chris@87
|
137
|
Chris@87
|
138 B = A + 2j*A
|
Chris@87
|
139 mB = matrix(B)
|
Chris@87
|
140 assert_(allclose(linalg.inv(B), mB.I))
|
Chris@87
|
141 assert_(all(array(transpose(B) == mB.T)))
|
Chris@87
|
142 assert_(all(array(conjugate(transpose(B)) == mB.H)))
|
Chris@87
|
143
|
Chris@87
|
144 def test_pinv(self):
|
Chris@87
|
145 x = matrix(arange(6).reshape(2, 3))
|
Chris@87
|
146 xpinv = matrix([[-0.77777778, 0.27777778],
|
Chris@87
|
147 [-0.11111111, 0.11111111],
|
Chris@87
|
148 [ 0.55555556, -0.05555556]])
|
Chris@87
|
149 assert_almost_equal(x.I, xpinv)
|
Chris@87
|
150
|
Chris@87
|
151 def test_comparisons(self):
|
Chris@87
|
152 A = arange(100).reshape(10, 10)
|
Chris@87
|
153 mA = matrix(A)
|
Chris@87
|
154 mB = matrix(A) + 0.1
|
Chris@87
|
155 assert_(all(mB == A+0.1))
|
Chris@87
|
156 assert_(all(mB == matrix(A+0.1)))
|
Chris@87
|
157 assert_(not any(mB == matrix(A-0.1)))
|
Chris@87
|
158 assert_(all(mA < mB))
|
Chris@87
|
159 assert_(all(mA <= mB))
|
Chris@87
|
160 assert_(all(mA <= mA))
|
Chris@87
|
161 assert_(not any(mA < mA))
|
Chris@87
|
162
|
Chris@87
|
163 assert_(not any(mB < mA))
|
Chris@87
|
164 assert_(all(mB >= mA))
|
Chris@87
|
165 assert_(all(mB >= mB))
|
Chris@87
|
166 assert_(not any(mB > mB))
|
Chris@87
|
167
|
Chris@87
|
168 assert_(all(mA == mA))
|
Chris@87
|
169 assert_(not any(mA == mB))
|
Chris@87
|
170 assert_(all(mB != mA))
|
Chris@87
|
171
|
Chris@87
|
172 assert_(not all(abs(mA) > 0))
|
Chris@87
|
173 assert_(all(abs(mB > 0)))
|
Chris@87
|
174
|
Chris@87
|
175 def test_asmatrix(self):
|
Chris@87
|
176 A = arange(100).reshape(10, 10)
|
Chris@87
|
177 mA = asmatrix(A)
|
Chris@87
|
178 A[0, 0] = -10
|
Chris@87
|
179 assert_(A[0, 0] == mA[0, 0])
|
Chris@87
|
180
|
Chris@87
|
181 def test_noaxis(self):
|
Chris@87
|
182 A = matrix([[1, 0], [0, 1]])
|
Chris@87
|
183 assert_(A.sum() == matrix(2))
|
Chris@87
|
184 assert_(A.mean() == matrix(0.5))
|
Chris@87
|
185
|
Chris@87
|
186 def test_repr(self):
|
Chris@87
|
187 A = matrix([[1, 0], [0, 1]])
|
Chris@87
|
188 assert_(repr(A) == "matrix([[1, 0],\n [0, 1]])")
|
Chris@87
|
189
|
Chris@87
|
190 class TestCasting(TestCase):
|
Chris@87
|
191 def test_basic(self):
|
Chris@87
|
192 A = arange(100).reshape(10, 10)
|
Chris@87
|
193 mA = matrix(A)
|
Chris@87
|
194
|
Chris@87
|
195 mB = mA.copy()
|
Chris@87
|
196 O = ones((10, 10), float64) * 0.1
|
Chris@87
|
197 mB = mB + O
|
Chris@87
|
198 assert_(mB.dtype.type == float64)
|
Chris@87
|
199 assert_(all(mA != mB))
|
Chris@87
|
200 assert_(all(mB == mA+0.1))
|
Chris@87
|
201
|
Chris@87
|
202 mC = mA.copy()
|
Chris@87
|
203 O = ones((10, 10), complex128)
|
Chris@87
|
204 mC = mC * O
|
Chris@87
|
205 assert_(mC.dtype.type == complex128)
|
Chris@87
|
206 assert_(all(mA != mB))
|
Chris@87
|
207
|
Chris@87
|
208
|
Chris@87
|
209 class TestAlgebra(TestCase):
|
Chris@87
|
210 def test_basic(self):
|
Chris@87
|
211 import numpy.linalg as linalg
|
Chris@87
|
212
|
Chris@87
|
213 A = array([[1., 2.],
|
Chris@87
|
214 [3., 4.]])
|
Chris@87
|
215 mA = matrix(A)
|
Chris@87
|
216
|
Chris@87
|
217 B = identity(2)
|
Chris@87
|
218 for i in range(6):
|
Chris@87
|
219 assert_(allclose((mA ** i).A, B))
|
Chris@87
|
220 B = dot(B, A)
|
Chris@87
|
221
|
Chris@87
|
222 Ainv = linalg.inv(A)
|
Chris@87
|
223 B = identity(2)
|
Chris@87
|
224 for i in range(6):
|
Chris@87
|
225 assert_(allclose((mA ** -i).A, B))
|
Chris@87
|
226 B = dot(B, Ainv)
|
Chris@87
|
227
|
Chris@87
|
228 assert_(allclose((mA * mA).A, dot(A, A)))
|
Chris@87
|
229 assert_(allclose((mA + mA).A, (A + A)))
|
Chris@87
|
230 assert_(allclose((3*mA).A, (3*A)))
|
Chris@87
|
231
|
Chris@87
|
232 mA2 = matrix(A)
|
Chris@87
|
233 mA2 *= 3
|
Chris@87
|
234 assert_(allclose(mA2.A, 3*A))
|
Chris@87
|
235
|
Chris@87
|
236 def test_pow(self):
|
Chris@87
|
237 """Test raising a matrix to an integer power works as expected."""
|
Chris@87
|
238 m = matrix("1. 2.; 3. 4.")
|
Chris@87
|
239 m2 = m.copy()
|
Chris@87
|
240 m2 **= 2
|
Chris@87
|
241 mi = m.copy()
|
Chris@87
|
242 mi **= -1
|
Chris@87
|
243 m4 = m2.copy()
|
Chris@87
|
244 m4 **= 2
|
Chris@87
|
245 assert_array_almost_equal(m2, m**2)
|
Chris@87
|
246 assert_array_almost_equal(m4, np.dot(m2, m2))
|
Chris@87
|
247 assert_array_almost_equal(np.dot(mi, m), np.eye(2))
|
Chris@87
|
248
|
Chris@87
|
249 def test_notimplemented(self):
|
Chris@87
|
250 '''Check that 'not implemented' operations produce a failure.'''
|
Chris@87
|
251 A = matrix([[1., 2.],
|
Chris@87
|
252 [3., 4.]])
|
Chris@87
|
253
|
Chris@87
|
254 # __rpow__
|
Chris@87
|
255 try:
|
Chris@87
|
256 1.0**A
|
Chris@87
|
257 except TypeError:
|
Chris@87
|
258 pass
|
Chris@87
|
259 else:
|
Chris@87
|
260 self.fail("matrix.__rpow__ doesn't raise a TypeError")
|
Chris@87
|
261
|
Chris@87
|
262 # __mul__ with something not a list, ndarray, tuple, or scalar
|
Chris@87
|
263 try:
|
Chris@87
|
264 A*object()
|
Chris@87
|
265 except TypeError:
|
Chris@87
|
266 pass
|
Chris@87
|
267 else:
|
Chris@87
|
268 self.fail("matrix.__mul__ with non-numeric object doesn't raise"
|
Chris@87
|
269 "a TypeError")
|
Chris@87
|
270
|
Chris@87
|
271 class TestMatrixReturn(TestCase):
|
Chris@87
|
272 def test_instance_methods(self):
|
Chris@87
|
273 a = matrix([1.0], dtype='f8')
|
Chris@87
|
274 methodargs = {
|
Chris@87
|
275 'astype': ('intc',),
|
Chris@87
|
276 'clip': (0.0, 1.0),
|
Chris@87
|
277 'compress': ([1],),
|
Chris@87
|
278 'repeat': (1,),
|
Chris@87
|
279 'reshape': (1,),
|
Chris@87
|
280 'swapaxes': (0, 0),
|
Chris@87
|
281 'dot': np.array([1.0]),
|
Chris@87
|
282 }
|
Chris@87
|
283 excluded_methods = [
|
Chris@87
|
284 'argmin', 'choose', 'dump', 'dumps', 'fill', 'getfield',
|
Chris@87
|
285 'getA', 'getA1', 'item', 'nonzero', 'put', 'putmask', 'resize',
|
Chris@87
|
286 'searchsorted', 'setflags', 'setfield', 'sort',
|
Chris@87
|
287 'partition', 'argpartition',
|
Chris@87
|
288 'take', 'tofile', 'tolist', 'tostring', 'tobytes', 'all', 'any',
|
Chris@87
|
289 'sum', 'argmax', 'argmin', 'min', 'max', 'mean', 'var', 'ptp',
|
Chris@87
|
290 'prod', 'std', 'ctypes', 'itemset', 'setasflat'
|
Chris@87
|
291 ]
|
Chris@87
|
292 for attrib in dir(a):
|
Chris@87
|
293 if attrib.startswith('_') or attrib in excluded_methods:
|
Chris@87
|
294 continue
|
Chris@87
|
295 f = getattr(a, attrib)
|
Chris@87
|
296 if isinstance(f, collections.Callable):
|
Chris@87
|
297 # reset contents of a
|
Chris@87
|
298 a.astype('f8')
|
Chris@87
|
299 a.fill(1.0)
|
Chris@87
|
300 if attrib in methodargs:
|
Chris@87
|
301 args = methodargs[attrib]
|
Chris@87
|
302 else:
|
Chris@87
|
303 args = ()
|
Chris@87
|
304 b = f(*args)
|
Chris@87
|
305 assert_(type(b) is matrix, "%s" % attrib)
|
Chris@87
|
306 assert_(type(a.real) is matrix)
|
Chris@87
|
307 assert_(type(a.imag) is matrix)
|
Chris@87
|
308 c, d = matrix([0.0]).nonzero()
|
Chris@87
|
309 assert_(type(c) is matrix)
|
Chris@87
|
310 assert_(type(d) is matrix)
|
Chris@87
|
311
|
Chris@87
|
312
|
Chris@87
|
313 class TestIndexing(TestCase):
|
Chris@87
|
314 def test_basic(self):
|
Chris@87
|
315 x = asmatrix(zeros((3, 2), float))
|
Chris@87
|
316 y = zeros((3, 1), float)
|
Chris@87
|
317 y[:, 0] = [0.8, 0.2, 0.3]
|
Chris@87
|
318 x[:, 1] = y>0.5
|
Chris@87
|
319 assert_equal(x, [[0, 1], [0, 0], [0, 0]])
|
Chris@87
|
320
|
Chris@87
|
321
|
Chris@87
|
322 class TestNewScalarIndexing(TestCase):
|
Chris@87
|
323 def setUp(self):
|
Chris@87
|
324 self.a = matrix([[1, 2], [3, 4]])
|
Chris@87
|
325
|
Chris@87
|
326 def test_dimesions(self):
|
Chris@87
|
327 a = self.a
|
Chris@87
|
328 x = a[0]
|
Chris@87
|
329 assert_equal(x.ndim, 2)
|
Chris@87
|
330
|
Chris@87
|
331 def test_array_from_matrix_list(self):
|
Chris@87
|
332 a = self.a
|
Chris@87
|
333 x = array([a, a])
|
Chris@87
|
334 assert_equal(x.shape, [2, 2, 2])
|
Chris@87
|
335
|
Chris@87
|
336 def test_array_to_list(self):
|
Chris@87
|
337 a = self.a
|
Chris@87
|
338 assert_equal(a.tolist(), [[1, 2], [3, 4]])
|
Chris@87
|
339
|
Chris@87
|
340 def test_fancy_indexing(self):
|
Chris@87
|
341 a = self.a
|
Chris@87
|
342 x = a[1, [0, 1, 0]]
|
Chris@87
|
343 assert_(isinstance(x, matrix))
|
Chris@87
|
344 assert_equal(x, matrix([[3, 4, 3]]))
|
Chris@87
|
345 x = a[[1, 0]]
|
Chris@87
|
346 assert_(isinstance(x, matrix))
|
Chris@87
|
347 assert_equal(x, matrix([[3, 4], [1, 2]]))
|
Chris@87
|
348 x = a[[[1], [0]], [[1, 0], [0, 1]]]
|
Chris@87
|
349 assert_(isinstance(x, matrix))
|
Chris@87
|
350 assert_equal(x, matrix([[4, 3], [1, 2]]))
|
Chris@87
|
351
|
Chris@87
|
352 def test_matrix_element(self):
|
Chris@87
|
353 x = matrix([[1, 2, 3], [4, 5, 6]])
|
Chris@87
|
354 assert_equal(x[0][0], matrix([[1, 2, 3]]))
|
Chris@87
|
355 assert_equal(x[0][0].shape, (1, 3))
|
Chris@87
|
356 assert_equal(x[0].shape, (1, 3))
|
Chris@87
|
357 assert_equal(x[:, 0].shape, (2, 1))
|
Chris@87
|
358
|
Chris@87
|
359 x = matrix(0)
|
Chris@87
|
360 assert_equal(x[0, 0], 0)
|
Chris@87
|
361 assert_equal(x[0], 0)
|
Chris@87
|
362 assert_equal(x[:, 0].shape, x.shape)
|
Chris@87
|
363
|
Chris@87
|
364 def test_scalar_indexing(self):
|
Chris@87
|
365 x = asmatrix(zeros((3, 2), float))
|
Chris@87
|
366 assert_equal(x[0, 0], x[0][0])
|
Chris@87
|
367
|
Chris@87
|
368 def test_row_column_indexing(self):
|
Chris@87
|
369 x = asmatrix(np.eye(2))
|
Chris@87
|
370 assert_array_equal(x[0,:], [[1, 0]])
|
Chris@87
|
371 assert_array_equal(x[1,:], [[0, 1]])
|
Chris@87
|
372 assert_array_equal(x[:, 0], [[1], [0]])
|
Chris@87
|
373 assert_array_equal(x[:, 1], [[0], [1]])
|
Chris@87
|
374
|
Chris@87
|
375 def test_boolean_indexing(self):
|
Chris@87
|
376 A = arange(6)
|
Chris@87
|
377 A.shape = (3, 2)
|
Chris@87
|
378 x = asmatrix(A)
|
Chris@87
|
379 assert_array_equal(x[:, array([True, False])], x[:, 0])
|
Chris@87
|
380 assert_array_equal(x[array([True, False, False]),:], x[0,:])
|
Chris@87
|
381
|
Chris@87
|
382 def test_list_indexing(self):
|
Chris@87
|
383 A = arange(6)
|
Chris@87
|
384 A.shape = (3, 2)
|
Chris@87
|
385 x = asmatrix(A)
|
Chris@87
|
386 assert_array_equal(x[:, [1, 0]], x[:, ::-1])
|
Chris@87
|
387 assert_array_equal(x[[2, 1, 0],:], x[::-1,:])
|
Chris@87
|
388
|
Chris@87
|
389 class TestPower(TestCase):
|
Chris@87
|
390 def test_returntype(self):
|
Chris@87
|
391 a = array([[0, 1], [0, 0]])
|
Chris@87
|
392 assert_(type(matrix_power(a, 2)) is ndarray)
|
Chris@87
|
393 a = mat(a)
|
Chris@87
|
394 assert_(type(matrix_power(a, 2)) is matrix)
|
Chris@87
|
395
|
Chris@87
|
396 def test_list(self):
|
Chris@87
|
397 assert_array_equal(matrix_power([[0, 1], [0, 0]], 2), [[0, 0], [0, 0]])
|
Chris@87
|
398
|
Chris@87
|
399 if __name__ == "__main__":
|
Chris@87
|
400 run_module_suite()
|