github.com/neugram/ng@v0.0.0-20180309130942-d472ff93d872/eval/testdata/mat.ng (about)

     1  // This package exports symbols and is used by other testdata.
     2  
     3  type Matrix interface {
     4  	At(i, j int) float64
     5  	Set(i, j int, v float64)
     6  	Add(m Matrix) Matrix
     7  	Equal(m Matrix) bool
     8  }
     9  
    10  methodik memMatrix struct {
    11  	Rows   int
    12  	Cols   int
    13  	Stride int
    14  	Data   []float64
    15  } {
    16  	func (*m) offset(i, j int) int {
    17  		if i < 0 || i >= m.Rows || j < 0 || j >= m.Cols {
    18  			panic("matrix position out of bounds")
    19  		}
    20  		return i*m.Stride + j
    21  	}
    22  	func (*m) At(i, j int) float64     { return m.Data[m.offset(i, j)] }
    23  	func (*m) Set(i, j int, v float64) { m.Data[m.offset(i, j)] = v }
    24  	func (*m) Add(m2 Matrix) Matrix {
    25  		m3 := &memMatrix{Rows: m.Rows, Cols: m.Cols, Stride: m.Cols, Data: make([]float64, m.Rows*m.Cols)}
    26  
    27  		// Silly implementation, this is not meant for serious programs.
    28  		for i := 0; i < m.Rows; i++ {
    29  			for j := 0; j < m.Cols; j++ {
    30  				m3.Set(i, j, m.At(i, j)+m2.At(i, j))
    31  			}
    32  		}
    33  		return m3
    34  	}
    35  	func (*m) Equal(m2 Matrix) bool {
    36  		if m.Rows != m2.(*memMatrix).Rows || m.Cols != m2.(*memMatrix).Cols {
    37  			return false
    38  		}
    39  		for i := 0; i < m.Rows; i++ {
    40  			for j := 0; j < m.Cols; j++ {
    41  				if m.At(i, j) != m2.At(i, j) {
    42  					return false
    43  				}
    44  			}
    45  		}
    46  		return true
    47  	}
    48  }
    49  
    50  func New(i, j int) Matrix {
    51  	return &memMatrix{Rows: i, Cols: j, Stride: j, Data: make([]float64, i*j)}
    52  }
    53  
    54  print("OK")