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

     1  // Copyright ©2014 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  type Dsbmver interface {
    14  	Dsbmv(ul blas.Uplo, n, k int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int)
    15  }
    16  
    17  func DsbmvTest(t *testing.T, blasser Dsbmver) {
    18  	for i, test := range []struct {
    19  		ul    blas.Uplo
    20  		n     int
    21  		k     int
    22  		alpha float64
    23  		beta  float64
    24  		a     [][]float64
    25  		x     []float64
    26  		y     []float64
    27  
    28  		ans []float64
    29  	}{
    30  		{
    31  			ul:    blas.Upper,
    32  			n:     4,
    33  			k:     2,
    34  			alpha: 2,
    35  			beta:  3,
    36  			a: [][]float64{
    37  				{7, 8, 2, 0},
    38  				{0, 8, 2, -3},
    39  				{0, 0, 3, 6},
    40  				{0, 0, 0, 9},
    41  			},
    42  			x:   []float64{1, 2, 3, 4},
    43  			y:   []float64{-1, -2, -3, -4},
    44  			ans: []float64{55, 30, 69, 84},
    45  		},
    46  		{
    47  			ul:    blas.Lower,
    48  			n:     4,
    49  			k:     2,
    50  			alpha: 2,
    51  			beta:  3,
    52  			a: [][]float64{
    53  				{7, 0, 0, 0},
    54  				{8, 8, 0, 0},
    55  				{2, 2, 3, 0},
    56  				{0, -3, 6, 9},
    57  			},
    58  			x:   []float64{1, 2, 3, 4},
    59  			y:   []float64{-1, -2, -3, -4},
    60  			ans: []float64{55, 30, 69, 84},
    61  		},
    62  	} {
    63  		extra := 0
    64  		var aFlat []float64
    65  		if test.ul == blas.Upper {
    66  			aFlat = flattenBanded(test.a, test.k, 0)
    67  		} else {
    68  			aFlat = flattenBanded(test.a, 0, test.k)
    69  		}
    70  		incTest := func(incX, incY, extra int) {
    71  			xnew := makeIncremented(test.x, incX, extra)
    72  			ynew := makeIncremented(test.y, incY, extra)
    73  			ans := makeIncremented(test.ans, incY, extra)
    74  			blasser.Dsbmv(test.ul, test.n, test.k, test.alpha, aFlat, test.k+1, xnew, incX, test.beta, ynew, incY)
    75  			if !dSliceTolEqual(ans, ynew) {
    76  				t.Errorf("Case %v: Want %v, got %v", i, ans, ynew)
    77  			}
    78  		}
    79  		incTest(1, 1, extra)
    80  		incTest(1, 3, extra)
    81  		incTest(1, -3, extra)
    82  		incTest(2, 3, extra)
    83  		incTest(2, -3, extra)
    84  		incTest(3, 2, extra)
    85  		incTest(-3, 2, extra)
    86  	}
    87  }