+++ /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"
-)
-
-type Zgemver interface {
- Zgemv(trans blas.Transpose, m, n int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int)
-}
-
-func ZgemvTest(t *testing.T, impl Zgemver) {
- for tc, test := range []struct {
- trans blas.Transpose
- alpha complex128
- a []complex128
- x []complex128
- beta complex128
- y []complex128
-
- want []complex128
- wantXNeg []complex128
- wantYNeg []complex128
- wantXYNeg []complex128
- }{
- {
- trans: blas.NoTrans,
- alpha: 1 + 2i,
- beta: 3 + 4i,
- },
- {
- trans: blas.NoTrans,
- alpha: 1 + 2i,
- a: []complex128{
- 9 + 5i, -2 + 6i, 5 + 1i, 9 + 2i, 10 + 4i,
- 0 - 7i, 9 - 9i, 5 + 3i, -8 - 1i, 7 - 7i,
- 10 - 7i, -1 + 3i, 2 + 2i, 7 + 6i, 9 + 1i,
- 10 + 0i, 8 - 6i, 4 - 6i, -2 - 10i, -5 + 0i,
- },
- x: []complex128{
- 4 - 9i,
- 8 + 5i,
- -2 - 10i,
- 2 - 4i,
- -6 + 6i,
- },
- beta: 3 + 4i,
- y: []complex128{
- -2 + 3i,
- 10 + 5i,
- -8 - 5i,
- -8 + 7i,
- },
- want: []complex128{
- 101 - 116i,
- 58 + 166i,
- 126 - 242i,
- 336 - 75i,
- },
- wantXNeg: []complex128{
- 98 + 128i,
- 374 - 252i,
- -113 + 205i,
- -60 - 312i,
- },
- wantYNeg: []complex128{
- 370 - 63i,
- 140 - 140i,
- 44 + 64i,
- 67 - 128i,
- },
- wantXYNeg: []complex128{
- -26 - 300i,
- -99 + 307i,
- 360 - 354i,
- 64 + 116i,
- },
- },
- {
- trans: blas.Trans,
- alpha: 1 + 2i,
- a: []complex128{
- 9 + 5i, -2 + 6i, 5 + 1i, 9 + 2i, 10 + 4i,
- 0 - 7i, 9 - 9i, 5 + 3i, -8 - 1i, 7 - 7i,
- 10 - 7i, -1 + 3i, 2 + 2i, 7 + 6i, 9 + 1i,
- 10 + 0i, 8 - 6i, 4 - 6i, -2 - 10i, -5 + 0i,
- },
- x: []complex128{
- 4 - 9i,
- 8 + 5i,
- -2 - 10i,
- 2 - 4i,
- },
- beta: 3 + 4i,
- y: []complex128{
- 8 - 6i,
- -8 - 2i,
- 9 + 5i,
- 4 - 1i,
- 6 - 4i,
- },
- want: []complex128{
- 580 - 137i,
- 221 + 311i,
- 149 + 115i,
- 443 - 208i,
- 517 + 143i,
- },
- wantXNeg: []complex128{
- 387 + 152i,
- 109 - 433i,
- 225 - 53i,
- -246 + 44i,
- 13 + 20i,
- },
- wantYNeg: []complex128{
- 531 + 145i,
- 411 - 259i,
- 149 + 115i,
- 253 + 362i,
- 566 - 139i,
- },
- wantXYNeg: []complex128{
- 27 + 22i,
- -278 - 7i,
- 225 - 53i,
- 141 - 382i,
- 373 + 150i,
- },
- },
- {
- trans: blas.ConjTrans,
- alpha: 1 + 2i,
- a: []complex128{
- 9 + 5i, -2 + 6i, 5 + 1i, 9 + 2i, 10 + 4i,
- 0 - 7i, 9 - 9i, 5 + 3i, -8 - 1i, 7 - 7i,
- 10 - 7i, -1 + 3i, 2 + 2i, 7 + 6i, 9 + 1i,
- 10 + 0i, 8 - 6i, 4 - 6i, -2 - 10i, -5 + 0i,
- },
- x: []complex128{
- 4 - 9i,
- 8 + 5i,
- -2 - 10i,
- 2 - 4i,
- },
- beta: 3 + 4i,
- y: []complex128{
- 8 - 6i,
- -8 - 2i,
- 9 + 5i,
- 4 - 1i,
- 6 - 4i,
- },
- want: []complex128{
- 472 - 133i,
- -253 + 23i,
- 217 + 131i,
- 229 - 316i,
- 187 - 97i,
- },
- wantXNeg: []complex128{
- 289 + 276i,
- 499 + 47i,
- 237 + 91i,
- 54 + 504i,
- 251 + 196i,
- },
- wantYNeg: []complex128{
- 201 - 95i,
- 197 - 367i,
- 217 + 131i,
- -221 + 74i,
- 458 - 135i,
- },
- wantXYNeg: []complex128{
- 265 + 198i,
- 22 + 453i,
- 237 + 91i,
- 531 + 98i,
- 275 + 274i,
- },
- },
- {
- trans: blas.ConjTrans,
- alpha: 1 + 2i,
- a: []complex128{
- 9 + 5i, -2 + 6i, 5 + 1i, 9 + 2i, 10 + 4i,
- 0 - 7i, 9 - 9i, 5 + 3i, -8 - 1i, 7 - 7i,
- 10 - 7i, -1 + 3i, 2 + 2i, 7 + 6i, 9 + 1i,
- 10 + 0i, 8 - 6i, 4 - 6i, -2 - 10i, -5 + 0i,
- },
- x: []complex128{
- 4 - 9i,
- 8 + 5i,
- -2 - 10i,
- 2 - 4i,
- },
- beta: 0,
- y: []complex128{
- 8 - 6i,
- -8 - 2i,
- 9 + 5i,
- 4 - 1i,
- 6 - 4i,
- },
- want: []complex128{
- 424 - 147i,
- -237 + 61i,
- 210 + 80i,
- 213 - 329i,
- 153 - 109i,
- },
- wantXNeg: []complex128{
- 241 + 262i,
- 515 + 85i,
- 230 + 40i,
- 38 + 491i,
- 217 + 184i,
- },
- wantYNeg: []complex128{
- 153 - 109i,
- 213 - 329i,
- 210 + 80i,
- -237 + 61i,
- 424 - 147i,
- },
- wantXYNeg: []complex128{
- 217 + 184i,
- 38 + 491i,
- 230 + 40i,
- 515 + 85i,
- 241 + 262i,
- },
- },
- {
- trans: blas.ConjTrans,
- alpha: 0,
- a: []complex128{
- 9 + 5i, -2 + 6i, 5 + 1i, 9 + 2i, 10 + 4i,
- 0 - 7i, 9 - 9i, 5 + 3i, -8 - 1i, 7 - 7i,
- 10 - 7i, -1 + 3i, 2 + 2i, 7 + 6i, 9 + 1i,
- 10 + 0i, 8 - 6i, 4 - 6i, -2 - 10i, -5 + 0i,
- },
- x: []complex128{
- 4 - 9i,
- 8 + 5i,
- -2 - 10i,
- 2 - 4i,
- },
- beta: 3 + 4i,
- y: []complex128{
- 8 - 6i,
- -8 - 2i,
- 9 + 5i,
- 4 - 1i,
- 6 - 4i,
- },
- want: []complex128{
- 48 + 14i,
- -16 - 38i,
- 7 + 51i,
- 16 + 13i,
- 34 + 12i,
- },
- wantXNeg: []complex128{
- 48 + 14i,
- -16 - 38i,
- 7 + 51i,
- 16 + 13i,
- 34 + 12i,
- },
- wantYNeg: []complex128{
- 48 + 14i,
- -16 - 38i,
- 7 + 51i,
- 16 + 13i,
- 34 + 12i,
- },
- wantXYNeg: []complex128{
- 48 + 14i,
- -16 - 38i,
- 7 + 51i,
- 16 + 13i,
- 34 + 12i,
- },
- },
- } {
- var m, n int
- switch test.trans {
- case blas.NoTrans:
- m = len(test.y)
- n = len(test.x)
- case blas.Trans, blas.ConjTrans:
- m = len(test.x)
- n = len(test.y)
- }
- for _, incX := range []int{-11, -2, -1, 1, 2, 7} {
- for _, incY := range []int{-11, -2, -1, 1, 2, 7} {
- for _, lda := range []int{max(1, n), n + 11} {
- alpha := test.alpha
-
- a := makeZGeneral(test.a, m, n, lda)
- aCopy := make([]complex128, len(a))
- copy(aCopy, a)
-
- x := makeZVector(test.x, incX)
- xCopy := make([]complex128, len(x))
- copy(xCopy, x)
-
- y := makeZVector(test.y, incY)
-
- impl.Zgemv(test.trans, m, n, alpha, a, lda, x, incX, test.beta, y, incY)
-
- if !zsame(x, xCopy) {
- t.Errorf("Case %v (incX=%v,incY=%v,lda=%v): unexpected modification of x", tc, incX, incY, lda)
- }
- if !zsame(a, aCopy) {
- t.Errorf("Case %v (incX=%v,incY=%v,lda=%v): unexpected modification of A", tc, incX, incY, lda)
- }
-
- var want []complex128
- switch {
- case incX > 0 && incY > 0:
- want = makeZVector(test.want, incY)
- case incX < 0 && incY > 0:
- want = makeZVector(test.wantXNeg, incY)
- case incX > 0 && incY < 0:
- want = makeZVector(test.wantYNeg, incY)
- default:
- want = makeZVector(test.wantXYNeg, incY)
- }
- if !zsame(y, want) {
- t.Errorf("Case %v (incX=%v,incY=%v,lda=%v): unexpected result\nwant %v\ngot %v", tc, incX, incY, lda, want, y)
- }
- }
- }
- }
- }
-}