OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / blas / testblas / dtrsm.go
1 package testblas
2
3 import (
4         "testing"
5
6         "gonum.org/v1/gonum/blas"
7         "gonum.org/v1/gonum/floats"
8 )
9
10 type Dtrsmer interface {
11         Dtrsm(s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int,
12                 alpha float64, a []float64, lda int, b []float64, ldb int)
13 }
14
15 func DtrsmTest(t *testing.T, blasser Dtrsmer) {
16         for i, test := range []struct {
17                 s     blas.Side
18                 ul    blas.Uplo
19                 tA    blas.Transpose
20                 d     blas.Diag
21                 m     int
22                 n     int
23                 alpha float64
24                 a     [][]float64
25                 b     [][]float64
26                 ans   [][]float64
27         }{
28                 {
29                         s:     blas.Left,
30                         ul:    blas.Upper,
31                         tA:    blas.NoTrans,
32                         d:     blas.NonUnit,
33                         m:     3,
34                         n:     2,
35                         alpha: 2,
36                         a: [][]float64{
37                                 {1, 2, 3},
38                                 {0, 4, 5},
39                                 {0, 0, 5},
40                         },
41                         b: [][]float64{
42                                 {3, 6},
43                                 {4, 7},
44                                 {5, 8},
45                         },
46                         ans: [][]float64{
47                                 {1, 3.4},
48                                 {-0.5, -0.5},
49                                 {2, 3.2},
50                         },
51                 },
52                 {
53                         s:     blas.Left,
54                         ul:    blas.Upper,
55                         tA:    blas.NoTrans,
56                         d:     blas.Unit,
57                         m:     3,
58                         n:     2,
59                         alpha: 2,
60                         a: [][]float64{
61                                 {1, 2, 3},
62                                 {0, 4, 5},
63                                 {0, 0, 5},
64                         },
65                         b: [][]float64{
66                                 {3, 6},
67                                 {4, 7},
68                                 {5, 8},
69                         },
70                         ans: [][]float64{
71                                 {60, 96},
72                                 {-42, -66},
73                                 {10, 16},
74                         },
75                 },
76                 {
77                         s:     blas.Left,
78                         ul:    blas.Upper,
79                         tA:    blas.NoTrans,
80                         d:     blas.NonUnit,
81                         m:     3,
82                         n:     4,
83                         alpha: 2,
84                         a: [][]float64{
85                                 {1, 2, 3},
86                                 {0, 4, 5},
87                                 {0, 0, 5},
88                         },
89                         b: [][]float64{
90                                 {3, 6, 2, 9},
91                                 {4, 7, 1, 3},
92                                 {5, 8, 9, 10},
93                         },
94                         ans: [][]float64{
95                                 {1, 3.4, 1.2, 13},
96                                 {-0.5, -0.5, -4, -3.5},
97                                 {2, 3.2, 3.6, 4},
98                         },
99                 },
100                 {
101                         s:     blas.Left,
102                         ul:    blas.Upper,
103                         tA:    blas.NoTrans,
104                         d:     blas.Unit,
105                         m:     3,
106                         n:     4,
107                         alpha: 2,
108                         a: [][]float64{
109                                 {1, 2, 3},
110                                 {0, 4, 5},
111                                 {0, 0, 5},
112                         },
113                         b: [][]float64{
114                                 {3, 6, 2, 9},
115                                 {4, 7, 1, 3},
116                                 {5, 8, 9, 10},
117                         },
118                         ans: [][]float64{
119                                 {60, 96, 126, 146},
120                                 {-42, -66, -88, -94},
121                                 {10, 16, 18, 20},
122                         },
123                 },
124                 {
125                         s:     blas.Left,
126                         ul:    blas.Lower,
127                         tA:    blas.NoTrans,
128                         d:     blas.NonUnit,
129                         m:     3,
130                         n:     2,
131                         alpha: 3,
132                         a: [][]float64{
133                                 {2, 0, 0},
134                                 {3, 4, 0},
135                                 {5, 6, 7},
136                         },
137                         b: [][]float64{
138                                 {3, 6},
139                                 {4, 7},
140                                 {5, 8},
141                         },
142                         ans: [][]float64{
143                                 {4.5, 9},
144                                 {-0.375, -1.5},
145                                 {-0.75, -12.0 / 7},
146                         },
147                 },
148                 {
149                         s:     blas.Left,
150                         ul:    blas.Lower,
151                         tA:    blas.NoTrans,
152                         d:     blas.Unit,
153                         m:     3,
154                         n:     2,
155                         alpha: 3,
156                         a: [][]float64{
157                                 {2, 0, 0},
158                                 {3, 4, 0},
159                                 {5, 6, 7},
160                         },
161                         b: [][]float64{
162                                 {3, 6},
163                                 {4, 7},
164                                 {5, 8},
165                         },
166                         ans: [][]float64{
167                                 {9, 18},
168                                 {-15, -33},
169                                 {60, 132},
170                         },
171                 },
172                 {
173                         s:     blas.Left,
174                         ul:    blas.Lower,
175                         tA:    blas.NoTrans,
176                         d:     blas.NonUnit,
177                         m:     3,
178                         n:     4,
179                         alpha: 3,
180                         a: [][]float64{
181                                 {2, 0, 0},
182                                 {3, 4, 0},
183                                 {5, 6, 7},
184                         },
185                         b: [][]float64{
186                                 {3, 6, 2, 9},
187                                 {4, 7, 1, 3},
188                                 {5, 8, 9, 10},
189                         },
190                         ans: [][]float64{
191                                 {4.5, 9, 3, 13.5},
192                                 {-0.375, -1.5, -1.5, -63.0 / 8},
193                                 {-0.75, -12.0 / 7, 3, 39.0 / 28},
194                         },
195                 },
196                 {
197                         s:     blas.Left,
198                         ul:    blas.Lower,
199                         tA:    blas.NoTrans,
200                         d:     blas.Unit,
201                         m:     3,
202                         n:     4,
203                         alpha: 3,
204                         a: [][]float64{
205                                 {2, 0, 0},
206                                 {3, 4, 0},
207                                 {5, 6, 7},
208                         },
209                         b: [][]float64{
210                                 {3, 6, 2, 9},
211                                 {4, 7, 1, 3},
212                                 {5, 8, 9, 10},
213                         },
214                         ans: [][]float64{
215                                 {9, 18, 6, 27},
216                                 {-15, -33, -15, -72},
217                                 {60, 132, 87, 327},
218                         },
219                 },
220                 {
221                         s:     blas.Left,
222                         ul:    blas.Upper,
223                         tA:    blas.Trans,
224                         d:     blas.NonUnit,
225                         m:     3,
226                         n:     2,
227                         alpha: 3,
228                         a: [][]float64{
229                                 {2, 3, 4},
230                                 {0, 5, 6},
231                                 {0, 0, 7},
232                         },
233                         b: [][]float64{
234                                 {3, 6},
235                                 {4, 7},
236                                 {5, 8},
237                         },
238                         ans: [][]float64{
239                                 {4.5, 9},
240                                 {-0.30, -1.2},
241                                 {-6.0 / 35, -24.0 / 35},
242                         },
243                 },
244                 {
245                         s:     blas.Left,
246                         ul:    blas.Upper,
247                         tA:    blas.Trans,
248                         d:     blas.Unit,
249                         m:     3,
250                         n:     2,
251                         alpha: 3,
252                         a: [][]float64{
253                                 {2, 3, 4},
254                                 {0, 5, 6},
255                                 {0, 0, 7},
256                         },
257                         b: [][]float64{
258                                 {3, 6},
259                                 {4, 7},
260                                 {5, 8},
261                         },
262                         ans: [][]float64{
263                                 {9, 18},
264                                 {-15, -33},
265                                 {69, 150},
266                         },
267                 },
268                 {
269                         s:     blas.Left,
270                         ul:    blas.Upper,
271                         tA:    blas.Trans,
272                         d:     blas.NonUnit,
273                         m:     3,
274                         n:     4,
275                         alpha: 3,
276                         a: [][]float64{
277                                 {2, 3, 4},
278                                 {0, 5, 6},
279                                 {0, 0, 7},
280                         },
281                         b: [][]float64{
282                                 {3, 6, 6, 7},
283                                 {4, 7, 8, 9},
284                                 {5, 8, 10, 11},
285                         },
286                         ans: [][]float64{
287                                 {4.5, 9, 9, 10.5},
288                                 {-0.3, -1.2, -0.6, -0.9},
289                                 {-6.0 / 35, -24.0 / 35, -12.0 / 35, -18.0 / 35},
290                         },
291                 },
292                 {
293                         s:     blas.Left,
294                         ul:    blas.Upper,
295                         tA:    blas.Trans,
296                         d:     blas.Unit,
297                         m:     3,
298                         n:     4,
299                         alpha: 3,
300                         a: [][]float64{
301                                 {2, 3, 4},
302                                 {0, 5, 6},
303                                 {0, 0, 7},
304                         },
305                         b: [][]float64{
306                                 {3, 6, 6, 7},
307                                 {4, 7, 8, 9},
308                                 {5, 8, 10, 11},
309                         },
310                         ans: [][]float64{
311                                 {9, 18, 18, 21},
312                                 {-15, -33, -30, -36},
313                                 {69, 150, 138, 165},
314                         },
315                 },
316                 {
317                         s:     blas.Left,
318                         ul:    blas.Lower,
319                         tA:    blas.Trans,
320                         d:     blas.NonUnit,
321                         m:     3,
322                         n:     2,
323                         alpha: 3,
324                         a: [][]float64{
325                                 {2, 0, 0},
326                                 {3, 4, 0},
327                                 {5, 6, 8},
328                         },
329                         b: [][]float64{
330                                 {3, 6},
331                                 {4, 7},
332                                 {5, 8},
333                         },
334                         ans: [][]float64{
335                                 {-0.46875, 0.375},
336                                 {0.1875, 0.75},
337                                 {1.875, 3},
338                         },
339                 },
340                 {
341                         s:     blas.Left,
342                         ul:    blas.Lower,
343                         tA:    blas.Trans,
344                         d:     blas.Unit,
345                         m:     3,
346                         n:     2,
347                         alpha: 3,
348                         a: [][]float64{
349                                 {2, 0, 0},
350                                 {3, 4, 0},
351                                 {5, 6, 8},
352                         },
353                         b: [][]float64{
354                                 {3, 6},
355                                 {4, 7},
356                                 {5, 8},
357                         },
358                         ans: [][]float64{
359                                 {168, 267},
360                                 {-78, -123},
361                                 {15, 24},
362                         },
363                 },
364                 {
365                         s:     blas.Left,
366                         ul:    blas.Lower,
367                         tA:    blas.Trans,
368                         d:     blas.NonUnit,
369                         m:     3,
370                         n:     4,
371                         alpha: 3,
372                         a: [][]float64{
373                                 {2, 0, 0},
374                                 {3, 4, 0},
375                                 {5, 6, 8},
376                         },
377                         b: [][]float64{
378                                 {3, 6, 2, 3},
379                                 {4, 7, 4, 5},
380                                 {5, 8, 6, 7},
381                         },
382                         ans: [][]float64{
383                                 {-0.46875, 0.375, -2.0625, -1.78125},
384                                 {0.1875, 0.75, -0.375, -0.1875},
385                                 {1.875, 3, 2.25, 2.625},
386                         },
387                 },
388                 {
389                         s:     blas.Left,
390                         ul:    blas.Lower,
391                         tA:    blas.Trans,
392                         d:     blas.Unit,
393                         m:     3,
394                         n:     4,
395                         alpha: 3,
396                         a: [][]float64{
397                                 {2, 0, 0},
398                                 {3, 4, 0},
399                                 {5, 6, 8},
400                         },
401                         b: [][]float64{
402                                 {3, 6, 2, 3},
403                                 {4, 7, 4, 5},
404                                 {5, 8, 6, 7},
405                         },
406                         ans: [][]float64{
407                                 {168, 267, 204, 237},
408                                 {-78, -123, -96, -111},
409                                 {15, 24, 18, 21},
410                         },
411                 },
412                 {
413                         s:     blas.Right,
414                         ul:    blas.Upper,
415                         tA:    blas.NoTrans,
416                         d:     blas.NonUnit,
417                         m:     4,
418                         n:     3,
419                         alpha: 3,
420                         a: [][]float64{
421                                 {2, 3, 4},
422                                 {0, 5, 6},
423                                 {0, 0, 7},
424                         },
425                         b: [][]float64{
426                                 {10, 11, 12},
427                                 {13, 14, 15},
428                                 {16, 17, 18},
429                                 {19, 20, 21},
430                         },
431                         ans: [][]float64{
432                                 {15, -2.4, -48.0 / 35},
433                                 {19.5, -3.3, -66.0 / 35},
434                                 {24, -4.2, -2.4},
435                                 {28.5, -5.1, -102.0 / 35},
436                         },
437                 },
438                 {
439                         s:     blas.Right,
440                         ul:    blas.Upper,
441                         tA:    blas.NoTrans,
442                         d:     blas.Unit,
443                         m:     4,
444                         n:     3,
445                         alpha: 3,
446                         a: [][]float64{
447                                 {2, 3, 4},
448                                 {0, 5, 6},
449                                 {0, 0, 8},
450                         },
451                         b: [][]float64{
452                                 {10, 11, 12},
453                                 {13, 14, 15},
454                                 {16, 17, 18},
455                                 {19, 20, 21},
456                         },
457                         ans: [][]float64{
458                                 {30, -57, 258},
459                                 {39, -75, 339},
460                                 {48, -93, 420},
461                                 {57, -111, 501},
462                         },
463                 },
464                 {
465                         s:     blas.Right,
466                         ul:    blas.Upper,
467                         tA:    blas.NoTrans,
468                         d:     blas.NonUnit,
469                         m:     2,
470                         n:     3,
471                         alpha: 3,
472                         a: [][]float64{
473                                 {2, 3, 4},
474                                 {0, 5, 6},
475                                 {0, 0, 7},
476                         },
477                         b: [][]float64{
478                                 {10, 11, 12},
479                                 {13, 14, 15},
480                         },
481                         ans: [][]float64{
482                                 {15, -2.4, -48.0 / 35},
483                                 {19.5, -3.3, -66.0 / 35},
484                         },
485                 },
486                 {
487                         s:     blas.Right,
488                         ul:    blas.Upper,
489                         tA:    blas.NoTrans,
490                         d:     blas.Unit,
491                         m:     2,
492                         n:     3,
493                         alpha: 3,
494                         a: [][]float64{
495                                 {2, 3, 4},
496                                 {0, 5, 6},
497                                 {0, 0, 8},
498                         },
499                         b: [][]float64{
500                                 {10, 11, 12},
501                                 {13, 14, 15},
502                         },
503                         ans: [][]float64{
504                                 {30, -57, 258},
505                                 {39, -75, 339},
506                         },
507                 },
508                 {
509                         s:     blas.Right,
510                         ul:    blas.Lower,
511                         tA:    blas.NoTrans,
512                         d:     blas.NonUnit,
513                         m:     4,
514                         n:     3,
515                         alpha: 3,
516                         a: [][]float64{
517                                 {2, 0, 0},
518                                 {3, 5, 0},
519                                 {4, 6, 8},
520                         },
521                         b: [][]float64{
522                                 {10, 11, 12},
523                                 {13, 14, 15},
524                                 {16, 17, 18},
525                                 {19, 20, 21},
526                         },
527                         ans: [][]float64{
528                                 {4.2, 1.2, 4.5},
529                                 {5.775, 1.65, 5.625},
530                                 {7.35, 2.1, 6.75},
531                                 {8.925, 2.55, 7.875},
532                         },
533                 },
534                 {
535                         s:     blas.Right,
536                         ul:    blas.Lower,
537                         tA:    blas.NoTrans,
538                         d:     blas.Unit,
539                         m:     4,
540                         n:     3,
541                         alpha: 3,
542                         a: [][]float64{
543                                 {2, 0, 0},
544                                 {3, 5, 0},
545                                 {4, 6, 8},
546                         },
547                         b: [][]float64{
548                                 {10, 11, 12},
549                                 {13, 14, 15},
550                                 {16, 17, 18},
551                                 {19, 20, 21},
552                         },
553                         ans: [][]float64{
554                                 {435, -183, 36},
555                                 {543, -228, 45},
556                                 {651, -273, 54},
557                                 {759, -318, 63},
558                         },
559                 },
560                 {
561                         s:     blas.Right,
562                         ul:    blas.Lower,
563                         tA:    blas.NoTrans,
564                         d:     blas.NonUnit,
565                         m:     2,
566                         n:     3,
567                         alpha: 3,
568                         a: [][]float64{
569                                 {2, 0, 0},
570                                 {3, 5, 0},
571                                 {4, 6, 8},
572                         },
573                         b: [][]float64{
574                                 {10, 11, 12},
575                                 {13, 14, 15},
576                         },
577                         ans: [][]float64{
578                                 {4.2, 1.2, 4.5},
579                                 {5.775, 1.65, 5.625},
580                         },
581                 },
582                 {
583                         s:     blas.Right,
584                         ul:    blas.Lower,
585                         tA:    blas.NoTrans,
586                         d:     blas.Unit,
587                         m:     2,
588                         n:     3,
589                         alpha: 3,
590                         a: [][]float64{
591                                 {2, 0, 0},
592                                 {3, 5, 0},
593                                 {4, 6, 8},
594                         },
595                         b: [][]float64{
596                                 {10, 11, 12},
597                                 {13, 14, 15},
598                         },
599                         ans: [][]float64{
600                                 {435, -183, 36},
601                                 {543, -228, 45},
602                         },
603                 },
604                 {
605                         s:     blas.Right,
606                         ul:    blas.Upper,
607                         tA:    blas.Trans,
608                         d:     blas.NonUnit,
609                         m:     4,
610                         n:     3,
611                         alpha: 3,
612                         a: [][]float64{
613                                 {2, 3, 4},
614                                 {0, 5, 6},
615                                 {0, 0, 8},
616                         },
617                         b: [][]float64{
618                                 {10, 11, 12},
619                                 {13, 14, 15},
620                                 {16, 17, 18},
621                                 {19, 20, 21},
622                         },
623                         ans: [][]float64{
624                                 {4.2, 1.2, 4.5},
625                                 {5.775, 1.65, 5.625},
626                                 {7.35, 2.1, 6.75},
627                                 {8.925, 2.55, 7.875},
628                         },
629                 },
630                 {
631                         s:     blas.Right,
632                         ul:    blas.Upper,
633                         tA:    blas.Trans,
634                         d:     blas.Unit,
635                         m:     4,
636                         n:     3,
637                         alpha: 3,
638                         a: [][]float64{
639                                 {2, 3, 4},
640                                 {0, 5, 6},
641                                 {0, 0, 8},
642                         },
643                         b: [][]float64{
644                                 {10, 11, 12},
645                                 {13, 14, 15},
646                                 {16, 17, 18},
647                                 {19, 20, 21},
648                         },
649                         ans: [][]float64{
650                                 {435, -183, 36},
651                                 {543, -228, 45},
652                                 {651, -273, 54},
653                                 {759, -318, 63},
654                         },
655                 },
656                 {
657                         s:     blas.Right,
658                         ul:    blas.Upper,
659                         tA:    blas.Trans,
660                         d:     blas.NonUnit,
661                         m:     2,
662                         n:     3,
663                         alpha: 3,
664                         a: [][]float64{
665                                 {2, 3, 4},
666                                 {0, 5, 6},
667                                 {0, 0, 8},
668                         },
669                         b: [][]float64{
670                                 {10, 11, 12},
671                                 {13, 14, 15},
672                         },
673                         ans: [][]float64{
674                                 {4.2, 1.2, 4.5},
675                                 {5.775, 1.65, 5.625},
676                         },
677                 },
678                 {
679                         s:     blas.Right,
680                         ul:    blas.Upper,
681                         tA:    blas.Trans,
682                         d:     blas.Unit,
683                         m:     2,
684                         n:     3,
685                         alpha: 3,
686                         a: [][]float64{
687                                 {2, 3, 4},
688                                 {0, 5, 6},
689                                 {0, 0, 8},
690                         },
691                         b: [][]float64{
692                                 {10, 11, 12},
693                                 {13, 14, 15},
694                         },
695                         ans: [][]float64{
696                                 {435, -183, 36},
697                                 {543, -228, 45},
698                         },
699                 },
700                 {
701                         s:     blas.Right,
702                         ul:    blas.Lower,
703                         tA:    blas.Trans,
704                         d:     blas.NonUnit,
705                         m:     4,
706                         n:     3,
707                         alpha: 3,
708                         a: [][]float64{
709                                 {2, 0, 0},
710                                 {3, 5, 0},
711                                 {4, 6, 8},
712                         },
713                         b: [][]float64{
714                                 {10, 11, 12},
715                                 {13, 14, 15},
716                                 {16, 17, 18},
717                                 {19, 20, 21},
718                         },
719                         ans: [][]float64{
720                                 {15, -2.4, -1.2},
721                                 {19.5, -3.3, -1.65},
722                                 {24, -4.2, -2.1},
723                                 {28.5, -5.1, -2.55},
724                         },
725                 },
726                 {
727                         s:     blas.Right,
728                         ul:    blas.Lower,
729                         tA:    blas.Trans,
730                         d:     blas.Unit,
731                         m:     4,
732                         n:     3,
733                         alpha: 3,
734                         a: [][]float64{
735                                 {2, 0, 0},
736                                 {3, 5, 0},
737                                 {4, 6, 8},
738                         },
739                         b: [][]float64{
740                                 {10, 11, 12},
741                                 {13, 14, 15},
742                                 {16, 17, 18},
743                                 {19, 20, 21},
744                         },
745                         ans: [][]float64{
746                                 {30, -57, 258},
747                                 {39, -75, 339},
748                                 {48, -93, 420},
749                                 {57, -111, 501},
750                         },
751                 },
752                 {
753                         s:     blas.Right,
754                         ul:    blas.Lower,
755                         tA:    blas.Trans,
756                         d:     blas.NonUnit,
757                         m:     2,
758                         n:     3,
759                         alpha: 3,
760                         a: [][]float64{
761                                 {2, 0, 0},
762                                 {3, 5, 0},
763                                 {4, 6, 8},
764                         },
765                         b: [][]float64{
766                                 {10, 11, 12},
767                                 {13, 14, 15},
768                         },
769                         ans: [][]float64{
770                                 {15, -2.4, -1.2},
771                                 {19.5, -3.3, -1.65},
772                         },
773                 },
774                 {
775                         s:     blas.Right,
776                         ul:    blas.Lower,
777                         tA:    blas.Trans,
778                         d:     blas.Unit,
779                         m:     2,
780                         n:     3,
781                         alpha: 3,
782                         a: [][]float64{
783                                 {2, 0, 0},
784                                 {3, 5, 0},
785                                 {4, 6, 8},
786                         },
787                         b: [][]float64{
788                                 {10, 11, 12},
789                                 {13, 14, 15},
790                         },
791                         ans: [][]float64{
792                                 {30, -57, 258},
793                                 {39, -75, 339},
794                         },
795                 },
796         } {
797                 aFlat := flatten(test.a)
798                 bFlat := flatten(test.b)
799                 ansFlat := flatten(test.ans)
800                 var lda int
801                 if test.s == blas.Left {
802                         lda = test.m
803                 } else {
804                         lda = test.n
805                 }
806                 blasser.Dtrsm(test.s, test.ul, test.tA, test.d, test.m, test.n, test.alpha, aFlat, lda, bFlat, test.n)
807                 if !floats.EqualApprox(ansFlat, bFlat, 1e-13) {
808                         t.Errorf("Case %v: Want %v, got %v.", i, ansFlat, bFlat)
809                 }
810         }
811 }