| // 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 zhemvTestCases = []struct { |
| uplo blas.Uplo |
| alpha complex128 |
| a []complex128 |
| x []complex128 |
| beta complex128 |
| y []complex128 |
| |
| want []complex128 |
| wantXNeg []complex128 |
| wantYNeg []complex128 |
| wantXYNeg []complex128 |
| }{ |
| { |
| uplo: blas.Upper, |
| alpha: 6 + 2i, |
| beta: -6 - 7i, |
| }, |
| { |
| uplo: blas.Lower, |
| alpha: 6 + 2i, |
| beta: -6 - 7i, |
| }, |
| { |
| uplo: blas.Upper, |
| alpha: 6 + 2i, |
| a: []complex128{ |
| 7, 8 + 4i, -9 - 6i, -9 + 3i, |
| znan, -3, -10 - 6i, 0 + 3i, |
| znan, znan, 6, 2 + 8i, |
| znan, znan, znan, -4, |
| }, |
| x: []complex128{ |
| -4 + 0i, |
| -2 - 5i, |
| 8 + 0i, |
| 6 - 1i, |
| }, |
| beta: -6 - 7i, |
| y: []complex128{ |
| 1 - 5i, |
| -2 - 5i, |
| 0 - 4i, |
| 7 + 7i, |
| }, |
| want: []complex128{ |
| -785 - 685i, |
| -643 - 156i, |
| 776 + 692i, |
| 169 - 317i, |
| }, |
| wantXNeg: []complex128{ |
| 599 + 703i, |
| 1 + 172i, |
| -978 - 86i, |
| -449 - 423i, |
| }, |
| wantYNeg: []complex128{ |
| 121 - 203i, |
| 781 + 712i, |
| -648 - 176i, |
| -737 - 799i, |
| }, |
| wantXYNeg: []complex128{ |
| -497 - 309i, |
| -973 - 66i, |
| -4 + 152i, |
| 647 + 589i, |
| }, |
| }, |
| { |
| uplo: blas.Lower, |
| alpha: 6 + 2i, |
| a: []complex128{ |
| 7, znan, znan, znan, |
| 8 - 4i, -3, znan, znan, |
| -9 + 6i, -10 + 6i, 6, znan, |
| -9 - 3i, 0 - 3i, 2 - 8i, -4, |
| }, |
| x: []complex128{ |
| -4 + 0i, |
| -2 - 5i, |
| 8 + 0i, |
| 6 - 1i, |
| }, |
| beta: -6 - 7i, |
| y: []complex128{ |
| 1 - 5i, |
| -2 - 5i, |
| 0 - 4i, |
| 7 + 7i, |
| }, |
| want: []complex128{ |
| -785 - 685i, |
| -643 - 156i, |
| 776 + 692i, |
| 169 - 317i, |
| }, |
| wantXNeg: []complex128{ |
| 599 + 703i, |
| 1 + 172i, |
| -978 - 86i, |
| -449 - 423i, |
| }, |
| wantYNeg: []complex128{ |
| 121 - 203i, |
| 781 + 712i, |
| -648 - 176i, |
| -737 - 799i, |
| }, |
| wantXYNeg: []complex128{ |
| -497 - 309i, |
| -973 - 66i, |
| -4 + 152i, |
| 647 + 589i, |
| }, |
| }, |
| { |
| uplo: blas.Upper, |
| alpha: 0, |
| a: []complex128{ |
| 7, 8 + 4i, -9 - 6i, -9 + 3i, |
| znan, -3, -10 - 6i, 0 + 3i, |
| znan, znan, 6, 2 + 8i, |
| znan, znan, znan, -4, |
| }, |
| x: []complex128{ |
| -4 + 0i, |
| -2 - 5i, |
| 8 + 0i, |
| 6 - 1i, |
| }, |
| beta: -6 - 7i, |
| y: []complex128{ |
| 1 - 5i, |
| -2 - 5i, |
| 0 - 4i, |
| 7 + 7i, |
| }, |
| want: []complex128{ |
| -41 + 23i, |
| -23 + 44i, |
| -28 + 24i, |
| 7 - 91i, |
| }, |
| wantXNeg: []complex128{ |
| -41 + 23i, |
| -23 + 44i, |
| -28 + 24i, |
| 7 - 91i, |
| }, |
| wantYNeg: []complex128{ |
| -41 + 23i, |
| -23 + 44i, |
| -28 + 24i, |
| 7 - 91i, |
| }, |
| wantXYNeg: []complex128{ |
| -41 + 23i, |
| -23 + 44i, |
| -28 + 24i, |
| 7 - 91i, |
| }, |
| }, |
| { |
| uplo: blas.Upper, |
| alpha: 6 + 2i, |
| a: []complex128{ |
| 7, 8 + 4i, -9 - 6i, -9 + 3i, |
| znan, -3, -10 - 6i, 0 + 3i, |
| znan, znan, 6, 2 + 8i, |
| znan, znan, znan, -4, |
| }, |
| x: []complex128{ |
| -4 + 0i, |
| -2 - 5i, |
| 8 + 0i, |
| 6 - 1i, |
| }, |
| beta: 0, |
| y: []complex128{ |
| 1 - 5i, |
| -2 - 5i, |
| 0 - 4i, |
| 7 + 7i, |
| }, |
| want: []complex128{ |
| -744 - 708i, |
| -620 - 200i, |
| 804 + 668i, |
| 162 - 226i, |
| }, |
| wantXNeg: []complex128{ |
| 640 + 680i, |
| 24 + 128i, |
| -950 - 110i, |
| -456 - 332i, |
| }, |
| wantYNeg: []complex128{ |
| 162 - 226i, |
| 804 + 668i, |
| -620 - 200i, |
| -744 - 708i, |
| }, |
| wantXYNeg: []complex128{ |
| -456 - 332i, |
| -950 - 110i, |
| 24 + 128i, |
| 640 + 680i, |
| }, |
| }, |
| } |
| |
| type Zhemver interface { |
| Zhemv(uplo blas.Uplo, n int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int) |
| } |
| |
| func ZhemvTest(t *testing.T, impl Zhemver) { |
| for tc, test := range zhemvTestCases { |
| n := len(test.x) |
| 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 |
| beta := test.beta |
| |
| a := makeZGeneral(test.a, n, 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.Zhemv(test.uplo, n, alpha, a, lda, x, incX, 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) |
| } |
| } |
| } |
| } |
| } |
| } |