mirror of
https://github.com/gonum/gonum.git
synced 2025-10-08 00:20:11 +08:00
103 lines
2.3 KiB
Go
103 lines
2.3 KiB
Go
// 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
|
||
}
|