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"
13 "gonum.org/v1/gonum/floats"
16 type Dormlqer interface {
18 Dormlq(side blas.Side, trans blas.Transpose, m, n, k int, a []float64, lda int, tau, c []float64, ldc int, work []float64, lwork int)
21 func DormlqTest(t *testing.T, impl Dormlqer) {
22 rnd := rand.New(rand.NewSource(1))
23 for _, side := range []blas.Side{blas.Left, blas.Right} {
24 for _, trans := range []blas.Transpose{blas.NoTrans, blas.Trans} {
25 for _, wl := range []worklen{minimumWork, mediumWork, optimumWork} {
26 for _, test := range []struct {
27 common, adim, cdim, lda, ldc int
36 {100, 200, 300, 0, 0},
37 {100, 300, 200, 0, 0},
38 {200, 100, 300, 0, 0},
39 {200, 300, 100, 0, 0},
40 {300, 100, 200, 0, 0},
41 {300, 200, 100, 0, 0},
42 {100, 200, 300, 400, 500},
43 {100, 300, 200, 400, 500},
44 {200, 100, 300, 400, 500},
45 {200, 300, 100, 400, 500},
46 {300, 100, 200, 400, 500},
47 {300, 200, 100, 400, 500},
48 {100, 200, 300, 500, 400},
49 {100, 300, 200, 500, 400},
50 {200, 100, 300, 500, 400},
51 {200, 300, 100, 500, 400},
52 {300, 100, 200, 500, 400},
53 {300, 200, 100, 500, 400},
55 var ma, na, mc, nc int
56 if side == blas.Left {
67 // Generate a random matrix
72 a := make([]float64, ma*lda)
76 // Compute random C matrix
81 c := make([]float64, mc*ldc)
88 tau := make([]float64, k)
89 work := make([]float64, 1)
90 impl.Dgelqf(ma, na, a, lda, tau, work, -1)
91 work = make([]float64, int(work[0]))
92 impl.Dgelqf(ma, na, a, lda, tau, work, len(work))
94 cCopy := make([]float64, len(c))
96 ans := make([]float64, len(c))
100 if side == blas.Left {
105 work = make([]float64, max(1, nw))
106 impl.Dorml2(side, trans, mc, nc, k, a, lda, tau, ans, ldc, work)
113 impl.Dormlq(side, trans, mc, nc, k, a, lda, tau, c, ldc, work, -1)
116 work := make([]float64, 1)
117 impl.Dormlq(side, trans, mc, nc, k, a, lda, tau, c, ldc, work, -1)
118 lwork = (int(work[0]) + nw) / 2
120 lwork = max(1, lwork)
121 work = make([]float64, lwork)
123 impl.Dormlq(side, trans, mc, nc, k, a, lda, tau, c, ldc, work, lwork)
124 if !floats.EqualApprox(c, ans, 1e-13) {
125 t.Errorf("Dormqr and Dorm2r results mismatch")