github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/native/ilaenv.go (about) 1 // Copyright ©2015 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. 4 5 package native 6 7 // Ilaenv returns algorithm tuning parameters for the algorithm given by the 8 // input string. ispec specifies the parameter to return: 9 // 1: The optimal block size for a blocked algorithm. 10 // 2: The minimum block size for a blocked algorithm. 11 // 3: The block size of unprocessed data at which a blocked algorithm should 12 // crossover to an unblocked version. 13 // 4: The number of shifts. 14 // 5: The minimum column dimension for blocking to be used. 15 // 6: The crossover point for SVD (to use QR factorization or not). 16 // 7: The number of processors. 17 // 8: The crossover point for multi-shift in QR and QZ methods for non-symmetric eigenvalue problems. 18 // 9: Maximum size of the subproblems in divide-and-conquer algorithms. 19 // 10: ieee NaN arithmetic can be trusted not to trap. 20 // 11: infinity arithmetic can be trusted not to trap. 21 // 12...16: parameters for Dhseqr and related functions. See Iparmq for more 22 // information. 23 // 24 // Ilaenv is an internal routine. It is exported for testing purposes. 25 func (impl Implementation) Ilaenv(ispec int, s string, opts string, n1, n2, n3, n4 int) int { 26 // TODO(btracey): Replace this with a constant lookup? A list of constants? 27 sname := s[0] == 'S' || s[0] == 'D' 28 cname := s[0] == 'C' || s[0] == 'Z' 29 if !sname && !cname { 30 panic("lapack: bad name") 31 } 32 c2 := s[1:3] 33 c3 := s[3:6] 34 c4 := c3[1:3] 35 36 switch ispec { 37 default: 38 panic("lapack: bad ispec") 39 case 1: 40 switch c2 { 41 default: 42 panic("lapack: bad function name") 43 case "GE": 44 switch c3 { 45 default: 46 panic("lapack: bad function name") 47 case "TRF": 48 if sname { 49 return 64 50 } 51 return 64 52 case "QRF", "RQF", "LQF", "QLF": 53 if sname { 54 return 32 55 } 56 return 32 57 case "HRD": 58 if sname { 59 return 32 60 } 61 return 32 62 case "BRD": 63 if sname { 64 return 32 65 } 66 return 32 67 case "TRI": 68 if sname { 69 return 64 70 } 71 return 64 72 } 73 case "PO": 74 switch c3 { 75 default: 76 panic("lapack: bad function name") 77 case "TRF": 78 if sname { 79 return 64 80 } 81 return 64 82 } 83 case "SY": 84 switch c3 { 85 default: 86 panic("lapack: bad function name") 87 case "TRF": 88 if sname { 89 return 64 90 } 91 return 64 92 case "TRD": 93 return 32 94 case "GST": 95 return 64 96 } 97 case "HE": 98 switch c3 { 99 default: 100 panic("lapack: bad function name") 101 case "TRF": 102 return 64 103 case "TRD": 104 return 32 105 case "GST": 106 return 64 107 } 108 case "OR": 109 switch c3[0] { 110 default: 111 panic("lapack: bad function name") 112 case 'G': 113 switch c3[1:] { 114 default: 115 panic("lapack: bad function name") 116 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 117 return 32 118 } 119 case 'M': 120 switch c3[1:] { 121 default: 122 panic("lapack: bad function name") 123 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 124 return 32 125 } 126 } 127 case "UN": 128 switch c3[0] { 129 default: 130 panic("lapack: bad function name") 131 case 'G': 132 switch c3[1:] { 133 default: 134 panic("lapack: bad function name") 135 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 136 return 32 137 } 138 case 'M': 139 switch c3[1:] { 140 default: 141 panic("lapack: bad function name") 142 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 143 return 32 144 } 145 } 146 case "GB": 147 switch c3 { 148 default: 149 panic("lapack: bad function name") 150 case "TRF": 151 if sname { 152 if n4 <= 64 { 153 return 1 154 } 155 return 32 156 } 157 if n4 <= 64 { 158 return 1 159 } 160 return 32 161 } 162 case "PB": 163 switch c3 { 164 default: 165 panic("lapack: bad function name") 166 case "TRF": 167 if sname { 168 if n4 <= 64 { 169 return 1 170 } 171 return 32 172 } 173 if n4 <= 64 { 174 return 1 175 } 176 return 32 177 } 178 case "TR": 179 switch c3 { 180 default: 181 panic("lapack: bad function name") 182 case "TRI": 183 if sname { 184 return 64 185 } 186 return 64 187 case "EVC": 188 if sname { 189 return 64 190 } 191 return 64 192 } 193 case "LA": 194 switch c3 { 195 default: 196 panic("lapack: bad function name") 197 case "UUM": 198 if sname { 199 return 64 200 } 201 return 64 202 } 203 case "ST": 204 if sname && c3 == "EBZ" { 205 return 1 206 } 207 panic("lapack: bad function name") 208 } 209 case 2: 210 switch c2 { 211 default: 212 panic("lapack: bad function name") 213 case "GE": 214 switch c3 { 215 default: 216 panic("lapack: bad function name") 217 case "QRF", "RQF", "LQF", "QLF": 218 if sname { 219 return 2 220 } 221 return 2 222 case "HRD": 223 if sname { 224 return 2 225 } 226 return 2 227 case "BRD": 228 if sname { 229 return 2 230 } 231 return 2 232 case "TRI": 233 if sname { 234 return 2 235 } 236 return 2 237 } 238 case "SY": 239 switch c3 { 240 default: 241 panic("lapack: bad function name") 242 case "TRF": 243 if sname { 244 return 8 245 } 246 return 8 247 case "TRD": 248 if sname { 249 return 2 250 } 251 panic("lapack: bad function name") 252 } 253 case "HE": 254 if c3 == "TRD" { 255 return 2 256 } 257 panic("lapack: bad function name") 258 case "OR": 259 if !sname { 260 panic("lapack: bad function name") 261 } 262 switch c3[0] { 263 default: 264 panic("lapack: bad function name") 265 case 'G': 266 switch c4 { 267 default: 268 panic("lapack: bad function name") 269 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 270 return 2 271 } 272 case 'M': 273 switch c4 { 274 default: 275 panic("lapack: bad function name") 276 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 277 return 2 278 } 279 } 280 case "UN": 281 switch c3[0] { 282 default: 283 panic("lapack: bad function name") 284 case 'G': 285 switch c4 { 286 default: 287 panic("lapack: bad function name") 288 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 289 return 2 290 } 291 case 'M': 292 switch c4 { 293 default: 294 panic("lapack: bad function name") 295 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 296 return 2 297 } 298 } 299 } 300 case 3: 301 switch c2 { 302 default: 303 panic("lapack: bad function name") 304 case "GE": 305 switch c3 { 306 default: 307 panic("lapack: bad function name") 308 case "QRF", "RQF", "LQF", "QLF": 309 if sname { 310 return 128 311 } 312 return 128 313 case "HRD": 314 if sname { 315 return 128 316 } 317 return 128 318 case "BRD": 319 if sname { 320 return 128 321 } 322 return 128 323 } 324 case "SY": 325 if sname && c3 == "TRD" { 326 return 32 327 } 328 panic("lapack: bad function name") 329 case "HE": 330 if c3 == "TRD" { 331 return 32 332 } 333 panic("lapack: bad function name") 334 case "OR": 335 switch c3[0] { 336 default: 337 panic("lapack: bad function name") 338 case 'G': 339 switch c4 { 340 default: 341 panic("lapack: bad function name") 342 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 343 return 128 344 } 345 } 346 case "UN": 347 switch c3[0] { 348 default: 349 panic("lapack: bad function name") 350 case 'G': 351 switch c4 { 352 default: 353 panic("lapack: bad function name") 354 case "QR", "RQ", "LQ", "QL", "HR", "TR", "BR": 355 return 128 356 } 357 } 358 } 359 case 4: 360 // Used by xHSEQR 361 return 6 362 case 5: 363 // Not used 364 return 2 365 case 6: 366 // Used by xGELSS and xGESVD 367 return int(float64(min(n1, n2)) * 1.6) 368 case 7: 369 // Not used 370 return 1 371 case 8: 372 // Used by xHSEQR 373 return 50 374 case 9: 375 // used by xGELSD and xGESDD 376 return 25 377 case 10: 378 // Go guarantees ieee 379 return 1 380 case 11: 381 // Go guarantees ieee 382 return 1 383 case 12, 13, 14, 15, 16: 384 // Dhseqr and related functions for eigenvalue problems. 385 return impl.Iparmq(ispec, s, opts, n1, n2, n3, n4) 386 } 387 }