mirror of
				https://github.com/gonum/gonum.git
				synced 2025-10-31 18:42:45 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			286 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			286 lines
		
	
	
		
			5.9 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 ztrmvTestCases = []struct {
 | |
| 	uplo blas.Uplo
 | |
| 	a    []complex128
 | |
| 	x    []complex128
 | |
| 
 | |
| 	// Results with non-unit diagonal.
 | |
| 	want             []complex128
 | |
| 	wantNeg          []complex128
 | |
| 	wantTrans        []complex128
 | |
| 	wantTransNeg     []complex128
 | |
| 	wantConjTrans    []complex128
 | |
| 	wantConjTransNeg []complex128
 | |
| 
 | |
| 	// Results with unit diagonal.
 | |
| 	wantUnit             []complex128
 | |
| 	wantUnitNeg          []complex128
 | |
| 	wantUnitTrans        []complex128
 | |
| 	wantUnitTransNeg     []complex128
 | |
| 	wantUnitConjTrans    []complex128
 | |
| 	wantUnitConjTransNeg []complex128
 | |
| }{
 | |
| 	{uplo: blas.Upper},
 | |
| 	{uplo: blas.Lower},
 | |
| 	{
 | |
| 		uplo: blas.Upper,
 | |
| 		a: []complex128{
 | |
| 			6 - 8i, -10 + 10i, -6 - 3i, -1 - 8i,
 | |
| 			znan, 7 + 8i, -7 + 9i, 3 + 6i,
 | |
| 			znan, znan, 6 - 4i, -2 - 5i,
 | |
| 			znan, znan, znan, 4 - 8i,
 | |
| 		},
 | |
| 		x: []complex128{
 | |
| 			10 - 5i,
 | |
| 			-2 + 2i,
 | |
| 			8 - 1i,
 | |
| 			-7 + 9i,
 | |
| 		},
 | |
| 
 | |
| 		want: []complex128{
 | |
| 			48 - 121i,
 | |
| 			-152 + 62i,
 | |
| 			103 - 21i,
 | |
| 			44 + 92i,
 | |
| 		},
 | |
| 		wantNeg: []complex128{
 | |
| 			0 - 100i,
 | |
| 			-49 - 20i,
 | |
| 			120 + 70i,
 | |
| 			-72 + 119i,
 | |
| 		},
 | |
| 		wantTrans: []complex128{
 | |
| 			20 - 110i,
 | |
| 			-80 + 148i,
 | |
| 			-35 - 70i,
 | |
| 			-45 - 27i,
 | |
| 		},
 | |
| 		wantTransNeg: []complex128{
 | |
| 			123 - 2i,
 | |
| 			18 + 66i,
 | |
| 			44 - 103i,
 | |
| 			30 + 110i,
 | |
| 		},
 | |
| 		wantConjTrans: []complex128{
 | |
| 			100 + 50i,
 | |
| 			-148 - 20i,
 | |
| 			39 + 90i,
 | |
| 			-75 + 125i,
 | |
| 		},
 | |
| 		wantConjTransNeg: []complex128{
 | |
| 			27 - 70i,
 | |
| 			-70 - 136i,
 | |
| 			208 - 91i,
 | |
| 			-114 - 2i,
 | |
| 		},
 | |
| 
 | |
| 		wantUnit: []complex128{
 | |
| 			38 - 16i,
 | |
| 			-124 + 66i,
 | |
| 			67 + 16i,
 | |
| 			-7 + 9i,
 | |
| 		},
 | |
| 		wantUnitNeg: []complex128{
 | |
| 			10 - 5i,
 | |
| 			-47 - 38i,
 | |
| 			64 + 12i,
 | |
| 			-109 + 18i,
 | |
| 		},
 | |
| 		wantUnitTrans: []complex128{
 | |
| 			10 - 5i,
 | |
| 			-52 + 152i,
 | |
| 			-71 - 33i,
 | |
| 			-96 - 110i,
 | |
| 		},
 | |
| 		wantUnitTransNeg: []complex128{
 | |
| 			133 + 93i,
 | |
| 			20 + 48i,
 | |
| 			-12 - 161i,
 | |
| 			-7 + 9i,
 | |
| 		},
 | |
| 		wantUnitConjTrans: []complex128{
 | |
| 			10 - 5i,
 | |
| 			-152 - 48i,
 | |
| 			-5 + 63i,
 | |
| 			18 + 154i,
 | |
| 		},
 | |
| 		wantUnitConjTransNeg: []complex128{
 | |
| 			-43 - 135i,
 | |
| 			-52 - 138i,
 | |
| 			168 - 21i,
 | |
| 			-7 + 9i,
 | |
| 		},
 | |
| 	},
 | |
| 	{
 | |
| 		uplo: blas.Lower,
 | |
| 		a: []complex128{
 | |
| 			10 - 8i, znan, znan, znan,
 | |
| 			1 - 6i, -4 + 8i, znan, znan,
 | |
| 			2 - 6i, 4 - 8i, 5 + 3i, znan,
 | |
| 			-7 - 4i, 1 + 3i, -2 - 4i, 9 + 8i,
 | |
| 		},
 | |
| 		x: []complex128{
 | |
| 			10 + 5i,
 | |
| 			-7 + 1i,
 | |
| 			3 - 1i,
 | |
| 			9 + 10i,
 | |
| 		},
 | |
| 
 | |
| 		want: []complex128{
 | |
| 			140 - 30i,
 | |
| 			60 - 115i,
 | |
| 			48 + 14i,
 | |
| 			-69 + 57i,
 | |
| 		},
 | |
| 		wantNeg: []complex128{
 | |
| 			51 + 53i,
 | |
| 			44 - 78i,
 | |
| 			65 - 16i,
 | |
| 			170 + 28i,
 | |
| 		},
 | |
| 		wantTrans: []complex128{
 | |
| 			116 - 113i,
 | |
| 			3 - 51i,
 | |
| 			40 - 52i,
 | |
| 			1 + 162i,
 | |
| 		},
 | |
| 		wantTransNeg: []complex128{
 | |
| 			50 + 125i,
 | |
| 			-38 - 66i,
 | |
| 			-29 + 123i,
 | |
| 			109 - 22i,
 | |
| 		},
 | |
| 		wantConjTrans: []complex128{
 | |
| 			-44 + 71i,
 | |
| 			95 + 55i,
 | |
| 			-46 + 2i,
 | |
| 			161 + 18i,
 | |
| 		},
 | |
| 		wantConjTransNeg: []complex128{
 | |
| 			130 - 35i,
 | |
| 			-72 + 56i,
 | |
| 			-31 - 97i,
 | |
| 			-91 + 154i,
 | |
| 		},
 | |
| 
 | |
| 		wantUnit: []complex128{
 | |
| 			10 + 5i,
 | |
| 			33 - 54i,
 | |
| 			33 + 9i,
 | |
| 			-61 - 95i,
 | |
| 		},
 | |
| 		wantUnitNeg: []complex128{
 | |
| 			11 - 67i,
 | |
| 			75 - 61i,
 | |
| 			72 - 45i,
 | |
| 			9 + 10i,
 | |
| 		},
 | |
| 		wantUnitTrans: []complex128{
 | |
| 			-14 - 78i,
 | |
| 			-24 + 10i,
 | |
| 			25 - 57i,
 | |
| 			9 + 10i,
 | |
| 		},
 | |
| 		wantUnitTransNeg: []complex128{
 | |
| 			10 + 5i,
 | |
| 			-7 - 49i,
 | |
| 			-22 + 94i,
 | |
| 			-52 - 40i,
 | |
| 		},
 | |
| 		wantUnitConjTrans: []complex128{
 | |
| 			-94 - 54i,
 | |
| 			52 + 4i,
 | |
| 			-55 + 15i,
 | |
| 			9 + 10i,
 | |
| 		},
 | |
| 		wantUnitConjTransNeg: []complex128{
 | |
| 			10 + 5i,
 | |
| 			-47 + 31i,
 | |
| 			-8 - 78i,
 | |
| 			-92 - 8i,
 | |
| 		},
 | |
| 	},
 | |
| }
 | |
