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