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 }