OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / lapack / testlapack / dorgl2.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         "testing"
9
10         "golang.org/x/exp/rand"
11
12         "gonum.org/v1/gonum/floats"
13 )
14
15 type Dorgl2er interface {
16         Dgelqfer
17         Dorgl2(m, n, k int, a []float64, lda int, tau []float64, work []float64)
18 }
19
20 func Dorgl2Test(t *testing.T, impl Dorgl2er) {
21         rnd := rand.New(rand.NewSource(1))
22         for _, test := range []struct {
23                 m, n, lda int
24         }{
25                 {3, 3, 0},
26                 {3, 4, 0},
27
28                 {5, 5, 20},
29                 {5, 10, 20},
30         } {
31                 m := test.m
32                 n := test.n
33                 lda := test.lda
34                 if lda == 0 {
35                         lda = test.n
36                 }
37                 a := make([]float64, m*lda)
38                 for i := range a {
39                         a[i] = rnd.NormFloat64()
40                 }
41                 k := min(m, n)
42                 tau := make([]float64, k)
43                 work := make([]float64, 1)
44                 impl.Dgelqf(m, n, a, lda, tau, work, -1)
45                 work = make([]float64, int(work[0]))
46                 impl.Dgelqf(m, n, a, lda, tau, work, len(work))
47
48                 q := constructQ("LQ", m, n, a, lda, tau)
49
50                 impl.Dorgl2(m, n, k, a, lda, tau, work)
51
52                 // Check that the first m rows match.
53                 same := true
54                 for i := 0; i < m; i++ {
55                         for j := 0; j < n; j++ {
56                                 if !floats.EqualWithinAbsOrRel(q.Data[i*q.Stride+j], a[i*lda+j], 1e-12, 1e-12) {
57                                         same = false
58                                         break
59                                 }
60                         }
61                 }
62                 if !same {
63                         t.Errorf("Q mismatch")
64                 }
65         }
66 }