def passed_test(dtype, as_matrix, b_is_row, stride, uplo, trans_a, diag): """ Run one triangular solve test. Arguments: dtype: either 'float64' or 'float32', the NumPy dtype to test as_matrix: True to test a NumPy matrix, False to test a NumPy ndarray b_is_row: True to test a row vector as parameter b, False to test a column vector stride: stride of x and y to test; if None, a random stride is assigned uplo: BLASpy uplo parameter to test trans_a: BLASpy trans parameter to test diag: BLASpy diag parameter to test Returns: True if the expected result is within the margin of error of the actual result, False otherwise. """ # generate random sizes for matrix/vector dimensions and vector stride (if necessary) n = randint(N_MIN, N_MAX) stride = randint(N_MIN, STRIDE_MAX) if stride is None else stride n_A = n / stride + (n % stride > 0) # create random vectors and matrices to test b = random_vector(n, b_is_row, dtype, as_matrix) A = random_triangular_matrix(n_A, dtype, as_matrix, uplo, diag) A /= n_A # scale off-diagonal to avoid numerical issues # fill diagonal with 1 if unit-triangular, else fill diagonal with values between 1 and 2 if diag == 'u': fill_diagonal(A, 1) else: for i in range(n_A): A[i, i] = uniform(1, 2) # copy b for comparison later expected = copy(b.T) if b_is_row else copy(b) # solve for x trsv(A, b, uplo, trans_a, diag, inc_b=stride) b = b.T if b_is_row else b # compute actual result actual = gemv(A, b, zeros((n, 1), dtype=dtype), trans_a=trans_a, inc_x=stride, inc_y=stride) if stride != 1: for i in range(n): if i % stride != 0: # zero out all non-relevant entries in expected vector expected[i] = 0 # compare the actual result to the expected result and return result of the test return allclose(actual, expected, RTOL, ATOL)
def test_row_as_ndarray(self): A = array([[1., 2.], [0., 3.]]) b = array([[5., 6.]]) expected = [[1., 2.]] self.assertListEqual(trsv(A, b).tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_A_not_transposed_with_trans_a_n(self): A = array([[1., 2.], [0., 3.]]) b = array([[5.], [6.]]) expected = [[1.], [2.]] self.assertListEqual(trsv(A, b, trans_a='n').tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_upper_triangle_ignored_with_uplo_L(self): A = array([[1., 55.], [2., 3.]]) b = array([[1.], [8.]]) expected = [[1.], [2.]] self.assertListEqual(trsv(A, b, uplo='L').tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_lower_triangle_ignored_with_uplo_U(self): A = array([[1., 2.], [-100., 3.]]) b = array([[5.], [6.]]) expected = [[1.], [2.]] self.assertListEqual(trsv(A, b, uplo='U').tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_as_matrix_mixed(self): A = asmatrix(array([[1., 2.], [0., 3.]])) b = array([[5.], [6.]]) expected = [[1.], [2.]] self.assertListEqual(trsv(A, b).tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_uplo_l_and_trans_a_t_and_diag_u(self): A = array([[1., -100.], [2., 3.]]) b = array([[5.], [2.]]) expected = [[1.], [2.]] self.assertListEqual(trsv(A, b, uplo='l', trans_a='t', diag='u').tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_A_unit_diag_with_diag_U(self): A = array([[1., 2.], [0., 3.]]) b = array([[5.], [2.]]) expected = [[1.], [2.]] self.assertListEqual(trsv(A, b, diag='U').tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_float64_dtype(self): A = array([[1., 2.], [0., 3.]], dtype='float64') b = array([[5.], [6.]], dtype='float64') self.assertEqual(A.dtype, 'float64') self.assertEqual(b.dtype, 'float64') expected = [[1.], [2.]] self.assertListEqual(trsv(A, b).tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_stride_greater_than_length(self): A = array([[1.]]) b = array([[5.], [2.], [3.], [4.]]) expected = [[5.], [2.], [3.], [4.]] self.assertListEqual(trsv(A, b, inc_b=4).tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_stride_less_than_length(self): A = array([[1., 2.], [0., 3.]]) b = array([[5.], [3.], [6.], [4.]]) expected = [[1.], [3.], [2.], [4.]] self.assertListEqual(trsv(A, b, inc_b=2).tolist(), expected) self.assertListEqual(b.tolist(), expected)
def test_scalars_as_ndarray(self): A = array([[1.]]) b = array([[2.]]) self.assertEqual(trsv(A, b), 2) self.assertEqual(b, 2)