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