OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / lapack / testlapack / dlantr.go
1 // Copyright ©2015 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         "math"
9         "testing"
10
11         "golang.org/x/exp/rand"
12
13         "gonum.org/v1/gonum/blas"
14         "gonum.org/v1/gonum/lapack"
15 )
16
17 type Dlantrer interface {
18         Dlanger
19         Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag blas.Diag, m, n int, a []float64, lda int, work []float64) float64
20 }
21
22 func DlantrTest(t *testing.T, impl Dlantrer) {
23         rnd := rand.New(rand.NewSource(1))
24         for _, norm := range []lapack.MatrixNorm{lapack.MaxAbs, lapack.MaxColumnSum, lapack.MaxRowSum, lapack.NormFrob} {
25                 for _, diag := range []blas.Diag{blas.NonUnit, blas.Unit} {
26                         for _, uplo := range []blas.Uplo{blas.Lower, blas.Upper} {
27                                 for _, test := range []struct {
28                                         m, n, lda int
29                                 }{
30                                         {3, 3, 0},
31                                         {3, 5, 0},
32                                         {10, 5, 0},
33
34                                         {5, 5, 11},
35                                         {5, 10, 11},
36                                         {10, 5, 11},
37                                 } {
38                                         // Do a couple of random trials since the values change.
39                                         for trial := 0; trial < 100; trial++ {
40                                                 m := test.m
41                                                 n := test.n
42                                                 lda := test.lda
43                                                 if lda == 0 {
44                                                         lda = n
45                                                 }
46                                                 a := make([]float64, m*lda)
47                                                 if trial == 0 {
48                                                         for i := range a {
49                                                                 a[i] = float64(i)
50                                                         }
51                                                 } else {
52                                                         for i := range a {
53                                                                 a[i] = rnd.NormFloat64()
54                                                         }
55                                                 }
56                                                 aDense := make([]float64, len(a))
57                                                 if uplo == blas.Lower {
58                                                         for i := 0; i < m; i++ {
59                                                                 for j := 0; j <= min(i, n-1); j++ {
60                                                                         aDense[i*lda+j] = a[i*lda+j]
61                                                                 }
62                                                         }
63                                                 } else {
64                                                         for i := 0; i < m; i++ {
65                                                                 for j := i; j < n; j++ {
66                                                                         aDense[i*lda+j] = a[i*lda+j]
67                                                                 }
68                                                         }
69                                                 }
70                                                 if diag == blas.Unit {
71                                                         for i := 0; i < min(m, n); i++ {
72                                                                 aDense[i*lda+i] = 1
73                                                         }
74                                                 }
75                                                 work := make([]float64, n+6)
76                                                 for i := range work {
77                                                         work[i] = rnd.Float64()
78                                                 }
79                                                 got := impl.Dlantr(norm, uplo, diag, m, n, a, lda, work)
80                                                 want := impl.Dlange(norm, m, n, aDense, lda, work)
81                                                 if math.Abs(got-want) > 1e-13 {
82                                                         t.Errorf("Norm mismatch. norm = %c, unitdiag = %v, upper = %v, m = %v, n = %v, lda = %v, Want %v, got %v.",
83                                                                 norm, diag == blas.Unit, uplo == blas.Upper, m, n, lda, got, want)
84                                                 }
85                                         }
86                                 }
87                         }
88                 }
89         }
90 }