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