github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/testlapack/dlaswp.go (about) 1 // Copyright ©2016 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 testlapack 6 7 import ( 8 "fmt" 9 "testing" 10 11 "github.com/gonum/blas/blas64" 12 ) 13 14 type Dlaswper interface { 15 Dlaswp(n int, a []float64, lda, k1, k2 int, ipiv []int, incX int) 16 } 17 18 func DlaswpTest(t *testing.T, impl Dlaswper) { 19 for ti, test := range []struct { 20 k1, k2 int 21 ipiv []int 22 incX int 23 24 want blas64.General 25 }{ 26 { 27 k1: 0, 28 k2: 2, 29 ipiv: []int{0, 1, 2}, 30 incX: 1, 31 want: blas64.General{ 32 Rows: 4, 33 Cols: 3, 34 Stride: 3, 35 Data: []float64{ 36 1, 2, 3, 37 4, 5, 6, 38 7, 8, 9, 39 10, 11, 12, 40 }, 41 }, 42 }, 43 { 44 k1: 0, 45 k2: 2, 46 ipiv: []int{0, 1, 2}, 47 incX: -1, 48 want: blas64.General{ 49 Rows: 4, 50 Cols: 3, 51 Stride: 3, 52 Data: []float64{ 53 1, 2, 3, 54 4, 5, 6, 55 7, 8, 9, 56 10, 11, 12, 57 }, 58 }, 59 }, 60 { 61 k1: 0, 62 k2: 2, 63 ipiv: []int{1, 2, 3}, 64 incX: 1, 65 want: blas64.General{ 66 Rows: 5, 67 Cols: 3, 68 Stride: 3, 69 Data: []float64{ 70 4, 5, 6, 71 7, 8, 9, 72 10, 11, 12, 73 1, 2, 3, 74 13, 14, 15, 75 }, 76 }, 77 }, 78 { 79 k1: 0, 80 k2: 2, 81 ipiv: []int{1, 2, 3}, 82 incX: -1, 83 want: blas64.General{ 84 Rows: 5, 85 Cols: 3, 86 Stride: 3, 87 Data: []float64{ 88 10, 11, 12, 89 1, 2, 3, 90 4, 5, 6, 91 7, 8, 9, 92 13, 14, 15, 93 }, 94 }, 95 }, 96 } { 97 m := test.want.Rows 98 n := test.want.Cols 99 k1 := test.k1 100 k2 := test.k2 101 if len(test.ipiv) != k2+1 { 102 panic("bad length of ipiv") 103 } 104 incX := test.incX 105 for _, extra := range []int{0, 11} { 106 a := zeros(m, n, n+extra) 107 c := 1 108 for i := 0; i < m; i++ { 109 for j := 0; j < n; j++ { 110 a.Data[i*a.Stride+j] = float64(c) 111 c++ 112 } 113 } 114 115 ipiv := make([]int, len(test.ipiv)) 116 copy(ipiv, test.ipiv) 117 118 impl.Dlaswp(n, a.Data, a.Stride, k1, k2, ipiv, incX) 119 120 prefix := fmt.Sprintf("Case %v (m=%v,n=%v,k1=%v,k2=%v,extra=%v)", ti, m, n, k1, k2, extra) 121 if !generalOutsideAllNaN(a) { 122 t.Errorf("%v: out-of-range write to A", prefix) 123 } 124 125 if !equalApproxGeneral(a, test.want, 0) { 126 t.Errorf("%v: unexpected A\n%v\n%v", prefix, a, test.want) 127 } 128 } 129 } 130 }