+++ /dev/null
-// 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)
- }
- }
- }
- }
- }
- }
-}