// 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. package gonum import "math" // Iparmq returns problem and machine dependent parameters useful for Dhseqr and // related subroutines for eigenvalue problems. // // ispec specifies the parameter to return: // 12: Crossover point between Dlahqr and Dlaqr0. Will be at least 11. // 13: Deflation window size. // 14: Nibble crossover point. Determines when to skip a multi-shift QR sweep. // 15: Number of simultaneous shifts in a multishift QR iteration. // 16: Select structured matrix multiply. // For other values of ispec Iparmq will panic. // // name is the name of the calling function. name must be in uppercase but this // is not checked. // // opts is not used and exists for future use. // // n is the order of the Hessenberg matrix H. // // ilo and ihi specify the block [ilo:ihi+1,ilo:ihi+1] that is being processed. // // lwork is the amount of workspace available. // // Except for ispec input parameters are not checked. // // Iparmq is an internal routine. It is exported for testing purposes. func (Implementation) Iparmq(ispec int, name, opts string, n, ilo, ihi, lwork int) int { nh := ihi - ilo + 1 ns := 2 switch { case nh >= 30: ns = 4 case nh >= 60: ns = 10 case nh >= 150: ns = max(10, nh/int(math.Log(float64(nh))/math.Ln2)) case nh >= 590: ns = 64 case nh >= 3000: ns = 128 case nh >= 6000: ns = 256 } ns = max(2, ns-(ns%2)) switch ispec { default: panic("lapack: bad ispec") case 12: // Matrices of order smaller than nmin get sent to Dlahqr, the // classic double shift algorithm. This must be at least 11. const nmin = 75 return nmin case 13: const knwswp = 500 if nh <= knwswp { return ns } return 3 * ns / 2 case 14: // Skip a computationally expensive multi-shift QR sweep with // Dlaqr5 whenever aggressive early deflation finds at least // nibble*(window size)/100 deflations. The default, small, // value reflects the expectation that the cost of looking // through the deflation window with Dlaqr3 will be // substantially smaller. const nibble = 14 return nibble case 15: return ns case 16: if len(name) != 6 { panic("lapack: bad name") } const ( k22min = 14 kacmin = 14 ) var acc22 int switch { case name[1:] == "GGHRD" || name[1:] == "GGHD3": acc22 = 1 if nh >= k22min { acc22 = 2 } case name[3:] == "EXC": if nh >= kacmin { acc22 = 1 } if nh >= k22min { acc22 = 2 } case name[1:] == "HSEQR" || name[1:5] == "LAQR": if ns >= kacmin { acc22 = 1 } if ns >= k22min { acc22 = 2 } } return acc22 } }