--- /dev/null
+// Copyright ©2016 The Gonum Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// dlahr2test generates test data for Dlahr2. Test cases are stored in
+// gzip-compressed JSON file testlapack/testdata/dlahr2data.json.gz which is
+// read during testing by testlapack/dlahr2.go.
+//
+// This program uses cgo to call Fortran version of DLAHR2. Therefore, matrices
+// passed to the Fortran routine are in column-major format but are written into
+// the output file in row-major format.
+package main
+
+import (
+ "compress/gzip"
+ "encoding/json"
+ "log"
+ "os"
+ "path/filepath"
+
+ "golang.org/x/exp/rand"
+
+ "gonum.org/v1/gonum/lapack/internal/testdata/netlib"
+)
+
+type Dlahr2Test struct {
+ N, K, NB int
+ A []float64
+
+ AWant []float64
+ TWant []float64
+ YWant []float64
+ TauWant []float64
+}
+
+func main() {
+ file, err := os.Create(filepath.FromSlash("../../../testlapack/testdata/dlahr2data.json.gz"))
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer file.Close()
+ w := gzip.NewWriter(file)
+
+ rnd := rand.New(rand.NewSource(1))
+
+ var tests []Dlahr2Test
+ for _, n := range []int{4, 5, 6, 7, 11} {
+ for k := 0; k <= n/2; k++ {
+ for nb := 1; nb <= k; nb++ {
+ ain := genrand(n, n-k+1, rnd)
+ a := make([]float64, len(ain))
+ copy(a, ain)
+
+ t := genrand(nb, nb, rnd)
+ y := genrand(n, nb, rnd)
+ tau := genrand(nb, 1, rnd)
+
+ netlib.Dlahr2(n, k, nb, a, n, tau, t, nb, y, n)
+
+ tests = append(tests, Dlahr2Test{
+ N: n,
+ K: k,
+ NB: nb,
+ A: rowMajor(n, n-k+1, ain),
+ AWant: rowMajor(n, n-k+1, a),
+ TWant: rowMajor(nb, nb, t),
+ YWant: rowMajor(n, nb, y),
+ TauWant: tau,
+ })
+ }
+ }
+ }
+ json.NewEncoder(w).Encode(tests)
+
+ err = w.Close()
+ if err != nil {
+ log.Fatal(err)
+ }
+}
+
+// genrand returns a general r×c matrix with random entries.
+func genrand(r, c int, rnd *rand.Rand) []float64 {
+ m := make([]float64, r*c)
+ for i := range m {
+ m[i] = rnd.NormFloat64()
+ }
+ return m
+}
+
+// rowMajor returns the given r×c column-major matrix a in row-major format.
+func rowMajor(r, c int, a []float64) []float64 {
+ if len(a) != r*c {
+ panic("testdata: slice length mismatch")
+ }
+ m := make([]float64, len(a))
+ for i := 0; i < r; i++ {
+ for j := 0; j < c; j++ {
+ m[i*c+j] = a[i+j*r]
+ }
+ }
+ return m
+}