OSDN Git Service

test (#52)
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / blas / testblas / dgemv.go
1 package testblas
2
3 import (
4         "testing"
5
6         "gonum.org/v1/gonum/blas"
7 )
8
9 type DgemvCase struct {
10         Name string
11         m    int
12         n    int
13         A    [][]float64
14         tA   blas.Transpose
15         x    []float64
16         incX int
17         y    []float64
18         incY int
19
20         Subcases []DgemvSubcase
21 }
22
23 type DgemvSubcase struct {
24         mulXNeg1 bool
25         mulYNeg1 bool
26         alpha    float64
27         beta     float64
28         ans      []float64
29 }
30
31 var DgemvCases = []DgemvCase{
32         {
33                 Name: "M_gt_N_Inc1_NoTrans",
34                 tA:   blas.NoTrans,
35                 m:    5,
36                 n:    3,
37                 A: [][]float64{
38                         {4.1, 6.2, 8.1},
39                         {9.6, 3.5, 9.1},
40                         {10, 7, 3},
41                         {1, 1, 2},
42                         {9, 2, 5},
43                 },
44                 incX: 1,
45                 incY: 1,
46                 x:    []float64{1, 2, 3},
47                 y:    []float64{7, 8, 9, 10, 11},
48
49                 Subcases: []DgemvSubcase{
50                         {
51                                 alpha: 0,
52                                 beta:  0,
53                                 ans:   []float64{0, 0, 0, 0, 0},
54                         },
55                         {
56                                 alpha: 0,
57                                 beta:  1,
58                                 ans:   []float64{7, 8, 9, 10, 11},
59                         },
60                         {
61                                 alpha: 1,
62                                 beta:  0,
63                                 ans:   []float64{40.8, 43.9, 33, 9, 28},
64                         },
65                         {
66                                 alpha: 8,
67                                 beta:  -6,
68                                 ans:   []float64{284.4, 303.2, 210, 12, 158},
69                         },
70                 },
71         },
72         {
73                 Name: "M_gt_N_Inc1_Trans",
74                 tA:   blas.Trans,
75                 m:    5,
76                 n:    3,
77                 A: [][]float64{
78                         {4.1, 6.2, 8.1},
79                         {9.6, 3.5, 9.1},
80                         {10, 7, 3},
81                         {1, 1, 2},
82                         {9, 2, 5},
83                 },
84                 incX: 1,
85                 incY: 1,
86                 x:    []float64{1, 2, 3, -4, 5},
87                 y:    []float64{7, 8, 9},
88
89                 Subcases: []DgemvSubcase{
90                         {
91                                 alpha: 0,
92                                 beta:  0,
93                                 ans:   []float64{0, 0, 0},
94                         },
95                         {
96                                 alpha: 0,
97                                 beta:  1,
98                                 ans:   []float64{7, 8, 9},
99                         },
100                         {
101                                 alpha: 1,
102                                 beta:  0,
103                                 ans:   []float64{94.3, 40.2, 52.3},
104                         },
105                         {
106                                 alpha: 8,
107                                 beta:  -6,
108                                 ans:   []float64{712.4, 273.6, 364.4},
109                         },
110                 },
111         },
112         {
113                 Name: "M_eq_N_Inc1_NoTrans",
114                 tA:   blas.NoTrans,
115                 m:    3,
116                 n:    3,
117                 A: [][]float64{
118                         {4.1, 6.2, 8.1},
119                         {9.6, 3.5, 9.1},
120                         {10, 7, 3},
121                 },
122                 incX: 1,
123                 incY: 1,
124                 x:    []float64{1, 2, 3},
125                 y:    []float64{7, 2, 2},
126
127                 Subcases: []DgemvSubcase{
128                         {
129                                 alpha: 0,
130                                 beta:  0,
131                                 ans:   []float64{0, 0, 0},
132                         },
133                         {
134                                 alpha: 0,
135                                 beta:  1,
136                                 ans:   []float64{7, 2, 2},
137                         },
138                         {
139                                 alpha: 1,
140                                 beta:  0,
141                                 ans:   []float64{40.8, 43.9, 33},
142                         },
143                         {
144                                 alpha: 8,
145                                 beta:  -6,
146                                 ans:   []float64{40.8*8 - 6*7, 43.9*8 - 6*2, 33*8 - 6*2},
147                         },
148                 },
149         },
150         {
151                 Name: "M_eq_N_Inc1_Trans",
152                 tA:   blas.Trans,
153                 m:    3,
154                 n:    3,
155                 A: [][]float64{
156                         {4.1, 6.2, 8.1},
157                         {9.6, 3.5, 9.1},
158                         {10, 7, 3},
159                 },
160                 incX: 1,
161                 incY: 1,
162                 x:    []float64{1, 2, 3},
163                 y:    []float64{7, 2, 2},
164
165                 Subcases: []DgemvSubcase{
166                         {
167                                 alpha: 8,
168                                 beta:  -6,
169                                 ans:   []float64{384.4, 261.6, 270.4},
170                         },
171                 },
172         },
173         {
174                 Name: "M_lt_N_Inc1_NoTrans",
175                 tA:   blas.NoTrans,
176                 m:    3,
177                 n:    5,
178                 A: [][]float64{
179                         {4.1, 6.2, 8.1, 10, 7},
180                         {9.6, 3.5, 9.1, -2, 9},
181                         {10, 7, 3, 1, -5},
182                 },
183                 incX: 1,
184                 incY: 1,
185                 x:    []float64{1, 2, 3, -7.6, 8.1},
186                 y:    []float64{7, 2, 2},
187
188                 Subcases: []DgemvSubcase{
189                         {
190                                 alpha: 0,
191                                 beta:  0,
192                                 ans:   []float64{0, 0, 0},
193                         },
194                         {
195                                 alpha: 0,
196                                 beta:  1,
197                                 ans:   []float64{7, 2, 2},
198                         },
199                         {
200                                 alpha: 1,
201                                 beta:  0,
202                                 ans:   []float64{21.5, 132, -15.1},
203                         },
204
205                         {
206                                 alpha: 8,
207                                 beta:  -6,
208                                 ans:   []float64{21.5*8 - 6*7, 132*8 - 6*2, -15.1*8 - 6*2},
209                         },
210                 },
211         },
212         {
213                 Name: "M_lt_N_Inc1_Trans",
214                 tA:   blas.Trans,
215                 m:    3,
216                 n:    5,
217                 A: [][]float64{
218                         {4.1, 6.2, 8.1, 10, 7},
219                         {9.6, 3.5, 9.1, -2, 9},
220                         {10, 7, 3, 1, -5},
221                 },
222                 incX: 1,
223                 incY: 1,
224                 x:    []float64{1, 2, 3},
225                 y:    []float64{7, 2, 2, -3, 5},
226
227                 Subcases: []DgemvSubcase{
228                         {
229                                 alpha: 8,
230                                 beta:  -6,
231                                 ans:   []float64{384.4, 261.6, 270.4, 90, 50},
232                         },
233                 },
234         },
235         {
236                 Name: "M_gt_N_Part1_NoTrans",
237                 tA:   blas.NoTrans,
238                 m:    5,
239                 n:    3,
240                 A: [][]float64{
241                         {4.1, 6.2, 8.1},
242                         {9.6, 3.5, 9.1},
243                         {10, 7, 3},
244                         {1, 1, 2},
245                         {9, 2, 5},
246                 },
247                 incX: 1,
248                 incY: 2,
249                 x:    []float64{1, 2, 3},
250                 y:    []float64{7, 100, 8, 101, 9, 102, 10, 103, 11},
251
252                 Subcases: []DgemvSubcase{
253                         {
254                                 alpha: 0,
255                                 beta:  0,
256                                 ans:   []float64{0, 100, 0, 101, 0, 102, 0, 103, 0},
257                         },
258                         {
259                                 alpha: 0,
260                                 beta:  1,
261                                 ans:   []float64{7, 100, 8, 101, 9, 102, 10, 103, 11},
262                         },
263                         {
264                                 alpha: 1,
265                                 beta:  0,
266                                 ans:   []float64{40.8, 100, 43.9, 101, 33, 102, 9, 103, 28},
267                         },
268                         {
269                                 alpha: 8,
270                                 beta:  -6,
271                                 ans:   []float64{284.4, 100, 303.2, 101, 210, 102, 12, 103, 158},
272                         },
273                 },
274         },
275         {
276                 Name: "M_gt_N_Part1_Trans",
277                 tA:   blas.Trans,
278                 m:    5,
279                 n:    3,
280                 A: [][]float64{
281                         {4.1, 6.2, 8.1},
282                         {9.6, 3.5, 9.1},
283                         {10, 7, 3},
284                         {1, 1, 2},
285                         {9, 2, 5},
286                 },
287                 incX: 1,
288                 incY: 2,
289                 x:    []float64{1, 2, 3, -4, 5},
290                 y:    []float64{7, 100, 8, 101, 9},
291
292                 Subcases: []DgemvSubcase{
293                         {
294                                 alpha: 0,
295                                 beta:  0,
296                                 ans:   []float64{0, 100, 0, 101, 0},
297                         },
298                         {
299                                 alpha: 0,
300                                 beta:  1,
301                                 ans:   []float64{7, 100, 8, 101, 9},
302                         },
303                         {
304                                 alpha: 1,
305                                 beta:  0,
306                                 ans:   []float64{94.3, 100, 40.2, 101, 52.3},
307                         },
308                         {
309                                 alpha: 8,
310                                 beta:  -6,
311                                 ans:   []float64{712.4, 100, 273.6, 101, 364.4},
312                         },
313                 },
314         },
315         {
316                 Name: "M_gt_N_IncNot1_NoTrans",
317                 tA:   blas.NoTrans,
318                 m:    5,
319                 n:    3,
320
321                 A: [][]float64{
322                         {4.1, 6.2, 8.1},
323                         {9.6, 3.5, 9.1},
324                         {10, 7, 3},
325                         {1, 1, 2},
326                         {9, 2, 5},
327                 },
328                 incX: 2,
329                 incY: 3,
330                 x:    []float64{1, 15, 2, 150, 3},
331                 y:    []float64{7, 2, 6, 8, -4, -5, 9, 1, 1, 10, 19, 22, 11},
332                 Subcases: []DgemvSubcase{
333                         {
334                                 alpha: 8,
335                                 beta:  -6,
336                                 ans:   []float64{284.4, 2, 6, 303.2, -4, -5, 210, 1, 1, 12, 19, 22, 158},
337                         },
338                         {
339                                 mulXNeg1: true,
340                                 alpha:    8,
341                                 beta:     -6,
342                                 ans:      []float64{220.4, 2, 6, 311.2, -4, -5, 322, 1, 1, -4, 19, 22, 222},
343                         },
344                         {
345                                 mulYNeg1: true,
346                                 alpha:    8,
347                                 beta:     -6,
348                                 ans:      []float64{182, 2, 6, 24, -4, -5, 210, 1, 1, 291.2, 19, 22, 260.4},
349                         },
350                         {
351                                 mulXNeg1: true,
352                                 mulYNeg1: true,
353                                 alpha:    8,
354                                 beta:     -6,
355                                 ans:      []float64{246, 2, 6, 8, -4, -5, 322, 1, 1, 299.2, 19, 22, 196.4},
356                         },
357                 },
358         },
359         {
360                 Name: "M_gt_N_IncNot1_Trans",
361                 tA:   blas.Trans,
362                 m:    5,
363                 n:    3,
364
365                 A: [][]float64{
366                         {4.1, 6.2, 8.1},
367                         {9.6, 3.5, 9.1},
368                         {10, 7, 3},
369                         {1, 1, 2},
370                         {9, 2, 5},
371                 },
372                 incX: 2,
373                 incY: 3,
374                 x:    []float64{1, 15, 2, 150, 3, 8, -3, 6, 5},
375                 y:    []float64{7, 2, 6, 8, -4, -5, 9},
376                 Subcases: []DgemvSubcase{
377                         {
378                                 alpha: 8,
379                                 beta:  -6,
380                                 ans:   []float64{720.4, 2, 6, 281.6, -4, -5, 380.4},
381                         },
382                         {
383                                 mulXNeg1: true,
384                                 alpha:    8,
385                                 beta:     -6,
386                                 ans:      []float64{219.6, 2, 6, 316, -4, -5, 195.6},
387                         },
388                         {
389                                 mulYNeg1: true,
390                                 alpha:    8,
391                                 beta:     -6,
392                                 ans:      []float64{392.4, 2, 6, 281.6, -4, -5, 708.4},
393                         },
394                         {
395                                 mulXNeg1: true,
396                                 mulYNeg1: true,
397                                 alpha:    8,
398                                 beta:     -6,
399                                 ans:      []float64{207.6, 2, 6, 316, -4, -5, 207.6},
400                         },
401                 },
402         },
403         {
404                 Name: "M_eq_N_IncNot1_NoTrans",
405                 tA:   blas.NoTrans,
406                 m:    3,
407                 n:    3,
408                 A: [][]float64{
409                         {4.1, 6.2, 8.1},
410                         {9.6, 3.5, 9.1},
411                         {10, 7, 3},
412                 },
413                 incX: 2,
414                 incY: 3,
415                 x:    []float64{1, 15, 2, 150, 3},
416                 y:    []float64{7, 2, 6, 8, -4, -5, 9},
417                 Subcases: []DgemvSubcase{
418                         {
419                                 alpha: 8,
420                                 beta:  -6,
421                                 ans:   []float64{284.4, 2, 6, 303.2, -4, -5, 210},
422                         },
423                         {
424                                 mulXNeg1: true,
425                                 alpha:    8,
426                                 beta:     -6,
427                                 ans:      []float64{220.4, 2, 6, 311.2, -4, -5, 322},
428                         },
429                         {
430                                 mulYNeg1: true,
431                                 alpha:    8,
432                                 beta:     -6,
433                                 ans:      []float64{222, 2, 6, 303.2, -4, -5, 272.4},
434                         },
435                         {
436                                 mulXNeg1: true,
437                                 mulYNeg1: true,
438                                 alpha:    8,
439                                 beta:     -6,
440                                 ans:      []float64{334, 2, 6, 311.2, -4, -5, 208.4},
441                         },
442                 },
443         },
444         {
445                 Name: "M_eq_N_IncNot1_Trans",
446                 tA:   blas.Trans,
447                 m:    3,
448                 n:    3,
449                 A: [][]float64{
450                         {4.1, 6.2, 8.1},
451                         {9.6, 3.5, 9.1},
452                         {10, 7, 3},
453                 },
454                 incX: 2,
455                 incY: 3,
456                 x:    []float64{1, 15, 2, 150, 3},
457                 y:    []float64{7, 2, 6, 8, -4, -5, 9},
458
459                 Subcases: []DgemvSubcase{
460                         {
461                                 alpha: 8,
462                                 beta:  -6,
463                                 ans:   []float64{384.4, 2, 6, 225.6, -4, -5, 228.4},
464                         },
465                         {
466                                 mulXNeg1: true,
467                                 alpha:    8,
468                                 beta:     -6,
469                                 ans:      []float64{290, 2, 6, 212.8, -4, -5, 310},
470                         },
471                         {
472                                 mulYNeg1: true,
473                                 alpha:    8,
474                                 beta:     -6,
475                                 ans:      []float64{240.4, 2, 6, 225.6, -4, -5, 372.4},
476                         },
477                         {
478                                 mulXNeg1: true,
479                                 mulYNeg1: true,
480                                 alpha:    8,
481                                 beta:     -6,
482                                 ans:      []float64{322, 2, 6, 212.8, -4, -5, 278},
483                         },
484                 },
485         },
486         {
487                 Name: "M_lt_N_IncNot1_NoTrans",
488                 tA:   blas.NoTrans,
489                 m:    3,
490                 n:    5,
491                 A: [][]float64{
492                         {4.1, 6.2, 8.1, 10, 11},
493                         {9.6, 3.5, 9.1, -3, -2},
494                         {10, 7, 3, -7, -4},
495                 },
496                 incX: 2,
497                 incY: 3,
498                 x:    []float64{1, 15, 2, 150, 3, -2, -4, 8, -9},
499                 y:    []float64{7, 2, 6, 8, -4, -5, 9},
500
501                 Subcases: []DgemvSubcase{
502                         {
503                                 alpha: 8,
504                                 beta:  -6,
505                                 ans:   []float64{-827.6, 2, 6, 543.2, -4, -5, 722},
506                         },
507                         {
508                                 mulXNeg1: true,
509                                 alpha:    8,
510                                 beta:     -6,
511                                 ans:      []float64{-93.2, 2, 6, -696.8, -4, -5, -1070},
512                         },
513                         {
514                                 mulYNeg1: true,
515                                 alpha:    8,
516                                 beta:     -6,
517                                 ans:      []float64{734, 2, 6, 543.2, -4, -5, -839.6},
518                         },
519                         {
520                                 mulXNeg1: true,
521                                 mulYNeg1: true,
522                                 alpha:    8,
523                                 beta:     -6,
524                                 ans:      []float64{-1058, 2, 6, -696.8, -4, -5, -105.2},
525                         },
526                 },
527         },
528         {
529                 Name: "M_lt_N_IncNot1_Trans",
530                 tA:   blas.Trans,
531                 m:    3,
532                 n:    5,
533                 A: [][]float64{
534                         {4.1, 6.2, 8.1, 10, 11},
535                         {9.6, 3.5, 9.1, -3, -2},
536                         {10, 7, 3, -7, -4},
537                 },
538                 incX: 2,
539                 incY: 3,
540                 x:    []float64{1, 15, 2, 150, 3},
541                 y:    []float64{7, 2, 6, 8, -4, -5, 9, -4, -1, -9, 1, 1, 2},
542
543                 Subcases: []DgemvSubcase{
544                         {
545                                 alpha: 8,
546                                 beta:  -6,
547                                 ans:   []float64{384.4, 2, 6, 225.6, -4, -5, 228.4, -4, -1, -82, 1, 1, -52},
548                         },
549                         {
550                                 mulXNeg1: true,
551                                 alpha:    8,
552                                 beta:     -6,
553                                 ans:      []float64{290, 2, 6, 212.8, -4, -5, 310, -4, -1, 190, 1, 1, 188},
554                         },
555                         {
556                                 mulYNeg1: true,
557                                 alpha:    8,
558                                 beta:     -6,
559                                 ans:      []float64{-82, 2, 6, -184, -4, -5, 228.4, -4, -1, 327.6, 1, 1, 414.4},
560                         },
561                         {
562                                 mulXNeg1: true,
563                                 mulYNeg1: true,
564                                 alpha:    8,
565                                 beta:     -6,
566                                 ans:      []float64{158, 2, 6, 88, -4, -5, 310, -4, -1, 314.8, 1, 1, 320},
567                         },
568                 },
569         },
570
571         // TODO: A can be longer than mxn. Add cases where it is longer
572         // TODO: x and y can also be longer. Add tests for these
573         // TODO: Add tests for dimension mismatch
574         // TODO: Add places with a "submatrix view", where lda != m
575 }
576
577 type Dgemver interface {
578         Dgemv(tA blas.Transpose, m, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int)
579 }
580
581 func DgemvTest(t *testing.T, blasser Dgemver) {
582         for _, test := range DgemvCases {
583                 for i, cas := range test.Subcases {
584                         // Test that it passes with row-major
585                         dgemvcomp(t, test, cas, i, blasser)
586
587                         // Test the bad inputs
588                         dgemvbad(t, test, cas, i, blasser)
589                 }
590         }
591 }
592
593 func dgemvcomp(t *testing.T, test DgemvCase, cas DgemvSubcase, i int, blasser Dgemver) {
594         x := sliceCopy(test.x)
595         y := sliceCopy(test.y)
596         a := sliceOfSliceCopy(test.A)
597         aFlat := flatten(a)
598
599         lda := test.n
600
601         incX := test.incX
602         if cas.mulXNeg1 {
603                 incX *= -1
604         }
605         incY := test.incY
606         if cas.mulYNeg1 {
607                 incY *= -1
608         }
609
610         f := func() {
611                 blasser.Dgemv(test.tA, test.m, test.n, cas.alpha, aFlat, lda, x, incX, cas.beta, y, incY)
612         }
613         if panics(f) {
614                 t.Errorf("Test %v case %v: unexpected panic", test.Name, i)
615                 if throwPanic {
616                         blasser.Dgemv(test.tA, test.m, test.n, cas.alpha, aFlat, lda, x, incX, cas.beta, y, incY)
617                 }
618                 return
619         }
620         // Check that x and a are unchanged
621         if !dSliceEqual(x, test.x) {
622                 t.Errorf("Test %v, case %v: x modified during call", test.Name, i)
623         }
624         aFlat2 := flatten(sliceOfSliceCopy(test.A))
625         if !dSliceEqual(aFlat2, aFlat) {
626                 t.Errorf("Test %v, case %v: a modified during call", test.Name, i)
627         }
628
629         // Check that the answer matches
630         if !dSliceTolEqual(cas.ans, y) {
631                 t.Errorf("Test %v, case %v: answer mismatch: Expected %v, Found %v", test.Name, i, cas.ans, y)
632         }
633 }
634
635 func dgemvbad(t *testing.T, test DgemvCase, cas DgemvSubcase, i int, blasser Dgemver) {
636         x := sliceCopy(test.x)
637         y := sliceCopy(test.y)
638         a := sliceOfSliceCopy(test.A)
639         aFlatRow := flatten(a)
640         ldaRow := test.n
641
642         f := func() {
643                 blasser.Dgemv(312, test.m, test.n, cas.alpha, aFlatRow, ldaRow, x, test.incX, cas.beta, y, test.incY)
644         }
645         if !panics(f) {
646                 t.Errorf("Test %v case %v: no panic for bad transpose", test.Name, i)
647         }
648         f = func() {
649                 blasser.Dgemv(test.tA, -2, test.n, cas.alpha, aFlatRow, ldaRow, x, test.incX, cas.beta, y, test.incY)
650         }
651         if !panics(f) {
652                 t.Errorf("Test %v case %v: no panic for m negative", test.Name, i)
653         }
654         f = func() {
655                 blasser.Dgemv(test.tA, test.m, -4, cas.alpha, aFlatRow, ldaRow, x, test.incX, cas.beta, y, test.incY)
656         }
657         if !panics(f) {
658                 t.Errorf("Test %v case %v: no panic for n negative", test.Name, i)
659         }
660         f = func() {
661                 blasser.Dgemv(test.tA, test.m, test.n, cas.alpha, aFlatRow, ldaRow, x, 0, cas.beta, y, test.incY)
662         }
663         if !panics(f) {
664                 t.Errorf("Test %v case %v: no panic for incX zero", test.Name, i)
665         }
666         f = func() {
667                 blasser.Dgemv(test.tA, test.m, test.n, cas.alpha, aFlatRow, ldaRow, x, test.incX, cas.beta, y, 0)
668         }
669         if !panics(f) {
670                 t.Errorf("Test %v case %v: no panic for incY zero", test.Name, i)
671         }
672         f = func() {
673                 blasser.Dgemv(test.tA, test.m, test.n, cas.alpha, aFlatRow, ldaRow-1, x, test.incX, cas.beta, y, test.incY)
674         }
675         if !panics(f) {
676                 t.Errorf("Test %v case %v: no panic for lda too small row major", test.Name, i)
677         }
678 }