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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
 def test_scalars_as_ndarray(self):
     A = array([[1.]])
     b = array([[2.]])
     self.assertEqual(trsv(A, b), 2)
     self.assertEqual(b, 2)