github.com/jingcheng-WU/gonum@v0.9.1-0.20210323123734-f1a2a11a8f7b/mat/io_test.go (about)

     1  // Copyright ©2015 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package mat
     6  
     7  import (
     8  	"bytes"
     9  	"encoding"
    10  	"encoding/binary"
    11  	"io"
    12  	"io/ioutil"
    13  	"math"
    14  	"testing"
    15  
    16  	"github.com/jingcheng-WU/gonum/blas/blas64"
    17  )
    18  
    19  var (
    20  	_ encoding.BinaryMarshaler   = (*Dense)(nil)
    21  	_ encoding.BinaryUnmarshaler = (*Dense)(nil)
    22  	_ encoding.BinaryMarshaler   = (*VecDense)(nil)
    23  	_ encoding.BinaryUnmarshaler = (*VecDense)(nil)
    24  )
    25  
    26  var sizeInt64 = binary.Size(int64(0))
    27  
    28  var denseData = []struct {
    29  	raw  []byte
    30  	want *Dense
    31  	err  error
    32  	eq   func(got, want Matrix) bool
    33  }{
    34  	{
    35  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
    36  		want: &Dense{},
    37  		err:  ErrZeroLength,
    38  		eq:   Equal,
    39  	},
    40  	{
    41  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@"),
    42  		want: NewDense(2, 2, []float64{1, 2, 3, 4}),
    43  		eq:   Equal,
    44  	},
    45  	{
    46  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@"),
    47  		want: NewDense(2, 3, []float64{1, 2, 3, 4, 5, 6}),
    48  		eq:   Equal,
    49  	},
    50  	{
    51  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@"),
    52  		want: NewDense(3, 2, []float64{1, 2, 3, 4, 5, 6}),
    53  		eq:   Equal,
    54  	},
    55  	{
    56  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00\x1c@\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00\"@"),
    57  		want: NewDense(3, 3, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}),
    58  		eq:   Equal,
    59  	},
    60  	{
    61  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@"),
    62  		want: NewDense(3, 3, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}).Slice(0, 2, 0, 2).(*Dense),
    63  		eq:   Equal,
    64  	},
    65  	{
    66  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00\"@"),
    67  		want: NewDense(3, 3, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}).Slice(1, 3, 1, 3).(*Dense),
    68  		eq:   Equal,
    69  	},
    70  	{
    71  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00\"@"),
    72  		want: NewDense(3, 3, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}).Slice(0, 3, 1, 3).(*Dense),
    73  		eq:   Equal,
    74  	},
    75  	{
    76  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x00\x00\x00\x00\x00\x00\xf0\u007f\x01\x00\x00\x00\x00\x00\xf8\u007f"),
    77  		want: NewDense(1, 4, []float64{0, math.Inf(-1), math.Inf(+1), math.NaN()}),
    78  		eq: func(got, want Matrix) bool {
    79  			for _, v := range []bool{
    80  				got.At(0, 0) == 0,
    81  				math.IsInf(got.At(0, 1), -1),
    82  				math.IsInf(got.At(0, 2), +1),
    83  				math.IsNaN(got.At(0, 3)),
    84  			} {
    85  				if !v {
    86  					return false
    87  				}
    88  			}
    89  			return true
    90  		},
    91  	},
    92  }
    93  
    94  func TestDenseMarshal(t *testing.T) {
    95  	t.Parallel()
    96  	for i, test := range denseData {
    97  		buf, err := test.want.MarshalBinary()
    98  		if err != nil {
    99  			t.Errorf("error encoding test-%d: %v\n", i, err)
   100  			continue
   101  		}
   102  
   103  		nrows, ncols := test.want.Dims()
   104  		sz := headerSize + nrows*ncols*sizeFloat64
   105  		if len(buf) != sz {
   106  			t.Errorf("encoded size test-%d: want=%d got=%d\n", i, sz, len(buf))
   107  		}
   108  
   109  		if !bytes.Equal(buf, test.raw) {
   110  			t.Errorf("error encoding test-%d: bytes mismatch.\n got=%q\nwant=%q\n",
   111  				i,
   112  				string(buf),
   113  				string(test.raw),
   114  			)
   115  			continue
   116  		}
   117  	}
   118  }
   119  
   120  func TestDenseMarshalTo(t *testing.T) {
   121  	t.Parallel()
   122  	for i, test := range denseData {
   123  		buf := new(bytes.Buffer)
   124  		n, err := test.want.MarshalBinaryTo(buf)
   125  		if err != nil {
   126  			t.Errorf("error encoding test-%d: %v\n", i, err)
   127  			continue
   128  		}
   129  
   130  		nrows, ncols := test.want.Dims()
   131  		sz := headerSize + nrows*ncols*sizeFloat64
   132  		if n != sz {
   133  			t.Errorf("encoded size test-%d: want=%d got=%d\n", i, sz, n)
   134  		}
   135  
   136  		if !bytes.Equal(buf.Bytes(), test.raw) {
   137  			t.Errorf("error encoding test-%d: bytes mismatch.\n got=%q\nwant=%q\n",
   138  				i,
   139  				buf.Bytes(),
   140  				test.raw,
   141  			)
   142  			continue
   143  		}
   144  	}
   145  }
   146  
   147  func TestDenseUnmarshal(t *testing.T) {
   148  	t.Parallel()
   149  	for i, test := range denseData {
   150  		var v Dense
   151  		err := v.UnmarshalBinary(test.raw)
   152  		if err != nil {
   153  			if err != test.err {
   154  				t.Errorf("error decoding test-%d: %v\n", i, err)
   155  			}
   156  			continue
   157  		}
   158  		if !test.eq(&v, test.want) {
   159  			t.Errorf("error decoding test-%d: values differ.\n got=%v\nwant=%v\n",
   160  				i,
   161  				&v,
   162  				test.want,
   163  			)
   164  		}
   165  	}
   166  }
   167  
   168  func TestDenseUnmarshalFrom(t *testing.T) {
   169  	t.Parallel()
   170  	for i, test := range denseData {
   171  		var v Dense
   172  		buf := bytes.NewReader(test.raw)
   173  		n, err := v.UnmarshalBinaryFrom(buf)
   174  		if err != nil {
   175  			if err != test.err {
   176  				t.Errorf("error decoding test-%d: %v\n", i, err)
   177  			}
   178  			continue
   179  		}
   180  		if n != len(test.raw) {
   181  			t.Errorf("error decoding test-%d: lengths differ.\n got=%d\nwant=%d\n",
   182  				i, n, len(test.raw),
   183  			)
   184  		}
   185  		if !test.eq(&v, test.want) {
   186  			t.Errorf("error decoding test-%d: values differ.\n got=%v\nwant=%v\n",
   187  				i,
   188  				&v,
   189  				test.want,
   190  			)
   191  		}
   192  	}
   193  }
   194  
   195  func TestDenseUnmarshalFromError(t *testing.T) {
   196  	t.Parallel()
   197  	test := denseData[1]
   198  	for i, tt := range []struct {
   199  		beg int
   200  		end int
   201  	}{
   202  		{
   203  			beg: 0,
   204  			end: len(test.raw) - 1,
   205  		},
   206  		{
   207  			beg: 0,
   208  			end: len(test.raw) - sizeFloat64,
   209  		},
   210  		{
   211  			beg: 0,
   212  			end: 0,
   213  		},
   214  		{
   215  			beg: 0,
   216  			end: 1,
   217  		},
   218  		{
   219  			beg: 0,
   220  			end: sizeInt64,
   221  		},
   222  		{
   223  			beg: 0,
   224  			end: sizeInt64 - 1,
   225  		},
   226  		{
   227  			beg: 0,
   228  			end: sizeInt64 + 1,
   229  		},
   230  		{
   231  			beg: 0,
   232  			end: 2*sizeInt64 - 1,
   233  		},
   234  		{
   235  			beg: 0,
   236  			end: 2 * sizeInt64,
   237  		},
   238  		{
   239  			beg: 0,
   240  			end: 2*sizeInt64 + 1,
   241  		},
   242  		{
   243  			beg: 0,
   244  			end: 2*sizeInt64 + sizeFloat64 - 1,
   245  		},
   246  		{
   247  			beg: 0,
   248  			end: 2*sizeInt64 + sizeFloat64,
   249  		},
   250  		{
   251  			beg: 0,
   252  			end: 2*sizeInt64 + sizeFloat64 + 1,
   253  		},
   254  	} {
   255  		buf := bytes.NewReader(test.raw[tt.beg:tt.end])
   256  		var m Dense
   257  		_, err := m.UnmarshalBinaryFrom(buf)
   258  		if err != io.ErrUnexpectedEOF {
   259  			t.Errorf("test #%d: error decoding. got=%v. want=%v\n", i, err, io.ErrUnexpectedEOF)
   260  		}
   261  	}
   262  }
   263  
   264  func TestDenseIORoundTrip(t *testing.T) {
   265  	t.Parallel()
   266  	for i, test := range denseData {
   267  		buf, err := test.want.MarshalBinary()
   268  		if err != nil {
   269  			t.Errorf("error encoding test #%d: %v\n", i, err)
   270  		}
   271  
   272  		var got Dense
   273  		err = got.UnmarshalBinary(buf)
   274  		if err != nil {
   275  			if err != test.err {
   276  				t.Errorf("error decoding test #%d: %v\n", i, err)
   277  			}
   278  			continue
   279  		}
   280  
   281  		if !test.eq(&got, test.want) {
   282  			t.Errorf("r/w test #%d failed\n got=%#v\nwant=%#v\n", i, &got, test.want)
   283  		}
   284  
   285  		wbuf := new(bytes.Buffer)
   286  		_, err = test.want.MarshalBinaryTo(wbuf)
   287  		if err != nil {
   288  			t.Errorf("error encoding test #%d: %v\n", i, err)
   289  		}
   290  
   291  		if !bytes.Equal(buf, wbuf.Bytes()) {
   292  			t.Errorf("r/w test #%d encoding via MarshalBinary and MarshalBinaryTo differ:\nwith-stream: %q\n  no-stream: %q\n",
   293  				i, wbuf.Bytes(), buf,
   294  			)
   295  		}
   296  
   297  		var wgot Dense
   298  		_, err = wgot.UnmarshalBinaryFrom(wbuf)
   299  		if err != nil {
   300  			t.Errorf("error decoding test #%d: %v\n", i, err)
   301  		}
   302  
   303  		if !test.eq(&wgot, test.want) {
   304  			t.Errorf("r/w test #%d failed\n got=%#v\nwant=%#v\n", i, &wgot, test.want)
   305  		}
   306  	}
   307  }
   308  
   309  var vectorData = []struct {
   310  	raw  []byte
   311  	want *VecDense
   312  	err  error
   313  	eq   func(got, want Matrix) bool
   314  }{
   315  	{
   316  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
   317  		want: &VecDense{},
   318  		err:  ErrZeroLength,
   319  		eq:   Equal,
   320  	},
   321  	{
   322  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@"),
   323  		want: NewVecDense(4, []float64{1, 2, 3, 4}),
   324  		eq:   Equal,
   325  	},
   326  	{
   327  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x06\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@"),
   328  		want: NewVecDense(6, []float64{1, 2, 3, 4, 5, 6}),
   329  		eq:   Equal,
   330  	},
   331  	{
   332  		raw:  []byte("\x01\x00\x00\x00GFA\x00\t\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00\x1c@\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00\"@"),
   333  		want: NewVecDense(9, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}),
   334  		eq:   Equal,
   335  	},
   336  	{
   337  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@"),
   338  		want: NewVecDense(9, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}).SliceVec(0, 3).(*VecDense),
   339  		eq:   Equal,
   340  	},
   341  	{
   342  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@"),
   343  		want: NewVecDense(9, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}).SliceVec(1, 4).(*VecDense),
   344  		eq:   Equal,
   345  	},
   346  	{
   347  		raw:  []byte("\x01\x00\x00\x00GFA\x00\b\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00\x1c@\x00\x00\x00\x00\x00\x00 @"),
   348  		want: NewVecDense(9, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}).SliceVec(0, 8).(*VecDense),
   349  		eq:   Equal,
   350  	},
   351  	{
   352  		raw: []byte("\x01\x00\x00\x00GFA\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b@\x00\x00\x00\x00\x00\x00\x18@"),
   353  		want: &VecDense{
   354  			mat: blas64.Vector{
   355  				N:    3,
   356  				Data: []float64{0, 1, 2, 3, 4, 5, 6},
   357  				Inc:  3,
   358  			},
   359  		},
   360  		eq: Equal,
   361  	},
   362  	{
   363  		raw:  []byte("\x01\x00\x00\x00GFA\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x00\x00\x00\x00\x00\x00\xf0\u007f\x01\x00\x00\x00\x00\x00\xf8\u007f"),
   364  		want: NewVecDense(4, []float64{0, math.Inf(-1), math.Inf(+1), math.NaN()}),
   365  		eq: func(got, want Matrix) bool {
   366  			for _, v := range []bool{
   367  				got.At(0, 0) == 0,
   368  				math.IsInf(got.At(1, 0), -1),
   369  				math.IsInf(got.At(2, 0), +1),
   370  				math.IsNaN(got.At(3, 0)),
   371  			} {
   372  				if !v {
   373  					return false
   374  				}
   375  			}
   376  			return true
   377  		},
   378  	},
   379  }
   380  
   381  func TestVecDenseMarshal(t *testing.T) {
   382  	t.Parallel()
   383  	for i, test := range vectorData {
   384  		buf, err := test.want.MarshalBinary()
   385  		if err != nil {
   386  			t.Errorf("error encoding test-%d: %v\n", i, err)
   387  			continue
   388  		}
   389  
   390  		nrows, ncols := test.want.Dims()
   391  		sz := headerSize + nrows*ncols*sizeFloat64
   392  		if len(buf) != sz {
   393  			t.Errorf("encoded size test-%d: want=%d got=%d\n", i, sz, len(buf))
   394  		}
   395  
   396  		if !bytes.Equal(buf, test.raw) {
   397  			t.Errorf("error encoding test-%d: bytes mismatch.\n got=%q\nwant=%q\n",
   398  				i,
   399  				string(buf),
   400  				string(test.raw),
   401  			)
   402  			continue
   403  		}
   404  	}
   405  }
   406  
   407  func TestVecDenseMarshalTo(t *testing.T) {
   408  	t.Parallel()
   409  	for i, test := range vectorData {
   410  		buf := new(bytes.Buffer)
   411  		n, err := test.want.MarshalBinaryTo(buf)
   412  		if err != nil {
   413  			t.Errorf("error encoding test-%d: %v\n", i, err)
   414  			continue
   415  		}
   416  
   417  		nrows, ncols := test.want.Dims()
   418  		sz := headerSize + nrows*ncols*sizeFloat64
   419  		if n != sz {
   420  			t.Errorf("encoded size test-%d: want=%d got=%d\n", i, sz, n)
   421  		}
   422  
   423  		if !bytes.Equal(buf.Bytes(), test.raw) {
   424  			t.Errorf("error encoding test-%d: bytes mismatch.\n got=%q\nwant=%q\n",
   425  				i,
   426  				buf.Bytes(),
   427  				test.raw,
   428  			)
   429  			continue
   430  		}
   431  	}
   432  }
   433  
   434  func TestVecDenseUnmarshal(t *testing.T) {
   435  	t.Parallel()
   436  	for i, test := range vectorData {
   437  		var v VecDense
   438  		err := v.UnmarshalBinary(test.raw)
   439  		if err != nil {
   440  			if err != test.err {
   441  				t.Errorf("error decoding test-%d: %v\n", i, err)
   442  			}
   443  			continue
   444  		}
   445  		if !test.eq(&v, test.want) {
   446  			t.Errorf("error decoding test-%d: values differ.\n got=%v\nwant=%v\n",
   447  				i,
   448  				&v,
   449  				test.want,
   450  			)
   451  		}
   452  	}
   453  }
   454  
   455  func TestVecDenseUnmarshalFrom(t *testing.T) {
   456  	t.Parallel()
   457  	for i, test := range vectorData {
   458  		var v VecDense
   459  		buf := bytes.NewReader(test.raw)
   460  		n, err := v.UnmarshalBinaryFrom(buf)
   461  		if err != nil {
   462  			if err != test.err {
   463  				t.Errorf("error decoding test-%d: %v\n", i, err)
   464  			}
   465  			continue
   466  		}
   467  		if n != len(test.raw) {
   468  			t.Errorf("error decoding test-%d: lengths differ.\n got=%d\nwant=%d\n",
   469  				i,
   470  				n,
   471  				len(test.raw),
   472  			)
   473  		}
   474  		if !test.eq(&v, test.want) {
   475  			t.Errorf("error decoding test-%d: values differ.\n got=%v\nwant=%v\n",
   476  				i,
   477  				&v,
   478  				test.want,
   479  			)
   480  		}
   481  	}
   482  }
   483  
   484  func TestVecDenseUnmarshalFromError(t *testing.T) {
   485  	t.Parallel()
   486  	test := vectorData[1]
   487  	for i, tt := range []struct {
   488  		beg int
   489  		end int
   490  	}{
   491  		{
   492  			beg: 0,
   493  			end: len(test.raw) - 1,
   494  		},
   495  		{
   496  			beg: 0,
   497  			end: len(test.raw) - sizeFloat64,
   498  		},
   499  		{
   500  			beg: 0,
   501  			end: 0,
   502  		},
   503  		{
   504  			beg: 0,
   505  			end: 1,
   506  		},
   507  		{
   508  			beg: 0,
   509  			end: sizeInt64,
   510  		},
   511  		{
   512  			beg: 0,
   513  			end: sizeInt64 - 1,
   514  		},
   515  		{
   516  			beg: 0,
   517  			end: sizeInt64 + 1,
   518  		},
   519  		{
   520  			beg: 0,
   521  			end: sizeInt64 + sizeFloat64 - 1,
   522  		},
   523  		{
   524  			beg: 0,
   525  			end: sizeInt64 + sizeFloat64,
   526  		},
   527  		{
   528  			beg: 0,
   529  			end: sizeInt64 + sizeFloat64 + 1,
   530  		},
   531  	} {
   532  		buf := bytes.NewReader(test.raw[tt.beg:tt.end])
   533  		var v VecDense
   534  		_, err := v.UnmarshalBinaryFrom(buf)
   535  		if err != io.ErrUnexpectedEOF {
   536  			t.Errorf("test #%d: error decoding. got=%v. want=%v\n", i, err, io.ErrUnexpectedEOF)
   537  		}
   538  	}
   539  }
   540  
   541  func TestVecDenseIORoundTrip(t *testing.T) {
   542  	t.Parallel()
   543  	for i, test := range vectorData {
   544  		buf, err := test.want.MarshalBinary()
   545  		if err != nil {
   546  			t.Errorf("error encoding test #%d: %v\n", i, err)
   547  		}
   548  
   549  		var got VecDense
   550  		err = got.UnmarshalBinary(buf)
   551  		if err != nil {
   552  			if err != test.err {
   553  				t.Errorf("error decoding test #%d: %v\n", i, err)
   554  			}
   555  			continue
   556  		}
   557  		if !test.eq(&got, test.want) {
   558  			t.Errorf("r/w test #%d failed\n got=%#v\nwant=%#v\n", i, &got, test.want)
   559  		}
   560  
   561  		wbuf := new(bytes.Buffer)
   562  		_, err = test.want.MarshalBinaryTo(wbuf)
   563  		if err != nil {
   564  			t.Errorf("error encoding test #%d: %v\n", i, err)
   565  		}
   566  
   567  		if !bytes.Equal(buf, wbuf.Bytes()) {
   568  			t.Errorf("test #%d encoding via MarshalBinary and MarshalBinaryTo differ:\nwith-stream: %q\n  no-stream: %q\n",
   569  				i, wbuf.Bytes(), buf,
   570  			)
   571  		}
   572  
   573  		var wgot VecDense
   574  		_, err = wgot.UnmarshalBinaryFrom(wbuf)
   575  		if err != nil {
   576  			t.Errorf("error decoding test #%d: %v\n", i, err)
   577  		}
   578  
   579  		if !test.eq(&wgot, test.want) {
   580  			t.Errorf("r/w test #%d failed\n got=%#v\nwant=%#v\n", i, &wgot, test.want)
   581  		}
   582  	}
   583  }
   584  
   585  func BenchmarkMarshalDense10(b *testing.B)    { marshalBinaryBenchDense(b, 10) }
   586  func BenchmarkMarshalDense100(b *testing.B)   { marshalBinaryBenchDense(b, 100) }
   587  func BenchmarkMarshalDense1000(b *testing.B)  { marshalBinaryBenchDense(b, 1000) }
   588  func BenchmarkMarshalDense10000(b *testing.B) { marshalBinaryBenchDense(b, 10000) }
   589  
   590  func marshalBinaryBenchDense(b *testing.B, size int) {
   591  	data := make([]float64, size)
   592  	for i := range data {
   593  		data[i] = float64(i)
   594  	}
   595  	m := NewDense(1, size, data)
   596  	b.ResetTimer()
   597  
   598  	for n := 0; n < b.N; n++ {
   599  		_, err := m.MarshalBinary()
   600  		if err != nil {
   601  			b.Fatalf("unexpected error: %v", err)
   602  		}
   603  	}
   604  }
   605  
   606  func BenchmarkUnmarshalDense10(b *testing.B)    { unmarshalBinaryBenchDense(b, 10) }
   607  func BenchmarkUnmarshalDense100(b *testing.B)   { unmarshalBinaryBenchDense(b, 100) }
   608  func BenchmarkUnmarshalDense1000(b *testing.B)  { unmarshalBinaryBenchDense(b, 1000) }
   609  func BenchmarkUnmarshalDense10000(b *testing.B) { unmarshalBinaryBenchDense(b, 10000) }
   610  
   611  func unmarshalBinaryBenchDense(b *testing.B, size int) {
   612  	data := make([]float64, size)
   613  	for i := range data {
   614  		data[i] = float64(i)
   615  	}
   616  	buf, err := NewDense(1, size, data).MarshalBinary()
   617  	if err != nil {
   618  		b.Fatalf("error creating binary buffer (size=%d): %v\n", size, err)
   619  	}
   620  	b.ResetTimer()
   621  
   622  	for n := 0; n < b.N; n++ {
   623  		var m Dense
   624  		err := m.UnmarshalBinary(buf)
   625  		if err != nil {
   626  			b.Fatalf("unexpected error: %v", err)
   627  		}
   628  	}
   629  }
   630  
   631  func BenchmarkMarshalToDense10(b *testing.B)    { marshalBinaryToBenchDense(b, 10) }
   632  func BenchmarkMarshalToDense100(b *testing.B)   { marshalBinaryToBenchDense(b, 100) }
   633  func BenchmarkMarshalToDense1000(b *testing.B)  { marshalBinaryToBenchDense(b, 1000) }
   634  func BenchmarkMarshalToDense10000(b *testing.B) { marshalBinaryToBenchDense(b, 10000) }
   635  
   636  func marshalBinaryToBenchDense(b *testing.B, size int) {
   637  	data := make([]float64, size)
   638  	for i := range data {
   639  		data[i] = float64(i)
   640  	}
   641  	m := NewDense(1, size, data)
   642  	w := ioutil.Discard
   643  	b.ResetTimer()
   644  
   645  	for n := 0; n < b.N; n++ {
   646  		_, err := m.MarshalBinaryTo(w)
   647  		if err != nil {
   648  			b.Fatalf("unexpected error: %v", err)
   649  		}
   650  	}
   651  }
   652  
   653  type readerTest struct {
   654  	buf []byte
   655  	pos int
   656  }
   657  
   658  func (r *readerTest) Read(data []byte) (int, error) {
   659  	n := copy(data, r.buf[r.pos:r.pos+len(data)])
   660  	r.pos += n
   661  	return n, nil
   662  }
   663  
   664  func (r *readerTest) reset() {
   665  	r.pos = 0
   666  }
   667  
   668  func BenchmarkUnmarshalFromDense10(b *testing.B)    { unmarshalBinaryFromBenchDense(b, 10) }
   669  func BenchmarkUnmarshalFromDense100(b *testing.B)   { unmarshalBinaryFromBenchDense(b, 100) }
   670  func BenchmarkUnmarshalFromDense1000(b *testing.B)  { unmarshalBinaryFromBenchDense(b, 1000) }
   671  func BenchmarkUnmarshalFromDense10000(b *testing.B) { unmarshalBinaryFromBenchDense(b, 10000) }
   672  
   673  func unmarshalBinaryFromBenchDense(b *testing.B, size int) {
   674  	data := make([]float64, size)
   675  	for i := range data {
   676  		data[i] = float64(i)
   677  	}
   678  	buf, err := NewDense(1, size, data).MarshalBinary()
   679  	if err != nil {
   680  		b.Fatalf("error creating binary buffer (size=%d): %v\n", size, err)
   681  	}
   682  	r := &readerTest{buf: buf}
   683  	b.ResetTimer()
   684  
   685  	for n := 0; n < b.N; n++ {
   686  		var m Dense
   687  		_, err := m.UnmarshalBinaryFrom(r)
   688  		if err != nil {
   689  			b.Fatalf("unexpected error: %v", err)
   690  		}
   691  		r.reset()
   692  	}
   693  }
   694  
   695  func BenchmarkMarshalVecDense10(b *testing.B)    { marshalBinaryBenchVecDense(b, 10) }
   696  func BenchmarkMarshalVecDense100(b *testing.B)   { marshalBinaryBenchVecDense(b, 100) }
   697  func BenchmarkMarshalVecDense1000(b *testing.B)  { marshalBinaryBenchVecDense(b, 1000) }
   698  func BenchmarkMarshalVecDense10000(b *testing.B) { marshalBinaryBenchVecDense(b, 10000) }
   699  
   700  func marshalBinaryBenchVecDense(b *testing.B, size int) {
   701  	data := make([]float64, size)
   702  	for i := range data {
   703  		data[i] = float64(i)
   704  	}
   705  	vec := NewVecDense(size, data)
   706  	b.ResetTimer()
   707  
   708  	for n := 0; n < b.N; n++ {
   709  		_, err := vec.MarshalBinary()
   710  		if err != nil {
   711  			b.Fatalf("unexpected error: %v", err)
   712  		}
   713  	}
   714  }
   715  
   716  func BenchmarkUnmarshalVecDense10(b *testing.B)    { unmarshalBinaryBenchVecDense(b, 10) }
   717  func BenchmarkUnmarshalVecDense100(b *testing.B)   { unmarshalBinaryBenchVecDense(b, 100) }
   718  func BenchmarkUnmarshalVecDense1000(b *testing.B)  { unmarshalBinaryBenchVecDense(b, 1000) }
   719  func BenchmarkUnmarshalVecDense10000(b *testing.B) { unmarshalBinaryBenchVecDense(b, 10000) }
   720  
   721  func unmarshalBinaryBenchVecDense(b *testing.B, size int) {
   722  	data := make([]float64, size)
   723  	for i := range data {
   724  		data[i] = float64(i)
   725  	}
   726  	buf, err := NewVecDense(size, data).MarshalBinary()
   727  	if err != nil {
   728  		b.Fatalf("error creating binary buffer (size=%d): %v\n", size, err)
   729  	}
   730  	b.ResetTimer()
   731  
   732  	for n := 0; n < b.N; n++ {
   733  		var vec VecDense
   734  		err := vec.UnmarshalBinary(buf)
   735  		if err != nil {
   736  			b.Fatalf("unexpected error: %v", err)
   737  		}
   738  	}
   739  }
   740  
   741  func BenchmarkMarshalToVecDense10(b *testing.B)    { marshalBinaryToBenchVecDense(b, 10) }
   742  func BenchmarkMarshalToVecDense100(b *testing.B)   { marshalBinaryToBenchVecDense(b, 100) }
   743  func BenchmarkMarshalToVecDense1000(b *testing.B)  { marshalBinaryToBenchVecDense(b, 1000) }
   744  func BenchmarkMarshalToVecDense10000(b *testing.B) { marshalBinaryToBenchVecDense(b, 10000) }
   745  
   746  func marshalBinaryToBenchVecDense(b *testing.B, size int) {
   747  	data := make([]float64, size)
   748  	for i := range data {
   749  		data[i] = float64(i)
   750  	}
   751  	vec := NewVecDense(size, data)
   752  	w := ioutil.Discard
   753  	b.ResetTimer()
   754  
   755  	for n := 0; n < b.N; n++ {
   756  		_, err := vec.MarshalBinaryTo(w)
   757  		if err != nil {
   758  			b.Fatalf("unexpected error: %v", err)
   759  		}
   760  	}
   761  }
   762  
   763  func BenchmarkUnmarshalFromVecDense10(b *testing.B)    { unmarshalBinaryFromBenchVecDense(b, 10) }
   764  func BenchmarkUnmarshalFromVecDense100(b *testing.B)   { unmarshalBinaryFromBenchVecDense(b, 100) }
   765  func BenchmarkUnmarshalFromVecDense1000(b *testing.B)  { unmarshalBinaryFromBenchVecDense(b, 1000) }
   766  func BenchmarkUnmarshalFromVecDense10000(b *testing.B) { unmarshalBinaryFromBenchVecDense(b, 10000) }
   767  
   768  func unmarshalBinaryFromBenchVecDense(b *testing.B, size int) {
   769  	data := make([]float64, size)
   770  	for i := range data {
   771  		data[i] = float64(i)
   772  	}
   773  	buf, err := NewVecDense(size, data).MarshalBinary()
   774  	if err != nil {
   775  		b.Fatalf("error creating binary buffer (size=%d): %v\n", size, err)
   776  	}
   777  	r := &readerTest{buf: buf}
   778  	b.ResetTimer()
   779  
   780  	for n := 0; n < b.N; n++ {
   781  		var vec VecDense
   782  		_, err := vec.UnmarshalBinaryFrom(r)
   783  		if err != nil {
   784  			b.Fatalf("unexpected error: %v", err)
   785  		}
   786  		r.reset()
   787  	}
   788  }