OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / lapack / testlapack / dlansy.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 Dlansyer interface {
18         Dlanger
19         Dlansy(norm lapack.MatrixNorm, uplo blas.Uplo, n int, a []float64, lda int, work []float64) float64
20 }
21
22 func DlansyTest(t *testing.T, impl Dlansyer) {
23         rnd := rand.New(rand.NewSource(1))
24         for _, norm := range []lapack.MatrixNorm{lapack.MaxAbs, lapack.MaxColumnSum, lapack.MaxRowSum, lapack.NormFrob} {
25                 for _, uplo := range []blas.Uplo{blas.Lower, blas.Upper} {
26                         for _, test := range []struct {
27                                 n, lda int
28                         }{
29                                 {1, 0},
30                                 {3, 0},
31
32                                 {1, 10},
33                                 {3, 10},
34                         } {
35                                 for trial := 0; trial < 100; trial++ {
36                                         n := test.n
37                                         lda := test.lda
38                                         if lda == 0 {
39                                                 lda = n
40                                         }
41                                         a := make([]float64, lda*n)
42                                         if trial == 0 {
43                                                 for i := range a {
44                                                         a[i] = float64(i)
45                                                 }
46                                         } else {
47                                                 for i := range a {
48                                                         a[i] = rnd.NormFloat64()
49                                                 }
50                                         }
51
52                                         aDense := make([]float64, n*n)
53                                         if uplo == blas.Upper {
54                                                 for i := 0; i < n; i++ {
55                                                         for j := i; j < n; j++ {
56                                                                 v := a[i*lda+j]
57                                                                 aDense[i*n+j] = v
58                                                                 aDense[j*n+i] = v
59                                                         }
60                                                 }
61                                         } else {
62                                                 for i := 0; i < n; i++ {
63                                                         for j := 0; j <= i; j++ {
64                                                                 v := a[i*lda+j]
65                                                                 aDense[i*n+j] = v
66                                                                 aDense[j*n+i] = v
67                                                         }
68                                                 }
69                                         }
70                                         work := make([]float64, n)
71                                         got := impl.Dlansy(norm, uplo, n, a, lda, work)
72                                         want := impl.Dlange(norm, n, n, aDense, n, work)
73                                         if math.Abs(want-got) > 1e-14 {
74                                                 t.Errorf("Norm mismatch. norm = %c, upper = %v, n = %v, lda = %v, want %v, got %v.",
75                                                         norm, uplo == blas.Upper, n, lda, got, want)
76                                         }
77                                 }
78                         }
79                 }
80         }
81 }