gonum.org/v1/gonum@v0.14.0/internal/asm/f64/gemv_test.go (about) 1 // Copyright ©2017 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 f64_test 6 7 import ( 8 "fmt" 9 "testing" 10 11 . "gonum.org/v1/gonum/internal/asm/f64" 12 ) 13 14 type DgemvCase struct { 15 m int 16 n int 17 A []float64 18 x []float64 19 y []float64 20 21 NoTrans []DgemvSubcase 22 Trans []DgemvSubcase 23 } 24 25 type DgemvSubcase struct { 26 alpha float64 27 beta float64 28 want []float64 29 wantRevX []float64 30 wantRevY []float64 31 wantRevXY []float64 32 } 33 34 var DgemvCases = []DgemvCase{ 35 { // 1x1 36 m: 1, 37 n: 1, 38 A: []float64{4.1}, 39 x: []float64{2.2}, 40 y: []float64{6.8}, 41 42 NoTrans: []DgemvSubcase{ // (1x1) 43 {alpha: 0, beta: 0, 44 want: []float64{0}, 45 wantRevX: []float64{0}, 46 wantRevY: []float64{0}, 47 wantRevXY: []float64{0}, 48 }, 49 {alpha: 0, beta: 1, 50 want: []float64{6.8}, 51 wantRevX: []float64{6.8}, 52 wantRevY: []float64{6.8}, 53 wantRevXY: []float64{6.8}, 54 }, 55 {alpha: 1, beta: 0, 56 want: []float64{9.02}, 57 wantRevX: []float64{9.02}, 58 wantRevY: []float64{9.02}, 59 wantRevXY: []float64{9.02}, 60 }, 61 {alpha: 8, beta: -6, 62 want: []float64{31.36}, 63 wantRevX: []float64{31.36}, 64 wantRevY: []float64{31.36}, 65 wantRevXY: []float64{31.36}, 66 }, 67 }, 68 69 Trans: []DgemvSubcase{ // (1x1) 70 {alpha: 0, beta: 0, 71 want: []float64{0}, 72 wantRevX: []float64{0}, 73 wantRevY: []float64{0}, 74 wantRevXY: []float64{0}, 75 }, 76 {alpha: 0, beta: 1, 77 want: []float64{2.2}, 78 wantRevX: []float64{2.2}, 79 wantRevY: []float64{2.2}, 80 wantRevXY: []float64{2.2}, 81 }, 82 {alpha: 1, beta: 0, 83 want: []float64{27.88}, 84 wantRevX: []float64{27.88}, 85 wantRevY: []float64{27.88}, 86 wantRevXY: []float64{27.88}, 87 }, 88 {alpha: 8, beta: -6, 89 want: []float64{209.84}, 90 wantRevX: []float64{209.84}, 91 wantRevY: []float64{209.84}, 92 wantRevXY: []float64{209.84}, 93 }, 94 }, 95 }, 96 97 { // 3x2 98 m: 3, 99 n: 2, 100 A: []float64{ 101 4.67, 2.75, 102 0.48, 1.21, 103 2.28, 2.82, 104 }, 105 x: []float64{3.38, 3}, 106 y: []float64{2.8, 1.71, 2.64}, 107 108 NoTrans: []DgemvSubcase{ // (2x2, 1x2) 109 {alpha: 0, beta: 0, 110 want: []float64{0, 0, 0}, 111 wantRevX: []float64{0, 0, 0}, 112 wantRevY: []float64{0, 0, 0}, 113 wantRevXY: []float64{0, 0, 0}, 114 }, 115 {alpha: 0, beta: 1, 116 want: []float64{2.8, 1.71, 2.64}, 117 wantRevX: []float64{2.8, 1.71, 2.64}, 118 wantRevY: []float64{2.8, 1.71, 2.64}, 119 wantRevXY: []float64{2.8, 1.71, 2.64}, 120 }, 121 {alpha: 1, beta: 0, 122 want: []float64{24.0346, 5.2524, 16.1664}, 123 wantRevX: []float64{23.305, 5.5298, 16.3716}, 124 wantRevY: []float64{16.1664, 5.2524, 24.0346}, 125 wantRevXY: []float64{16.3716, 5.5298, 23.305}, 126 }, 127 {alpha: 8, beta: -6, 128 want: []float64{175.4768, 31.7592, 113.4912}, 129 wantRevX: []float64{169.64, 33.9784, 115.1328}, 130 wantRevY: []float64{112.5312, 31.7592, 176.4368}, 131 wantRevXY: []float64{114.1728, 33.9784, 170.6}, 132 }, 133 }, 134 135 Trans: []DgemvSubcase{ // (2x2) 136 {alpha: 0, beta: 0, 137 want: []float64{0, 0}, 138 wantRevX: []float64{0, 0}, 139 wantRevY: []float64{0, 0}, 140 wantRevXY: []float64{0, 0}, 141 }, 142 {alpha: 0, beta: 1, 143 want: []float64{3.38, 3}, 144 wantRevX: []float64{3.38, 3}, 145 wantRevY: []float64{3.38, 3}, 146 wantRevXY: []float64{3.38, 3}, 147 }, 148 {alpha: 1, beta: 0, 149 want: []float64{19.916, 17.2139}, 150 wantRevX: []float64{19.5336, 17.2251}, 151 wantRevY: []float64{17.2139, 19.916}, 152 wantRevXY: []float64{17.2251, 19.5336}, 153 }, 154 {alpha: 8, beta: -6, 155 want: []float64{139.048, 119.7112}, 156 wantRevX: []float64{135.9888, 119.8008}, 157 wantRevY: []float64{117.4312, 141.328}, 158 wantRevXY: []float64{117.5208, 138.2688}, 159 }, 160 }, 161 }, 162 163 { // 3x3 164 m: 3, 165 n: 3, 166 A: []float64{ 167 4.38, 4.4, 4.26, 168 4.18, 0.56, 2.57, 169 2.59, 2.07, 0.46, 170 }, 171 x: []float64{4.82, 1.82, 1.12}, 172 y: []float64{0.24, 1.41, 3.45}, 173 174 NoTrans: []DgemvSubcase{ // (2x2, 2x1, 1x2, 1x1) 175 {alpha: 0, beta: 0, 176 want: []float64{0, 0, 0}, 177 wantRevX: []float64{0, 0, 0}, 178 wantRevY: []float64{0, 0, 0}, 179 wantRevXY: []float64{0, 0, 0}, 180 }, 181 {alpha: 0, beta: 1, 182 want: []float64{0.24, 1.41, 3.45}, 183 wantRevX: []float64{0.24, 1.41, 3.45}, 184 wantRevY: []float64{0.24, 1.41, 3.45}, 185 wantRevXY: []float64{0.24, 1.41, 3.45}, 186 }, 187 {alpha: 1, beta: 0, 188 want: []float64{33.8908, 24.0452, 16.7664}, 189 wantRevX: []float64{33.4468, 18.0882, 8.8854}, 190 wantRevY: []float64{16.7664, 24.0452, 33.8908}, 191 wantRevXY: []float64{8.8854, 18.0882, 33.4468}, 192 }, 193 {alpha: 8, beta: -6, 194 want: []float64{269.6864, 183.9016, 113.4312}, 195 wantRevX: []float64{266.1344, 136.2456, 50.3832}, 196 wantRevY: []float64{132.6912, 183.9016, 250.4264}, 197 wantRevXY: []float64{69.6432, 136.2456, 246.8744}, 198 }, 199 }, 200 201 Trans: []DgemvSubcase{ // (2x2, 1x2, 2x1, 1x1) 202 {alpha: 0, beta: 0, 203 want: []float64{0, 0, 0}, 204 wantRevX: []float64{0, 0, 0}, 205 wantRevY: []float64{0, 0, 0}, 206 wantRevXY: []float64{0, 0, 0}, 207 }, 208 {alpha: 0, beta: 1, 209 want: []float64{4.82, 1.82, 1.12}, 210 wantRevX: []float64{4.82, 1.82, 1.12}, 211 wantRevY: []float64{4.82, 1.82, 1.12}, 212 wantRevXY: []float64{4.82, 1.82, 1.12}, 213 }, 214 {alpha: 1, beta: 0, 215 want: []float64{15.8805, 8.9871, 6.2331}, 216 wantRevX: []float64{21.6264, 16.4664, 18.4311}, 217 wantRevY: []float64{6.2331, 8.9871, 15.8805}, 218 wantRevXY: []float64{18.4311, 16.4664, 21.6264}, 219 }, 220 {alpha: 8, beta: -6, 221 want: []float64{98.124, 60.9768, 43.1448}, 222 wantRevX: []float64{144.0912, 120.8112, 140.7288}, 223 wantRevY: []float64{20.9448, 60.9768, 120.324}, 224 wantRevXY: []float64{118.5288, 120.8112, 166.2912}, 225 }, 226 }, 227 }, 228 229 { // 5x3 230 m: 5, 231 n: 3, 232 A: []float64{ 233 4.1, 6.2, 8.1, 234 9.6, 3.5, 9.1, 235 10, 7, 3, 236 1, 1, 2, 237 9, 2, 5, 238 }, 239 x: []float64{1, 2, 3}, 240 y: []float64{7, 8, 9, 10, 11}, 241 242 NoTrans: []DgemvSubcase{ //(4x2, 4x1, 1x2, 1x1) 243 {alpha: 0, beta: 0, 244 want: []float64{0, 0, 0, 0, 0}, 245 wantRevX: []float64{0, 0, 0, 0, 0}, 246 wantRevY: []float64{0, 0, 0, 0, 0}, 247 wantRevXY: []float64{0, 0, 0, 0, 0}, 248 }, 249 {alpha: 0, beta: 1, 250 want: []float64{7, 8, 9, 10, 11}, 251 wantRevX: []float64{7, 8, 9, 10, 11}, 252 wantRevY: []float64{7, 8, 9, 10, 11}, 253 wantRevXY: []float64{7, 8, 9, 10, 11}, 254 }, 255 {alpha: 1, beta: 0, 256 want: []float64{40.8, 43.9, 33, 9, 28}, 257 wantRevX: []float64{32.8, 44.9, 47, 7, 36}, 258 wantRevY: []float64{28, 9, 33, 43.9, 40.8}, 259 wantRevXY: []float64{36, 7, 47, 44.9, 32.8}, 260 }, 261 {alpha: 8, beta: -6, 262 want: []float64{284.4, 303.2, 210, 12, 158}, 263 wantRevX: []float64{220.4, 311.2, 322, -4, 222}, 264 wantRevY: []float64{182, 24, 210, 291.2, 260.4}, 265 wantRevXY: []float64{246, 8, 322, 299.2, 196.4}, 266 }, 267 }, 268 269 Trans: []DgemvSubcase{ //( 2x4, 1x4, 2x1, 1x1) 270 {alpha: 0, beta: 0, 271 want: []float64{0, 0, 0}, 272 wantRevX: []float64{0, 0, 0}, 273 wantRevY: []float64{0, 0, 0}, 274 wantRevXY: []float64{0, 0, 0}, 275 }, 276 {alpha: 0, beta: 1, 277 want: []float64{1, 2, 3}, 278 wantRevX: []float64{1, 2, 3}, 279 wantRevY: []float64{1, 2, 3}, 280 wantRevXY: []float64{1, 2, 3}, 281 }, 282 {alpha: 1, beta: 0, 283 want: []float64{304.5, 166.4, 231.5}, 284 wantRevX: []float64{302.1, 188.2, 258.1}, 285 wantRevY: []float64{231.5, 166.4, 304.5}, 286 wantRevXY: []float64{258.1, 188.2, 302.1}, 287 }, 288 {alpha: 8, beta: -6, 289 want: []float64{2430, 1319.2, 1834}, 290 wantRevX: []float64{2410.8, 1493.6, 2046.8}, 291 wantRevY: []float64{1846, 1319.2, 2418}, 292 wantRevXY: []float64{2058.8, 1493.6, 2398.8}, 293 }, 294 }, 295 }, 296 297 { // 3x5 298 m: 3, 299 n: 5, 300 A: []float64{ 301 1.4, 2.34, 3.96, 0.96, 2.3, 302 3.43, 0.62, 1.09, 0.2, 3.56, 303 1.15, 0.58, 3.8, 1.16, 0.01, 304 }, 305 x: []float64{2.34, 2.82, 4.73, 0.22, 3.91}, 306 y: []float64{2.46, 2.22, 4.75}, 307 308 NoTrans: []DgemvSubcase{ // (2x4, 2x1, 1x4, 1x1) 309 {alpha: 0, beta: 0, 310 want: []float64{0, 0, 0}, 311 wantRevX: []float64{0, 0, 0}, 312 wantRevY: []float64{0, 0, 0}, 313 wantRevXY: []float64{0, 0, 0}, 314 }, 315 {alpha: 0, beta: 1, 316 want: []float64{2.46, 2.22, 4.75}, 317 wantRevX: []float64{2.46, 2.22, 4.75}, 318 wantRevY: []float64{2.46, 2.22, 4.75}, 319 wantRevXY: []float64{2.46, 2.22, 4.75}, 320 }, 321 {alpha: 1, beta: 0, 322 want: []float64{37.8098, 28.8939, 22.5949}, 323 wantRevX: []float64{32.8088, 27.5978, 25.8927}, 324 wantRevY: []float64{22.5949, 28.8939, 37.8098}, 325 wantRevXY: []float64{25.8927, 27.5978, 32.8088}, 326 }, 327 {alpha: 8, beta: -6, 328 want: []float64{287.7184, 217.8312, 152.2592}, 329 wantRevX: []float64{247.7104, 207.4624, 178.6416}, 330 wantRevY: []float64{165.9992, 217.8312, 273.9784}, 331 wantRevXY: []float64{192.3816, 207.4624, 233.9704}, 332 }, 333 }, 334 335 Trans: []DgemvSubcase{ // (4x2, 1x2, 4x1, 1x1) 336 {alpha: 0, beta: 0, 337 want: []float64{0, 0, 0, 0, 0}, 338 wantRevX: []float64{0, 0, 0, 0, 0}, 339 wantRevY: []float64{0, 0, 0, 0, 0}, 340 wantRevXY: []float64{0, 0, 0, 0, 0}, 341 }, 342 {alpha: 0, beta: 1, 343 want: []float64{2.34, 2.82, 4.73, 0.22, 3.91}, 344 wantRevX: []float64{2.34, 2.82, 4.73, 0.22, 3.91}, 345 wantRevY: []float64{2.34, 2.82, 4.73, 0.22, 3.91}, 346 wantRevXY: []float64{2.34, 2.82, 4.73, 0.22, 3.91}, 347 }, 348 {alpha: 1, beta: 0, 349 want: []float64{16.5211, 9.8878, 30.2114, 8.3156, 13.6087}, 350 wantRevX: []float64{17.0936, 13.9182, 30.5778, 7.8576, 18.8528}, 351 wantRevY: []float64{13.6087, 8.3156, 30.2114, 9.8878, 16.5211}, 352 wantRevXY: []float64{18.8528, 7.8576, 30.5778, 13.9182, 17.0936}, 353 }, 354 {alpha: 8, beta: -6, 355 want: []float64{118.1288, 62.1824, 213.3112, 65.2048, 85.4096}, 356 wantRevX: []float64{122.7088, 94.4256, 216.2424, 61.5408, 127.3624}, 357 wantRevY: []float64{94.8296, 49.6048, 213.3112, 77.7824, 108.7088}, 358 wantRevXY: []float64{136.7824, 45.9408, 216.2424, 110.0256, 113.2888}, 359 }, 360 }, 361 }, 362 363 { // 7x7 & nan test 364 m: 7, 365 n: 7, 366 A: []float64{ 367 0.9, 2.6, 0.5, 1.8, 2.3, 0.6, 0.2, 368 1.6, 0.6, 1.3, 2.1, 1.4, 0.4, 0.8, 369 2.9, 0.9, 2.3, 2.5, 1.4, 1.8, 1.6, 370 2.6, 2.8, 2.1, 0.3, nan, 2.2, 1.3, 371 0.2, 2.2, 1.8, 1.8, 2.1, 1.3, 1.4, 372 1.7, 1.4, 2.3, 2., 1., 0., 1.4, 373 2.1, 1.9, 0.8, 2.9, 1.3, 0.3, 1.3, 374 }, 375 x: []float64{0.4, 2.8, 3.5, 0.3, 0.6, 2.5, 3.1}, 376 y: []float64{3.2, 4.4, 5., 4.3, 4.1, 1.4, 0.2}, 377 378 NoTrans: []DgemvSubcase{ // (4x4, 4x2, 4x1, 2x4, 2x2, 2x1, 1x4, 1x2, 1x1) 379 {alpha: 0, beta: 0, 380 want: []float64{0, 0, 0, nan, 0, 0, 0}, 381 wantRevX: []float64{0, 0, 0, nan, 0, 0, 0}, 382 wantRevY: []float64{0, 0, 0, nan, 0, 0, 0}, 383 wantRevXY: []float64{0, 0, 0, nan, 0, 0, 0}, 384 }, 385 {alpha: 0, beta: 1, 386 want: []float64{3.2, 4.4, 5., nan, 4.1, 1.4, 0.2}, 387 wantRevX: []float64{3.2, 4.4, 5., nan, 4.1, 1.4, 0.2}, 388 wantRevY: []float64{3.2, 4.4, 5., nan, 4.1, 1.4, 0.2}, 389 wantRevXY: []float64{3.2, 4.4, 5., nan, 4.1, 1.4, 0.2}, 390 }, 391 {alpha: 1, beta: 0, 392 want: []float64{13.43, 11.82, 22.78, nan, 21.93, 18.19, 15.39}, 393 wantRevX: []float64{19.94, 14.21, 23.95, nan, 19.29, 14.81, 18.52}, 394 wantRevY: []float64{15.39, 18.19, 21.93, nan, 22.78, 11.82, 13.43}, 395 wantRevXY: []float64{18.52, 14.81, 19.29, nan, 23.95, 14.21, 19.94}, 396 }, 397 {alpha: 8, beta: -6, 398 want: []float64{88.24, 68.16, 152.24, nan, 150.84, 137.12, 121.92}, 399 wantRevX: []float64{140.32, 87.28, 161.6, nan, 129.72, 110.08, 146.96}, 400 wantRevY: []float64{103.92, 119.12, 145.44, nan, 157.64, 86.16, 106.24}, 401 wantRevXY: []float64{128.96, 92.08, 124.32, nan, 167., 105.28, 158.32}, 402 }, 403 }, 404 405 Trans: []DgemvSubcase{ // (4x4, 2x4, 1x4, 4x2, 2x2, 1x2, 4x1, 2x1, 1x1) 406 {alpha: 0, beta: 0, 407 want: []float64{0, 0, 0, 0, nan, 0, 0}, 408 wantRevX: []float64{0, 0, 0, 0, nan, 0, 0}, 409 wantRevY: []float64{0, 0, nan, 0, 0, 0, 0}, 410 wantRevXY: []float64{0, 0, nan, 0, 0, 0, 0}, 411 }, 412 {alpha: 0, beta: 1, 413 want: []float64{0.4, 2.8, 3.5, 0.3, nan, 2.5, 3.1}, 414 wantRevX: []float64{0.4, 2.8, 3.5, 0.3, nan, 2.5, 3.1}, 415 wantRevY: []float64{0.4, 2.8, nan, 0.3, 0.6, 2.5, 3.1}, 416 wantRevXY: []float64{0.4, 2.8, nan, 0.3, 0.6, 2.5, 3.1}, 417 }, 418 {alpha: 1, beta: 0, 419 want: []float64{39.22, 38.86, 38.61, 39.55, nan, 27.53, 25.71}, 420 wantRevX: []float64{40.69, 40.33, 42.06, 41.92, nan, 24.98, 30.63}, 421 wantRevY: []float64{25.71, 27.53, nan, 39.55, 38.61, 38.86, 39.22}, 422 wantRevXY: []float64{30.63, 24.98, nan, 41.92, 42.06, 40.33, 40.69}, 423 }, 424 {alpha: 8, beta: -6, 425 want: []float64{311.36, 294.08, 287.88, 314.6, nan, 205.24, 187.08}, 426 wantRevX: []float64{323.12, 305.84, 315.48, 333.56, nan, 184.84, 226.44}, 427 wantRevY: []float64{203.28, 203.44, nan, 314.6, 305.28, 295.88, 295.16}, 428 wantRevXY: []float64{242.64, 183.04, nan, 333.56, 332.88, 307.64, 306.92}, 429 }, 430 }, 431 }, 432 { // 11x11 433 m: 11, 434 n: 11, 435 A: []float64{ 436 0.4, 3., 2.5, 2., 0.4, 2., 2., 1., 0.1, 0.3, 2., 437 1.7, 0.7, 2.6, 1.6, 0.5, 2.4, 3., 0.9, 0.1, 2.8, 1.3, 438 1.1, 2.2, 1.5, 0.8, 2.9, 0.4, 0.5, 1.7, 0.8, 2.6, 0.7, 439 2.2, 1.7, 0.8, 2.9, 0.7, 0.7, 1.7, 1.8, 1.9, 2.4, 1.9, 440 0.3, 0.5, 1.6, 1.5, 1.5, 2.4, 1.7, 1.2, 1.9, 2.8, 1.2, 441 1.4, 2.2, 1.7, 1.4, 2.7, 1.4, 0.9, 1.8, 0.5, 1.2, 1.9, 442 0.8, 2.3, 1.7, 1.3, 2., 2.8, 2.6, 0.4, 2.5, 1.3, 0.5, 443 2.4, 2.8, 1.1, 0.2, 0.4, 2.8, 0.5, 0.5, 0., 2.8, 1.9, 444 2.3, 1.8, 2.3, 1.7, 1.1, 0.1, 1.4, 1.2, 1.9, 0.5, 0.6, 445 0.6, 2.4, 1.2, 0.3, 1.4, 1.3, 2.5, 2.6, 0., 1.3, 2.6, 446 0.7, 1.5, 0.2, 1.4, 1.1, 1.8, 0.2, 1., 1., 0.6, 1.2, 447 }, 448 x: []float64{2.5, 1.2, 0.8, 2.9, 3.4, 1.8, 4.6, 3.3, 3.8, 0.9, 1.1}, 449 y: []float64{3.8, 3.4, 1.6, 4.8, 4.3, 0.5, 2., 2.5, 1.5, 2.8, 3.9}, 450 451 NoTrans: []DgemvSubcase{ // (4x4, 4x2, 4x1, 2x4, 2x2, 2x1, 1x4, 1x2, 1x1) 452 {alpha: 0, beta: 0, 453 want: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 454 wantRevX: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 455 wantRevY: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 456 wantRevXY: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 457 }, 458 {alpha: 0, beta: 1, 459 want: []float64{3.8, 3.4, 1.6, 4.8, 4.3, 0.5, 2., 2.5, 1.5, 2.8, 3.9}, 460 wantRevX: []float64{3.8, 3.4, 1.6, 4.8, 4.3, 0.5, 2., 2.5, 1.5, 2.8, 3.9}, 461 wantRevY: []float64{3.8, 3.4, 1.6, 4.8, 4.3, 0.5, 2., 2.5, 1.5, 2.8, 3.9}, 462 wantRevXY: []float64{3.8, 3.4, 1.6, 4.8, 4.3, 0.5, 2., 2.5, 1.5, 2.8, 3.9}, 463 }, 464 {alpha: 1, beta: 0, 465 want: []float64{32.71, 38.93, 33.55, 45.46, 39.24, 38.41, 46.23, 25.78, 37.33, 37.42, 24.63}, 466 wantRevX: []float64{39.82, 43.78, 37.73, 41.19, 40.17, 44.41, 42.75, 28.14, 35.6, 41.25, 23.9}, 467 wantRevY: []float64{24.63, 37.42, 37.33, 25.78, 46.23, 38.41, 39.24, 45.46, 33.55, 38.93, 32.71}, 468 wantRevXY: []float64{23.9, 41.25, 35.6, 28.14, 42.75, 44.41, 40.17, 41.19, 37.73, 43.78, 39.82}, 469 }, 470 {alpha: 8, beta: -6, 471 want: []float64{238.88, 291.04, 258.8, 334.88, 288.12, 304.28, 357.84, 191.24, 289.64, 282.56, 173.64}, 472 wantRevX: []float64{295.76, 329.84, 292.24, 300.72, 295.56, 352.28, 330., 210.12, 275.8, 313.2, 167.8}, 473 wantRevY: []float64{174.24, 278.96, 289.04, 177.44, 344.04, 304.28, 301.92, 348.68, 259.4, 294.64, 238.28}, 474 wantRevXY: []float64{168.4, 309.6, 275.2, 196.32, 316.2, 352.28, 309.36, 314.52, 292.84, 333.44, 295.16}, 475 }, 476 }, 477 478 Trans: []DgemvSubcase{ // (4x4, 2x4, 1x4, 4x2, 2x2, 1x2, 4x1, 2x1, 1x1) 479 {alpha: 0, beta: 0, 480 want: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 481 wantRevX: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 482 wantRevY: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 483 wantRevXY: []float64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 484 }, 485 {alpha: 0, beta: 1, 486 want: []float64{2.5, 1.2, 0.8, 2.9, 3.4, 1.8, 4.6, 3.3, 3.8, 0.9, 1.1}, 487 wantRevX: []float64{2.5, 1.2, 0.8, 2.9, 3.4, 1.8, 4.6, 3.3, 3.8, 0.9, 1.1}, 488 wantRevY: []float64{2.5, 1.2, 0.8, 2.9, 3.4, 1.8, 4.6, 3.3, 3.8, 0.9, 1.1}, 489 wantRevXY: []float64{2.5, 1.2, 0.8, 2.9, 3.4, 1.8, 4.6, 3.3, 3.8, 0.9, 1.1}, 490 }, 491 {alpha: 1, beta: 0, 492 want: []float64{37.07, 55.58, 46.05, 47.34, 33.88, 54.19, 50.85, 39.31, 31.29, 55.31, 46.98}, 493 wantRevX: []float64{38.11, 63.38, 46.44, 40.04, 34.63, 59.27, 50.13, 35.45, 28.26, 51.64, 46.22}, 494 wantRevY: []float64{46.98, 55.31, 31.29, 39.31, 50.85, 54.19, 33.88, 47.34, 46.05, 55.58, 37.07}, 495 wantRevXY: []float64{46.22, 51.64, 28.26, 35.45, 50.13, 59.27, 34.63, 40.04, 46.44, 63.38, 38.11}, 496 }, 497 {alpha: 8, beta: -6, 498 want: []float64{281.56, 437.44, 363.6, 361.32, 250.64, 422.72, 379.2, 294.68, 227.52, 437.08, 369.24}, 499 wantRevX: []float64{289.88, 499.84, 366.72, 302.92, 256.64, 463.36, 373.44, 263.8, 203.28, 407.72, 363.16}, 500 wantRevY: []float64{360.84, 435.28, 245.52, 297.08, 386.4, 422.72, 243.44, 358.92, 345.6, 439.24, 289.96}, 501 wantRevXY: []float64{354.76, 405.92, 221.28, 266.2, 380.64, 463.36, 249.44, 300.52, 348.72, 501.64, 298.28}, 502 }, 503 }, 504 }, 505 } 506 507 func TestGemv(t *testing.T) { 508 for _, test := range DgemvCases { 509 t.Run(fmt.Sprintf("(%vx%v)", test.m, test.n), func(tt *testing.T) { 510 for i, cas := range test.NoTrans { 511 tt.Run(fmt.Sprintf("NoTrans case %v", i), func(st *testing.T) { 512 dgemvcomp(st, test, false, cas, i) 513 }) 514 } 515 for i, cas := range test.Trans { 516 tt.Run(fmt.Sprintf("Trans case %v", i), func(st *testing.T) { 517 dgemvcomp(st, test, true, cas, i) 518 }) 519 } 520 }) 521 } 522 } 523 524 func dgemvcomp(t *testing.T, test DgemvCase, trans bool, cas DgemvSubcase, i int) { 525 const ( 526 tol = 1e-15 527 528 xGdVal, yGdVal, aGdVal = 0.5, 1.5, 10 529 gdLn = 4 530 ) 531 if trans { 532 test.x, test.y = test.y, test.x 533 } 534 prefix := fmt.Sprintf("Test (%vx%v) t:%v (a:%v,b:%v)", test.m, test.n, trans, cas.alpha, cas.beta) 535 xg, yg := guardVector(test.x, xGdVal, gdLn), guardVector(test.y, yGdVal, gdLn) 536 x, y := xg[gdLn:len(xg)-gdLn], yg[gdLn:len(yg)-gdLn] 537 ag := guardVector(test.A, aGdVal, gdLn) 538 a := ag[gdLn : len(ag)-gdLn] 539 540 lda := uintptr(test.n) 541 if trans { 542 GemvT(uintptr(test.m), uintptr(test.n), cas.alpha, a, lda, x, 1, cas.beta, y, 1) 543 } else { 544 GemvN(uintptr(test.m), uintptr(test.n), cas.alpha, a, lda, x, 1, cas.beta, y, 1) 545 } 546 for i := range cas.want { 547 if !sameApprox(y[i], cas.want[i], tol) { 548 t.Errorf(msgVal, prefix, i, y[i], cas.want[i]) 549 } 550 } 551 552 if !isValidGuard(xg, xGdVal, gdLn) { 553 t.Errorf(msgGuard, prefix, "x", xg[:gdLn], xg[len(xg)-gdLn:]) 554 } 555 if !isValidGuard(yg, yGdVal, gdLn) { 556 t.Errorf(msgGuard, prefix, "y", yg[:gdLn], yg[len(yg)-gdLn:]) 557 } 558 if !isValidGuard(ag, aGdVal, gdLn) { 559 t.Errorf(msgGuard, prefix, "a", ag[:gdLn], ag[len(ag)-gdLn:]) 560 } 561 if !equalStrided(test.x, x, 1) { 562 t.Errorf(msgReadOnly, prefix, "x") 563 } 564 if !equalStrided(test.A, a, 1) { 565 t.Errorf(msgReadOnly, prefix, "a") 566 } 567 568 for _, inc := range newIncSet(-1, 1, 2, 3, 90) { 569 incPrefix := fmt.Sprintf("%s inc(x:%v, y:%v)", prefix, inc.x, inc.y) 570 want, incY := cas.want, inc.y 571 switch { 572 case inc.x < 0 && inc.y < 0: 573 want = cas.wantRevXY 574 incY = -inc.y 575 case inc.x < 0: 576 want = cas.wantRevX 577 case inc.y < 0: 578 want = cas.wantRevY 579 incY = -inc.y 580 } 581 xg, yg := guardIncVector(test.x, xGdVal, inc.x, gdLn), guardIncVector(test.y, yGdVal, inc.y, gdLn) 582 x, y := xg[gdLn:len(xg)-gdLn], yg[gdLn:len(yg)-gdLn] 583 ag := guardVector(test.A, aGdVal, gdLn) 584 a := ag[gdLn : len(ag)-gdLn] 585 586 if trans { 587 GemvT(uintptr(test.m), uintptr(test.n), cas.alpha, 588 a, lda, x, uintptr(inc.x), 589 cas.beta, y, uintptr(inc.y)) 590 } else { 591 GemvN(uintptr(test.m), uintptr(test.n), cas.alpha, 592 a, lda, x, uintptr(inc.x), 593 cas.beta, y, uintptr(inc.y)) 594 } 595 for i := range want { 596 if !sameApprox(y[i*incY], want[i], tol) { 597 t.Errorf(msgVal, incPrefix, i, y[i*incY], want[i]) 598 t.Error(y[i*incY] - want[i]) 599 } 600 } 601 602 checkValidIncGuard(t, xg, xGdVal, inc.x, gdLn) 603 checkValidIncGuard(t, yg, yGdVal, inc.y, gdLn) 604 if !isValidGuard(ag, aGdVal, gdLn) { 605 t.Errorf(msgGuard, incPrefix, "a", ag[:gdLn], ag[len(ag)-gdLn:]) 606 } 607 if !equalStrided(test.x, x, inc.x) { 608 t.Errorf(msgReadOnly, incPrefix, "x") 609 } 610 if !equalStrided(test.A, a, 1) { 611 t.Errorf(msgReadOnly, incPrefix, "a") 612 } 613 } 614 }