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.
10 "golang.org/x/exp/rand"
12 "gonum.org/v1/gonum/blas/blas64"
13 "gonum.org/v1/gonum/floats"
14 "gonum.org/v1/gonum/lapack"
17 type Dorgbrer interface {
18 Dorgbr(vect lapack.DecompUpdate, m, n, k int, a []float64, lda int, tau, work []float64, lwork int)
22 func DorgbrTest(t *testing.T, impl Dorgbrer) {
23 rnd := rand.New(rand.NewSource(1))
24 for _, vect := range []lapack.DecompUpdate{lapack.ApplyQ, lapack.ApplyP} {
25 for _, test := range []struct {
54 // Filter out bad tests
55 if vect == lapack.ApplyQ {
56 if m < n || n < min(m, k) || m < min(m, k) {
60 if n < m || m < min(n, k) || n < min(n, k) {
66 if vect == lapack.ApplyQ {
83 // a eventually needs to store either P or Q, so it must be
86 if vect == lapack.ApplyQ {
88 a = make([]float64, m*lda)
91 a = make([]float64, n*lda)
94 a[i] = rnd.NormFloat64()
98 tauP := make([]float64, nTau)
99 tauQ := make([]float64, nTau)
100 d := make([]float64, nTau)
101 e := make([]float64, nTau)
103 work := make([]float64, 1)
104 impl.Dgebrd(ma, na, a, lda, d, e, tauQ, tauP, work, lwork)
105 work = make([]float64, int(work[0]))
107 impl.Dgebrd(ma, na, a, lda, d, e, tauQ, tauP, work, lwork)
109 aCopy := make([]float64, len(a))
113 if vect == lapack.ApplyQ {
119 impl.Dorgbr(vect, m, n, k, a, lda, tau, work, -1)
120 work = make([]float64, int(work[0]))
122 impl.Dorgbr(vect, m, n, k, a, lda, tau, work, lwork)
124 var ans blas64.General
127 if vect == lapack.ApplyQ {
133 ans = constructQPBidiagonal(vect, ma, na, min(m, k), aCopy, lda, tau)
140 ansTmp := constructQPBidiagonal(vect, ma, na, min(k, n), aCopy, lda, tau)
141 // Dorgbr actually computes P^T
142 ans = transposeGeneral(ansTmp)
144 for i := 0; i < nRows; i++ {
145 for j := 0; j < nCols; j++ {
146 if !floats.EqualWithinAbsOrRel(a[i*lda+j], ans.Data[i*ans.Stride+j], 1e-8, 1e-8) {
152 applyQ := vect == lapack.ApplyQ
153 t.Errorf("Extracted matrix mismatch. applyQ: %v, m = %v, n = %v, k = %v", applyQ, m, n, k)