gonum.org/v1/gonum@v0.14.0/blas/testblas/zher.go (about)

     1  // Copyright ©2017 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package testblas
     6  
     7  import (
     8  	"testing"
     9  
    10  	"gonum.org/v1/gonum/blas"
    11  )
    12  
    13  var zherTestCases = []struct {
    14  	alpha float64
    15  	x     []complex128
    16  	a     []complex128
    17  
    18  	want    []complex128
    19  	wantRev []complex128 // Result when incX is negative.
    20  }{
    21  	{
    22  		alpha: 1,
    23  	},
    24  	{
    25  		alpha: 3,
    26  		x: []complex128{
    27  			0 - 3i,
    28  			6 + 10i,
    29  			-2 - 7i,
    30  		},
    31  		a: []complex128{
    32  			-2 + 3i, -3 - 11i, 0 + 4i,
    33  			-3 + 11i, -6 + 3i, 7 + 2i,
    34  			0 - 4i, 7 - 2i, 18 + 3i,
    35  		},
    36  		want: []complex128{
    37  			25 + 0i, -93 - 65i, 63 + 22i,
    38  			-93 + 65i, 402 + 0i, -239 + 68i,
    39  			63 - 22i, -239 - 68i, 177 + 0i},
    40  		wantRev: []complex128{
    41  			157 + 0i, -249 - 77i, 63 - 14i,
    42  			-249 + 77i, 402 + 0i, -83 + 56i,
    43  			63 + 14i, -83 - 56i, 45 + 0i,
    44  		},
    45  	},
    46  	{
    47  		alpha: 3,
    48  		x: []complex128{
    49  			-6 + 2i,
    50  			-2 - 4i,
    51  			0 + 0i,
    52  			0 + 7i,
    53  		},
    54  		a: []complex128{
    55  			2 + 3i, -9 + 7i, 3 + 11i, 10 - 1i,
    56  			-9 - 7i, 16 + 3i, -5 + 2i, -7 - 5i,
    57  			3 - 11i, -5 - 2i, 14 + 3i, 2 - 1i,
    58  			10 + 1i, -7 + 5i, 2 + 1i, 18 + 3i,
    59  		},
    60  		want: []complex128{
    61  			122 + 0i, 3 - 77i, 3 + 11i, 52 + 125i,
    62  			3 + 77i, 76 + 0i, -5 + 2i, -91 + 37i,
    63  			3 - 11i, -5 - 2i, 14 + 0i, 2 - 1i,
    64  			52 - 125i, -91 - 37i, 2 + 1i, 165 + 0i,
    65  		},
    66  		wantRev: []complex128{
    67  			149 + 0i, -9 + 7i, -81 - 31i, 52 - 127i,
    68  			-9 - 7i, 16 + 0i, -5 + 2i, -7 - 5i,
    69  			-81 + 31i, -5 - 2i, 74 + 0i, 14 + 83i,
    70  			52 + 127i, -7 + 5i, 14 - 83i, 138 + 0i,
    71  		},
    72  	},
    73  	{
    74  		alpha: 0,
    75  		x: []complex128{
    76  			-6 + 2i,
    77  			-2 - 4i,
    78  			0 + 0i,
    79  			0 + 7i,
    80  		},
    81  		a: []complex128{
    82  			2 + 0i, -9 + 7i, 3 + 11i, 10 - 1i,
    83  			-9 - 7i, 16 + 0i, -5 + 2i, -7 - 5i,
    84  			3 - 11i, -5 - 2i, 14 + 0i, 2 - 1i,
    85  			10 + 1i, -7 + 5i, 2 + 1i, 18 + 0i,
    86  		},
    87  		want: []complex128{
    88  			2 + 0i, -9 + 7i, 3 + 11i, 10 - 1i,
    89  			-9 - 7i, 16 + 0i, -5 + 2i, -7 - 5i,
    90  			3 - 11i, -5 - 2i, 14 + 0i, 2 - 1i,
    91  			10 + 1i, -7 + 5i, 2 + 1i, 18 + 0i,
    92  		},
    93  		wantRev: []complex128{
    94  			2 + 0i, -9 + 7i, 3 + 11i, 10 - 1i,
    95  			-9 - 7i, 16 + 0i, -5 + 2i, -7 - 5i,
    96  			3 - 11i, -5 - 2i, 14 + 0i, 2 - 1i,
    97  			10 + 1i, -7 + 5i, 2 + 1i, 18 + 0i,
    98  		},
    99  	},
   100  }
   101  
   102  type Zherer interface {
   103  	Zher(uplo blas.Uplo, n int, alpha float64, x []complex128, incX int, a []complex128, lda int)
   104  }
   105  
   106  func ZherTest(t *testing.T, impl Zherer) {
   107  	for tc, test := range zherTestCases {
   108  		n := len(test.x)
   109  		for _, uplo := range []blas.Uplo{blas.Lower, blas.Upper} {
   110  			for _, incX := range []int{-11, -2, -1, 1, 2, 7} {
   111  				for _, lda := range []int{max(1, n), n + 11} {
   112  					x := makeZVector(test.x, incX)
   113  					xCopy := make([]complex128, len(x))
   114  					copy(xCopy, x)
   115  
   116  					a := makeZGeneral(test.a, n, n, lda)
   117  
   118  					var want []complex128
   119  					if incX > 0 {
   120  						want = makeZGeneral(test.want, n, n, lda)
   121  					} else {
   122  						want = makeZGeneral(test.wantRev, n, n, lda)
   123  					}
   124  
   125  					if uplo == blas.Upper {
   126  						for i := 0; i < n; i++ {
   127  							for j := 0; j < i; j++ {
   128  								a[i*lda+j] = znan
   129  								want[i*lda+j] = znan
   130  							}
   131  						}
   132  					} else {
   133  						for i := 0; i < n; i++ {
   134  							for j := i + 1; j < n; j++ {
   135  								a[i*lda+j] = znan
   136  								want[i*lda+j] = znan
   137  							}
   138  						}
   139  					}
   140  
   141  					impl.Zher(uplo, n, test.alpha, x, incX, a, lda)
   142  
   143  					if !zsame(x, xCopy) {
   144  						t.Errorf("Case %v (uplo=%v,incX=%v,lda=%v,alpha=%v): unexpected modification of x", tc, uplo, incX, test.alpha, lda)
   145  					}
   146  					if !zsame(want, a) {
   147  						t.Errorf("Case %v (uplo=%v,incX=%v,lda=%v,alpha=%v): unexpected result\nwant: %v\ngot:  %v", tc, uplo, incX, lda, test.alpha, want, a)
   148  					}
   149  				}
   150  			}
   151  		}
   152  	}
   153  }