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.
11 "golang.org/x/exp/rand"
13 "gonum.org/v1/gonum/floats"
16 type Dgebrder interface {
17 Dgebrd(m, n int, a []float64, lda int, d, e, tauQ, tauP, work []float64, lwork int)
21 func DgebrdTest(t *testing.T, impl Dgebrder) {
22 rnd := rand.New(rand.NewSource(1))
23 for _, test := range []struct {
47 a := make([]float64, m*lda)
49 a[i] = rnd.NormFloat64()
52 d := make([]float64, minmn)
53 e := make([]float64, minmn-1)
54 tauP := make([]float64, minmn)
55 tauQ := make([]float64, minmn)
56 work := make([]float64, max(m, n))
62 aCopy := make([]float64, len(a))
65 // Compute the true answer with the unblocked algorithm.
66 impl.Dgebd2(m, n, a, lda, d, e, tauQ, tauP, work)
67 aAns := make([]float64, len(a))
69 dAns := make([]float64, len(d))
71 eAns := make([]float64, len(e))
73 tauQAns := make([]float64, len(tauQ))
75 tauPAns := make([]float64, len(tauP))
78 // Test with optimal work.
81 impl.Dgebrd(m, n, a, lda, d, e, tauQ, tauP, work, lwork)
82 work = make([]float64, int(work[0]))
99 impl.Dgebrd(m, n, a, lda, d, e, tauQ, tauP, work, lwork)
102 if !floats.EqualApprox(a, aAns, 1e-10) {
103 t.Errorf("a mismatch")
105 if !floats.EqualApprox(d, dAns, 1e-10) {
106 t.Errorf("d mismatch")
108 if !floats.EqualApprox(e, eAns, 1e-10) {
109 t.Errorf("e mismatch")
111 if !floats.EqualApprox(tauQ, tauQAns, 1e-10) {
112 t.Errorf("tauQ mismatch")
114 if !floats.EqualApprox(tauP, tauPAns, 1e-10) {
115 t.Errorf("tauP mismatch")
118 // Test with shorter than optimal work.
127 for i := range tauP {
130 for i := range tauQ {
133 impl.Dgebrd(m, n, a, lda, d, e, tauQ, tauP, work, lwork)
136 if !floats.EqualApprox(a, aAns, 1e-10) {
137 t.Errorf("a mismatch")
139 if !floats.EqualApprox(d, dAns, 1e-10) {
140 t.Errorf("d mismatch")
142 if !floats.EqualApprox(e, eAns, 1e-10) {
143 t.Errorf("e mismatch")
145 if !floats.EqualApprox(tauQ, tauQAns, 1e-10) {
146 t.Errorf("tauQ mismatch")
148 if !floats.EqualApprox(tauP, tauPAns, 1e-10) {
149 t.Errorf("tauP mismatch")