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

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  )
     7  
     8  type DenseBinOp struct {
     9  	MethodName string
    10  	Name       string
    11  	Scalar     bool
    12  }
    13  
    14  func (fn *DenseBinOp) Write(w io.Writer) {
    15  	type tmp struct {
    16  		Left, Right string
    17  	}
    18  	var ds tmp
    19  	ds.Left = "t"
    20  	ds.Right = "other"
    21  	name := fn.MethodName
    22  	if fn.Scalar {
    23  		name += "Scalar"
    24  	}
    25  	if tmpl, ok := arithDocStrings[name]; ok {
    26  		tmpl.Execute(w, ds)
    27  	}
    28  	if tmpl, ok := cmpDocStrings[name]; ok {
    29  		tmpl.Execute(w, ds)
    30  	}
    31  
    32  	if fn.Scalar {
    33  		fmt.Fprintf(w, "func (t *Dense) %sScalar(other interface{}, leftTensor bool, opts ...FuncOpt) (retVal *Dense, err error) {\n", fn.MethodName)
    34  		denseArithScalarBody.Execute(w, fn)
    35  	} else {
    36  		fmt.Fprintf(w, "func (t *Dense) %s(other *Dense, opts ...FuncOpt) (retVal *Dense, err error) {\n", fn.MethodName)
    37  		denseArithBody.Execute(w, fn)
    38  	}
    39  	w.Write([]byte("}\n\n"))
    40  
    41  }
    42  
    43  func generateDenseArith(f io.Writer, ak Kinds) {
    44  	var methods []*DenseBinOp
    45  	for _, bo := range arithBinOps {
    46  		meth := &DenseBinOp{
    47  			MethodName: bo.Name(),
    48  			Name:       bo.Name(),
    49  		}
    50  		methods = append(methods, meth)
    51  	}
    52  
    53  	for _, meth := range methods {
    54  		meth.Write(f)
    55  		meth.Scalar = true
    56  	}
    57  	for _, meth := range methods {
    58  		meth.Write(f)
    59  	}
    60  }
    61  
    62  func generateDenseCmp(f io.Writer, ak Kinds) {
    63  	var methods []*DenseBinOp
    64  	for _, cbo := range cmpBinOps {
    65  		methName := cbo.Name()
    66  		if methName == "Eq" || methName == "Ne" {
    67  			methName = "El" + cbo.Name()
    68  		}
    69  		meth := &DenseBinOp{
    70  			MethodName: methName,
    71  			Name:       cbo.Name(),
    72  		}
    73  		methods = append(methods, meth)
    74  	}
    75  	for _, meth := range methods {
    76  		meth.Write(f)
    77  		meth.Scalar = true
    78  	}
    79  	for _, meth := range methods {
    80  		meth.Write(f)
    81  	}
    82  }