| 
 | |
| type Ztrmver interface {
 | |
| 	Ztrmv(uplo blas.Uplo, trans blas.Transpose, diag blas.Diag, n int, a []complex128, lda int, x []complex128, incX int)
 | |
| }
 | |
| 
 | |
| func ZtrmvTest(t *testing.T, impl Ztrmver) {
 | |
| 	for tc, test := range ztrmvTestCases {
 | |
| 		n := len(test.x)
 | |
| 		uplo := test.uplo
 | |
| 		for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans, blas.ConjTrans} {
 | |
| 			for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
 | |
| 				for _, incX := range []int{-11, -2, -1, 1, 2, 7} {
 | |
| 					for _, lda := range []int{max(1, n), n + 11} {
 | |
| 						a := makeZGeneral(test.a, n, n, lda)
 | |
| 						if diag == blas.Unit {
 | |
| 							for i := 0; i < n; i++ {
 | |
| 								a[i*lda+i] = znan
 | |
| 							}
 | |
| 						}
 | |
| 						aCopy := make([]complex128, len(a))
 | |
| 						copy(aCopy, a)
 | |
| 
 | |
| 						x := makeZVector(test.x, incX)
 | |
| 
 | |
| 						impl.Ztrmv(uplo, trans, diag, n, a, lda, x, incX)
 | |
| 
 | |
| 						if !zsame(a, aCopy) {
 | |
| 							t.Errorf("Case %v (uplo=%v,trans=%v,diag=%v,lda=%v,incX=%v): unexpected modification of A", tc, uplo, trans, diag, lda, incX)
 | |
| 						}
 | |
| 
 | |
| 						var want []complex128
 | |
| 						if diag == blas.NonUnit {
 | |
| 							switch {
 | |
| 							case trans == blas.NoTrans && incX > 0:
 | |
| 								want = makeZVector(test.want, incX)
 | |
| 							case trans == blas.NoTrans && incX < 0:
 | |
| 								want = makeZVector(test.wantNeg, incX)
 | |
| 							case trans == blas.Trans && incX > 0:
 | |
| 								want = makeZVector(test.wantTrans, incX)
 | |
| 							case trans == blas.Trans && incX < 0:
 | |
| 								want = makeZVector(test.wantTransNeg, incX)
 | |
| 							case trans == blas.ConjTrans && incX > 0:
 | |
| 								want = makeZVector(test.wantConjTrans, incX)
 | |
| 							case trans == blas.ConjTrans && incX < 0:
 | |
| 								want = makeZVector(test.wantConjTransNeg, incX)
 | |
| 							}
 | |
| 						} else {
 | |
| 							switch {
 | |
| 							case trans == blas.NoTrans && incX > 0:
 | |
| 								want = makeZVector(test.wantUnit, incX)
 | |
| 							case trans == blas.NoTrans && incX < 0:
 | |
| 								want = makeZVector(test.wantUnitNeg, incX)
 | |
| 							case trans == blas.Trans && incX > 0:
 | |
| 								want = makeZVector(test.wantUnitTrans, incX)
 | |
| 							case trans == blas.Trans && incX < 0:
 | |
| 								want = makeZVector(test.wantUnitTransNeg, incX)
 | |
| 							case trans == blas.ConjTrans && incX > 0:
 | |
| 								want = makeZVector(test.wantUnitConjTrans, incX)
 | |
| 							case trans == blas.ConjTrans && incX < 0:
 | |
| 								want = makeZVector(test.wantUnitConjTransNeg, incX)
 | |
| 							}
 | |
| 						}
 | |
| 						if !zsame(x, want) {
 | |
| 							t.Errorf("Case %v (uplo=%v,trans=%v,diag=%v,lda=%v,incX=%v): unexpected result\nwant %v\ngot  %v", tc, uplo, trans, diag, lda, incX, want, x)
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
