github.com/jingcheng-WU/gonum@v0.9.1-0.20210323123734-f1a2a11a8f7b/blas/testblas/dtrmm.go (about)

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