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

     1  // Copyright ©2017 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  )
    12  
    13  var ztrmvTestCases = []struct {
    14  	uplo blas.Uplo
    15  	a    []complex128
    16  	x    []complex128
    17  
    18  	// Results with non-unit diagonal.
    19  	want             []complex128
    20  	wantNeg          []complex128
    21  	wantTrans        []complex128
    22  	wantTransNeg     []complex128
    23  	wantConjTrans    []complex128
    24  	wantConjTransNeg []complex128
    25  
    26  	// Results with unit diagonal.
    27  	wantUnit             []complex128
    28  	wantUnitNeg          []complex128
    29  	wantUnitTrans        []complex128
    30  	wantUnitTransNeg     []complex128
    31  	wantUnitConjTrans    []complex128
    32  	wantUnitConjTransNeg []complex128
    33  }{
    34  	{uplo: blas.Upper},
    35  	{uplo: blas.Lower},
    36  	{
    37  		uplo: blas.Upper,
    38  		a: []complex128{
    39  			6 - 8i, -10 + 10i, -6 - 3i, -1 - 8i,
    40  			znan, 7 + 8i, -7 + 9i, 3 + 6i,
    41  			znan, znan, 6 - 4i, -2 - 5i,
    42  			znan, znan, znan, 4 - 8i,
    43  		},
    44  		x: []complex128{
    45  			10 - 5i,
    46  			-2 + 2i,
    47  			8 - 1i,
    48  			-7 + 9i,
    49  		},
    50  
    51  		want: []complex128{
    52  			48 - 121i,
    53  			-152 + 62i,
    54  			103 - 21i,
    55  			44 + 92i,
    56  		},
    57  		wantNeg: []complex128{
    58  			0 - 100i,
    59  			-49 - 20i,
    60  			120 + 70i,
    61  			-72 + 119i,
    62  		},
    63  		wantTrans: []complex128{
    64  			20 - 110i,
    65  			-80 + 148i,
    66  			-35 - 70i,
    67  			-45 - 27i,
    68  		},
    69  		wantTransNeg: []complex128{
    70  			123 - 2i,
    71  			18 + 66i,
    72  			44 - 103i,
    73  			30 + 110i,
    74  		},
    75  		wantConjTrans: []complex128{
    76  			100 + 50i,
    77  			-148 - 20i,
    78  			39 + 90i,
    79  			-75 + 125i,
    80  		},
    81  		wantConjTransNeg: []complex128{
    82  			27 - 70i,
    83  			-70 - 136i,
    84  			208 - 91i,
    85  			-114 - 2i,
    86  		},
    87  
    88  		wantUnit: []complex128{
    89  			38 - 16i,
    90  			-124 + 66i,
    91  			67 + 16i,
    92  			-7 + 9i,
    93  		},
    94  		wantUnitNeg: []complex128{
    95  			10 - 5i,
    96  			-47 - 38i,
    97  			64 + 12i,
    98  			-109 + 18i,
    99  		},
   100  		wantUnitTrans: []complex128{
   101  			10 - 5i,
   102  			-52 + 152i,
   103  			-71 - 33i,
   104  			-96 - 110i,
   105  		},
   106  		wantUnitTransNeg: []complex128{
   107  			133 + 93i,
   108  			20 + 48i,
   109  			-12 - 161i,
   110  			-7 + 9i,
   111  		},
   112  		wantUnitConjTrans: []complex128{
   113  			10 - 5i,
   114  			-152 - 48i,
   115  			-5 + 63i,
   116  			18 + 154i,
   117  		},
   118  		wantUnitConjTransNeg: []complex128{
   119  			-43 - 135i,
   120  			-52 - 138i,
   121  			168 - 21i,
   122  			-7 + 9i,
   123  		},
   124  	},
   125  	{
   126  		uplo: blas.Lower,
   127  		a: []complex128{
   128  			10 - 8i, znan, znan, znan,
   129  			1 - 6i, -4 + 8i, znan, znan,
   130  			2 - 6i, 4 - 8i, 5 + 3i, znan,
   131  			-7 - 4i, 1 + 3i, -2 - 4i, 9 + 8i,
   132  		},
   133  		x: []complex128{
   134  			10 + 5i,
   135  			-7 + 1i,
   136  			3 - 1i,
   137  			9 + 10i,
   138  		},
   139  
   140  		want: []complex128{
   141  			140 - 30i,
   142  			60 - 115i,
   143  			48 + 14i,
   144  			-69 + 57i,
   145  		},
   146  		wantNeg: []complex128{
   147  			51 + 53i,
   148  			44 - 78i,
   149  			65 - 16i,
   150  			170 + 28i,
   151  		},
   152  		wantTrans: []complex128{
   153  			116 - 113i,
   154  			3 - 51i,
   155  			40 - 52i,
   156  			1 + 162i,
   157  		},
   158  		wantTransNeg: []complex128{
   159  			50 + 125i,
   160  			-38 - 66i,
   161  			-29 + 123i,
   162  			109 - 22i,
   163  		},
   164  		wantConjTrans: []complex128{
   165  			-44 + 71i,
   166  			95 + 55i,
   167  			-46 + 2i,
   168  			161 + 18i,
   169  		},
   170  		wantConjTransNeg: []complex128{
   171  			130 - 35i,
   172  			-72 + 56i,
   173  			-31 - 97i,
   174  			-91 + 154i,
   175  		},
   176  
   177  		wantUnit: []complex128{
   178  			10 + 5i,
   179  			33 - 54i,
   180  			33 + 9i,
   181  			-61 - 95i,
   182  		},
   183  		wantUnitNeg: []complex128{
   184  			11 - 67i,
   185  			75 - 61i,
   186  			72 - 45i,
   187  			9 + 10i,
   188  		},
   189  		wantUnitTrans: []complex128{
   190  			-14 - 78i,
   191  			-24 + 10i,
   192  			25 - 57i,
   193  			9 + 10i,
   194  		},
   195  		wantUnitTransNeg: []complex128{
   196  			10 + 5i,
   197  			-7 - 49i,
   198  			-22 + 94i,
   199  			-52 - 40i,
   200  		},
   201  		wantUnitConjTrans: []complex128{
   202  			-94 - 54i,
   203  			52 + 4i,
   204  			-55 + 15i,
   205  			9 + 10i,
   206  		},
   207  		wantUnitConjTransNeg: []complex128{
   208  			10 + 5i,
   209  			-47 + 31i,
   210  			-8 - 78i,
   211  			-92 - 8i,
   212  		},
   213  	},
   214  }
   215  
   216  type Ztrmver interface {
   217  	Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex128, lda int, x []complex128, incX int)
   218  }
   219  
   220  func ZtrmvTest(t *testing.T, impl Ztrmver) {
   221  	for tc, test := range ztrmvTestCases {
   222  		n := len(test.x)
   223  		uplo := test.uplo
   224  		for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
   225  			for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
   226  				for _, incX := range []int{-11, -2, -1, 1, 2, 7} {
   227  					for _, lda := range []int{max(1, n), n + 11} {
   228  						a := makeZGeneral(test.a, n, n, lda)
   229  						if diag == blas.Unit {
   230  							for i := 0; i < n; i++ {
   231  								a[i*lda+i] = znan
   232  							}
   233  						}
   234  						aCopy := make([]complex128, len(a))
   235  						copy(aCopy, a)
   236  
   237  						x := makeZVector(test.x, incX)
   238  
   239  						impl.Ztrmv(uplo, trans, diag, n, a, lda, x, incX)
   240  
   241  						if !zsame(a, aCopy) {
   242  							t.Errorf("Case %v (uplo=%v,trans=%v,diag=%v,lda=%v,incX=%v): unexpected modification of A", tc, uplo, trans, diag, lda, incX)
   243  						}
   244  
   245  						var want []complex128
   246  						if diag == blas.NonUnit {
   247  							switch {
   248  							case trans == blas.NoTrans && incX > 0:
   249  								want = makeZVector(test.want, incX)
   250  							case trans == blas.NoTrans && incX < 0:
   251  								want = makeZVector(test.wantNeg, incX)
   252  							case trans == blas.Trans && incX > 0:
   253  								want = makeZVector(test.wantTrans, incX)
   254  							case trans == blas.Trans && incX < 0:
   255  								want = makeZVector(test.wantTransNeg, incX)
   256  							case trans == blas.ConjTrans && incX > 0:
   257  								want = makeZVector(test.wantConjTrans, incX)
   258  							case trans == blas.ConjTrans && incX < 0:
   259  								want = makeZVector(test.wantConjTransNeg, incX)
   260  							}
   261  						} else {
   262  							switch {
   263  							case trans == blas.NoTrans && incX > 0:
   264  								want = makeZVector(test.wantUnit, incX)
   265  							case trans == blas.NoTrans && incX < 0:
   266  								want = makeZVector(test.wantUnitNeg, incX)
   267  							case trans == blas.Trans && incX > 0:
   268  								want = makeZVector(test.wantUnitTrans, incX)
   269  							case trans == blas.Trans && incX < 0:
   270  								want = makeZVector(test.wantUnitTransNeg, incX)
   271  							case trans == blas.ConjTrans && incX > 0:
   272  								want = makeZVector(test.wantUnitConjTrans, incX)
   273  							case trans == blas.ConjTrans && incX < 0:
   274  								want = makeZVector(test.wantUnitConjTransNeg, incX)
   275  							}
   276  						}
   277  						if !zsame(x, want) {
   278  							t.Errorf("Case %v (uplo=%v,trans=%v,diag=%v,lda=%v,incX=%v): unexpected result\nwant %v\ngot  %v", tc, uplo, trans, diag, lda, incX, want, x)
   279  						}
   280  					}
   281  				}
   282  			}
   283  		}
   284  	}
   285  }