github.com/wzzhu/tensor@v0.9.24/genlib2/agg1_body.go (about)

     1  package main
     2  
     3  import "text/template"
     4  
     5  // level 1 aggregation (internal.E) templates
     6  
     7  const (
     8  	eArithRaw = `as := isScalar(a, t)
     9  	bs := isScalar(b, t)
    10  	{{$name := .Name}}
    11  	switch t {
    12  		{{range .Kinds -}}
    13  		case {{reflectKind .}}:
    14  			at := a.{{sliceOf .}}
    15  			bt := b.{{sliceOf .}}
    16  			{{$isDiv := eq $name "Div" -}}
    17  			{{$p := panicsDiv0 . -}}
    18  			switch {
    19  			case as && bs:
    20  				Vec{{$name}}{{short .}}(at, bt)
    21  			case as && !bs:
    22  				{{if and $isDiv $p}} err = {{end}} {{$name}}SV{{short .}}(at[0], bt)
    23  			case !as && bs:
    24  				{{if and $isDiv $p}} err = {{end}} {{$name}}VS{{short .}}(at, bt[0])
    25  			default:
    26  				{{if and $isDiv $p}} err = {{end}} Vec{{$name}}{{short .}}(at, bt)
    27  			}
    28  			return
    29  		{{end -}}
    30  		default:
    31  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
    32  	}
    33  	`
    34  
    35  	eArithIncrRaw = `as := isScalar(a, t)
    36  	bs := isScalar(b, t)
    37  	is := isScalar(incr, t)
    38  	if ((as && !bs) || (bs && !as)) && is {
    39  		return errors.Errorf("Cannot increment on scalar increment. a: %d, b %d", a.TypedLen(t), b.TypedLen(t))
    40  	}
    41  	{{$name := .Name}}
    42  	switch t {
    43  		{{range .Kinds -}}
    44  		case {{reflectKind .}}:
    45  			at := a.{{sliceOf .}}
    46  			bt := b.{{sliceOf .}}
    47  			it := incr.{{sliceOf .}}
    48  
    49  			switch {
    50  			case as && bs:
    51  				Vec{{$name}}{{short .}}(at, bt)
    52  				if !is {
    53  					return e.Add(t, incr, a)
    54  				}
    55  				it[0]+= at[0]
    56  			case as && !bs:
    57  				{{$name}}IncrSV{{short .}}(at[0], bt, it)
    58  			case !as && bs :
    59  				{{$name}}IncrVS{{short .}}(at, bt[0], it)
    60  			default:
    61  				{{$name}}Incr{{short .}}(at, bt,it)
    62  			}
    63  			return
    64  		{{end -}}
    65  	default:
    66  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
    67  	}
    68  	`
    69  	eArithIterRaw = `as := isScalar(a, t)
    70  	bs := isScalar(b, t)
    71  	{{$name := .Name}}
    72  	switch t {
    73  		{{range .Kinds -}}
    74  	case {{reflectKind .}}:
    75  		at := a.{{sliceOf .}}
    76  		bt := b.{{sliceOf .}}
    77  		switch {
    78  		case as && bs :
    79  			Vec{{$name}}{{short .}}(at, bt)
    80  		case as && !bs:
    81  			{{$name}}IterSV{{short .}}(at[0], bt, bit)
    82  		case !as && bs:
    83  			{{$name}}IterVS{{short .}}(at, bt[0], ait)
    84  		default:
    85  			{{$name}}Iter{{short .}}(at, bt, ait, bit)
    86  		}
    87  		return
    88  		{{end -}}
    89  	default:
    90  		return errors.Errorf("Unsupported type %v for {{$name}}Iter", t)
    91  	}
    92  	`
    93  
    94  	eArithIterIncrRaw = `as :=isScalar(a, t)
    95  	bs := isScalar(b, t)
    96  	is := isScalar(incr, t)
    97  
    98  	if ((as && !bs) || (bs && !as)) && is {
    99  		return errors.Errorf("Cannot increment on a scalar increment. len(a): %d, len(b) %d", a.TypedLen(t), b.TypedLen(t))
   100  	}
   101  	{{$name := .Name}}
   102  	switch t {
   103  		{{range .Kinds -}}
   104  	case {{reflectKind .}}:
   105  		at := a.{{sliceOf .}}
   106  		bt := b.{{sliceOf .}}
   107  		it := incr.{{sliceOf .}}
   108  		switch {
   109  		case as && bs:
   110  			Vec{{$name}}{{short .}}(at, bt)
   111  			if !is {
   112  				return e.{{$name}}Iter(t, incr, a, iit, ait)
   113  			}
   114  			it[0] += at[0]
   115  			return
   116  		case as && !bs:
   117  			return {{$name}}IterIncrSV{{short .}}(at[0], bt, it, bit, iit)
   118  		case !as && bs:
   119  			return {{$name}}IterIncrVS{{short .}}(at, bt[0], it, ait, iit)
   120  		default:
   121  			return {{$name}}IterIncr{{short .}}(at, bt, it, ait, bit, iit)
   122  		}
   123  		{{end -}}
   124  	default:
   125  		return errors.Errorf("Unsupported type %v for {{$name}}IterIncr", t)
   126  	}
   127  	`
   128  
   129  	eArithRecvRaw = `as :=isScalar(a, t)
   130  	bs := isScalar(b, t)
   131  	rs := isScalar(recv, t)
   132  
   133  	if ((as && !bs) || (bs && !as)) && rs {
   134  		return errors.Errorf("Cannot increment on a scalar increment. len(a): %d, len(b) %d", a.TypedLen(t), b.TypedLen(t))
   135  	}
   136  
   137  	{{$name := .Name}}
   138  	switch t{
   139  		{{range .Kinds -}}
   140  	case {{reflectKind .}}:
   141  		at := a.{{sliceOf .}}
   142  		bt := b.{{sliceOf .}}
   143  		rt := recv.{{sliceOf .}}
   144  		{{$name}}Recv{{short .}}(at, bt, rt)
   145  		return
   146  		{{end -}}
   147  	default:
   148  		return errors.Errorf("Unsupported type %v for {{$name}}Recv", t)
   149  	}
   150  	`
   151  
   152  	eMapRaw = `as := isScalar(a, t)
   153  	switch t {
   154  		{{range .Kinds -}}
   155  	case {{reflectKind .}}:
   156  		var f0 {{template "fntype0" .}}
   157  		var f1 {{template "fntype1" .}}
   158  
   159  		switch f := fn.(type){
   160  		case {{template "fntype0" .}}:
   161  			f0 = f
   162  		case {{template "fntype1" .}}:
   163  			f1 = f
   164  		default:
   165  			return errors.Errorf("Cannot map fn of %T to array", fn)
   166  		}
   167  
   168  		at := a.{{sliceOf .}}
   169  		{{if isAddable . -}}
   170  		switch{
   171  		case as && incr && f0 != nil:
   172  			at[0] += f0(at[0])
   173  		case as && incr && f0 == nil:
   174  			var tmp {{asType .}}
   175  			if tmp, err= f1(at[0]); err != nil {
   176  				return
   177  			}
   178  			at[0] += tmp
   179  		case as && !incr && f0 != nil:
   180  			at[0] = f0(at[0])
   181  		case as && !incr && f0 == nil:
   182  			at[0], err = f1(at[0])
   183  		case !as && incr && f0 != nil:
   184  			MapIncr{{short .}}(f0, at)
   185  		case !as && incr && f0 == nil:
   186  			err = MapIncrErr{{short .}}(f1, at)
   187  		case !as && !incr && f0 == nil:
   188  			err = MapErr{{short .}}(f1, at)
   189  		default:
   190  			Map{{short .}}(f0, at)
   191  		}
   192  		{{else -}}
   193  		if incr {
   194  			return errors.Errorf("Cannot perform increment on t of %v", t)
   195  		}
   196  		switch {
   197  		case as && f0 != nil:
   198  			at[0] = f0(at[0])
   199  		case as && f0 == nil:
   200  			at[0], err = f1(at[0])
   201  		case !as && f0 == nil:
   202  			err = MapErr{{short .}}(f1, at)
   203  		default:
   204  			Map{{short .}}(f0, at)
   205  		}
   206  		{{end -}}
   207  
   208  		{{end -}}
   209  	default:
   210  		return errors.Errorf("Cannot map t of %v", t)
   211  
   212  	}
   213  	`
   214  
   215  	eMapIterRaw = `switch t {
   216  		{{range .Kinds -}}
   217  	case {{reflectKind .}}:
   218  		at := a.{{sliceOf .}}
   219  		var f0 {{template "fntype0" .}}
   220  		var f1 {{template "fntype1" .}}
   221  
   222  		switch f := fn.(type){
   223  		case {{template "fntype0" .}}:
   224  			f0 = f
   225  		case {{template "fntype1" .}}:
   226  			f1 = f
   227  		default:
   228  			return errors.Errorf("Cannot map fn of %T to array", fn)
   229  		}
   230  
   231  		{{if isAddable . -}}
   232  		switch {
   233  		case incr && f0 != nil:
   234  			MapIterIncr{{short .}}(f0, at, ait)
   235  		case incr && f0 == nil:
   236  			err = MapIterIncrErr{{short .}}(f1, at, ait)
   237  		case !incr && f0 == nil:
   238  			err = MapIterErr{{short .}}(f1, at, ait)
   239  		default:
   240  			MapIter{{short .}}(f0, at, ait)
   241  		}
   242  		{{else -}}
   243  			if incr {
   244  				return errors.Errorf("Cannot perform increment on t of %v", t)
   245  			}
   246  			switch {
   247  			case f0 == nil:
   248  				err = MapIterErr{{short .}}(f1, at, ait)
   249  			default:
   250  				MapIter{{short .}}(f0, at, ait)
   251  			}
   252  		{{end -}}
   253  		{{end -}}
   254  	default:
   255  			return errors.Errorf("Cannot map t of %v", t)
   256  	}
   257  	`
   258  
   259  	eCmpSameRaw = `as := isScalar(a, t)
   260  	bs := isScalar(b, t)
   261  	{{$name := .Name}}
   262  	switch t {
   263  		{{range .Kinds -}}
   264  		{{if isBoolRepr . -}}
   265  		case {{reflectKind .}}:
   266  			at := a.{{sliceOf .}}
   267  			bt := b.{{sliceOf .}}
   268  			switch {
   269  			case as && bs:
   270  				{{$name}}Same{{short .}}(at, bt)
   271  			case as && !bs:
   272  				{{$name}}SameSV{{short .}}(at[0], bt)
   273  			case !as && bs:
   274  				{{$name}}SameVS{{short .}}(at, bt[0])
   275  			default:
   276  				{{$name}}Same{{short .}}(at, bt)
   277  			}
   278  			return
   279  		{{end -}}
   280  		{{end -}}
   281  		default:
   282  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   283  	}`
   284  
   285  	eCmpBoolRaw = `as := isScalar(a, t)
   286  	bs := isScalar(b, t)
   287  	rs := isScalar(retVal, Bool)
   288  	rt := retVal.Bools()
   289  
   290  	if ((as && !bs) || (bs && !as)) && rs {
   291  		return errors.Errorf("retVal is a scalar. a: %d, b %d", a.TypedLen(t), b.TypedLen(t))
   292  	}
   293  
   294  	{{$name := .Name}}
   295  	switch t {
   296  		{{range .Kinds -}}
   297  		case {{reflectKind .}}:
   298  			at := a.{{sliceOf .}}
   299  			bt := b.{{sliceOf .}}
   300  
   301  			switch {
   302  			case as && bs:
   303  				{{$name}}{{short .}}(at, bt, rt)
   304  			case as && !bs:
   305  				{{$name}}SV{{short .}}(at[0], bt, rt)
   306  			case !as && bs :
   307  				{{$name}}VS{{short .}}(at, bt[0], rt)
   308  			default:
   309  				{{$name}}{{short .}}(at, bt, rt)
   310  			}
   311  			return
   312  		{{end -}}
   313  	default:
   314  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   315  	}
   316  	`
   317  
   318  	eCmpSameIterRaw = `as := isScalar(a, t)
   319  	bs := isScalar(b, t)
   320  	{{$name := .Name}}
   321  	switch t {
   322  		{{range .Kinds -}}
   323  		{{if isBoolRepr . -}}
   324  	case {{reflectKind .}}:
   325  		at := a.{{sliceOf .}}
   326  		bt := b.{{sliceOf .}}
   327  		switch {
   328  		case as && bs :
   329  			{{$name}}Same{{short .}}(at, bt)
   330  		case as && !bs:
   331  			{{$name}}SameIterSV{{short .}}(at[0], bt, bit)
   332  		case !as && bs:
   333  			{{$name}}SameIterVS{{short .}}(at, bt[0], ait)
   334  		default:
   335  			{{$name}}SameIter{{short .}}(at, bt, ait, bit)
   336  		}
   337  		return
   338  		{{end -}}
   339  		{{end -}}
   340  	default:
   341  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   342  	}
   343  	`
   344  
   345  	eCmpBoolIterRaw = `as :=isScalar(a, t)
   346  	bs := isScalar(b, t)
   347  	rs := isScalar(retVal, Bool)
   348  	rt := retVal.Bools()
   349  
   350  	if ((as && !bs) || (bs && !as)) && rs {
   351  		return errors.Errorf("retVal is scalar while len(a): %d, len(b) %d", a.TypedLen(t), b.TypedLen(t))
   352  	}
   353  
   354  	{{$name := .Name}}
   355  	switch t {
   356  		{{range .Kinds -}}
   357  	case {{reflectKind .}}:
   358  		at := a.{{sliceOf .}}
   359  		bt := b.{{sliceOf .}}
   360  		switch {
   361  		case as && bs:
   362  			{{$name}}{{short .}}(at, bt, rt)
   363  			return
   364  		case as && !bs:
   365  			return {{$name}}IterSV{{short .}}(at[0], bt, rt, bit, rit)
   366  		case !as && bs:
   367  			return {{$name}}IterVS{{short .}}(at, bt[0], rt, ait, rit)
   368  		default:
   369  			return {{$name}}Iter{{short .}}(at, bt, rt, ait, bit, rit)
   370  		}
   371  		{{end -}}
   372  	default:
   373  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   374  	}
   375  	`
   376  	eMinMaxSameRaw = `as := isScalar(a, t)
   377  	bs := isScalar(b, t)
   378  	{{$name := .Name}}
   379  	switch t {
   380  		{{range .Kinds -}}
   381  		{{if isOrd . -}}
   382  		case {{reflectKind .}}:
   383  			at := a.{{sliceOf .}}
   384  			bt := b.{{sliceOf .}}
   385  			switch {
   386  			case as && bs:
   387  				Vec{{$name}}{{short .}}(at, bt)
   388  			case as && !bs:
   389  				{{$name}}SV{{short .}}(at[0], bt)
   390  			case !as && bs:
   391  				{{$name}}VS{{short .}}(at, bt[0])
   392  			default:
   393  				Vec{{$name}}{{short .}}(at, bt)
   394  			}
   395  			return
   396  		{{end -}}
   397  		{{end -}}
   398  		default:
   399  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   400  	}
   401  	`
   402  
   403  	eMinMaxSameIterRaw = `as := isScalar(a, t)
   404  	bs := isScalar(b, t)
   405  	{{$name := .Name}}
   406  	switch t {
   407  		{{range .Kinds -}}
   408  		{{if isOrd . -}}
   409  	case {{reflectKind .}}:
   410  		at := a.{{sliceOf .}}
   411  		bt := b.{{sliceOf .}}
   412  		switch {
   413  		case as && bs :
   414  			Vec{{$name}}{{short .}}(at, bt)
   415  		case as && !bs:
   416  			{{$name}}IterSV{{short .}}(at[0], bt, bit)
   417  		case !as && bs:
   418  			{{$name}}IterVS{{short .}}(at, bt[0], ait)
   419  		default:
   420  			Vec{{$name}}Iter{{short .}}(at, bt, ait, bit)
   421  		}
   422  		return
   423  		{{end -}}
   424  		{{end -}}
   425  	default:
   426  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   427  	}
   428  	`
   429  
   430  	complexAbs = `{{if eq .Kind.String "complex64" -}}
   431  	{{else if eq .Kind.String "complex128" -}}
   432  	{{end -}}
   433  	`
   434  
   435  	eReduceFirstRaw = `{{$name := .Name -}}
   436  	switch t {
   437  		{{range .Kinds -}}
   438  	case {{reflectKind .}}:
   439  		dt := data.{{sliceOf .}}
   440  		rt := retVal.{{sliceOf .}}
   441  		switch f := fn.(type){
   442  			case func([]{{asType .}}, []{{asType .}}):
   443  				{{$name | unexport}}{{short .}}(dt, rt, split, size, f)
   444  			case func({{asType .}}, {{asType .}}) {{asType .}}:
   445  				generic{{$name}}{{short .}}(dt, rt, split, size, f)
   446  			default:
   447  				return errors.Errorf(reductionErrMsg, fn)
   448  		}
   449  		return nil
   450  		{{end -}}
   451  	default:
   452  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   453  	}
   454  	`
   455  
   456  	eReduceLastRaw = `var ok bool
   457  	{{$name := .Name -}}
   458  	switch t {
   459  		{{range .Kinds -}}
   460  	case {{reflectKind .}}:
   461  		var def {{asType .}}
   462  
   463  		if def, ok = defaultValue.({{asType .}}); !ok {
   464  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   465  		}
   466  		dt := data.{{sliceOf .}}
   467  		rt := retVal.{{sliceOf .}}
   468  		switch f := fn.(type){
   469  		case func([]{{asType .}}) {{asType .}}:
   470  			{{$name | unexport}}{{short .}}(dt, rt, dimSize, def, f)
   471  		case func({{asType .}}, {{asType .}}) {{asType .}}:
   472  			generic{{$name}}{{short .}}(dt, rt, dimSize, def, f)
   473  		default:
   474  			return errors.Errorf(reductionErrMsg, fn)
   475  		}
   476  		return nil
   477  		{{end -}}
   478  	default:
   479  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   480  	}
   481  	`
   482  
   483  	eReduceDefaultRaw = `var ok bool
   484  	{{$name := .Name -}}
   485  	switch t {
   486  		{{range .Kinds -}}
   487  	case {{reflectKind .}}:
   488  		var f func({{asType .}}, {{asType .}}) {{asType .}}
   489  		if f, ok = fn.(func({{asType .}}, {{asType .}}) {{asType .}}); !ok {
   490  			return errors.Errorf(reductionErrMsg, fn)
   491  		}
   492  		dt := data.{{sliceOf .}}
   493  		rt := retVal.{{sliceOf .}}
   494  		{{$name | unexport}}{{short .}}(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   495  		return nil
   496  		{{end -}}
   497  	default:
   498  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   499  	}
   500  	`
   501  
   502  	eReduceRaw = `var ok bool
   503  	switch t{
   504  		{{range .Kinds -}}
   505  	case {{reflectKind .}}:
   506  		var f func({{asType .}}, {{asType .}}) {{asType .}}
   507  		var def {{asType .}}
   508  		if f, ok = fn.(func({{asType .}}, {{asType .}}) {{asType .}}); !ok {
   509  			return nil, errors.Errorf(reductionErrMsg, fn)
   510  		}
   511  		if def, ok  = defaultValue.({{asType .}}); !ok {
   512  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   513  		}
   514  		retVal = Reduce{{short .}}(f, def, a.{{sliceOf .}}...)
   515  		return
   516  		{{end -}}
   517  	default:
   518  		return nil, errors.Errorf("Unsupported type %v for Reduce", t)
   519  	}
   520  	`
   521  
   522  	eUnaryRaw = `{{$name := .Name -}}
   523  	switch t {
   524  		{{range .Kinds -}}
   525  	case {{reflectKind .}}:
   526  		{{$name}}{{short .}}(a.{{sliceOf .}})
   527  		return nil
   528  		{{end -}}
   529  	default:
   530  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   531  	}
   532  	`
   533  
   534  	eUnaryIterRaw = `{{$name := .Name -}}
   535  	switch t {
   536  		{{range .Kinds -}}
   537  	case {{reflectKind .}}:
   538  		return {{$name}}{{short .}}(a.{{sliceOf .}}, ait)
   539  		{{end -}}
   540  	default:
   541  		return errors.Errorf("Unsupported type %v for {{$name}}", t)
   542  	}
   543  	`
   544  
   545  	eUnaryClampRaw = `var ok bool
   546  	switch t {
   547  		{{range .Kinds -}}
   548  	case {{reflectKind .}}:
   549  		var min, max {{asType .}}
   550  		if min, ok = minVal.({{asType .}}); !ok {
   551  			return errors.Wrap(errors.Errorf(typeMismatch, min, minVal), "Clamp() min")
   552  		}
   553  		if max, ok = maxVal.({{asType .}}); !ok {
   554  			return errors.Wrap(errors.Errorf(typeMismatch, max, maxVal), "Clamp() max")
   555  		}
   556  		Clamp{{short .}}(a.{{sliceOf .}}, min, max)
   557  		return nil
   558  		{{end -}}
   559  	default:
   560  		return errors.Errorf("Unsupported type %v for Clamp", t)
   561  	}
   562  	`
   563  
   564  	eUnaryClampIterRaw = `var ok bool
   565  	switch t {
   566  		{{range .Kinds -}}
   567  	case {{reflectKind .}}:
   568  		var min, max {{asType .}}
   569  		if min, ok = minVal.({{asType .}}); !ok {
   570  			return errors.Wrap(errors.Errorf(typeMismatch, min, minVal), "Clamp() min")
   571  		}
   572  		if max, ok = maxVal.({{asType .}}); !ok {
   573  			return errors.Wrap(errors.Errorf(typeMismatch, max, maxVal), "Clamp() max")
   574  		}
   575  		return ClampIter{{short .}}(a.{{sliceOf .}}, ait, min, max)
   576  		{{end -}}
   577  	default:
   578  		return errors.Errorf("Unsupported type %v for Clamp", t)
   579  	}
   580  	`
   581  
   582  	eArgmaxRaw = `var next int
   583  	{{$name := .Name -}}
   584  	switch t {
   585  		{{range .Kinds -}}
   586  	case {{reflectKind .}}:
   587  		data := a.{{sliceOf .}}
   588  		tmp := make([]{{asType .}}, 0, lastSize)
   589  		for next,  err = it.Next(); err == nil; next, err = it.Next() {
   590  			tmp = append(tmp, data[next])
   591  			if len(tmp) == lastSize {
   592  				am := Arg{{$name}}{{short .}}(tmp)
   593  				indices = append(indices, am)
   594  
   595  				// reset
   596  				tmp = tmp[:0]
   597  			}
   598  		}
   599  		if _, ok := err.(NoOpError); ok  {
   600  			err = nil
   601  		}
   602  		return
   603  		{{end -}}
   604  	default:
   605  		return nil, errors.Errorf("Unsupported type %v for Arg{{.Name}}", t)
   606  	}
   607  	`
   608  
   609  	eArgmaxMaskedRaw = `newMask := make([]bool, 0, lastSize)
   610  	var next int
   611  	{{$name := .Name -}}
   612  	switch t {
   613  		{{range .Kinds -}}
   614  	case {{reflectKind .}}:
   615  		data := a.{{sliceOf .}}
   616  		tmp := make([]{{asType .}}, 0, lastSize)
   617  		for next,  err = it.Next(); err == nil; next, err = it.Next() {
   618  			tmp = append(tmp, data[next])
   619  			newMask = append(newMask, mask[next])
   620  			if len(tmp) == lastSize {
   621  				am := Arg{{$name}}Masked{{short .}}(tmp, mask)
   622  				indices = append(indices, am)
   623  
   624  				// reset
   625  				tmp = tmp[:0]
   626  				newMask = newMask[:0]
   627  			}
   628  		}
   629  		if _, ok := err.(NoOpError); ok {
   630  			err = nil
   631  		}
   632  		return
   633  		{{end -}}
   634  	default:
   635  		return nil, errors.Errorf("Unsupported type %v for Arg{{.Name}}", t)
   636  	}
   637  	`
   638  
   639  	eArgmaxFlatRaw = `switch t {
   640  	{{$name := .Name -}}
   641  		{{range .Kinds -}}
   642  	case {{reflectKind .}}:
   643  		return Arg{{$name}}{{short .}}(a.{{sliceOf .}})
   644  		{{end -}}
   645  	default:
   646  		return -1
   647  	}
   648  	`
   649  
   650  	eArgmaxFlatMaskedRaw = `switch t {
   651  		{{$name := .Name -}}
   652  		{{range .Kinds -}}
   653  	case {{reflectKind .}}:
   654  		return Arg{{$name}}Masked{{short .}}(a.{{sliceOf .}}, mask)
   655  		{{end -}}
   656  	default:
   657  		return -1
   658  	}
   659  	`
   660  )
   661  
   662  var (
   663  	eArith         *template.Template
   664  	eArithIncr     *template.Template
   665  	eArithIter     *template.Template
   666  	eArithIterIncr *template.Template
   667  	eArithRecv     *template.Template
   668  
   669  	eMap     *template.Template
   670  	eMapIter *template.Template
   671  
   672  	eCmpBool     *template.Template
   673  	eCmpSame     *template.Template
   674  	eCmpBoolIter *template.Template
   675  	eCmpSameIter *template.Template
   676  
   677  	eMinMaxSame *template.Template
   678  	eMinMaxIter *template.Template
   679  
   680  	eReduce        *template.Template
   681  	eReduceFirst   *template.Template
   682  	eReduceLast    *template.Template
   683  	eReduceDefault *template.Template
   684  
   685  	eUnary          *template.Template
   686  	eUnaryIter      *template.Template
   687  	eUnaryClamp     *template.Template
   688  	eUnaryClampIter *template.Template
   689  
   690  	eArgmax           *template.Template
   691  	eArgmaxMasked     *template.Template
   692  	eArgmaxFlat       *template.Template
   693  	eArgmaxFlatMasked *template.Template
   694  )
   695  
   696  func init() {
   697  	eArith = template.Must(template.New("eArith").Funcs(funcs).Parse(eArithRaw))
   698  	eArithIncr = template.Must(template.New("eArithIncr").Funcs(funcs).Parse(eArithIncrRaw))
   699  	eArithIter = template.Must(template.New("eArithIter").Funcs(funcs).Parse(eArithIterRaw))
   700  	eArithIterIncr = template.Must(template.New("eArithIterIncr").Funcs(funcs).Parse(eArithIterIncrRaw))
   701  	eArithRecv = template.Must(template.New("eArithRecv").Funcs(funcs).Parse(eArithRecvRaw))
   702  
   703  	eMap = template.Must(template.New("eMap").Funcs(funcs).Parse(eMapRaw))
   704  	eMapIter = template.Must(template.New("eMapIter").Funcs(funcs).Parse(eMapIterRaw))
   705  
   706  	eCmpBool = template.Must(template.New("eCmpBool").Funcs(funcs).Parse(eCmpBoolRaw))
   707  	eCmpSame = template.Must(template.New("eCmpSame").Funcs(funcs).Parse(eCmpSameRaw))
   708  	eCmpBoolIter = template.Must(template.New("eCmpBoolIter").Funcs(funcs).Parse(eCmpBoolIterRaw))
   709  	eCmpSameIter = template.Must(template.New("eCmpSameIter").Funcs(funcs).Parse(eCmpSameIterRaw))
   710  
   711  	eMinMaxSame = template.Must(template.New("eMinMaxSame").Funcs(funcs).Parse(eMinMaxSameRaw))
   712  	eMinMaxIter = template.Must(template.New("eMinMaxSameIter").Funcs(funcs).Parse(eMinMaxSameIterRaw))
   713  
   714  	eReduce = template.Must(template.New("eReduce").Funcs(funcs).Parse(eReduceRaw))
   715  	eReduceFirst = template.Must(template.New("eReduceFirst").Funcs(funcs).Parse(eReduceFirstRaw))
   716  	eReduceLast = template.Must(template.New("eReduceLast").Funcs(funcs).Parse(eReduceLastRaw))
   717  	eReduceDefault = template.Must(template.New("eReduceDefault").Funcs(funcs).Parse(eReduceDefaultRaw))
   718  
   719  	eUnary = template.Must(template.New("eUnary").Funcs(funcs).Parse(eUnaryRaw))
   720  	eUnaryIter = template.Must(template.New("eUnaryIter").Funcs(funcs).Parse(eUnaryIterRaw))
   721  	eUnaryClamp = template.Must(template.New("eUnaryClamp").Funcs(funcs).Parse(eUnaryClampRaw))
   722  	eUnaryClampIter = template.Must(template.New("eUnaryClampIter").Funcs(funcs).Parse(eUnaryClampIterRaw))
   723  
   724  	eArgmax = template.Must(template.New("argmax").Funcs(funcs).Parse(eArgmaxRaw))
   725  	eArgmaxMasked = template.Must(template.New("argmaxMasked").Funcs(funcs).Parse(eArgmaxMaskedRaw))
   726  	eArgmaxFlat = template.Must(template.New("argmaxFlat").Funcs(funcs).Parse(eArgmaxFlatRaw))
   727  	eArgmaxFlatMasked = template.Must(template.New("argmaxFlatMasked").Funcs(funcs).Parse(eArgmaxFlatMaskedRaw))
   728  }