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.
10 "gonum.org/v1/gonum/blas"
13 var ztrmvTestCases = []struct {
18 // Results with non-unit diagonal.
21 wantTrans []complex128
22 wantTransNeg []complex128
23 wantConjTrans []complex128
24 wantConjTransNeg []complex128
26 // Results with unit diagonal.
28 wantUnitNeg []complex128
29 wantUnitTrans []complex128
30 wantUnitTransNeg []complex128
31 wantUnitConjTrans []complex128
32 wantUnitConjTransNeg []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,
57 wantNeg: []complex128{
63 wantTrans: []complex128{
69 wantTransNeg: []complex128{
75 wantConjTrans: []complex128{
81 wantConjTransNeg: []complex128{
88 wantUnit: []complex128{
94 wantUnitNeg: []complex128{
100 wantUnitTrans: []complex128{
106 wantUnitTransNeg: []complex128{
112 wantUnitConjTrans: []complex128{
118 wantUnitConjTransNeg: []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,
146 wantNeg: []complex128{
152 wantTrans: []complex128{
158 wantTransNeg: []complex128{
164 wantConjTrans: []complex128{
170 wantConjTransNeg: []complex128{
177 wantUnit: []complex128{
183 wantUnitNeg: []complex128{
189 wantUnitTrans: []complex128{
195 wantUnitTransNeg: []complex128{
201 wantUnitConjTrans: []complex128{
207 wantUnitConjTransNeg: []complex128{
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)
220 func ZtrmvTest(t *testing.T, impl Ztrmver) {
221 for tc, test := range ztrmvTestCases {
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++ {
234 aCopy := make([]complex128, len(a))
237 x := makeZVector(test.x, incX)
239 impl.Ztrmv(uplo, trans, diag, n, a, lda, x, incX)
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)
245 var want []complex128
246 if diag == blas.NonUnit {
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)
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)
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)