github.com/gopherd/gonum@v0.0.4/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 "github.com/gopherd/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 }