// Copyright ©2023 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. package testlapack import ( "fmt" "testing" "golang.org/x/exp/rand" ) func Dlaqr5Benchmark(b *testing.B, impl Dlaqr5er) { const ( random = iota iplusj laplacian ) rnd := rand.New(rand.NewSource(1)) for _, typ := range []int{random, iplusj, laplacian} { for _, n := range []int{100, 200, 500, 1000} { h := zeros(n, n, n) var name string switch typ { case random: name = fmt.Sprintf("HessenbergRandom%d", n) h = randomHessenberg(n, n, rnd) case iplusj: name = fmt.Sprintf("HessenbergIPlusJ%d", n) for i := 0; i < n; i++ { for j := max(0, i-1); j < n; j++ { h.Data[i*h.Stride+j] = float64(i + j + 2) } } case laplacian: name = fmt.Sprintf("Laplacian%d", n) for i := 0; i < n; i++ { if i > 0 { h.Data[i*h.Stride+i-1] = -1 } h.Data[i*h.Stride+i] = 2 if i < n-1 { h.Data[i*h.Stride+i+1] = -1 } } } hCopy := cloneGeneral(h) nshifts := 2 * n sr := make([]float64, nshifts) si := make([]float64, nshifts) for i := 0; i < nshifts; { if i == nshifts-1 || rnd.Float64() < 0.5 { re := rnd.NormFloat64() sr[i], si[i] = re, 0 i++ continue } re := rnd.NormFloat64() im := rnd.NormFloat64() sr[i], sr[i+1] = re, re si[i], si[i+1] = im, -im i += 2 } v := zeros(nshifts/2, 3, 3) u := zeros(2*nshifts, 2*nshifts, 2*nshifts) nh := n wh := zeros(2*nshifts, n, n) nv := n wv := zeros(n, 2*nshifts, 2*nshifts) z := eye(n, n) b.Run(name, func(b *testing.B) { for i := 0; i < b.N; i++ { copyGeneral(h, hCopy) impl.Dlaqr5(true, true, 1, n, 0, n-1, nshifts, sr, si, h.Data, h.Stride, 0, n-1, z.Data, z.Stride, v.Data, v.Stride, u.Data, u.Stride, nh, wv.Data, wv.Stride, nv, wh.Data, wh.Stride) } }) } } }