| // Copyright ©2017 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package testblas |
| |
| import ( |
| "testing" |
| |
| "gonum.org/v1/gonum/blas" |
| ) |
| |
| var ztrmvTestCases = []struct { |
| uplo blas.Uplo |
| a []complex128 |
| x []complex128 |
| |
| // Results with non-unit diagonal. |
| want []complex128 |
| wantNeg []complex128 |
| wantTrans []complex128 |
| wantTransNeg []complex128 |
| wantConjTrans []complex128 |
| wantConjTransNeg []complex128 |
| |
| // Results with unit diagonal. |
| wantUnit []complex128 |
| wantUnitNeg []complex128 |
| wantUnitTrans []complex128 |
| wantUnitTransNeg []complex128 |
| wantUnitConjTrans []complex128 |
| wantUnitConjTransNeg []complex128 |
| }{ |
| {uplo: blas.Upper}, |
| {uplo: blas.Lower}, |
| { |
| uplo: blas.Upper, |
| a: []complex128{ |
| 6 - 8i, -10 + 10i, -6 - 3i, -1 - 8i, |
| znan, 7 + 8i, -7 + 9i, 3 + 6i, |
| znan, znan, 6 - 4i, -2 - 5i, |
| znan, znan, znan, 4 - 8i, |
| }, |
| x: []complex128{ |
| 10 - 5i, |
| -2 + 2i, |
| 8 - 1i, |
| -7 + 9i, |
| }, |
| |
| want: []complex128{ |
| 48 - 121i, |
| -152 + 62i, |
| 103 - 21i, |
| 44 + 92i, |
| }, |
| wantNeg: []complex128{ |
| 0 - 100i, |
| -49 - 20i, |
| 120 + 70i, |
| -72 + 119i, |
| }, |
| wantTrans: []complex128{ |
| 20 - 110i, |
| -80 + 148i, |
| -35 - 70i, |
| -45 - 27i, |
| }, |
| wantTransNeg: []complex128{ |
| 123 - 2i, |
| 18 + 66i, |
| 44 - 103i, |
| 30 + 110i, |
| }, |
| wantConjTrans: []complex128{ |
| 100 + 50i, |
| -148 - 20i, |
| 39 + 90i, |
| -75 + 125i, |
| }, |
| wantConjTransNeg: []complex128{ |
| 27 - 70i, |
| -70 - 136i, |
| 208 - 91i, |
| -114 - 2i, |
| }, |
| |
| wantUnit: []complex128{ |
| 38 - 16i, |
| -124 + 66i, |
| 67 + 16i, |
| -7 + 9i, |
| }, |
| wantUnitNeg: []complex128{ |
| 10 - 5i, |
| -47 - 38i, |
| 64 + 12i, |
| -109 + 18i, |
| }, |
| wantUnitTrans: []complex128{ |
| 10 - 5i, |
| -52 + 152i, |
| -71 - 33i, |
| -96 - 110i, |
| }, |
| wantUnitTransNeg: []complex128{ |
| 133 + 93i, |
| 20 + 48i, |
| -12 - 161i, |
| -7 + 9i, |
| }, |
| wantUnitConjTrans: []complex128{ |
| 10 - 5i, |
| -152 - 48i, |
| -5 + 63i, |
| 18 + 154i, |
| }, |
| wantUnitConjTransNeg: []complex128{ |
| -43 - 135i, |
| -52 - 138i, |
| 168 - 21i, |
| -7 + 9i, |
| }, |
| }, |
| { |
| uplo: blas.Lower, |
| a: []complex128{ |
| 10 - 8i, znan, znan, znan, |
| 1 - 6i, -4 + 8i, znan, znan, |
| 2 - 6i, 4 - 8i, 5 + 3i, znan, |
| -7 - 4i, 1 + 3i, -2 - 4i, 9 + 8i, |
| }, |
| x: []complex128{ |
| 10 + 5i, |
| -7 + 1i, |
| 3 - 1i, |
| 9 + 10i, |
| }, |
| |
| want: []complex128{ |
| 140 - 30i, |
| 60 - 115i, |
| 48 + 14i, |
| -69 + 57i, |
| }, |
| wantNeg: []complex128{ |
| 51 + 53i, |
| 44 - 78i, |
| 65 - 16i, |
| 170 + 28i, |
| }, |
| wantTrans: []complex128{ |
| 116 - 113i, |
| 3 - 51i, |
| 40 - 52i, |
| 1 + 162i, |
| }, |
| wantTransNeg: []complex128{ |
| 50 + 125i, |
| -38 - 66i, |
| -29 + 123i, |
| 109 - 22i, |
| }, |
| wantConjTrans: []complex128{ |
| -44 + 71i, |
| 95 + 55i, |
| -46 + 2i, |
| 161 + 18i, |
| }, |
| wantConjTransNeg: []complex128{ |
| 130 - 35i, |
| -72 + 56i, |
| -31 - 97i, |
| -91 + 154i, |
| }, |
| |
| wantUnit: []complex128{ |
| 10 + 5i, |
| 33 - 54i, |
| 33 + 9i, |
| -61 - 95i, |
| }, |
| wantUnitNeg: []complex128{ |
| 11 - 67i, |
| 75 - 61i, |
| 72 - 45i, |
| 9 + 10i, |
| }, |
| wantUnitTrans: []complex128{ |
| -14 - 78i, |
| -24 + 10i, |
| 25 - 57i, |
| 9 + 10i, |
| }, |
| wantUnitTransNeg: []complex128{ |
| 10 + 5i, |
| -7 - 49i, |
| -22 + 94i, |
| -52 - 40i, |
| }, |
| wantUnitConjTrans: []complex128{ |
| -94 - 54i, |
| 52 + 4i, |
| -55 + 15i, |
| 9 + 10i, |
| }, |
| wantUnitConjTransNeg: []complex128{ |
| 10 + 5i, |
| -47 + 31i, |
| -8 - 78i, |
| -92 - 8i, |
| }, |
| }, |
| } |
| |
| type Ztrmver interface { |
| Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex128, lda int, x []complex128, incX int) |
| } |
| |
| func ZtrmvTest(t *testing.T, impl Ztrmver) { |
| for tc, test := range ztrmvTestCases { |
| n := len(test.x) |
| uplo := test.uplo |
| for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} { |
| for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} { |
| for _, incX := range []int{-11, -2, -1, 1, 2, 7} { |
| for _, lda := range []int{max(1, n), n + 11} { |
| a := makeZGeneral(test.a, n, n, lda) |
| if diag == blas.Unit { |
| for i := 0; i < n; i++ { |
| a[i*lda+i] = znan |
| } |
| } |
| aCopy := make([]complex128, len(a)) |
| copy(aCopy, a) |
| |
| x := makeZVector(test.x, incX) |
| |
| impl.Ztrmv(uplo, trans, diag, n, a, lda, x, incX) |
| |
| if !zsame(a, aCopy) { |
| t.Errorf("Case %v (uplo=%v,trans=%v,diag=%v,lda=%v,incX=%v): unexpected modification of A", tc, uplo, trans, diag, lda, incX) |
| } |
| |
| var want []complex128 |
| if diag == blas.NonUnit { |
| switch { |
| case trans == blas.NoTrans && incX > 0: |
| want = makeZVector(test.want, incX) |
| case trans == blas.NoTrans && incX < 0: |
| want = makeZVector(test.wantNeg, incX) |
| case trans == blas.Trans && incX > 0: |
| want = makeZVector(test.wantTrans, incX) |
| case trans == blas.Trans && incX < 0: |
| want = makeZVector(test.wantTransNeg, incX) |
| case trans == blas.ConjTrans && incX > 0: |
| want = makeZVector(test.wantConjTrans, incX) |
| case trans == blas.ConjTrans && incX < 0: |
| want = makeZVector(test.wantConjTransNeg, incX) |
| } |
| } else { |
| switch { |
| case trans == blas.NoTrans && incX > 0: |
| want = makeZVector(test.wantUnit, incX) |
| case trans == blas.NoTrans && incX < 0: |
| want = makeZVector(test.wantUnitNeg, incX) |
| case trans == blas.Trans && incX > 0: |
| want = makeZVector(test.wantUnitTrans, incX) |
| case trans == blas.Trans && incX < 0: |
| want = makeZVector(test.wantUnitTransNeg, incX) |
| case trans == blas.ConjTrans && incX > 0: |
| want = makeZVector(test.wantUnitConjTrans, incX) |
| case trans == blas.ConjTrans && incX < 0: |
| want = makeZVector(test.wantUnitConjTransNeg, incX) |
| } |
| } |
| if !zsame(x, want) { |
| 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) |
| } |
| } |
| } |
| } |
| } |
| } |
| } |