mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 15:16:59 +08:00
277 lines
4.8 KiB
Go
277 lines
4.8 KiB
Go
// 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)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|