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 }