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

     1  package main
     2  
     3  import (
     4  	"io"
     5  	"text/template"
     6  )
     7  
     8  const onesRaw = `// Ones creates a *Dense with the provided shape and type
     9  func Ones(dt Dtype, shape ...int) *Dense {
    10  	d := recycledDense(dt, shape)
    11  	switch d.t.Kind() {
    12  		{{range .Kinds -}}
    13  		{{if isNumber . -}}
    14  		case reflect.{{reflectKind .}}:
    15  			d.Memset({{asType .}}(1))
    16  		{{end -}}
    17  		{{end -}}
    18  	case reflect.Bool:
    19  		d.Memset(true)
    20  	default:
    21  		// TODO: add a Oner interface
    22  	}
    23  	return d
    24  }
    25  `
    26  
    27  const Iraw = `// I creates the identity matrix (usually a square) matrix with 1s across the diagonals, and zeroes elsewhere, like so:
    28  //		Matrix(4,4)
    29  // 		⎡1  0  0  0⎤
    30  // 		⎢0  1  0  0⎥
    31  // 		⎢0  0  1  0⎥
    32  // 		⎣0  0  0  1⎦
    33  // While technically an identity matrix is a square matrix, in attempt to keep feature parity with Numpy,
    34  // the I() function allows you to create non square matrices, as well as an index to start the diagonals.
    35  //
    36  // For example:
    37  //		T = I(Float64, 4, 4, 1)
    38  // Yields:
    39  //		⎡0  1  0  0⎤
    40  //		⎢0  0  1  0⎥
    41  //		⎢0  0  0  1⎥
    42  //		⎣0  0  0  0⎦
    43  //
    44  // The index k can also be a negative number:
    45  // 		T = I(Float64, 4, 4, -1)
    46  // Yields:
    47  // 		⎡0  0  0  0⎤
    48  // 		⎢1  0  0  0⎥
    49  // 		⎢0  1  0  0⎥
    50  // 		⎣0  0  1  0⎦
    51  func I(dt Dtype, r, c, k int) *Dense{
    52  	ret := New(Of(dt), WithShape(r,c))
    53  	i := k
    54  	if k < 0 {
    55  		i = (-k) * c
    56  	}
    57  
    58  	var s *Dense
    59  	var err error
    60  	end := c - k
    61  	if end > r {
    62  		s, err = sliceDense(ret, nil)
    63  	} else {
    64  		s, err = sliceDense(ret, rs{0, end, 1})
    65  	}
    66  
    67  	if err != nil {
    68  		panic(err)
    69  	}
    70  	var nexts []int
    71  	iter := newFlatIterator(&s.AP)
    72  	nexts, err = iter.Slice(rs{i, s.Size(), c + 1})
    73  
    74  	switch s.t.Kind() {
    75  		{{range .Kinds -}}
    76  		{{if isNumber . -}}
    77  		case reflect.{{reflectKind .}}:
    78  			data := s.{{sliceOf .}}
    79  			for _, v := range nexts {
    80  				data[v] = 1
    81  			}
    82  		{{end -}}
    83  		{{end -}}
    84  	}
    85  	// TODO: create Oner interface for custom types
    86  	return ret
    87  }
    88  `
    89  
    90  var (
    91  	ones *template.Template
    92  	eye  *template.Template
    93  )
    94  
    95  func init() {
    96  	ones = template.Must(template.New("ones").Funcs(funcs).Parse(onesRaw))
    97  	eye = template.Must(template.New("eye").Funcs(funcs).Parse(Iraw))
    98  }
    99  
   100  func generateDenseConstructionFns(f io.Writer, generic Kinds) {
   101  	ones.Execute(f, generic)
   102  	eye.Execute(f, generic)
   103  }