mirror of
				https://github.com/gonum/gonum.git
				synced 2025-10-31 18:42:45 +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)
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
