gonum.org/v1/gonum@v0.14.0/blas/testblas/dtrmv.go (about)

     1  // Copyright ©2014 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package testblas
     6  
     7  import (
     8  	"testing"
     9  
    10  	"gonum.org/v1/gonum/blas"
    11  	"gonum.org/v1/gonum/floats"
    12  )
    13  
    14  type Dtrmver interface {
    15  	Dtrmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int)
    16  }
    17  
    18  func DtrmvTest(t *testing.T, blasser Dtrmver) {
    19  	for i, test := range []struct {
    20  		n   int
    21  		a   [][]float64
    22  		x   []float64
    23  		d   blas.Diag
    24  		ul  blas.Uplo
    25  		tA  blas.Transpose
    26  		ans []float64
    27  	}{
    28  		{
    29  			n:   1,
    30  			a:   [][]float64{{5}},
    31  			x:   []float64{2},
    32  			d:   blas.NonUnit,
    33  			ul:  blas.Upper,
    34  			tA:  blas.NoTrans,
    35  			ans: []float64{10},
    36  		},
    37  		{
    38  			n:   1,
    39  			a:   [][]float64{{5}},
    40  			x:   []float64{2},
    41  			d:   blas.Unit,
    42  			ul:  blas.Upper,
    43  			tA:  blas.NoTrans,
    44  			ans: []float64{2},
    45  		},
    46  		{
    47  			n: 3,
    48  			a: [][]float64{
    49  				{5, 6, 7},
    50  				{0, 9, 10},
    51  				{0, 0, 13},
    52  			},
    53  			x:   []float64{3, 4, 5},
    54  			d:   blas.NonUnit,
    55  			ul:  blas.Upper,
    56  			tA:  blas.NoTrans,
    57  			ans: []float64{74, 86, 65},
    58  		},
    59  		{
    60  			n: 3,
    61  			a: [][]float64{
    62  				{5, 6, 7},
    63  				{0, 9, 10},
    64  				{0, 0, 13},
    65  			},
    66  			x:   []float64{3, 4, 5},
    67  			d:   blas.Unit,
    68  			ul:  blas.Upper,
    69  			tA:  blas.NoTrans,
    70  			ans: []float64{62, 54, 5},
    71  		},
    72  		{
    73  			n: 3,
    74  			a: [][]float64{
    75  				{5, 0, 0},
    76  				{6, 9, 0},
    77  				{7, 10, 13},
    78  			},
    79  			x:   []float64{3, 4, 5},
    80  			d:   blas.NonUnit,
    81  			ul:  blas.Lower,
    82  			tA:  blas.NoTrans,
    83  			ans: []float64{15, 54, 126},
    84  		},
    85  		{
    86  			n: 3,
    87  			a: [][]float64{
    88  				{1, 0, 0},
    89  				{6, 1, 0},
    90  				{7, 10, 1},
    91  			},
    92  			x:   []float64{3, 4, 5},
    93  			d:   blas.Unit,
    94  			ul:  blas.Lower,
    95  			tA:  blas.NoTrans,
    96  			ans: []float64{3, 22, 66},
    97  		},
    98  		{
    99  			n: 3,
   100  			a: [][]float64{
   101  				{5, 6, 7},
   102  				{0, 9, 10},
   103  				{0, 0, 13},
   104  			},
   105  			x:   []float64{3, 4, 5},
   106  			d:   blas.NonUnit,
   107  			ul:  blas.Upper,
   108  			tA:  blas.Trans,
   109  			ans: []float64{15, 54, 126},
   110  		},
   111  		{
   112  			n: 3,
   113  			a: [][]float64{
   114  				{1, 6, 7},
   115  				{0, 1, 10},
   116  				{0, 0, 1},
   117  			},
   118  			x:   []float64{3, 4, 5},
   119  			d:   blas.Unit,
   120  			ul:  blas.Upper,
   121  			tA:  blas.Trans,
   122  			ans: []float64{3, 22, 66},
   123  		},
   124  		{
   125  			n: 3,
   126  			a: [][]float64{
   127  				{5, 0, 0},
   128  				{6, 9, 0},
   129  				{7, 10, 13},
   130  			},
   131  			x:   []float64{3, 4, 5},
   132  			d:   blas.NonUnit,
   133  			ul:  blas.Lower,
   134  			tA:  blas.Trans,
   135  			ans: []float64{74, 86, 65},
   136  		},
   137  	} {
   138  		incTest := func(incX, extra int) {
   139  			aFlat := flatten(test.a)
   140  			x := makeIncremented(test.x, incX, extra)
   141  			blasser.Dtrmv(test.ul, test.tA, test.d, test.n, aFlat, test.n, x, incX)
   142  			ans := makeIncremented(test.ans, incX, extra)
   143  			if !floats.EqualApprox(x, ans, 1e-14) {
   144  				t.Errorf("Case %v, idx %v: Want %v, got %v.", i, incX, ans, x)
   145  			}
   146  		}
   147  		incTest(1, 3)
   148  		incTest(-3, 3)
   149  		incTest(4, 3)
   150  	}
   151  }