1 // Copyright ©2016 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.
5 // This program generates test data for Dlaqr5. Test cases are stored in
6 // gzip-compressed JSON file testlapack/testdata/dlaqr5data.json.gz which is
7 // read during testing by testlapack/dlaqr5.go.
9 // This program uses cgo to call Fortran version of DLAQR5. Therefore, matrices
10 // passed to the Fortran routine are in column-major format but are written into
11 // the output file in row-major format.
21 "golang.org/x/exp/rand"
23 "gonum.org/v1/gonum/lapack/internal/testdata/netlib"
26 type Dlaqr5Test struct {
31 ShiftR, ShiftI []float64
39 file, err := os.Create(filepath.FromSlash("../../../testlapack/testdata/dlaqr5data.json.gz"))
44 w := gzip.NewWriter(file)
46 rnd := rand.New(rand.NewSource(1))
48 var tests []Dlaqr5Test
49 for _, wantt := range []bool{true, false} {
50 for _, n := range []int{2, 3, 4, 5, 6, 7, 11} {
51 for k := 0; k <= min(5, n); k++ {
56 for ktop := 0; ktop < n-1; ktop++ {
57 for kbot := ktop + 1; kbot < n; kbot++ {
58 sr, si := shiftpairs(npairs, rnd)
61 v := genrand(nshfts/2, 3, rnd)
62 u := genrand(3*nshfts-3, 3*nshfts-3, rnd)
63 wh := genrand(3*nshfts-3, n, rnd)
65 wv := genrand(n, 3*nshfts-3, rnd)
70 h[ktop+(ktop-1)*n] = 0
75 hin := make([]float64, len(h))
79 netlib.Dlaqr5(wantt, true, 2,
89 tests = append(tests, Dlaqr5Test{
97 H: rowMajor(n, n, hin),
98 HWant: rowMajor(n, n, h),
99 ZWant: rowMajor(n, n, z),
106 json.NewEncoder(w).Encode(tests)
114 // genrand returns a general r×c matrix with random entries.
115 func genrand(r, c int, rnd *rand.Rand) []float64 {
116 m := make([]float64, r*c)
118 m[i] = rnd.NormFloat64()
123 // eye returns an identity matrix of order n.
124 func eye(n int) []float64 {
125 m := make([]float64, n*n)
126 for i := 0; i < n*n; i += n + 1 {
132 // hessrand returns a Hessenberg matrix of order n with random non-zero entries
133 // in column-major format.
134 func hessrand(n int, rnd *rand.Rand) []float64 {
135 h := make([]float64, n*n)
136 for j := 0; j < n; j++ {
137 for i := 0; i <= min(j+1, n-1); i++ {
138 h[i+j*n] = rnd.NormFloat64()
144 // shiftpairs generates k real and complex conjugate shift pairs. That is, the
145 // length of sr and si is 2*k.
146 func shiftpairs(k int, rnd *rand.Rand) (sr, si []float64) {
147 sr = make([]float64, 2*k)
148 si = make([]float64, 2*k)
149 for i := 0; i < len(sr); {
150 if rnd.Float64() < 0.5 || i == len(sr)-1 {
151 sr[i] = rnd.NormFloat64()
155 // Generate a complex conjugate pair.
156 r := rnd.NormFloat64()
157 c := rnd.NormFloat64()
167 // rowMajor returns the given r×c column-major matrix a in row-major format.
168 func rowMajor(r, c int, a []float64) []float64 {
170 panic("testdata: slice length mismatch")
172 m := make([]float64, len(a))
173 for i := 0; i < r; i++ {
174 for j := 0; j < c; j++ {
181 func min(a, b int) int {