gorgonia.org/tensor@v0.9.24/internal/execution/generic_reduce.go (about)

     1  // Code generated by genlib2. DO NOT EDIT.
     2  
     3  package execution
     4  
     5  import "unsafe"
     6  
     7  func ReduceB(f func(a, b bool) bool, def bool, l ...bool) (retVal bool) {
     8  	retVal = def
     9  	if len(l) == 0 {
    10  		return
    11  	}
    12  
    13  	for _, v := range l {
    14  		retVal = f(retVal, v)
    15  	}
    16  	return
    17  }
    18  
    19  func ReduceI(f func(a, b int) int, def int, l ...int) (retVal int) {
    20  	retVal = def
    21  	if len(l) == 0 {
    22  		return
    23  	}
    24  
    25  	for _, v := range l {
    26  		retVal = f(retVal, v)
    27  	}
    28  	return
    29  }
    30  
    31  func ReduceI8(f func(a, b int8) int8, def int8, l ...int8) (retVal int8) {
    32  	retVal = def
    33  	if len(l) == 0 {
    34  		return
    35  	}
    36  
    37  	for _, v := range l {
    38  		retVal = f(retVal, v)
    39  	}
    40  	return
    41  }
    42  
    43  func ReduceI16(f func(a, b int16) int16, def int16, l ...int16) (retVal int16) {
    44  	retVal = def
    45  	if len(l) == 0 {
    46  		return
    47  	}
    48  
    49  	for _, v := range l {
    50  		retVal = f(retVal, v)
    51  	}
    52  	return
    53  }
    54  
    55  func ReduceI32(f func(a, b int32) int32, def int32, l ...int32) (retVal int32) {
    56  	retVal = def
    57  	if len(l) == 0 {
    58  		return
    59  	}
    60  
    61  	for _, v := range l {
    62  		retVal = f(retVal, v)
    63  	}
    64  	return
    65  }
    66  
    67  func ReduceI64(f func(a, b int64) int64, def int64, l ...int64) (retVal int64) {
    68  	retVal = def
    69  	if len(l) == 0 {
    70  		return
    71  	}
    72  
    73  	for _, v := range l {
    74  		retVal = f(retVal, v)
    75  	}
    76  	return
    77  }
    78  
    79  func ReduceU(f func(a, b uint) uint, def uint, l ...uint) (retVal uint) {
    80  	retVal = def
    81  	if len(l) == 0 {
    82  		return
    83  	}
    84  
    85  	for _, v := range l {
    86  		retVal = f(retVal, v)
    87  	}
    88  	return
    89  }
    90  
    91  func ReduceU8(f func(a, b uint8) uint8, def uint8, l ...uint8) (retVal uint8) {
    92  	retVal = def
    93  	if len(l) == 0 {
    94  		return
    95  	}
    96  
    97  	for _, v := range l {
    98  		retVal = f(retVal, v)
    99  	}
   100  	return
   101  }
   102  
   103  func ReduceU16(f func(a, b uint16) uint16, def uint16, l ...uint16) (retVal uint16) {
   104  	retVal = def
   105  	if len(l) == 0 {
   106  		return
   107  	}
   108  
   109  	for _, v := range l {
   110  		retVal = f(retVal, v)
   111  	}
   112  	return
   113  }
   114  
   115  func ReduceU32(f func(a, b uint32) uint32, def uint32, l ...uint32) (retVal uint32) {
   116  	retVal = def
   117  	if len(l) == 0 {
   118  		return
   119  	}
   120  
   121  	for _, v := range l {
   122  		retVal = f(retVal, v)
   123  	}
   124  	return
   125  }
   126  
   127  func ReduceU64(f func(a, b uint64) uint64, def uint64, l ...uint64) (retVal uint64) {
   128  	retVal = def
   129  	if len(l) == 0 {
   130  		return
   131  	}
   132  
   133  	for _, v := range l {
   134  		retVal = f(retVal, v)
   135  	}
   136  	return
   137  }
   138  
   139  func ReduceUintptr(f func(a, b uintptr) uintptr, def uintptr, l ...uintptr) (retVal uintptr) {
   140  	retVal = def
   141  	if len(l) == 0 {
   142  		return
   143  	}
   144  
   145  	for _, v := range l {
   146  		retVal = f(retVal, v)
   147  	}
   148  	return
   149  }
   150  
   151  func ReduceF32(f func(a, b float32) float32, def float32, l ...float32) (retVal float32) {
   152  	retVal = def
   153  	if len(l) == 0 {
   154  		return
   155  	}
   156  
   157  	for _, v := range l {
   158  		retVal = f(retVal, v)
   159  	}
   160  	return
   161  }
   162  
   163  func ReduceF64(f func(a, b float64) float64, def float64, l ...float64) (retVal float64) {
   164  	retVal = def
   165  	if len(l) == 0 {
   166  		return
   167  	}
   168  
   169  	for _, v := range l {
   170  		retVal = f(retVal, v)
   171  	}
   172  	return
   173  }
   174  
   175  func ReduceC64(f func(a, b complex64) complex64, def complex64, l ...complex64) (retVal complex64) {
   176  	retVal = def
   177  	if len(l) == 0 {
   178  		return
   179  	}
   180  
   181  	for _, v := range l {
   182  		retVal = f(retVal, v)
   183  	}
   184  	return
   185  }
   186  
   187  func ReduceC128(f func(a, b complex128) complex128, def complex128, l ...complex128) (retVal complex128) {
   188  	retVal = def
   189  	if len(l) == 0 {
   190  		return
   191  	}
   192  
   193  	for _, v := range l {
   194  		retVal = f(retVal, v)
   195  	}
   196  	return
   197  }
   198  
   199  func ReduceStr(f func(a, b string) string, def string, l ...string) (retVal string) {
   200  	retVal = def
   201  	if len(l) == 0 {
   202  		return
   203  	}
   204  
   205  	for _, v := range l {
   206  		retVal = f(retVal, v)
   207  	}
   208  	return
   209  }
   210  
   211  func ReduceUnsafePointer(f func(a, b unsafe.Pointer) unsafe.Pointer, def unsafe.Pointer, l ...unsafe.Pointer) (retVal unsafe.Pointer) {
   212  	retVal = def
   213  	if len(l) == 0 {
   214  		return
   215  	}
   216  
   217  	for _, v := range l {
   218  		retVal = f(retVal, v)
   219  	}
   220  	return
   221  }
   222  
   223  func SumI(a []int) int {
   224  	var retVal int
   225  	a = a[:]
   226  	for _, v := range a {
   227  		retVal += v
   228  	}
   229  	return retVal
   230  }
   231  func SumI8(a []int8) int8 {
   232  	var retVal int8
   233  	a = a[:]
   234  	for _, v := range a {
   235  		retVal += v
   236  	}
   237  	return retVal
   238  }
   239  func SumI16(a []int16) int16 {
   240  	var retVal int16
   241  	a = a[:]
   242  	for _, v := range a {
   243  		retVal += v
   244  	}
   245  	return retVal
   246  }
   247  func SumI32(a []int32) int32 {
   248  	var retVal int32
   249  	a = a[:]
   250  	for _, v := range a {
   251  		retVal += v
   252  	}
   253  	return retVal
   254  }
   255  func SumI64(a []int64) int64 {
   256  	var retVal int64
   257  	a = a[:]
   258  	for _, v := range a {
   259  		retVal += v
   260  	}
   261  	return retVal
   262  }
   263  func SumU(a []uint) uint {
   264  	var retVal uint
   265  	a = a[:]
   266  	for _, v := range a {
   267  		retVal += v
   268  	}
   269  	return retVal
   270  }
   271  func SumU8(a []uint8) uint8 {
   272  	var retVal uint8
   273  	a = a[:]
   274  	for _, v := range a {
   275  		retVal += v
   276  	}
   277  	return retVal
   278  }
   279  func SumU16(a []uint16) uint16 {
   280  	var retVal uint16
   281  	a = a[:]
   282  	for _, v := range a {
   283  		retVal += v
   284  	}
   285  	return retVal
   286  }
   287  func SumU32(a []uint32) uint32 {
   288  	var retVal uint32
   289  	a = a[:]
   290  	for _, v := range a {
   291  		retVal += v
   292  	}
   293  	return retVal
   294  }
   295  func SumU64(a []uint64) uint64 {
   296  	var retVal uint64
   297  	a = a[:]
   298  	for _, v := range a {
   299  		retVal += v
   300  	}
   301  	return retVal
   302  }
   303  func SumF32(a []float32) float32 {
   304  	var retVal float32
   305  	a = a[:]
   306  	for _, v := range a {
   307  		retVal += v
   308  	}
   309  	return retVal
   310  }
   311  func SumF64(a []float64) float64 {
   312  	var retVal float64
   313  	a = a[:]
   314  	for _, v := range a {
   315  		retVal += v
   316  	}
   317  	return retVal
   318  }
   319  func SumC64(a []complex64) complex64 {
   320  	var retVal complex64
   321  	a = a[:]
   322  	for _, v := range a {
   323  		retVal += v
   324  	}
   325  	return retVal
   326  }
   327  func SumC128(a []complex128) complex128 {
   328  	var retVal complex128
   329  	a = a[:]
   330  	for _, v := range a {
   331  		retVal += v
   332  	}
   333  	return retVal
   334  }
   335  func ProdI(a []int) int {
   336  	if len(a) == 0 {
   337  		return 0
   338  	}
   339  	var retVal int = 1
   340  	a = a[:]
   341  	for _, v := range a {
   342  		retVal *= v
   343  	}
   344  	return retVal
   345  }
   346  func ProdI8(a []int8) int8 {
   347  	if len(a) == 0 {
   348  		return 0
   349  	}
   350  	var retVal int8 = 1
   351  	a = a[:]
   352  	for _, v := range a {
   353  		retVal *= v
   354  	}
   355  	return retVal
   356  }
   357  func ProdI16(a []int16) int16 {
   358  	if len(a) == 0 {
   359  		return 0
   360  	}
   361  	var retVal int16 = 1
   362  	a = a[:]
   363  	for _, v := range a {
   364  		retVal *= v
   365  	}
   366  	return retVal
   367  }
   368  func ProdI32(a []int32) int32 {
   369  	if len(a) == 0 {
   370  		return 0
   371  	}
   372  	var retVal int32 = 1
   373  	a = a[:]
   374  	for _, v := range a {
   375  		retVal *= v
   376  	}
   377  	return retVal
   378  }
   379  func ProdI64(a []int64) int64 {
   380  	if len(a) == 0 {
   381  		return 0
   382  	}
   383  	var retVal int64 = 1
   384  	a = a[:]
   385  	for _, v := range a {
   386  		retVal *= v
   387  	}
   388  	return retVal
   389  }
   390  func ProdU(a []uint) uint {
   391  	if len(a) == 0 {
   392  		return 0
   393  	}
   394  	var retVal uint = 1
   395  	a = a[:]
   396  	for _, v := range a {
   397  		retVal *= v
   398  	}
   399  	return retVal
   400  }
   401  func ProdU8(a []uint8) uint8 {
   402  	if len(a) == 0 {
   403  		return 0
   404  	}
   405  	var retVal uint8 = 1
   406  	a = a[:]
   407  	for _, v := range a {
   408  		retVal *= v
   409  	}
   410  	return retVal
   411  }
   412  func ProdU16(a []uint16) uint16 {
   413  	if len(a) == 0 {
   414  		return 0
   415  	}
   416  	var retVal uint16 = 1
   417  	a = a[:]
   418  	for _, v := range a {
   419  		retVal *= v
   420  	}
   421  	return retVal
   422  }
   423  func ProdU32(a []uint32) uint32 {
   424  	if len(a) == 0 {
   425  		return 0
   426  	}
   427  	var retVal uint32 = 1
   428  	a = a[:]
   429  	for _, v := range a {
   430  		retVal *= v
   431  	}
   432  	return retVal
   433  }
   434  func ProdU64(a []uint64) uint64 {
   435  	if len(a) == 0 {
   436  		return 0
   437  	}
   438  	var retVal uint64 = 1
   439  	a = a[:]
   440  	for _, v := range a {
   441  		retVal *= v
   442  	}
   443  	return retVal
   444  }
   445  func ProdF32(a []float32) float32 {
   446  	if len(a) == 0 {
   447  		return 0
   448  	}
   449  	var retVal float32 = 1
   450  	a = a[:]
   451  	for _, v := range a {
   452  		retVal *= v
   453  	}
   454  	return retVal
   455  }
   456  func ProdF64(a []float64) float64 {
   457  	if len(a) == 0 {
   458  		return 0
   459  	}
   460  	var retVal float64 = 1
   461  	a = a[:]
   462  	for _, v := range a {
   463  		retVal *= v
   464  	}
   465  	return retVal
   466  }
   467  func ProdC64(a []complex64) complex64 {
   468  	if len(a) == 0 {
   469  		return 0
   470  	}
   471  	var retVal complex64 = 1
   472  	a = a[:]
   473  	for _, v := range a {
   474  		retVal *= v
   475  	}
   476  	return retVal
   477  }
   478  func ProdC128(a []complex128) complex128 {
   479  	if len(a) == 0 {
   480  		return 0
   481  	}
   482  	var retVal complex128 = 1
   483  	a = a[:]
   484  	for _, v := range a {
   485  		retVal *= v
   486  	}
   487  	return retVal
   488  }
   489  
   490  func SliceMinI(a []int) int {
   491  	if len(a) < 1 {
   492  		panic("Max of empty slice is meaningless")
   493  	}
   494  	return ReduceI(MinI, a[0], a[1:]...)
   495  }
   496  
   497  func SliceMaxI(a []int) int {
   498  	if len(a) < 1 {
   499  		panic("Max of empty slice is meaningless")
   500  	}
   501  	return ReduceI(MaxI, a[0], a[1:]...)
   502  }
   503  
   504  func SliceMinI8(a []int8) int8 {
   505  	if len(a) < 1 {
   506  		panic("Max of empty slice is meaningless")
   507  	}
   508  	return ReduceI8(MinI8, a[0], a[1:]...)
   509  }
   510  
   511  func SliceMaxI8(a []int8) int8 {
   512  	if len(a) < 1 {
   513  		panic("Max of empty slice is meaningless")
   514  	}
   515  	return ReduceI8(MaxI8, a[0], a[1:]...)
   516  }
   517  
   518  func SliceMinI16(a []int16) int16 {
   519  	if len(a) < 1 {
   520  		panic("Max of empty slice is meaningless")
   521  	}
   522  	return ReduceI16(MinI16, a[0], a[1:]...)
   523  }
   524  
   525  func SliceMaxI16(a []int16) int16 {
   526  	if len(a) < 1 {
   527  		panic("Max of empty slice is meaningless")
   528  	}
   529  	return ReduceI16(MaxI16, a[0], a[1:]...)
   530  }
   531  
   532  func SliceMinI32(a []int32) int32 {
   533  	if len(a) < 1 {
   534  		panic("Max of empty slice is meaningless")
   535  	}
   536  	return ReduceI32(MinI32, a[0], a[1:]...)
   537  }
   538  
   539  func SliceMaxI32(a []int32) int32 {
   540  	if len(a) < 1 {
   541  		panic("Max of empty slice is meaningless")
   542  	}
   543  	return ReduceI32(MaxI32, a[0], a[1:]...)
   544  }
   545  
   546  func SliceMinI64(a []int64) int64 {
   547  	if len(a) < 1 {
   548  		panic("Max of empty slice is meaningless")
   549  	}
   550  	return ReduceI64(MinI64, a[0], a[1:]...)
   551  }
   552  
   553  func SliceMaxI64(a []int64) int64 {
   554  	if len(a) < 1 {
   555  		panic("Max of empty slice is meaningless")
   556  	}
   557  	return ReduceI64(MaxI64, a[0], a[1:]...)
   558  }
   559  
   560  func SliceMinU(a []uint) uint {
   561  	if len(a) < 1 {
   562  		panic("Max of empty slice is meaningless")
   563  	}
   564  	return ReduceU(MinU, a[0], a[1:]...)
   565  }
   566  
   567  func SliceMaxU(a []uint) uint {
   568  	if len(a) < 1 {
   569  		panic("Max of empty slice is meaningless")
   570  	}
   571  	return ReduceU(MaxU, a[0], a[1:]...)
   572  }
   573  
   574  func SliceMinU8(a []uint8) uint8 {
   575  	if len(a) < 1 {
   576  		panic("Max of empty slice is meaningless")
   577  	}
   578  	return ReduceU8(MinU8, a[0], a[1:]...)
   579  }
   580  
   581  func SliceMaxU8(a []uint8) uint8 {
   582  	if len(a) < 1 {
   583  		panic("Max of empty slice is meaningless")
   584  	}
   585  	return ReduceU8(MaxU8, a[0], a[1:]...)
   586  }
   587  
   588  func SliceMinU16(a []uint16) uint16 {
   589  	if len(a) < 1 {
   590  		panic("Max of empty slice is meaningless")
   591  	}
   592  	return ReduceU16(MinU16, a[0], a[1:]...)
   593  }
   594  
   595  func SliceMaxU16(a []uint16) uint16 {
   596  	if len(a) < 1 {
   597  		panic("Max of empty slice is meaningless")
   598  	}
   599  	return ReduceU16(MaxU16, a[0], a[1:]...)
   600  }
   601  
   602  func SliceMinU32(a []uint32) uint32 {
   603  	if len(a) < 1 {
   604  		panic("Max of empty slice is meaningless")
   605  	}
   606  	return ReduceU32(MinU32, a[0], a[1:]...)
   607  }
   608  
   609  func SliceMaxU32(a []uint32) uint32 {
   610  	if len(a) < 1 {
   611  		panic("Max of empty slice is meaningless")
   612  	}
   613  	return ReduceU32(MaxU32, a[0], a[1:]...)
   614  }
   615  
   616  func SliceMinU64(a []uint64) uint64 {
   617  	if len(a) < 1 {
   618  		panic("Max of empty slice is meaningless")
   619  	}
   620  	return ReduceU64(MinU64, a[0], a[1:]...)
   621  }
   622  
   623  func SliceMaxU64(a []uint64) uint64 {
   624  	if len(a) < 1 {
   625  		panic("Max of empty slice is meaningless")
   626  	}
   627  	return ReduceU64(MaxU64, a[0], a[1:]...)
   628  }
   629  
   630  func SliceMinF32(a []float32) float32 {
   631  	if len(a) < 1 {
   632  		panic("Max of empty slice is meaningless")
   633  	}
   634  	return ReduceF32(MinF32, a[0], a[1:]...)
   635  }
   636  
   637  func SliceMaxF32(a []float32) float32 {
   638  	if len(a) < 1 {
   639  		panic("Max of empty slice is meaningless")
   640  	}
   641  	return ReduceF32(MaxF32, a[0], a[1:]...)
   642  }
   643  
   644  func SliceMinF64(a []float64) float64 {
   645  	if len(a) < 1 {
   646  		panic("Max of empty slice is meaningless")
   647  	}
   648  	return ReduceF64(MinF64, a[0], a[1:]...)
   649  }
   650  
   651  func SliceMaxF64(a []float64) float64 {
   652  	if len(a) < 1 {
   653  		panic("Max of empty slice is meaningless")
   654  	}
   655  	return ReduceF64(MaxF64, a[0], a[1:]...)
   656  }
   657  
   658  func reduceFirstB(data, retVal []bool, split, size int, fn func(a, b []bool)) {
   659  	start := split
   660  	copy(retVal[0:split], data[0:split])
   661  	for i := 0; i < size-1; i++ {
   662  		fn(retVal, data[start:start+split])
   663  		start += split
   664  	}
   665  }
   666  
   667  func genericReduceFirstB(data, retVal []bool, split, size int, fn func(a, b bool) bool) {
   668  	start := split
   669  	copy(retVal[0:split], data[0:split])
   670  	for i := 0; i < size-1; i++ {
   671  		for j := 0; j < split; j++ {
   672  			retVal[j] = fn(retVal[j], data[j+start])
   673  		}
   674  		start += split
   675  	}
   676  }
   677  func reduceFirstI(data, retVal []int, split, size int, fn func(a, b []int)) {
   678  	start := split
   679  	copy(retVal[0:split], data[0:split])
   680  	for i := 0; i < size-1; i++ {
   681  		fn(retVal, data[start:start+split])
   682  		start += split
   683  	}
   684  }
   685  
   686  func genericReduceFirstI(data, retVal []int, split, size int, fn func(a, b int) int) {
   687  	start := split
   688  	copy(retVal[0:split], data[0:split])
   689  	for i := 0; i < size-1; i++ {
   690  		for j := 0; j < split; j++ {
   691  			retVal[j] = fn(retVal[j], data[j+start])
   692  		}
   693  		start += split
   694  	}
   695  }
   696  func reduceFirstI8(data, retVal []int8, split, size int, fn func(a, b []int8)) {
   697  	start := split
   698  	copy(retVal[0:split], data[0:split])
   699  	for i := 0; i < size-1; i++ {
   700  		fn(retVal, data[start:start+split])
   701  		start += split
   702  	}
   703  }
   704  
   705  func genericReduceFirstI8(data, retVal []int8, split, size int, fn func(a, b int8) int8) {
   706  	start := split
   707  	copy(retVal[0:split], data[0:split])
   708  	for i := 0; i < size-1; i++ {
   709  		for j := 0; j < split; j++ {
   710  			retVal[j] = fn(retVal[j], data[j+start])
   711  		}
   712  		start += split
   713  	}
   714  }
   715  func reduceFirstI16(data, retVal []int16, split, size int, fn func(a, b []int16)) {
   716  	start := split
   717  	copy(retVal[0:split], data[0:split])
   718  	for i := 0; i < size-1; i++ {
   719  		fn(retVal, data[start:start+split])
   720  		start += split
   721  	}
   722  }
   723  
   724  func genericReduceFirstI16(data, retVal []int16, split, size int, fn func(a, b int16) int16) {
   725  	start := split
   726  	copy(retVal[0:split], data[0:split])
   727  	for i := 0; i < size-1; i++ {
   728  		for j := 0; j < split; j++ {
   729  			retVal[j] = fn(retVal[j], data[j+start])
   730  		}
   731  		start += split
   732  	}
   733  }
   734  func reduceFirstI32(data, retVal []int32, split, size int, fn func(a, b []int32)) {
   735  	start := split
   736  	copy(retVal[0:split], data[0:split])
   737  	for i := 0; i < size-1; i++ {
   738  		fn(retVal, data[start:start+split])
   739  		start += split
   740  	}
   741  }
   742  
   743  func genericReduceFirstI32(data, retVal []int32, split, size int, fn func(a, b int32) int32) {
   744  	start := split
   745  	copy(retVal[0:split], data[0:split])
   746  	for i := 0; i < size-1; i++ {
   747  		for j := 0; j < split; j++ {
   748  			retVal[j] = fn(retVal[j], data[j+start])
   749  		}
   750  		start += split
   751  	}
   752  }
   753  func reduceFirstI64(data, retVal []int64, split, size int, fn func(a, b []int64)) {
   754  	start := split
   755  	copy(retVal[0:split], data[0:split])
   756  	for i := 0; i < size-1; i++ {
   757  		fn(retVal, data[start:start+split])
   758  		start += split
   759  	}
   760  }
   761  
   762  func genericReduceFirstI64(data, retVal []int64, split, size int, fn func(a, b int64) int64) {
   763  	start := split
   764  	copy(retVal[0:split], data[0:split])
   765  	for i := 0; i < size-1; i++ {
   766  		for j := 0; j < split; j++ {
   767  			retVal[j] = fn(retVal[j], data[j+start])
   768  		}
   769  		start += split
   770  	}
   771  }
   772  func reduceFirstU(data, retVal []uint, split, size int, fn func(a, b []uint)) {
   773  	start := split
   774  	copy(retVal[0:split], data[0:split])
   775  	for i := 0; i < size-1; i++ {
   776  		fn(retVal, data[start:start+split])
   777  		start += split
   778  	}
   779  }
   780  
   781  func genericReduceFirstU(data, retVal []uint, split, size int, fn func(a, b uint) uint) {
   782  	start := split
   783  	copy(retVal[0:split], data[0:split])
   784  	for i := 0; i < size-1; i++ {
   785  		for j := 0; j < split; j++ {
   786  			retVal[j] = fn(retVal[j], data[j+start])
   787  		}
   788  		start += split
   789  	}
   790  }
   791  func reduceFirstU8(data, retVal []uint8, split, size int, fn func(a, b []uint8)) {
   792  	start := split
   793  	copy(retVal[0:split], data[0:split])
   794  	for i := 0; i < size-1; i++ {
   795  		fn(retVal, data[start:start+split])
   796  		start += split
   797  	}
   798  }
   799  
   800  func genericReduceFirstU8(data, retVal []uint8, split, size int, fn func(a, b uint8) uint8) {
   801  	start := split
   802  	copy(retVal[0:split], data[0:split])
   803  	for i := 0; i < size-1; i++ {
   804  		for j := 0; j < split; j++ {
   805  			retVal[j] = fn(retVal[j], data[j+start])
   806  		}
   807  		start += split
   808  	}
   809  }
   810  func reduceFirstU16(data, retVal []uint16, split, size int, fn func(a, b []uint16)) {
   811  	start := split
   812  	copy(retVal[0:split], data[0:split])
   813  	for i := 0; i < size-1; i++ {
   814  		fn(retVal, data[start:start+split])
   815  		start += split
   816  	}
   817  }
   818  
   819  func genericReduceFirstU16(data, retVal []uint16, split, size int, fn func(a, b uint16) uint16) {
   820  	start := split
   821  	copy(retVal[0:split], data[0:split])
   822  	for i := 0; i < size-1; i++ {
   823  		for j := 0; j < split; j++ {
   824  			retVal[j] = fn(retVal[j], data[j+start])
   825  		}
   826  		start += split
   827  	}
   828  }
   829  func reduceFirstU32(data, retVal []uint32, split, size int, fn func(a, b []uint32)) {
   830  	start := split
   831  	copy(retVal[0:split], data[0:split])
   832  	for i := 0; i < size-1; i++ {
   833  		fn(retVal, data[start:start+split])
   834  		start += split
   835  	}
   836  }
   837  
   838  func genericReduceFirstU32(data, retVal []uint32, split, size int, fn func(a, b uint32) uint32) {
   839  	start := split
   840  	copy(retVal[0:split], data[0:split])
   841  	for i := 0; i < size-1; i++ {
   842  		for j := 0; j < split; j++ {
   843  			retVal[j] = fn(retVal[j], data[j+start])
   844  		}
   845  		start += split
   846  	}
   847  }
   848  func reduceFirstU64(data, retVal []uint64, split, size int, fn func(a, b []uint64)) {
   849  	start := split
   850  	copy(retVal[0:split], data[0:split])
   851  	for i := 0; i < size-1; i++ {
   852  		fn(retVal, data[start:start+split])
   853  		start += split
   854  	}
   855  }
   856  
   857  func genericReduceFirstU64(data, retVal []uint64, split, size int, fn func(a, b uint64) uint64) {
   858  	start := split
   859  	copy(retVal[0:split], data[0:split])
   860  	for i := 0; i < size-1; i++ {
   861  		for j := 0; j < split; j++ {
   862  			retVal[j] = fn(retVal[j], data[j+start])
   863  		}
   864  		start += split
   865  	}
   866  }
   867  func reduceFirstUintptr(data, retVal []uintptr, split, size int, fn func(a, b []uintptr)) {
   868  	start := split
   869  	copy(retVal[0:split], data[0:split])
   870  	for i := 0; i < size-1; i++ {
   871  		fn(retVal, data[start:start+split])
   872  		start += split
   873  	}
   874  }
   875  
   876  func genericReduceFirstUintptr(data, retVal []uintptr, split, size int, fn func(a, b uintptr) uintptr) {
   877  	start := split
   878  	copy(retVal[0:split], data[0:split])
   879  	for i := 0; i < size-1; i++ {
   880  		for j := 0; j < split; j++ {
   881  			retVal[j] = fn(retVal[j], data[j+start])
   882  		}
   883  		start += split
   884  	}
   885  }
   886  func reduceFirstF32(data, retVal []float32, split, size int, fn func(a, b []float32)) {
   887  	start := split
   888  	copy(retVal[0:split], data[0:split])
   889  	for i := 0; i < size-1; i++ {
   890  		fn(retVal, data[start:start+split])
   891  		start += split
   892  	}
   893  }
   894  
   895  func genericReduceFirstF32(data, retVal []float32, split, size int, fn func(a, b float32) float32) {
   896  	start := split
   897  	copy(retVal[0:split], data[0:split])
   898  	for i := 0; i < size-1; i++ {
   899  		for j := 0; j < split; j++ {
   900  			retVal[j] = fn(retVal[j], data[j+start])
   901  		}
   902  		start += split
   903  	}
   904  }
   905  func reduceFirstF64(data, retVal []float64, split, size int, fn func(a, b []float64)) {
   906  	start := split
   907  	copy(retVal[0:split], data[0:split])
   908  	for i := 0; i < size-1; i++ {
   909  		fn(retVal, data[start:start+split])
   910  		start += split
   911  	}
   912  }
   913  
   914  func genericReduceFirstF64(data, retVal []float64, split, size int, fn func(a, b float64) float64) {
   915  	start := split
   916  	copy(retVal[0:split], data[0:split])
   917  	for i := 0; i < size-1; i++ {
   918  		for j := 0; j < split; j++ {
   919  			retVal[j] = fn(retVal[j], data[j+start])
   920  		}
   921  		start += split
   922  	}
   923  }
   924  func reduceFirstC64(data, retVal []complex64, split, size int, fn func(a, b []complex64)) {
   925  	start := split
   926  	copy(retVal[0:split], data[0:split])
   927  	for i := 0; i < size-1; i++ {
   928  		fn(retVal, data[start:start+split])
   929  		start += split
   930  	}
   931  }
   932  
   933  func genericReduceFirstC64(data, retVal []complex64, split, size int, fn func(a, b complex64) complex64) {
   934  	start := split
   935  	copy(retVal[0:split], data[0:split])
   936  	for i := 0; i < size-1; i++ {
   937  		for j := 0; j < split; j++ {
   938  			retVal[j] = fn(retVal[j], data[j+start])
   939  		}
   940  		start += split
   941  	}
   942  }
   943  func reduceFirstC128(data, retVal []complex128, split, size int, fn func(a, b []complex128)) {
   944  	start := split
   945  	copy(retVal[0:split], data[0:split])
   946  	for i := 0; i < size-1; i++ {
   947  		fn(retVal, data[start:start+split])
   948  		start += split
   949  	}
   950  }
   951  
   952  func genericReduceFirstC128(data, retVal []complex128, split, size int, fn func(a, b complex128) complex128) {
   953  	start := split
   954  	copy(retVal[0:split], data[0:split])
   955  	for i := 0; i < size-1; i++ {
   956  		for j := 0; j < split; j++ {
   957  			retVal[j] = fn(retVal[j], data[j+start])
   958  		}
   959  		start += split
   960  	}
   961  }
   962  func reduceFirstStr(data, retVal []string, split, size int, fn func(a, b []string)) {
   963  	start := split
   964  	copy(retVal[0:split], data[0:split])
   965  	for i := 0; i < size-1; i++ {
   966  		fn(retVal, data[start:start+split])
   967  		start += split
   968  	}
   969  }
   970  
   971  func genericReduceFirstStr(data, retVal []string, split, size int, fn func(a, b string) string) {
   972  	start := split
   973  	copy(retVal[0:split], data[0:split])
   974  	for i := 0; i < size-1; i++ {
   975  		for j := 0; j < split; j++ {
   976  			retVal[j] = fn(retVal[j], data[j+start])
   977  		}
   978  		start += split
   979  	}
   980  }
   981  func reduceFirstUnsafePointer(data, retVal []unsafe.Pointer, split, size int, fn func(a, b []unsafe.Pointer)) {
   982  	start := split
   983  	copy(retVal[0:split], data[0:split])
   984  	for i := 0; i < size-1; i++ {
   985  		fn(retVal, data[start:start+split])
   986  		start += split
   987  	}
   988  }
   989  
   990  func genericReduceFirstUnsafePointer(data, retVal []unsafe.Pointer, split, size int, fn func(a, b unsafe.Pointer) unsafe.Pointer) {
   991  	start := split
   992  	copy(retVal[0:split], data[0:split])
   993  	for i := 0; i < size-1; i++ {
   994  		for j := 0; j < split; j++ {
   995  			retVal[j] = fn(retVal[j], data[j+start])
   996  		}
   997  		start += split
   998  	}
   999  }
  1000  func reduceLastB(a, retVal []bool, dimSize int, defaultValue bool, fn func(a []bool) bool) {
  1001  	var at int
  1002  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1003  		r := fn(a[start : start+dimSize])
  1004  		retVal[at] = r
  1005  		at++
  1006  	}
  1007  }
  1008  
  1009  func genericReduceLastB(a, retVal []bool, dimSize int, defaultValue bool, fn func(bool, bool) bool) {
  1010  	var at int
  1011  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1012  		r := ReduceB(fn, defaultValue, a[start:start+dimSize]...)
  1013  		retVal[at] = r
  1014  		at++
  1015  	}
  1016  }
  1017  
  1018  func reduceLastI(a, retVal []int, dimSize int, defaultValue int, fn func(a []int) int) {
  1019  	var at int
  1020  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1021  		r := fn(a[start : start+dimSize])
  1022  		retVal[at] = r
  1023  		at++
  1024  	}
  1025  }
  1026  
  1027  func genericReduceLastI(a, retVal []int, dimSize int, defaultValue int, fn func(int, int) int) {
  1028  	var at int
  1029  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1030  		r := ReduceI(fn, defaultValue, a[start:start+dimSize]...)
  1031  		retVal[at] = r
  1032  		at++
  1033  	}
  1034  }
  1035  
  1036  func reduceLastI8(a, retVal []int8, dimSize int, defaultValue int8, fn func(a []int8) int8) {
  1037  	var at int
  1038  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1039  		r := fn(a[start : start+dimSize])
  1040  		retVal[at] = r
  1041  		at++
  1042  	}
  1043  }
  1044  
  1045  func genericReduceLastI8(a, retVal []int8, dimSize int, defaultValue int8, fn func(int8, int8) int8) {
  1046  	var at int
  1047  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1048  		r := ReduceI8(fn, defaultValue, a[start:start+dimSize]...)
  1049  		retVal[at] = r
  1050  		at++
  1051  	}
  1052  }
  1053  
  1054  func reduceLastI16(a, retVal []int16, dimSize int, defaultValue int16, fn func(a []int16) int16) {
  1055  	var at int
  1056  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1057  		r := fn(a[start : start+dimSize])
  1058  		retVal[at] = r
  1059  		at++
  1060  	}
  1061  }
  1062  
  1063  func genericReduceLastI16(a, retVal []int16, dimSize int, defaultValue int16, fn func(int16, int16) int16) {
  1064  	var at int
  1065  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1066  		r := ReduceI16(fn, defaultValue, a[start:start+dimSize]...)
  1067  		retVal[at] = r
  1068  		at++
  1069  	}
  1070  }
  1071  
  1072  func reduceLastI32(a, retVal []int32, dimSize int, defaultValue int32, fn func(a []int32) int32) {
  1073  	var at int
  1074  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1075  		r := fn(a[start : start+dimSize])
  1076  		retVal[at] = r
  1077  		at++
  1078  	}
  1079  }
  1080  
  1081  func genericReduceLastI32(a, retVal []int32, dimSize int, defaultValue int32, fn func(int32, int32) int32) {
  1082  	var at int
  1083  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1084  		r := ReduceI32(fn, defaultValue, a[start:start+dimSize]...)
  1085  		retVal[at] = r
  1086  		at++
  1087  	}
  1088  }
  1089  
  1090  func reduceLastI64(a, retVal []int64, dimSize int, defaultValue int64, fn func(a []int64) int64) {
  1091  	var at int
  1092  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1093  		r := fn(a[start : start+dimSize])
  1094  		retVal[at] = r
  1095  		at++
  1096  	}
  1097  }
  1098  
  1099  func genericReduceLastI64(a, retVal []int64, dimSize int, defaultValue int64, fn func(int64, int64) int64) {
  1100  	var at int
  1101  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1102  		r := ReduceI64(fn, defaultValue, a[start:start+dimSize]...)
  1103  		retVal[at] = r
  1104  		at++
  1105  	}
  1106  }
  1107  
  1108  func reduceLastU(a, retVal []uint, dimSize int, defaultValue uint, fn func(a []uint) uint) {
  1109  	var at int
  1110  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1111  		r := fn(a[start : start+dimSize])
  1112  		retVal[at] = r
  1113  		at++
  1114  	}
  1115  }
  1116  
  1117  func genericReduceLastU(a, retVal []uint, dimSize int, defaultValue uint, fn func(uint, uint) uint) {
  1118  	var at int
  1119  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1120  		r := ReduceU(fn, defaultValue, a[start:start+dimSize]...)
  1121  		retVal[at] = r
  1122  		at++
  1123  	}
  1124  }
  1125  
  1126  func reduceLastU8(a, retVal []uint8, dimSize int, defaultValue uint8, fn func(a []uint8) uint8) {
  1127  	var at int
  1128  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1129  		r := fn(a[start : start+dimSize])
  1130  		retVal[at] = r
  1131  		at++
  1132  	}
  1133  }
  1134  
  1135  func genericReduceLastU8(a, retVal []uint8, dimSize int, defaultValue uint8, fn func(uint8, uint8) uint8) {
  1136  	var at int
  1137  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1138  		r := ReduceU8(fn, defaultValue, a[start:start+dimSize]...)
  1139  		retVal[at] = r
  1140  		at++
  1141  	}
  1142  }
  1143  
  1144  func reduceLastU16(a, retVal []uint16, dimSize int, defaultValue uint16, fn func(a []uint16) uint16) {
  1145  	var at int
  1146  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1147  		r := fn(a[start : start+dimSize])
  1148  		retVal[at] = r
  1149  		at++
  1150  	}
  1151  }
  1152  
  1153  func genericReduceLastU16(a, retVal []uint16, dimSize int, defaultValue uint16, fn func(uint16, uint16) uint16) {
  1154  	var at int
  1155  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1156  		r := ReduceU16(fn, defaultValue, a[start:start+dimSize]...)
  1157  		retVal[at] = r
  1158  		at++
  1159  	}
  1160  }
  1161  
  1162  func reduceLastU32(a, retVal []uint32, dimSize int, defaultValue uint32, fn func(a []uint32) uint32) {
  1163  	var at int
  1164  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1165  		r := fn(a[start : start+dimSize])
  1166  		retVal[at] = r
  1167  		at++
  1168  	}
  1169  }
  1170  
  1171  func genericReduceLastU32(a, retVal []uint32, dimSize int, defaultValue uint32, fn func(uint32, uint32) uint32) {
  1172  	var at int
  1173  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1174  		r := ReduceU32(fn, defaultValue, a[start:start+dimSize]...)
  1175  		retVal[at] = r
  1176  		at++
  1177  	}
  1178  }
  1179  
  1180  func reduceLastU64(a, retVal []uint64, dimSize int, defaultValue uint64, fn func(a []uint64) uint64) {
  1181  	var at int
  1182  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1183  		r := fn(a[start : start+dimSize])
  1184  		retVal[at] = r
  1185  		at++
  1186  	}
  1187  }
  1188  
  1189  func genericReduceLastU64(a, retVal []uint64, dimSize int, defaultValue uint64, fn func(uint64, uint64) uint64) {
  1190  	var at int
  1191  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1192  		r := ReduceU64(fn, defaultValue, a[start:start+dimSize]...)
  1193  		retVal[at] = r
  1194  		at++
  1195  	}
  1196  }
  1197  
  1198  func reduceLastUintptr(a, retVal []uintptr, dimSize int, defaultValue uintptr, fn func(a []uintptr) uintptr) {
  1199  	var at int
  1200  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1201  		r := fn(a[start : start+dimSize])
  1202  		retVal[at] = r
  1203  		at++
  1204  	}
  1205  }
  1206  
  1207  func genericReduceLastUintptr(a, retVal []uintptr, dimSize int, defaultValue uintptr, fn func(uintptr, uintptr) uintptr) {
  1208  	var at int
  1209  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1210  		r := ReduceUintptr(fn, defaultValue, a[start:start+dimSize]...)
  1211  		retVal[at] = r
  1212  		at++
  1213  	}
  1214  }
  1215  
  1216  func reduceLastF32(a, retVal []float32, dimSize int, defaultValue float32, fn func(a []float32) float32) {
  1217  	var at int
  1218  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1219  		r := fn(a[start : start+dimSize])
  1220  		retVal[at] = r
  1221  		at++
  1222  	}
  1223  }
  1224  
  1225  func genericReduceLastF32(a, retVal []float32, dimSize int, defaultValue float32, fn func(float32, float32) float32) {
  1226  	var at int
  1227  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1228  		r := ReduceF32(fn, defaultValue, a[start:start+dimSize]...)
  1229  		retVal[at] = r
  1230  		at++
  1231  	}
  1232  }
  1233  
  1234  func reduceLastF64(a, retVal []float64, dimSize int, defaultValue float64, fn func(a []float64) float64) {
  1235  	var at int
  1236  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1237  		r := fn(a[start : start+dimSize])
  1238  		retVal[at] = r
  1239  		at++
  1240  	}
  1241  }
  1242  
  1243  func genericReduceLastF64(a, retVal []float64, dimSize int, defaultValue float64, fn func(float64, float64) float64) {
  1244  	var at int
  1245  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1246  		r := ReduceF64(fn, defaultValue, a[start:start+dimSize]...)
  1247  		retVal[at] = r
  1248  		at++
  1249  	}
  1250  }
  1251  
  1252  func reduceLastC64(a, retVal []complex64, dimSize int, defaultValue complex64, fn func(a []complex64) complex64) {
  1253  	var at int
  1254  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1255  		r := fn(a[start : start+dimSize])
  1256  		retVal[at] = r
  1257  		at++
  1258  	}
  1259  }
  1260  
  1261  func genericReduceLastC64(a, retVal []complex64, dimSize int, defaultValue complex64, fn func(complex64, complex64) complex64) {
  1262  	var at int
  1263  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1264  		r := ReduceC64(fn, defaultValue, a[start:start+dimSize]...)
  1265  		retVal[at] = r
  1266  		at++
  1267  	}
  1268  }
  1269  
  1270  func reduceLastC128(a, retVal []complex128, dimSize int, defaultValue complex128, fn func(a []complex128) complex128) {
  1271  	var at int
  1272  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1273  		r := fn(a[start : start+dimSize])
  1274  		retVal[at] = r
  1275  		at++
  1276  	}
  1277  }
  1278  
  1279  func genericReduceLastC128(a, retVal []complex128, dimSize int, defaultValue complex128, fn func(complex128, complex128) complex128) {
  1280  	var at int
  1281  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1282  		r := ReduceC128(fn, defaultValue, a[start:start+dimSize]...)
  1283  		retVal[at] = r
  1284  		at++
  1285  	}
  1286  }
  1287  
  1288  func reduceLastStr(a, retVal []string, dimSize int, defaultValue string, fn func(a []string) string) {
  1289  	var at int
  1290  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1291  		r := fn(a[start : start+dimSize])
  1292  		retVal[at] = r
  1293  		at++
  1294  	}
  1295  }
  1296  
  1297  func genericReduceLastStr(a, retVal []string, dimSize int, defaultValue string, fn func(string, string) string) {
  1298  	var at int
  1299  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1300  		r := ReduceStr(fn, defaultValue, a[start:start+dimSize]...)
  1301  		retVal[at] = r
  1302  		at++
  1303  	}
  1304  }
  1305  
  1306  func reduceLastUnsafePointer(a, retVal []unsafe.Pointer, dimSize int, defaultValue unsafe.Pointer, fn func(a []unsafe.Pointer) unsafe.Pointer) {
  1307  	var at int
  1308  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1309  		r := fn(a[start : start+dimSize])
  1310  		retVal[at] = r
  1311  		at++
  1312  	}
  1313  }
  1314  
  1315  func genericReduceLastUnsafePointer(a, retVal []unsafe.Pointer, dimSize int, defaultValue unsafe.Pointer, fn func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer) {
  1316  	var at int
  1317  	for start := 0; start <= len(a)-dimSize; start += dimSize {
  1318  		r := ReduceUnsafePointer(fn, defaultValue, a[start:start+dimSize]...)
  1319  		retVal[at] = r
  1320  		at++
  1321  	}
  1322  }
  1323  
  1324  func reduceDefaultB(data, retVal []bool, dim0, dimSize, outerStride, stride, expected int, fn func(a, b bool) bool) {
  1325  	for i := 0; i < dim0; i++ {
  1326  		start := i * outerStride
  1327  		sliced := data[start : start+outerStride]
  1328  		var innerStart, strideTrack int
  1329  		for j := 0; j < expected; j++ {
  1330  			writeTo := i*expected + j
  1331  			retVal[writeTo] = sliced[innerStart]
  1332  			for k := 1; k < dimSize; k++ {
  1333  				readFrom := innerStart + k*stride
  1334  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1335  			}
  1336  			strideTrack++
  1337  			if strideTrack >= stride {
  1338  				strideTrack = 0
  1339  				innerStart += stride
  1340  			}
  1341  			innerStart++
  1342  		}
  1343  	}
  1344  }
  1345  
  1346  func reduceDefaultI(data, retVal []int, dim0, dimSize, outerStride, stride, expected int, fn func(a, b int) int) {
  1347  	for i := 0; i < dim0; i++ {
  1348  		start := i * outerStride
  1349  		sliced := data[start : start+outerStride]
  1350  		var innerStart, strideTrack int
  1351  		for j := 0; j < expected; j++ {
  1352  			writeTo := i*expected + j
  1353  			retVal[writeTo] = sliced[innerStart]
  1354  			for k := 1; k < dimSize; k++ {
  1355  				readFrom := innerStart + k*stride
  1356  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1357  			}
  1358  			strideTrack++
  1359  			if strideTrack >= stride {
  1360  				strideTrack = 0
  1361  				innerStart += stride
  1362  			}
  1363  			innerStart++
  1364  		}
  1365  	}
  1366  }
  1367  
  1368  func reduceDefaultI8(data, retVal []int8, dim0, dimSize, outerStride, stride, expected int, fn func(a, b int8) int8) {
  1369  	for i := 0; i < dim0; i++ {
  1370  		start := i * outerStride
  1371  		sliced := data[start : start+outerStride]
  1372  		var innerStart, strideTrack int
  1373  		for j := 0; j < expected; j++ {
  1374  			writeTo := i*expected + j
  1375  			retVal[writeTo] = sliced[innerStart]
  1376  			for k := 1; k < dimSize; k++ {
  1377  				readFrom := innerStart + k*stride
  1378  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1379  			}
  1380  			strideTrack++
  1381  			if strideTrack >= stride {
  1382  				strideTrack = 0
  1383  				innerStart += stride
  1384  			}
  1385  			innerStart++
  1386  		}
  1387  	}
  1388  }
  1389  
  1390  func reduceDefaultI16(data, retVal []int16, dim0, dimSize, outerStride, stride, expected int, fn func(a, b int16) int16) {
  1391  	for i := 0; i < dim0; i++ {
  1392  		start := i * outerStride
  1393  		sliced := data[start : start+outerStride]
  1394  		var innerStart, strideTrack int
  1395  		for j := 0; j < expected; j++ {
  1396  			writeTo := i*expected + j
  1397  			retVal[writeTo] = sliced[innerStart]
  1398  			for k := 1; k < dimSize; k++ {
  1399  				readFrom := innerStart + k*stride
  1400  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1401  			}
  1402  			strideTrack++
  1403  			if strideTrack >= stride {
  1404  				strideTrack = 0
  1405  				innerStart += stride
  1406  			}
  1407  			innerStart++
  1408  		}
  1409  	}
  1410  }
  1411  
  1412  func reduceDefaultI32(data, retVal []int32, dim0, dimSize, outerStride, stride, expected int, fn func(a, b int32) int32) {
  1413  	for i := 0; i < dim0; i++ {
  1414  		start := i * outerStride
  1415  		sliced := data[start : start+outerStride]
  1416  		var innerStart, strideTrack int
  1417  		for j := 0; j < expected; j++ {
  1418  			writeTo := i*expected + j
  1419  			retVal[writeTo] = sliced[innerStart]
  1420  			for k := 1; k < dimSize; k++ {
  1421  				readFrom := innerStart + k*stride
  1422  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1423  			}
  1424  			strideTrack++
  1425  			if strideTrack >= stride {
  1426  				strideTrack = 0
  1427  				innerStart += stride
  1428  			}
  1429  			innerStart++
  1430  		}
  1431  	}
  1432  }
  1433  
  1434  func reduceDefaultI64(data, retVal []int64, dim0, dimSize, outerStride, stride, expected int, fn func(a, b int64) int64) {
  1435  	for i := 0; i < dim0; i++ {
  1436  		start := i * outerStride
  1437  		sliced := data[start : start+outerStride]
  1438  		var innerStart, strideTrack int
  1439  		for j := 0; j < expected; j++ {
  1440  			writeTo := i*expected + j
  1441  			retVal[writeTo] = sliced[innerStart]
  1442  			for k := 1; k < dimSize; k++ {
  1443  				readFrom := innerStart + k*stride
  1444  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1445  			}
  1446  			strideTrack++
  1447  			if strideTrack >= stride {
  1448  				strideTrack = 0
  1449  				innerStart += stride
  1450  			}
  1451  			innerStart++
  1452  		}
  1453  	}
  1454  }
  1455  
  1456  func reduceDefaultU(data, retVal []uint, dim0, dimSize, outerStride, stride, expected int, fn func(a, b uint) uint) {
  1457  	for i := 0; i < dim0; i++ {
  1458  		start := i * outerStride
  1459  		sliced := data[start : start+outerStride]
  1460  		var innerStart, strideTrack int
  1461  		for j := 0; j < expected; j++ {
  1462  			writeTo := i*expected + j
  1463  			retVal[writeTo] = sliced[innerStart]
  1464  			for k := 1; k < dimSize; k++ {
  1465  				readFrom := innerStart + k*stride
  1466  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1467  			}
  1468  			strideTrack++
  1469  			if strideTrack >= stride {
  1470  				strideTrack = 0
  1471  				innerStart += stride
  1472  			}
  1473  			innerStart++
  1474  		}
  1475  	}
  1476  }
  1477  
  1478  func reduceDefaultU8(data, retVal []uint8, dim0, dimSize, outerStride, stride, expected int, fn func(a, b uint8) uint8) {
  1479  	for i := 0; i < dim0; i++ {
  1480  		start := i * outerStride
  1481  		sliced := data[start : start+outerStride]
  1482  		var innerStart, strideTrack int
  1483  		for j := 0; j < expected; j++ {
  1484  			writeTo := i*expected + j
  1485  			retVal[writeTo] = sliced[innerStart]
  1486  			for k := 1; k < dimSize; k++ {
  1487  				readFrom := innerStart + k*stride
  1488  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1489  			}
  1490  			strideTrack++
  1491  			if strideTrack >= stride {
  1492  				strideTrack = 0
  1493  				innerStart += stride
  1494  			}
  1495  			innerStart++
  1496  		}
  1497  	}
  1498  }
  1499  
  1500  func reduceDefaultU16(data, retVal []uint16, dim0, dimSize, outerStride, stride, expected int, fn func(a, b uint16) uint16) {
  1501  	for i := 0; i < dim0; i++ {
  1502  		start := i * outerStride
  1503  		sliced := data[start : start+outerStride]
  1504  		var innerStart, strideTrack int
  1505  		for j := 0; j < expected; j++ {
  1506  			writeTo := i*expected + j
  1507  			retVal[writeTo] = sliced[innerStart]
  1508  			for k := 1; k < dimSize; k++ {
  1509  				readFrom := innerStart + k*stride
  1510  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1511  			}
  1512  			strideTrack++
  1513  			if strideTrack >= stride {
  1514  				strideTrack = 0
  1515  				innerStart += stride
  1516  			}
  1517  			innerStart++
  1518  		}
  1519  	}
  1520  }
  1521  
  1522  func reduceDefaultU32(data, retVal []uint32, dim0, dimSize, outerStride, stride, expected int, fn func(a, b uint32) uint32) {
  1523  	for i := 0; i < dim0; i++ {
  1524  		start := i * outerStride
  1525  		sliced := data[start : start+outerStride]
  1526  		var innerStart, strideTrack int
  1527  		for j := 0; j < expected; j++ {
  1528  			writeTo := i*expected + j
  1529  			retVal[writeTo] = sliced[innerStart]
  1530  			for k := 1; k < dimSize; k++ {
  1531  				readFrom := innerStart + k*stride
  1532  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1533  			}
  1534  			strideTrack++
  1535  			if strideTrack >= stride {
  1536  				strideTrack = 0
  1537  				innerStart += stride
  1538  			}
  1539  			innerStart++
  1540  		}
  1541  	}
  1542  }
  1543  
  1544  func reduceDefaultU64(data, retVal []uint64, dim0, dimSize, outerStride, stride, expected int, fn func(a, b uint64) uint64) {
  1545  	for i := 0; i < dim0; i++ {
  1546  		start := i * outerStride
  1547  		sliced := data[start : start+outerStride]
  1548  		var innerStart, strideTrack int
  1549  		for j := 0; j < expected; j++ {
  1550  			writeTo := i*expected + j
  1551  			retVal[writeTo] = sliced[innerStart]
  1552  			for k := 1; k < dimSize; k++ {
  1553  				readFrom := innerStart + k*stride
  1554  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1555  			}
  1556  			strideTrack++
  1557  			if strideTrack >= stride {
  1558  				strideTrack = 0
  1559  				innerStart += stride
  1560  			}
  1561  			innerStart++
  1562  		}
  1563  	}
  1564  }
  1565  
  1566  func reduceDefaultUintptr(data, retVal []uintptr, dim0, dimSize, outerStride, stride, expected int, fn func(a, b uintptr) uintptr) {
  1567  	for i := 0; i < dim0; i++ {
  1568  		start := i * outerStride
  1569  		sliced := data[start : start+outerStride]
  1570  		var innerStart, strideTrack int
  1571  		for j := 0; j < expected; j++ {
  1572  			writeTo := i*expected + j
  1573  			retVal[writeTo] = sliced[innerStart]
  1574  			for k := 1; k < dimSize; k++ {
  1575  				readFrom := innerStart + k*stride
  1576  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1577  			}
  1578  			strideTrack++
  1579  			if strideTrack >= stride {
  1580  				strideTrack = 0
  1581  				innerStart += stride
  1582  			}
  1583  			innerStart++
  1584  		}
  1585  	}
  1586  }
  1587  
  1588  func reduceDefaultF32(data, retVal []float32, dim0, dimSize, outerStride, stride, expected int, fn func(a, b float32) float32) {
  1589  	for i := 0; i < dim0; i++ {
  1590  		start := i * outerStride
  1591  		sliced := data[start : start+outerStride]
  1592  		var innerStart, strideTrack int
  1593  		for j := 0; j < expected; j++ {
  1594  			writeTo := i*expected + j
  1595  			retVal[writeTo] = sliced[innerStart]
  1596  			for k := 1; k < dimSize; k++ {
  1597  				readFrom := innerStart + k*stride
  1598  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1599  			}
  1600  			strideTrack++
  1601  			if strideTrack >= stride {
  1602  				strideTrack = 0
  1603  				innerStart += stride
  1604  			}
  1605  			innerStart++
  1606  		}
  1607  	}
  1608  }
  1609  
  1610  func reduceDefaultF64(data, retVal []float64, dim0, dimSize, outerStride, stride, expected int, fn func(a, b float64) float64) {
  1611  	for i := 0; i < dim0; i++ {
  1612  		start := i * outerStride
  1613  		sliced := data[start : start+outerStride]
  1614  		var innerStart, strideTrack int
  1615  		for j := 0; j < expected; j++ {
  1616  			writeTo := i*expected + j
  1617  			retVal[writeTo] = sliced[innerStart]
  1618  			for k := 1; k < dimSize; k++ {
  1619  				readFrom := innerStart + k*stride
  1620  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1621  			}
  1622  			strideTrack++
  1623  			if strideTrack >= stride {
  1624  				strideTrack = 0
  1625  				innerStart += stride
  1626  			}
  1627  			innerStart++
  1628  		}
  1629  	}
  1630  }
  1631  
  1632  func reduceDefaultC64(data, retVal []complex64, dim0, dimSize, outerStride, stride, expected int, fn func(a, b complex64) complex64) {
  1633  	for i := 0; i < dim0; i++ {
  1634  		start := i * outerStride
  1635  		sliced := data[start : start+outerStride]
  1636  		var innerStart, strideTrack int
  1637  		for j := 0; j < expected; j++ {
  1638  			writeTo := i*expected + j
  1639  			retVal[writeTo] = sliced[innerStart]
  1640  			for k := 1; k < dimSize; k++ {
  1641  				readFrom := innerStart + k*stride
  1642  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1643  			}
  1644  			strideTrack++
  1645  			if strideTrack >= stride {
  1646  				strideTrack = 0
  1647  				innerStart += stride
  1648  			}
  1649  			innerStart++
  1650  		}
  1651  	}
  1652  }
  1653  
  1654  func reduceDefaultC128(data, retVal []complex128, dim0, dimSize, outerStride, stride, expected int, fn func(a, b complex128) complex128) {
  1655  	for i := 0; i < dim0; i++ {
  1656  		start := i * outerStride
  1657  		sliced := data[start : start+outerStride]
  1658  		var innerStart, strideTrack int
  1659  		for j := 0; j < expected; j++ {
  1660  			writeTo := i*expected + j
  1661  			retVal[writeTo] = sliced[innerStart]
  1662  			for k := 1; k < dimSize; k++ {
  1663  				readFrom := innerStart + k*stride
  1664  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1665  			}
  1666  			strideTrack++
  1667  			if strideTrack >= stride {
  1668  				strideTrack = 0
  1669  				innerStart += stride
  1670  			}
  1671  			innerStart++
  1672  		}
  1673  	}
  1674  }
  1675  
  1676  func reduceDefaultStr(data, retVal []string, dim0, dimSize, outerStride, stride, expected int, fn func(a, b string) string) {
  1677  	for i := 0; i < dim0; i++ {
  1678  		start := i * outerStride
  1679  		sliced := data[start : start+outerStride]
  1680  		var innerStart, strideTrack int
  1681  		for j := 0; j < expected; j++ {
  1682  			writeTo := i*expected + j
  1683  			retVal[writeTo] = sliced[innerStart]
  1684  			for k := 1; k < dimSize; k++ {
  1685  				readFrom := innerStart + k*stride
  1686  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1687  			}
  1688  			strideTrack++
  1689  			if strideTrack >= stride {
  1690  				strideTrack = 0
  1691  				innerStart += stride
  1692  			}
  1693  			innerStart++
  1694  		}
  1695  	}
  1696  }
  1697  
  1698  func reduceDefaultUnsafePointer(data, retVal []unsafe.Pointer, dim0, dimSize, outerStride, stride, expected int, fn func(a, b unsafe.Pointer) unsafe.Pointer) {
  1699  	for i := 0; i < dim0; i++ {
  1700  		start := i * outerStride
  1701  		sliced := data[start : start+outerStride]
  1702  		var innerStart, strideTrack int
  1703  		for j := 0; j < expected; j++ {
  1704  			writeTo := i*expected + j
  1705  			retVal[writeTo] = sliced[innerStart]
  1706  			for k := 1; k < dimSize; k++ {
  1707  				readFrom := innerStart + k*stride
  1708  				retVal[writeTo] = fn(retVal[writeTo], sliced[readFrom])
  1709  			}
  1710  			strideTrack++
  1711  			if strideTrack >= stride {
  1712  				strideTrack = 0
  1713  				innerStart += stride
  1714  			}
  1715  			innerStart++
  1716  		}
  1717  	}
  1718  }