pytorch

Форк
0
/
test_serialization.py 
4103 строки · 266.0 Кб
1
# Owner(s): ["module: serialization"]
2

3
import torch
4
import unittest
5
import io
6
import tempfile
7
import os
8
import gc
9
import sys
10
import zipfile
11
import warnings
12
import gzip
13
import copy
14
import pickle
15
import shutil
16
import pathlib
17
import platform
18
from copy import deepcopy
19
from itertools import product
20

21
from torch._utils_internal import get_file_path_2
22
from torch._utils import _rebuild_tensor
23
from torch.utils._import_utils import import_dill
24
from torch.serialization import check_module_version_greater_or_equal, get_default_load_endianness, \
25
    set_default_load_endianness, LoadEndianness
26

27
from torch.testing._internal.common_utils import (
28
    IS_FILESYSTEM_UTF8_ENCODING, TemporaryDirectoryName,
29
    TestCase, IS_WINDOWS, TEST_DILL, run_tests, download_file, BytesIOContext, TemporaryFileName,
30
    parametrize, instantiate_parametrized_tests, AlwaysWarnTypedStorageRemoval)
31
from torch.testing._internal.common_device_type import instantiate_device_type_tests
32
from torch.testing._internal.common_dtype import all_types_and_complex_and
33

34
# These tests were all copied from `test/test_torch.py` at some point, so see
35
# the actual blame, see this revision
36
# https://github.com/pytorch/pytorch/blame/9a2691f2fc948b9792686085b493c61793c2de30/test/test_torch.py
37

38
dill = import_dill()
39
HAS_DILL_AT_LEAST_0_3_1 = dill is not None and check_module_version_greater_or_equal(dill, (0, 3, 1))
40

41
can_retrieve_source = True
42
with warnings.catch_warnings(record=True) as warns:
43
    with tempfile.NamedTemporaryFile() as checkpoint:
44
        x = torch.save(torch.nn.Module(), checkpoint)
45
        for warn in warns:
46
            if "Couldn't retrieve source code" in warn.message.args[0]:
47
                can_retrieve_source = False
48
                break
49

50

51
class FilelikeMock:
52
    def __init__(self, data, has_fileno=True, has_readinto=False):
53
        if has_readinto:
54
            self.readinto = self.readinto_opt
55
        if has_fileno:
56
            # Python 2's StringIO.StringIO has no fileno attribute.
57
            # This is used to test that.
58
            self.fileno = self.fileno_opt
59

60
        self.calls = set()
61
        self.bytesio = io.BytesIO(data)
62

63
        def trace(fn, name):
64
            def result(*args, **kwargs):
65
                self.calls.add(name)
66
                return fn(*args, **kwargs)
67
            return result
68

69
        for attr in ['read', 'readline', 'seek', 'tell', 'write', 'flush']:
70
            traced_fn = trace(getattr(self.bytesio, attr), attr)
71
            setattr(self, attr, traced_fn)
72

73
    def fileno_opt(self):
74
        raise io.UnsupportedOperation('Not a real file')
75

76
    def readinto_opt(self, view):
77
        self.calls.add('readinto')
78
        return self.bytesio.readinto(view)
79

80
    def was_called(self, name):
81
        return name in self.calls
82

83

84
class SerializationMixin:
85
    def _test_serialization_data(self):
86
        a = [torch.randn(5, 5).float() for i in range(2)]
87
        b = [a[i % 2] for i in range(4)]  # 0-3
88
        b += [a[0].storage()]  # 4
89
        b += [a[0].reshape(-1)[1:4].storage()]  # 5
90
        b += [torch.arange(1, 11).int()]  # 6
91
        t1 = torch.FloatTensor().set_(a[0].reshape(-1)[1:4].clone().storage(), 0, (3,), (1,))
92
        t2 = torch.FloatTensor().set_(a[0].reshape(-1)[1:4].clone().storage(), 0, (3,), (1,))
93
        b += [(t1.storage(), t1.storage(), t2.storage())]  # 7
94
        b += [a[0].reshape(-1)[0:2].storage()]  # 8
95
        return b
96

97
    def _test_serialization_assert(self, b, c):
98
        self.assertEqual(b, c, atol=0, rtol=0)
99
        self.assertTrue(isinstance(c[0], torch.FloatTensor))
100
        self.assertTrue(isinstance(c[1], torch.FloatTensor))
101
        self.assertTrue(isinstance(c[2], torch.FloatTensor))
102
        self.assertTrue(isinstance(c[3], torch.FloatTensor))
103
        self.assertTrue(isinstance(c[4], torch.storage.TypedStorage))
104
        self.assertEqual(c[4].dtype, torch.float)
105
        c[0].fill_(10)
106
        self.assertEqual(c[0], c[2], atol=0, rtol=0)
107
        self.assertEqual(c[4], torch.FloatStorage(25).fill_(10), atol=0, rtol=0)
108
        c[1].fill_(20)
109
        self.assertEqual(c[1], c[3], atol=0, rtol=0)
110
        # I have to do it in this roundabout fashion, because there's no
111
        # way to slice storages
112
        for i in range(4):
113
            self.assertEqual(c[4][i + 1], c[5][i])
114

115
        # check that serializing the same storage view object unpickles
116
        # it as one object not two (and vice versa)
117
        views = c[7]
118
        self.assertEqual(views[0]._cdata, views[1]._cdata)
119
        self.assertEqual(views[0], views[2])
120
        self.assertNotEqual(views[0]._cdata, views[2]._cdata)
121

122
        rootview = c[8]
123
        self.assertEqual(rootview.data_ptr(), c[0].data_ptr())
124

125
    def test_serialization_zipfile_utils(self):
126
        data = {
127
            'a': b'12039810948234589',
128
            'b': b'1239081209484958',
129
            'c/d': b'94589480984058'
130
        }
131

132
        def test(name_or_buffer):
133
            with torch.serialization._open_zipfile_writer(name_or_buffer) as zip_file:
134
                for key in data:
135
                    zip_file.write_record(key, data[key], len(data[key]))
136

137
            if hasattr(name_or_buffer, 'seek'):
138
                name_or_buffer.seek(0)
139

140
            with torch.serialization._open_zipfile_reader(name_or_buffer) as zip_file:
141
                for key in data:
142
                    actual = zip_file.get_record(key)
143
                    expected = data[key]
144
                    self.assertEqual(expected, actual)
145

146
        with tempfile.NamedTemporaryFile() as f:
147
            test(f)
148

149
        with TemporaryFileName() as fname:
150
            test(fname)
151

152
        test(io.BytesIO())
153

154
    def _test_serialization(self, weights_only):
155
        # Test serialization with a real file
156
        b = self._test_serialization_data()
157
        with tempfile.NamedTemporaryFile() as f:
158
            torch.save(b, f)
159
            f.seek(0)
160
            c = torch.load(f, weights_only=weights_only)
161
            self._test_serialization_assert(b, c)
162
        with TemporaryFileName() as fname:
163
            torch.save(b, fname)
164
            c = torch.load(fname, weights_only=weights_only)
165
            self._test_serialization_assert(b, c)
166
        # test non-ascii encoding of bytes arrays/strings
167
        # The following bytes are produced by serializing
168
        #   [b'\xc5\xbc\xc4\x85\xc4\x85\xc3\xb3\xc5\xbc\xc4\x85\xc5\xbc', torch.zeros(1, dtype=torch.float), 2]
169
        # in Python 2.7.12 and PyTorch 0.4.1, where the first element contains
170
        # bytes of some utf-8 characters (i.e., `utf8_str.encode('utf-8')`).
171
        serialized = (
172
            b'\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9\x03.'
173
            b'\x80\x02}q\x01(U\x10protocol_versionq\x02M\xe9\x03U\n'
174
            b'type_sizesq\x03}q\x04(U\x03intq\x05K\x04U\x05shortq\x06K\x02U'
175
            b'\x04longq\x07K\x04uU\rlittle_endianq\x08\x88u.\x80\x02]q'
176
            b'\x01(U\x0e\xc5\xbc\xc4\x85\xc4\x85\xc3\xb3\xc5\xbc\xc4\x85'
177
            b'\xc5\xbcq\x02ctorch._utils\n_rebuild_tensor_v2\nq\x03((U'
178
            b'\x07storageq\x04ctorch\nFloatStorage\nq\x05U\x0845640624q'
179
            b'\x06U\x03cpuq\x07\x8a\x01\x01NtQK\x00K\x01\x85K\x01\x85'
180
            b'\x89NtRq\x08K\x02e.\x80\x02]q\x01U\x0845640624q\x02a.\x01\x00'
181
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
182
        )
183
        buf = io.BytesIO(serialized)
184
        utf8_bytes = b'\xc5\xbc\xc4\x85\xc4\x85\xc3\xb3\xc5\xbc\xc4\x85\xc5\xbc'
185
        utf8_str = utf8_bytes.decode('utf-8')
186
        loaded_utf8 = torch.load(buf, weights_only=weights_only, encoding='utf-8')
187
        self.assertEqual(loaded_utf8, [utf8_str, torch.zeros(1, dtype=torch.float), 2])
188
        buf.seek(0)
189
        loaded_bytes = torch.load(buf, weights_only=weights_only, encoding='bytes')
190
        self.assertEqual(loaded_bytes, [utf8_bytes, torch.zeros(1, dtype=torch.float), 2])
191

192
    def test_serialization(self):
193
        self._test_serialization(False)
194

195
    def test_serialization_safe(self):
196
        self._test_serialization(True)
197

198
    def test_serialization_filelike(self):
199
        # Test serialization (load and save) with a filelike object
200
        b = self._test_serialization_data()
201
        with BytesIOContext() as f:
202
            torch.save(b, f)
203
            f.seek(0)
204
            c = torch.load(f)
205
        self._test_serialization_assert(b, c)
206

207
    def test_serialization_fake_zip(self):
208
        data = [
209
            ord('P'),
210
            ord('K'),
211
            5,
212
            6
213
        ]
214
        for i in range(0, 100):
215
            data.append(0)
216
        t = torch.tensor(data, dtype=torch.uint8)
217

218
        with tempfile.NamedTemporaryFile() as f:
219
            torch.save(t, f)
220

221
            # If this check is False for all Python versions (i.e. the fix
222
            # has been backported), this test and torch.serialization._is_zipfile
223
            # can be deleted
224
            self.assertTrue(zipfile.is_zipfile(f))
225
            self.assertFalse(torch.serialization._is_zipfile(f))
226
            f.seek(0)
227
            self.assertEqual(torch.load(f), t)
228

229
    def test_serialization_gzip(self):
230
        # Test serialization with gzip file
231
        b = self._test_serialization_data()
232
        f1 = tempfile.NamedTemporaryFile(delete=False)
233
        f2 = tempfile.NamedTemporaryFile(delete=False)
234
        torch.save(b, f1)
235
        with open(f1.name, 'rb') as f_in, gzip.open(f2.name, 'wb') as f_out:
236
            shutil.copyfileobj(f_in, f_out)
237

238
        with gzip.open(f2.name, 'rb') as f:
239
            c = torch.load(f)
240
        self._test_serialization_assert(b, c)
241

242
    @unittest.skipIf(
243
        not TEST_DILL or HAS_DILL_AT_LEAST_0_3_1,
244
        '"dill" not found or is correct version'
245
    )
246
    def test_serialization_dill_version_not_supported(self):
247
        x = torch.randn(5, 5)
248

249
        with tempfile.NamedTemporaryFile() as f:
250
            with self.assertRaisesRegex(ValueError, 'supports dill >='):
251
                torch.save(x, f, pickle_module=dill)
252
            f.seek(0)
253
            with self.assertRaisesRegex(ValueError, 'supports dill >='):
254
                x2 = torch.load(f, pickle_module=dill, encoding='utf-8')
255

256
    def test_pickle_module(self):
257
        class ThrowingUnpickler(pickle.Unpickler):
258
            def load(self, *args, **kwargs):
259
                raise RuntimeError("rumpelstiltskin")
260

261
        class ThrowingModule:
262
            Unpickler = ThrowingUnpickler
263
            load = ThrowingUnpickler.load
264

265
        x = torch.eye(3)
266
        with tempfile.NamedTemporaryFile() as f:
267
            torch.save(x, f)
268
            f.seek(0)
269
            with self.assertRaisesRegex(RuntimeError, "rumpelstiltskin"):
270
                torch.load(f, pickle_module=ThrowingModule)
271
            f.seek(0)
272
            z = torch.load(f)
273
        self.assertEqual(x, z)
274

275
    @unittest.skipIf(
276
        not TEST_DILL or not HAS_DILL_AT_LEAST_0_3_1,
277
        '"dill" not found or not correct version'
278
    )
279
    def test_serialization_dill(self):
280
        x = torch.randn(5, 5)
281

282
        with tempfile.NamedTemporaryFile() as f:
283
            torch.save(x, f, pickle_module=dill)
284
            f.seek(0)
285
            x2 = torch.load(f, pickle_module=dill, encoding='utf-8')
286
            self.assertIsInstance(x2, type(x))
287
            self.assertEqual(x, x2)
288
            f.seek(0)
289
            x3 = torch.load(f, pickle_module=dill)
290
            self.assertIsInstance(x3, type(x))
291
            self.assertEqual(x, x3)
292

293
    def test_serialization_offset_gzip(self):
294
        a = torch.randn(5, 5)
295
        i = 41
296
        f1 = tempfile.NamedTemporaryFile(delete=False)
297
        f2 = tempfile.NamedTemporaryFile(delete=False)
298
        with open(f1.name, 'wb') as f:
299
            pickle.dump(i, f)
300
            torch.save(a, f)
301
        with open(f1.name, 'rb') as f_in, gzip.open(f2.name, 'wb') as f_out:
302
            shutil.copyfileobj(f_in, f_out)
303

304
        with gzip.open(f2.name, 'rb') as f:
305
            j = pickle.load(f)
306
            b = torch.load(f)
307
        self.assertTrue(torch.equal(a, b))
308
        self.assertEqual(i, j)
309

310
    def _test_serialization_sparse(self, weights_only):
311
        def _test_serialization(conversion):
312
            x = torch.zeros(3, 3)
313
            x[1][1] = 1
314
            x = conversion(x)
315
            with tempfile.NamedTemporaryFile() as f:
316
                torch.save({"tensor": x}, f)
317
                f.seek(0)
318
                y = torch.load(f, weights_only=weights_only)
319
                self.assertEqual(x, y["tensor"], exact_is_coalesced=True)
320
        _test_serialization(lambda x: x.to_sparse())
321
        _test_serialization(lambda x: x.to_sparse_csr())
322
        _test_serialization(lambda x: x.to_sparse_csc())
323
        _test_serialization(lambda x: x.to_sparse_bsr((1, 1)))
324
        _test_serialization(lambda x: x.to_sparse_bsc((1, 1)))
325

326
    def test_serialization_sparse(self):
327
        self._test_serialization(False)
328

329
    def test_serialization_sparse_safe(self):
330
        self._test_serialization(True)
331

332
    def test_serialization_sparse_invalid(self):
333
        x = torch.zeros(3, 3)
334
        x[1][1] = 1
335
        x = x.to_sparse()
336

337
        class TensorSerializationSpoofer:
338
            def __init__(self, tensor):
339
                self.tensor = tensor
340

341
            def __reduce_ex__(self, proto):
342
                invalid_indices = self.tensor._indices().clone()
343
                invalid_indices[0][0] = 3
344
                return (
345
                    torch._utils._rebuild_sparse_tensor,
346
                    (
347
                        self.tensor.layout,
348
                        (
349
                            invalid_indices,
350
                            self.tensor._values(),
351
                            self.tensor.size())))
352

353
        with tempfile.NamedTemporaryFile() as f:
354
            torch.save({"spoofed": TensorSerializationSpoofer(x)}, f)
355
            f.seek(0)
356
            with self.assertRaisesRegex(
357
                    RuntimeError,
358
                    "size is inconsistent with indices"):
359
                y = torch.load(f)
360

361
    def _test_serialization_sparse_compressed_invalid(self,
362
                                                      conversion,
363
                                                      get_compressed_indices,
364
                                                      get_plain_indices):
365
        x = torch.zeros(3, 3)
366
        x[1][1] = 1
367
        x = conversion(x)
368

369
        class TensorSerializationSpoofer:
370
            def __init__(self, tensor):
371
                self.tensor = tensor
372

373
            def __reduce_ex__(self, proto):
374
                invalid_compressed_indices = get_compressed_indices(self.tensor).clone()
375
                invalid_compressed_indices[0] = 3
376
                return (
377
                    torch._utils._rebuild_sparse_tensor,
378
                    (
379
                        self.tensor.layout,
380
                        (
381
                            invalid_compressed_indices,
382
                            get_plain_indices(self.tensor),
383
                            self.tensor.values(),
384
                            self.tensor.size())))
385

386
        if x.layout in {torch.sparse_csr, torch.sparse_bsr}:
387
            compressed_indices_name = 'crow_indices'
388
        else:
389
            compressed_indices_name = 'ccol_indices'
390

391
        with tempfile.NamedTemporaryFile() as f:
392
            torch.save({"spoofed": TensorSerializationSpoofer(x)}, f)
393
            f.seek(0)
394
            with self.assertRaisesRegex(
395
                    RuntimeError,
396
                    f"`{compressed_indices_name}[[]..., 0[]] == 0` is not satisfied."):
397
                y = torch.load(f)
398

399
    def test_serialization_sparse_csr_invalid(self):
400
        self._test_serialization_sparse_compressed_invalid(
401
            torch.Tensor.to_sparse_csr, torch.Tensor.crow_indices, torch.Tensor.col_indices)
402

403
    def test_serialization_sparse_csc_invalid(self):
404
        self._test_serialization_sparse_compressed_invalid(
405
            torch.Tensor.to_sparse_csc, torch.Tensor.ccol_indices, torch.Tensor.row_indices)
406

407
    def test_serialization_sparse_bsr_invalid(self):
408
        self._test_serialization_sparse_compressed_invalid(
409
            lambda x: x.to_sparse_bsr((1, 1)), torch.Tensor.crow_indices, torch.Tensor.col_indices)
410

411
    def test_serialization_sparse_bsc_invalid(self):
412
        self._test_serialization_sparse_compressed_invalid(
413
            lambda x: x.to_sparse_bsc((1, 1)), torch.Tensor.ccol_indices, torch.Tensor.row_indices)
414

415
    def test_serialize_device(self):
416
        device_str = ['cpu', 'cpu:0', 'cuda', 'cuda:0']
417
        device_obj = [torch.device(d) for d in device_str]
418
        for device in device_obj:
419
            device_copied = copy.deepcopy(device)
420
            self.assertEqual(device, device_copied)
421

422
    def _test_serialization_backwards_compat(self, weights_only):
423
        a = [torch.arange(1 + i, 26 + i).view(5, 5).float() for i in range(2)]
424
        b = [a[i % 2] for i in range(4)]
425
        b += [a[0].storage()]
426
        b += [a[0].reshape(-1)[1:4].clone().storage()]
427
        path = download_file('https://download.pytorch.org/test_data/legacy_serialized.pt')
428
        c = torch.load(path, weights_only=weights_only)
429
        self.assertEqual(b, c, atol=0, rtol=0)
430
        self.assertTrue(isinstance(c[0], torch.FloatTensor))
431
        self.assertTrue(isinstance(c[1], torch.FloatTensor))
432
        self.assertTrue(isinstance(c[2], torch.FloatTensor))
433
        self.assertTrue(isinstance(c[3], torch.FloatTensor))
434
        self.assertTrue(isinstance(c[4], torch.storage.TypedStorage))
435
        self.assertEqual(c[4].dtype, torch.float32)
436
        c[0].fill_(10)
437
        self.assertEqual(c[0], c[2], atol=0, rtol=0)
438
        self.assertEqual(c[4], torch.FloatStorage(25).fill_(10), atol=0, rtol=0)
439
        c[1].fill_(20)
440
        self.assertEqual(c[1], c[3], atol=0, rtol=0)
441

442
        # test some old tensor serialization mechanism
443
        class OldTensorBase:
444
            def __init__(self, new_tensor):
445
                self.new_tensor = new_tensor
446

447
            def __getstate__(self):
448
                return (self.new_tensor.storage(),
449
                        self.new_tensor.storage_offset(),
450
                        tuple(self.new_tensor.size()),
451
                        self.new_tensor.stride())
452

453
        class OldTensorV1(OldTensorBase):
454
            def __reduce__(self):
455
                return (torch.Tensor, (), self.__getstate__())
456

457
        class OldTensorV2(OldTensorBase):
458
            def __reduce__(self):
459
                return (_rebuild_tensor, self.__getstate__())
460

461
        x = torch.randn(30).as_strided([2, 3], [9, 3], 2)
462
        for old_cls in [OldTensorV1, OldTensorV2]:
463
            with tempfile.NamedTemporaryFile() as f:
464
                old_x = old_cls(x)
465
                torch.save(old_x, f)
466
                f.seek(0)
467
                load_x = torch.load(f, weights_only=weights_only)
468
                self.assertEqual(x.storage(), load_x.storage())
469
                self.assertEqual(x.storage_offset(), load_x.storage_offset())
470
                self.assertEqual(x.size(), load_x.size())
471
                self.assertEqual(x.stride(), load_x.stride())
472

473
    def test_serialization_backwards_compat(self):
474
        self._test_serialization_backwards_compat(False)
475

476
    def test_serialization_backwards_compat_safe(self):
477
        self._test_serialization_backwards_compat(True)
478

479
    def test_serialization_save_warnings(self):
480
        with warnings.catch_warnings(record=True) as warns:
481
            with tempfile.NamedTemporaryFile() as checkpoint:
482
                x = torch.save(torch.nn.Linear(2, 3), checkpoint)
483
                self.assertEqual(len(warns), 0)
484

485
    def test_serialization_map_location(self):
486
        test_file_path = download_file('https://download.pytorch.org/test_data/gpu_tensors.pt')
487

488
        def map_location(storage, loc):
489
            return storage
490

491
        def load_bytes():
492
            with open(test_file_path, 'rb') as f:
493
                return io.BytesIO(f.read())
494

495
        fileobject_lambdas = [lambda: test_file_path, load_bytes]
496
        cpu_map_locations = [
497
            map_location,
498
            {'cuda:0': 'cpu'},
499
            'cpu',
500
            torch.device('cpu'),
501
        ]
502
        gpu_0_map_locations = [
503
            {'cuda:0': 'cuda:0'},
504
            'cuda',
505
            'cuda:0',
506
            torch.device('cuda'),
507
            torch.device('cuda', 0)
508
        ]
509
        gpu_last_map_locations = [
510
            f'cuda:{torch.cuda.device_count() - 1}',
511
        ]
512

513
        def check_map_locations(map_locations, tensor_class, intended_device):
514
            for fileobject_lambda in fileobject_lambdas:
515
                for map_location in map_locations:
516
                    tensor = torch.load(fileobject_lambda(), map_location=map_location)
517

518
                    self.assertEqual(tensor.device, intended_device)
519
                    self.assertIsInstance(tensor, tensor_class)
520
                    self.assertEqual(tensor, tensor_class([[1.0, 2.0], [3.0, 4.0]]))
521

522
        check_map_locations(cpu_map_locations, torch.FloatTensor, torch.device('cpu'))
523
        if torch.cuda.is_available():
524
            check_map_locations(gpu_0_map_locations, torch.cuda.FloatTensor, torch.device('cuda', 0))
525
            check_map_locations(
526
                gpu_last_map_locations,
527
                torch.cuda.FloatTensor,
528
                torch.device('cuda', torch.cuda.device_count() - 1)
529
            )
530

531
    @unittest.skipIf(torch.cuda.is_available(), "Testing torch.load on CPU-only machine")
532
    def test_load_nonexistent_device(self):
533
        # Setup: create a serialized file object with a 'cuda:0' restore location
534
        # The following was generated by saving a torch.randn(2, device='cuda') tensor.
535
        serialized = (b'\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9'
536
                      b'\x03.\x80\x02}q\x00(X\x10\x00\x00\x00protocol_versionq'
537
                      b'\x01M\xe9\x03X\r\x00\x00\x00little_endianq\x02\x88X\n'
538
                      b'\x00\x00\x00type_sizesq\x03}q\x04(X\x05\x00\x00\x00shortq'
539
                      b'\x05K\x02X\x03\x00\x00\x00intq\x06K\x04X\x04\x00\x00\x00'
540
                      b'longq\x07K\x04uu.\x80\x02ctorch._utils\n_rebuild_tensor_v2'
541
                      b'\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nFloatStorage'
542
                      b'\nq\x02X\x0e\x00\x00\x0094919395964320q\x03X\x06\x00\x00'
543
                      b'\x00cuda:0q\x04K\x02Ntq\x05QK\x00K\x02\x85q\x06K\x01\x85q'
544
                      b'\x07\x89Ntq\x08Rq\t.\x80\x02]q\x00X\x0e\x00\x00\x00'
545
                      b'94919395964320q\x01a.\x02\x00\x00\x00\x00\x00\x00\x00\xbb'
546
                      b'\x1f\x82\xbe\xea\x81\xd1>')
547

548
        buf = io.BytesIO(serialized)
549

550
        error_msg = r'Attempting to deserialize object on a CUDA device'
551
        with self.assertRaisesRegex(RuntimeError, error_msg):
552
            _ = torch.load(buf)
553

554
    @unittest.skipIf((3, 8, 0) <= sys.version_info < (3, 8, 2), "See https://bugs.python.org/issue39681")
555
    def test_serialization_filelike_api_requirements(self):
556
        filemock = FilelikeMock(b'', has_readinto=False)
557
        tensor = torch.randn(3, 5)
558
        torch.save(tensor, filemock)
559
        expected_superset = {'write', 'flush'}
560
        self.assertTrue(expected_superset.issuperset(filemock.calls))
561

562
        # Reset between save and load
563
        filemock.seek(0)
564
        filemock.calls.clear()
565

566
        _ = torch.load(filemock)
567
        expected_superset = {'read', 'readline', 'seek', 'tell'}
568
        self.assertTrue(expected_superset.issuperset(filemock.calls))
569

570
    def _test_serialization_filelike(self, tensor, mock, desc):
571
        f = mock(b'')
572
        torch.save(tensor, f)
573
        f.seek(0)
574
        data = mock(f.read())
575

576
        msg = 'filelike serialization with {}'
577

578
        b = torch.load(data)
579
        self.assertTrue(torch.equal(tensor, b), msg.format(desc))
580

581
    @unittest.skipIf((3, 8, 0) <= sys.version_info < (3, 8, 2), "See https://bugs.python.org/issue39681")
582
    def test_serialization_filelike_missing_attrs(self):
583
        # Test edge cases where filelike objects are missing attributes.
584
        # The Python io docs suggests that these attributes should really exist
585
        # and throw io.UnsupportedOperation, but that isn't always the case.
586
        mocks = [
587
            ('no readinto', lambda x: FilelikeMock(x)),
588
            ('has readinto', lambda x: FilelikeMock(x, has_readinto=True)),
589
            ('no fileno', lambda x: FilelikeMock(x, has_fileno=False)),
590
        ]
591

592
        to_serialize = torch.randn(3, 10)
593
        for desc, mock in mocks:
594
            self._test_serialization_filelike(to_serialize, mock, desc)
595

596
    @unittest.skipIf((3, 8, 0) <= sys.version_info < (3, 8, 2), "See https://bugs.python.org/issue39681")
597
    def test_serialization_filelike_stress(self):
598
        a = torch.randn(11 * (2 ** 9) + 1, 5 * (2 ** 9))
599

600
        # This one should call python read multiple times
601
        self._test_serialization_filelike(a, lambda x: FilelikeMock(x, has_readinto=False),
602
                                          'read() stress test')
603
        self._test_serialization_filelike(a, lambda x: FilelikeMock(x, has_readinto=True),
604
                                          'readinto() stress test')
605

606
    def test_serialization_filelike_uses_readinto(self):
607
        # For maximum effiency, when reading a file-like object,
608
        # ensure the C API calls readinto instead of read.
609
        a = torch.randn(5, 4)
610

611
        f = io.BytesIO()
612
        torch.save(a, f)
613
        f.seek(0)
614
        data = FilelikeMock(f.read(), has_readinto=True)
615

616
        b = torch.load(data)
617
        self.assertTrue(data.was_called('readinto'))
618

619
    def test_serialization_filelike_exceptions(self):
620
        # Try to serialize to buffers that does not have write method
621
        # Or have a malfrormed one, and make sure it does not cause an abort
622
        # See https://github.com/pytorch/pytorch/issues/87997
623
        x = torch.rand(10)
624
        with self.assertRaises(AttributeError):
625
            # Tries to serialize str into tensor
626
            torch.save('foo', x)
627
        x.write = "bar"
628
        x.flush = "baz"
629
        with self.assertRaises(TypeError):
630
            # Tries to serialize str into tensor with write property
631
            torch.save('foo', x)
632
        x.write = str.__add__
633
        x.flush = str.__mul__
634
        with self.assertRaises(TypeError):
635
            # Tries to serialize str into tensor with wrong callable write property
636
            torch.save('foo', x)
637
        s_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
638
        s = torch.CharStorage(s_data)
639
        with self.assertRaises(AttributeError):
640
            # Tries to serialize list into CharStorage
641
            torch.save(s_data, s)
642
        x = torch.randint(10, (3, 3), dtype=torch.float).cpu().numpy()
643
        with self.assertRaises(AttributeError):
644
            # Tries to serialize ndarray into ndarray
645
            torch.save(x, x)
646

647

648
    def test_serialization_storage_slice(self):
649
        # Generated using:
650
        #
651
        # t = torch.zeros(2);
652
        # s1 = t.storage()[:1]
653
        # s2 = t.storage()[1:]
654
        # torch.save((s1, s2), 'foo.ser')
655
        #
656
        # with PyTorch 0.3.1
657
        serialized = (b'\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9\x03'
658
                      b'.\x80\x02}q\x00(X\n\x00\x00\x00type_sizesq\x01}q\x02(X\x03'
659
                      b'\x00\x00\x00intq\x03K\x04X\x05\x00\x00\x00shortq\x04K\x02X'
660
                      b'\x04\x00\x00\x00longq\x05K\x04uX\x10\x00\x00\x00protocol_versionq'
661
                      b'\x06M\xe9\x03X\r\x00\x00\x00little_endianq\x07\x88u.\x80\x02'
662
                      b'(X\x07\x00\x00\x00storageq\x00ctorch\nFloatStorage\nq\x01X\x0e'
663
                      b'\x00\x00\x0094279043900432q\x02X\x03\x00\x00\x00cpuq\x03K\x02'
664
                      b'X\x0e\x00\x00\x0094279029750368q\x04K\x00K\x01\x87q\x05tq\x06'
665
                      b'Q(h\x00h\x01X\x0e\x00\x00\x0094279043900432q\x07h\x03K\x02X'
666
                      b'\x0e\x00\x00\x0094279029750432q\x08K\x01K\x01\x87q\ttq\nQ'
667
                      b'\x86q\x0b.\x80\x02]q\x00X\x0e\x00\x00\x0094279043900432q'
668
                      b'\x01a.\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
669
                      b'\x00\x00\x00\x00')
670

671
        buf = io.BytesIO(serialized)
672
        (s1, s2) = torch.load(buf)
673
        self.assertEqual(s1[0], 0)
674
        self.assertEqual(s2[0], 0)
675
        self.assertEqual(s1.data_ptr() + 4, s2.data_ptr())
676

677
    def test_load_unicode_error_msg(self):
678
        # This Pickle contains a Python 2 module with Unicode data and the
679
        # loading should fail if the user explicitly specifies ascii encoding!
680
        path = download_file('https://download.pytorch.org/test_data/legacy_conv2d.pt')
681
        self.assertRaises(UnicodeDecodeError, lambda: torch.load(path, encoding='ascii'))
682

683
    def test_load_python2_unicode_module(self):
684
        # This Pickle contains some Unicode data!
685
        path = download_file('https://download.pytorch.org/test_data/legacy_conv2d.pt')
686
        with warnings.catch_warnings(record=True) as w:
687
            self.assertIsNotNone(torch.load(path))
688

689
    def test_load_error_msg(self):
690
        expected_err_msg = (".*You can only torch.load from a file that is seekable. " +
691
                            "Please pre-load the data into a buffer like io.BytesIO and " +
692
                            "try to load from it instead.")
693

694
        resource = FilelikeMock(data=b"data")
695
        delattr(resource, "tell")
696
        delattr(resource, "seek")
697
        with self.assertRaisesRegex(AttributeError, expected_err_msg):
698
            torch.load(resource)
699

700
    def test_save_different_dtype_unallocated(self):
701
        devices = ['cpu']
702
        if torch.cuda.is_available():
703
            devices.append('cuda')
704

705
        def save_load_check(a, b):
706
            with io.BytesIO() as f:
707
                torch.save([a, b], f)
708
                f.seek(0)
709
                a_loaded, b_loaded = torch.load(f)
710
            self.assertEqual(a, a_loaded)
711
            self.assertEqual(b, b_loaded)
712

713
        for device, dtype in product(devices, all_types_and_complex_and(torch.half,
714
                                                                        torch.bfloat16, torch.bool)):
715
            a = torch.tensor([], dtype=dtype, device=device)
716

717
            for other_dtype in all_types_and_complex_and(torch.half, torch.bfloat16, torch.bool):
718
                s = torch.TypedStorage(
719
                    wrap_storage=a.storage().untyped(),
720
                    dtype=other_dtype)
721
                save_load_check(a, s)
722
                save_load_check(a.storage(), s)
723
                b = torch.tensor([], dtype=other_dtype, device=device)
724
                save_load_check(a, b)
725

726
    def test_save_different_dtype_error(self):
727
        error_msg = r"Cannot save multiple tensors or storages that view the same data as different types"
728

729
        devices = ['cpu']
730
        if torch.cuda.is_available():
731
            devices.append('cuda')
732

733
        for device in devices:
734
            a = torch.randn(10, dtype=torch.complex128, device=device)
735
            f = io.BytesIO()
736

737
            with self.assertRaisesRegex(RuntimeError, error_msg):
738
                torch.save([a, a.imag], f)
739

740
            with self.assertRaisesRegex(RuntimeError, error_msg):
741
                torch.save([a.storage(), a.imag], f)
742

743
            with self.assertRaisesRegex(RuntimeError, error_msg):
744
                torch.save([a, a.imag.storage()], f)
745

746
            with self.assertRaisesRegex(RuntimeError, error_msg):
747
                torch.save([a.storage(), a.imag.storage()], f)
748

749
            a = torch.randn(10, device=device)
750
            s_bytes = torch.TypedStorage(
751
                wrap_storage=a.storage().untyped(),
752
                dtype=torch.uint8)
753

754
            with self.assertRaisesRegex(RuntimeError, error_msg):
755
                torch.save([a, s_bytes], f)
756

757
            with self.assertRaisesRegex(RuntimeError, error_msg):
758
                torch.save([a.storage(), s_bytes], f)
759

760
    def test_safe_load_basic_types(self):
761
        with tempfile.NamedTemporaryFile() as f:
762
            data = {"int": 123, "str": "world", "float": 3.14, "bool": False}
763
            torch.save(data, f)
764
            f.seek(0)
765
            loaded_data = torch.load(f, weights_only=True)
766
            self.assertEqual(data, loaded_data)
767

768

769
class serialization_method:
770
    def __init__(self, use_zip):
771
        self.use_zip = use_zip
772
        self.torch_save = torch.save
773

774
    def __enter__(self, *args, **kwargs):
775
        def wrapper(*args, **kwargs):
776
            if '_use_new_zipfile_serialization' in kwargs:
777
                raise RuntimeError("Cannot set method manually")
778
            kwargs['_use_new_zipfile_serialization'] = self.use_zip
779
            return self.torch_save(*args, **kwargs)
780

781
        torch.save = wrapper
782

783
    def __exit__(self, *args, **kwargs):
784
        torch.save = self.torch_save
785

786
@unittest.skipIf(IS_WINDOWS, "NamedTemporaryFile on windows")
787
class TestBothSerialization(TestCase):
788
    @parametrize("weights_only", (True, False))
789
    def test_serialization_new_format_old_format_compat(self, device, weights_only):
790
        x = [torch.ones(200, 200, device=device) for i in range(30)]
791

792
        def test(f_new, f_old):
793
            torch.save(x, f_new, _use_new_zipfile_serialization=True)
794
            f_new.seek(0)
795
            x_new_load = torch.load(f_new, weights_only=weights_only)
796
            self.assertEqual(x, x_new_load)
797

798
            torch.save(x, f_old, _use_new_zipfile_serialization=False)
799
            f_old.seek(0)
800
            x_old_load = torch.load(f_old, weights_only=weights_only)
801
            self.assertEqual(x_old_load, x_new_load)
802

803
        with AlwaysWarnTypedStorageRemoval(True), warnings.catch_warnings(record=True) as w:
804
            with tempfile.NamedTemporaryFile() as f_new, tempfile.NamedTemporaryFile() as f_old:
805
                test(f_new, f_old)
806
            self.assertTrue(len(w) == 0, msg=f"Expected no warnings but got {[str(x) for x in w]}")
807

808

809
class TestOldSerialization(TestCase, SerializationMixin):
810
    # unique_key is necessary because on Python 2.7, if a warning passed to
811
    # the warning module is the same, it is not raised again.
812
    def _test_serialization_container(self, unique_key, filecontext_lambda):
813

814
        tmpmodule_name = f'tmpmodule{unique_key}'
815

816
        def import_module(name, filename):
817
            import importlib.util
818
            spec = importlib.util.spec_from_file_location(name, filename)
819
            module = importlib.util.module_from_spec(spec)
820
            spec.loader.exec_module(module)
821
            sys.modules[module.__name__] = module
822
            return module
823

824
        with filecontext_lambda() as checkpoint:
825
            fname = get_file_path_2(os.path.dirname(os.path.dirname(torch.__file__)), 'torch', 'testing',
826
                                    '_internal', 'data', 'network1.py')
827
            module = import_module(tmpmodule_name, fname)
828
            torch.save(module.Net(), checkpoint)
829

830
            # First check that the checkpoint can be loaded without warning about unsafe loads
831
            checkpoint.seek(0)
832
            with warnings.catch_warnings(record=True) as w:
833
                loaded = torch.load(checkpoint)
834
                self.assertTrue(isinstance(loaded, module.Net))
835
                if can_retrieve_source:
836
                    self.assertEqual(len(w), 0)
837

838
            # Replace the module with different source
839
            fname = get_file_path_2(os.path.dirname(os.path.dirname(torch.__file__)), 'torch', 'testing',
840
                                    '_internal', 'data', 'network2.py')
841
            module = import_module(tmpmodule_name, fname)
842
            checkpoint.seek(0)
843
            with warnings.catch_warnings(record=True) as w:
844
                loaded = torch.load(checkpoint)
845
                self.assertTrue(isinstance(loaded, module.Net))
846
                if can_retrieve_source:
847
                    self.assertEqual(len(w), 1)
848
                    self.assertTrue(w[0].category, 'SourceChangeWarning')
849

850
    def test_serialization_container(self):
851
        self._test_serialization_container('file', tempfile.NamedTemporaryFile)
852

853
    def test_serialization_container_filelike(self):
854
        self._test_serialization_container('filelike', BytesIOContext)
855

856
    def test_serialization_offset(self):
857
        a = torch.randn(5, 5)
858
        b = torch.randn(1024, 1024, 512, dtype=torch.float32)
859
        m = torch.nn.Conv2d(1, 1, (1, 3))
860
        i, j = 41, 43
861
        with tempfile.NamedTemporaryFile() as f:
862
            pickle.dump(i, f)
863
            torch.save(a, f)
864
            pickle.dump(j, f)
865
            torch.save(b, f)
866
            torch.save(m, f)
867
            self.assertTrue(f.tell() > 2 * 1024 * 1024 * 1024)
868
            f.seek(0)
869
            i_loaded = pickle.load(f)
870
            a_loaded = torch.load(f)
871
            j_loaded = pickle.load(f)
872
            b_loaded = torch.load(f)
873
            m_loaded = torch.load(f)
874
        self.assertTrue(torch.equal(a, a_loaded))
875
        self.assertTrue(torch.equal(b, b_loaded))
876
        self.assertTrue(m.kernel_size == m_loaded.kernel_size)
877
        self.assertEqual(i, i_loaded)
878
        self.assertEqual(j, j_loaded)
879

880
    @parametrize('weights_only', (True, False))
881
    def test_serialization_offset_filelike(self, weights_only):
882
        a = torch.randn(5, 5)
883
        b = torch.randn(1024, 1024, 512, dtype=torch.float32)
884
        i, j = 41, 43
885
        with BytesIOContext() as f:
886
            pickle.dump(i, f)
887
            torch.save(a, f)
888
            pickle.dump(j, f)
889
            torch.save(b, f)
890
            self.assertTrue(f.tell() > 2 * 1024 * 1024 * 1024)
891
            f.seek(0)
892
            i_loaded = pickle.load(f)
893
            a_loaded = torch.load(f, weights_only=weights_only)
894
            j_loaded = pickle.load(f)
895
            b_loaded = torch.load(f, weights_only=weights_only)
896
        self.assertTrue(torch.equal(a, a_loaded))
897
        self.assertTrue(torch.equal(b, b_loaded))
898
        self.assertEqual(i, i_loaded)
899
        self.assertEqual(j, j_loaded)
900

901
    def run(self, *args, **kwargs):
902
        with serialization_method(use_zip=False):
903
            return super().run(*args, **kwargs)
904

905

906
class TestSerialization(TestCase, SerializationMixin):
907
    @parametrize('weights_only', (True, False))
908
    def test_serialization_zipfile(self, weights_only):
909
        data = self._test_serialization_data()
910

911
        def test(name_or_buffer):
912
            torch.save(data, name_or_buffer)
913

914
            if hasattr(name_or_buffer, 'seek'):
915
                name_or_buffer.seek(0)
916

917
            result = torch.load(name_or_buffer, weights_only=weights_only)
918
            self.assertEqual(result, data)
919

920
        with tempfile.NamedTemporaryFile() as f:
921
            test(f)
922

923
        with TemporaryFileName() as fname:
924
            test(fname)
925

926
        if IS_FILESYSTEM_UTF8_ENCODING:
927
            with TemporaryDirectoryName(suffix='非ASCIIパス') as dname:
928
                with TemporaryFileName(dir=dname) as fname:
929
                    test(fname)
930

931
        test(io.BytesIO())
932

933
    def test_serialization_zipfile_actually_jit(self):
934
        with tempfile.NamedTemporaryFile() as f:
935
            torch.jit.save(torch.jit.script(torch.nn.Linear(3, 4)), f)
936
            f.seek(0)
937
            torch.load(f)
938

939
    # Ensure large zip64 serialization works properly
940
    def test_serialization_2gb_file(self):
941
        # Run GC to clear up as much memory as possible before running this test
942
        gc.collect()
943
        big_model = torch.nn.Conv2d(20000, 3200, kernel_size=3)
944

945
        with BytesIOContext() as f:
946
            torch.save(big_model.state_dict(), f)
947
            f.seek(0)
948
            state = torch.load(f)
949

950
    @parametrize('weights_only', (True, False))
951
    def test_pathlike_serialization(self, weights_only):
952
        model = torch.nn.Conv2d(20, 3200, kernel_size=3)
953

954
        with TemporaryFileName() as fname:
955
            path = pathlib.Path(fname)
956
            torch.save(model.state_dict(), path)
957
            torch.load(path, weights_only=weights_only)
958

959
    @parametrize('weights_only', (True, False))
960
    def test_meta_serialization(self, weights_only):
961
        big_model = torch.nn.Conv2d(20000, 320000, kernel_size=3, device='meta')
962

963
        with BytesIOContext() as f:
964
            torch.save(big_model.state_dict(), f)
965
            f.seek(0)
966
            state = torch.load(f, weights_only=weights_only)
967

968
        self.assertEqual(state['weight'].size(), big_model.weight.size())
969

970
    def test_lr_scheduler_serialization(self):
971
        sgd = torch.optim.SGD([
972
            torch.tensor(torch.randn(100, 100, 2000), requires_grad=True)
973
        ], lr=0.1, momentum=0.9)
974
        lr_scheduler = torch.optim.lr_scheduler.OneCycleLR(sgd, 6.0, total_steps=10)
975

976
        with BytesIOContext() as f:
977
            torch.save(lr_scheduler.state_dict(), f)
978
            f.seek(0, os.SEEK_END)
979
            size = f.tell()
980
            f.seek(0)
981
            lr_scheduler_state = torch.load(f)
982

983
        self.assertEqual(lr_scheduler_state['base_lrs'], lr_scheduler.base_lrs)
984
        self.assertFalse(hasattr(lr_scheduler_state['anneal_func'], '__self__'))  # check method is not bound
985
        self.assertTrue(size < 1024 * 1024)  # Must be less than 1MB
986

987
    def test_serialization_python_attr(self):
988
        def _test_save_load_attr(t):
989
            t.foo = 'foo'
990
            t.pi = 3.14
991

992
            with BytesIOContext() as f:
993
                torch.save(t, f)
994
                f.seek(0)
995
                loaded_t = torch.load(f)
996

997
            self.assertEqual(t, loaded_t)
998
            self.assertEqual(t.foo, loaded_t.foo)
999
            self.assertEqual(t.pi, loaded_t.pi)
1000

1001
        t = torch.zeros(3, 3)
1002
        _test_save_load_attr(t)
1003
        _test_save_load_attr(torch.nn.Parameter(t))
1004

1005
    def test_weights_only_assert(self):
1006
        class HelloWorld:
1007
            def __reduce__(self):
1008
                return (print, ("Hello World!",))
1009

1010
        with BytesIOContext() as f:
1011
            torch.save(HelloWorld(), f)
1012
            f.seek(0)
1013
            # Unsafe load should work
1014
            self.assertIsNone(torch.load(f, weights_only=False))
1015
            f.seek(0)
1016
            # Safe load should assert
1017
            with self.assertRaisesRegex(pickle.UnpicklingError, "Unsupported class"):
1018
                torch.load(f, weights_only=True)
1019

1020
    @parametrize('weights_only', (False, True))
1021
    def test_serialization_math_bits(self, weights_only):
1022
        t = torch.randn(1, dtype=torch.cfloat)
1023

1024
        def _save_load_check(t):
1025
            with BytesIOContext() as f:
1026
                torch.save(t, f)
1027
                f.seek(0)
1028
                # Unsafe load should work
1029
                self.assertEqual(torch.load(f, weights_only=weights_only), t)
1030

1031
        t_conj = torch.conj(t)
1032
        _save_load_check(t_conj)
1033

1034
        t_neg = torch._neg_view(t)
1035
        _save_load_check(t_neg)
1036

1037
        t_n_c = torch._neg_view(torch.conj(t))
1038
        _save_load_check(t_n_c)
1039

1040
    @parametrize('weights_only', (False, True))
1041
    def test_serialization_efficient_zerotensor(self, weights_only):
1042
        # We don't support serializing `ZeroTensor` as it is not public
1043
        # facing yet.
1044
        # If in future, `ZeroTensor` serialization is supported, this test
1045
        # should start failing!
1046
        t = torch._efficientzerotensor((4, 5))
1047

1048
        def _save_load_check(t):
1049
            with BytesIOContext() as f:
1050
                torch.save(t, f)
1051
                f.seek(0)
1052
                # Unsafe load should work
1053
                self.assertEqual(torch.load(f, weights_only=weights_only), t)
1054

1055
        # NOTE: `torch.save` fails before we hit the TORCH_CHECK in `getTensoMetadata`
1056
        #       as nullptr storage is disabled.
1057
        with self.assertRaisesRegex(RuntimeError, 'ZeroTensor is not serializable'):
1058
            _save_load_check(t)
1059

1060
    def test_serialization_byteorder_mark(self):
1061
        lstm = torch.nn.LSTM(3, 3)
1062
        inputs = [torch.randn(1, 3) for _ in range(5)]
1063
        inputs = torch.cat(inputs).view(len(inputs), 1, -1)
1064
        hidden = (torch.randn(1, 1, 3), torch.randn(1, 1, 3))  # clean out hidden state
1065

1066
        databuffer = io.BytesIO()
1067
        torch.save(lstm.state_dict(), databuffer)
1068
        databuffer.seek(0)
1069

1070
        with torch.serialization._open_zipfile_reader(databuffer) as zip_file:
1071
            byteordername = 'byteorder'
1072
            self.assertTrue(zip_file.has_record(byteordername))
1073
            byteorderdata = zip_file.get_record(byteordername)
1074
            self.assertTrue(byteorderdata in [b'little', b'big'])
1075
            self.assertEqual(byteorderdata.decode(), sys.byteorder)
1076

1077
    def test_serialization_load_bom_data(self):
1078
        # 1. Generated on LE system using following commands:
1079
        #
1080
        # import torch
1081
        #
1082
        # lstm = torch.nn.LSTM(3, 3)
1083
        # inputs = [torch.randn(1, 3) for _ in range(5)]
1084
        #
1085
        # inputs = torch.cat(inputs).view(len(inputs), 1, -1)
1086
        # hidden = (torch.randn(1, 1, 3), torch.randn(1, 1, 3))
1087
        #
1088
        # torch.save(lstm.state_dict(), "lstm.LE.pt", _disable_byteorder_record=True)
1089
        # torch.save(lstm.state_dict(), "lstm.LE.BOM.pt")
1090
        #
1091
        # print(lstm.state_dict())
1092
        #
1093
        # 2. After that it is resaved on BE system with following commands:
1094
        #
1095
        # import torch
1096
        #
1097
        # lstm = torch.nn.LSTM(3, 3)
1098
        # lstm.load_state_dict(torch.load("lstm.LE.BOM.pt"), strict=True)
1099
        #
1100
        # torch.save(lstm.state_dict(), "lstm.BE.pt", _disable_byteorder_record=True)
1101
        # torch.save(lstm.state_dict(), "lstm.BE.BOM.pt")
1102
        #
1103
        # print(lstm.state_dict())
1104
        #
1105
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1106
        #
1107
        # file = open('filename', 'rb')
1108
        # data = file.read()
1109
        # file.close()
1110
        # print("\n".join(textwrap.wrap(str(data), 80)))
1111
        #
1112
        # BOM in this context is used as Byte Order Mark.
1113
        #
1114
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1115
                          b'\x00\x00\x00\x00\x00\r\x00\x15\x00lstm/data.pklFB\x11\x00ZZZZZZZZZZZZZZZZZ\x80\x02'
1116
                          b'ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ctor'
1117
                          b'ch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFloat'
1118
                          b'Storage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1119
                          b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weight_'
1120
                          b'hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03\x86'
1121
                          b'q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_l0'
1122
                          b'q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1123
                          b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03(('
1124
                          b'h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89h\x00'
1125
                          b')Rq#tq$Rq%u}q&X\t\x00\x00\x00_metadataq\'h\x00)Rq(X\x00\x00\x00\x00q)}q*X\x07'
1126
                          b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1127
                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1128
                          b'\x00\x00\x00\x00\x00\x00\x0b\x00\x0f\x00lstm/data/0FB\x0b\x00ZZZZZZZZZZZ\nuJ\xbe'
1129
                          b'X*\xa2\xbe\xc4\xea\x10>\xd4\n\x8d\xbe\x1c\x10\x8a\xbe\xb02\xe4\xbe,\xcb4>\x00'
1130
                          b'\x17!>H\x9c\xe0\xbe\xd2\x15!\xbe6C\xc6>v\xc5\x89>\xae\x14\x81\xbeZ\xc7\x99>\x90P'
1131
                          b'\x01?`\xb9\x9a<\xc0 <=\'\xc7\x9e\xbe\xaa\xf4\x02?\x00\xf3\x0e\xbc\xd8\xb7v\xbe\xa0'
1132
                          b'\xcc\xcd=$/\xaf>\x00\xc4K=0\xb8\xe5\xbe\xb6\xc5U\xbe\xc4i\xf3\xbe\xa45\xdc>\x06'
1133
                          b'g\x8d>N!\xae>2Fr\xbe0hb\xbd\xf0we\xbd g\xa0<\xb6\xbe\x9e\xbe\x14\xd1\xc2>PK\x07'
1134
                          b'\x08j\xd9\xb9M\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1135
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x007\x00lst'
1136
                          b'm/data/1FB3\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ|[\xe1>\xa2Yd\xbe'
1137
                          b'\xa5o\t\xbfz\x1c\x05\xbe \xb1\xdb<\xf0\xcd\xfc>\xa2u\xcb>\x8c\x87{\xbe\x9c\x9b'
1138
                          b'^>\xacmG>\xae\x17\x93>\x8e\xc5\xf0\xbet\x1c\xfc>\xcb\x84\x81\xbe\xc8\xa6 >\x88\xee'
1139
                          b'\xaf=\n\xc9\x8d>\xc0\xc5\xee>\xf0E\x91>\xf4^\xa1>\xb8\xbbF>\x97\x97\xfe\xbe\xec'
1140
                          b'\x85\x03?h\x9c\xf3=\xf2\xa8\x97>^\xfa\r?6i\x94\xbe\xbc1w\xbeh\xc4\x8a=\x94\xc8'
1141
                          b'\x9f\xbd\x81\xb5\x89\xbe(K\xb0>\xf0:z\xbd\xb0\xc6\x9b\xbdX\x00\x88=\x05\xc7\x11\xbf'
1142
                          b'PK\x07\x08\x12\xc0\x87\x96\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08'
1143
                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b'
1144
                          b'\x007\x00lstm/data/2FB3\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1145
                          b'Z\xb0\xc2f=@\xdd1<\x864\xd8\xbe\xa0\t\x13?+g\x8f\xbeu\xb1\r\xbfbl\xc3>\xa8\\\x82'
1146
                          b'\xbe\xa4c\xf3\xbd,\x96\xdf\xbe\xfe\x05\xf1\xbe\xf8\xc9\x96>PK\x07\x08\x92\tK?0\x00'
1147
                          b'\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
1148
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x17\x00lstm/data/3FB\x13\x00ZZ'
1149
                          b'ZZZZZZZZZZZZZZZZZ\x04\xaai\xbe\xce\xd8\x8a\xbe\xe3O\xdf\xbe$\xc3\xd2\xbe\x06\xb1'
1150
                          b'\x80\xbe^&\x08?\x00\x1a}\xbd\x06\xde\r?\x04\xe7\xac>Z@\xe9\xbe\x14\xc2)>\x9c\xe9'
1151
                          b'/>PK\x07\x08\x1axU\xe80\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1152
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x16\x00'
1153
                          b'lstm/versionFB\x12\x00ZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
1154
                          b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xab\xf1'
1155
                          b'\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1156
                          b'\x00\x00\x00\x00\x00\x00\x00\x00lstm/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
1157
                          b'\x00\x00\x00\x00\x00\x00j\xd9\xb9M\x90\x00\x00\x00\x90\x00\x00\x00\x0b\x00\x00\x00'
1158
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00lstm/data/0PK\x01\x02\x00'
1159
                          b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x12\xc0\x87\x96\x90\x00\x00\x00\x90'
1160
                          b'\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x02\x00'
1161
                          b'\x00lstm/data/1PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x92'
1162
                          b'\tK?0\x00\x00\x000\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1163
                          b'\x00\xe0\x03\x00\x00lstm/data/2PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1164
                          b'\x00\x00\x1axU\xe80\x00\x00\x000\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00'
1165
                          b'\x00\x00\x00\x00\x00\x80\x04\x00\x00lstm/data/3PK\x01\x02\x00\x00\x00\x00\x08'
1166
                          b'\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00'
1167
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00lstm/versionPK\x06'
1168
                          b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06'
1169
                          b'\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00'
1170
                          b'\x00\x00R\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xab\x06\x00\x00'
1171
                          b'\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x06\x00\x06\x00Y\x01'
1172
                          b'\x00\x00R\x05\x00\x00\x00\x00')
1173

1174
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1175
                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00lstm.save/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
1176
                       b'\x02ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ct'
1177
                       b'orch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFlo'
1178
                       b'atStorage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1179
                       b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weigh'
1180
                       b't_hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03'
1181
                       b'\x86q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_'
1182
                       b'l0q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1183
                       b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03'
1184
                       b'((h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89'
1185
                       b'h\x00)Rq#tq$Rq%u}q&X\t\x00\x00\x00_metadataq\'h\x00)Rq(X\x00\x00\x00\x00q)}q*X\x07'
1186
                       b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1187
                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1188
                       b'\x00\x00\x00\x00\x00\x00\x00\x13\x00\x07\x00lstm.save/byteorderFB\x03\x00ZZZlit'
1189
                       b'tlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08'
1190
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10'
1191
                       b'\x00<\x00lstm.save/data/0FB8\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1192
                       b'ZZZZZZZZ\nuJ\xbeX*\xa2\xbe\xc4\xea\x10>\xd4\n\x8d\xbe\x1c\x10\x8a\xbe\xb02\xe4\xbe'
1193
                       b',\xcb4>\x00\x17!>H\x9c\xe0\xbe\xd2\x15!\xbe6C\xc6>v\xc5\x89>\xae\x14\x81\xbeZ\xc7'
1194
                       b'\x99>\x90P\x01?`\xb9\x9a<\xc0 <=\'\xc7\x9e\xbe\xaa\xf4\x02?\x00\xf3\x0e\xbc\xd8'
1195
                       b'\xb7v\xbe\xa0\xcc\xcd=$/\xaf>\x00\xc4K=0\xb8\xe5\xbe\xb6\xc5U\xbe\xc4i\xf3\xbe'
1196
                       b'\xa45\xdc>\x06g\x8d>N!\xae>2Fr\xbe0hb\xbd\xf0we\xbd g\xa0<\xb6\xbe\x9e\xbe\x14\xd1'
1197
                       b'\xc2>PK\x07\x08j\xd9\xb9M\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08'
1198
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10'
1199
                       b'\x002\x00lstm.save/data/1FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ|'
1200
                       b'[\xe1>\xa2Yd\xbe\xa5o\t\xbfz\x1c\x05\xbe \xb1\xdb<\xf0\xcd\xfc>\xa2u\xcb>\x8c\x87'
1201
                       b'{\xbe\x9c\x9b^>\xacmG>\xae\x17\x93>\x8e\xc5\xf0\xbet\x1c\xfc>\xcb\x84\x81\xbe\xc8'
1202
                       b'\xa6 >\x88\xee\xaf=\n\xc9\x8d>\xc0\xc5\xee>\xf0E\x91>\xf4^\xa1>\xb8\xbbF>\x97\x97'
1203
                       b'\xfe\xbe\xec\x85\x03?h\x9c\xf3=\xf2\xa8\x97>^\xfa\r?6i\x94\xbe\xbc1w\xbeh\xc4'
1204
                       b'\x8a=\x94\xc8\x9f\xbd\x81\xb5\x89\xbe(K\xb0>\xf0:z\xbd\xb0\xc6\x9b\xbdX\x00\x88='
1205
                       b'\x05\xc7\x11\xbfPK\x07\x08\x12\xc0\x87\x96\x90\x00\x00\x00\x90\x00\x00\x00PK\x03'
1206
                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1207
                       b'\x00\x00\x00\x10\x002\x00lstm.save/data/2FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1208
                       b'ZZZZZZZZZZZZZZ\xb0\xc2f=@\xdd1<\x864\xd8\xbe\xa0\t\x13?+g\x8f\xbeu\xb1\r\xbfbl\xc3'
1209
                       b'>\xa8\\\x82\xbe\xa4c\xf3\xbd,\x96\xdf\xbe\xfe\x05\xf1\xbe\xf8\xc9\x96>PK\x07\x08'
1210
                       b'\x92\tK?0\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1211
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00lstm.save/'
1212
                       b'data/3FB\x0e\x00ZZZZZZZZZZZZZZ\x04\xaai\xbe\xce\xd8\x8a\xbe\xe3O\xdf\xbe$\xc3\xd2'
1213
                       b'\xbe\x06\xb1\x80\xbe^&\x08?\x00\x1a}\xbd\x06\xde\r?\x04\xe7\xac>Z@\xe9\xbe\x14\xc2'
1214
                       b')>\x9c\xe9/>PK\x07\x08\x1axU\xe80\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08'
1215
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11'
1216
                       b'\x00\x11\x00lstm.save/versionFB\r\x00ZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02'
1217
                       b'\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1218
                       b'\x00\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00'
1219
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lstm.save/data.pklPK\x01\x02\x00\x00'
1220
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00'
1221
                       b'\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00l'
1222
                       b'stm.save/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00j\xd9'
1223
                       b'\xb9M\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1224
                       b'\x00\x00\x00V\x02\x00\x00lstm.save/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
1225
                       b'\x00\x00\x00\x00\x00\x12\xc0\x87\x96\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00'
1226
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x03\x00\x00lstm.save/data/1PK\x01'
1227
                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x92\tK?0\x00\x00\x000\x00\x00'
1228
                       b'\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x04\x00\x00lstm.'
1229
                       b'save/data/2PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1axU\xe80'
1230
                       b'\x00\x00\x000\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1231
                       b'\x00\x05\x00\x00lstm.save/data/3PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1232
                       b'\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00'
1233
                       b'\x00\x00\x00\x00\x00\x00\x00\x80\x05\x00\x00lstm.save/versionPK\x06\x06,\x00\x00'
1234
                       b'\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00'
1235
                       b'\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00'
1236
                       b'\xd2\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x8a\x07\x00\x00\x00'
1237
                       b'\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x07\x00\x07\x00\xb8\x01\x00'
1238
                       b'\x00\xd2\x05\x00\x00\x00\x00')
1239

1240
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1241
                          b'\x00\x00\x00\x00\x00\x12\x00\x10\x00lstm.save/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
1242
                          b'\x02ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ct'
1243
                          b'orch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFlo'
1244
                          b'atStorage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1245
                          b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weigh'
1246
                          b't_hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03'
1247
                          b'\x86q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_'
1248
                          b'l0q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1249
                          b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03'
1250
                          b'((h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89'
1251
                          b'h\x00)Rq#tq$Rq%u}q&X\t\x00\x00\x00_metadataq\'h\x00)Rq(X\x00\x00\x00\x00q)}q*X\x07'
1252
                          b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1253
                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1254
                          b'\x00\x00\x00\x00\x00\x00\x00\x10\x00\n\x00lstm.save/data/0FB\x06\x00ZZZZZZ\xbeJ'
1255
                          b'u\n\xbe\xa2*X>\x10\xea\xc4\xbe\x8d\n\xd4\xbe\x8a\x10\x1c\xbe\xe42\xb0>4\xcb,>!\x17'
1256
                          b'\x00\xbe\xe0\x9cH\xbe!\x15\xd2>\xc6C6>\x89\xc5v\xbe\x81\x14\xae>\x99\xc7Z?\x01'
1257
                          b'P\x90<\x9a\xb9`=< \xc0\xbe\x9e\xc7\'?\x02\xf4\xaa\xbc\x0e\xf3\x00\xbev\xb7\xd8=\xcd'
1258
                          b'\xcc\xa0>\xaf/$=K\xc4\x00\xbe\xe5\xb80\xbeU\xc5\xb6\xbe\xf3i\xc4>\xdc5\xa4>\x8d'
1259
                          b'g\x06>\xae!N\xberF2\xbdbh0\xbdew\xf0<\xa0g \xbe\x9e\xbe\xb6>\xc2\xd1\x14PK\x07'
1260
                          b'\x08\xc2yG\xba\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1261
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x002\x00lst'
1262
                          b'm.save/data/1FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ>\xe1[|\xbedY\xa2'
1263
                          b'\xbf\to\xa5\xbe\x05\x1cz<\xdb\xb1 >\xfc\xcd\xf0>\xcbu\xa2\xbe{\x87\x8c>^\x9b\x9c'
1264
                          b'>Gm\xac>\x93\x17\xae\xbe\xf0\xc5\x8e>\xfc\x1ct\xbe\x81\x84\xcb> \xa6\xc8=\xaf'
1265
                          b'\xee\x88>\x8d\xc9\n>\xee\xc5\xc0>\x91E\xf0>\xa1^\xf4>F\xbb\xb8\xbe\xfe\x97\x97?\x03'
1266
                          b'\x85\xec=\xf3\x9ch>\x97\xa8\xf2?\r\xfa^\xbe\x94i6\xbew1\xbc=\x8a\xc4h\xbd\x9f'
1267
                          b'\xc8\x94\xbe\x89\xb5\x81>\xb0K(\xbdz:\xf0\xbd\x9b\xc6\xb0=\x88\x00X\xbf\x11\xc7\x05'
1268
                          b'PK\x07\x08\xd0\xbftD\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08\x08'
1269
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00'
1270
                          b'2\x00lstm.save/data/2FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ=f\xc2'
1271
                          b'\xb0<1\xdd@\xbe\xd84\x86?\x13\t\xa0\xbe\x8fg+\xbf\r\xb1u>\xc3lb\xbe\x82\\\xa8\xbd'
1272
                          b'\xf3c\xa4\xbe\xdf\x96,\xbe\xf1\x05\xfe>\x96\xc9\xf8PK\x07\x08"\xc5\xc5O0\x00\x00'
1273
                          b'\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1274
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00lstm.save/data/3FB\x0e\x00Z'
1275
                          b'ZZZZZZZZZZZZZ\xbei\xaa\x04\xbe\x8a\xd8\xce\xbe\xdfO\xe3\xbe\xd2\xc3$\xbe\x80\xb1'
1276
                          b'\x06?\x08&^\xbd}\x1a\x00?\r\xde\x06>\xac\xe7\x04\xbe\xe9@Z>)\xc2\x14>/\xe9\x9cPK'
1277
                          b'\x07\x08\xfb\xfd/\x920\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1278
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x11\x00'
1279
                          b'lstm.save/versionFB\r\x00ZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02'
1280
                          b'\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xab\xf1'
1281
                          b'\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1282
                          b'\x00\x00\x00\x00\x00\x00\x00\x00lstm.save/data.pklPK\x01\x02\x00\x00\x00\x00\x08'
1283
                          b'\x08\x00\x00\x00\x00\x00\x00\xc2yG\xba\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00'
1284
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00lstm.save/data/0PK'
1285
                          b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd0\xbftD\x90\x00\x00\x00'
1286
                          b'\x90\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x02'
1287
                          b'\x00\x00lstm.save/data/1PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1288
                          b'\x00"\xc5\xc5O0\x00\x00\x000\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1289
                          b'\x00\x00\x00\x00\xe0\x03\x00\x00lstm.save/data/2PK\x01\x02\x00\x00\x00\x00\x08\x08'
1290
                          b'\x00\x00\x00\x00\x00\x00\xfb\xfd/\x920\x00\x00\x000\x00\x00\x00\x10\x00\x00\x00'
1291
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00lstm.save/data/3PK\x01\x02'
1292
                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02'
1293
                          b'\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00'
1294
                          b'\x00lstm.save/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
1295
                          b'\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00'
1296
                          b'\x00\x00w\x01\x00\x00\x00\x00\x00\x00R\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
1297
                          b'\x00\x00\x00\xc9\x06\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00'
1298
                          b'\x00\x00\x06\x00\x06\x00w\x01\x00\x00R\x05\x00\x00\x00\x00')
1299

1300
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1301
                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00lstm.save/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
1302
                       b'\x02ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ct'
1303
                       b'orch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFlo'
1304
                       b'atStorage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1305
                       b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weigh'
1306
                       b't_hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03'
1307
                       b'\x86q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_'
1308
                       b'l0q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1309
                       b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03'
1310
                       b'((h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89'
1311
                       b'h\x00)Rq#tq$Rq%u}q&X\t\x00\x00\x00_metadataq\'h\x00)Rq(X\x00\x00\x00\x00q)}q*X\x07'
1312
                       b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1313
                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1314
                       b'\x00\x00\x00\x00\x00\x00\x00\x13\x00\x07\x00lstm.save/byteorderFB\x03\x00ZZZbig'
1315
                       b'PK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08\x08'
1316
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00'
1317
                       b'?\x00lstm.save/data/0FB;\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1318
                       b'ZZZZZZZZ\xbeJu\n\xbe\xa2*X>\x10\xea\xc4\xbe\x8d\n\xd4\xbe\x8a\x10\x1c\xbe\xe42\xb0'
1319
                       b'>4\xcb,>!\x17\x00\xbe\xe0\x9cH\xbe!\x15\xd2>\xc6C6>\x89\xc5v\xbe\x81\x14\xae>\x99'
1320
                       b'\xc7Z?\x01P\x90<\x9a\xb9`=< \xc0\xbe\x9e\xc7\'?\x02\xf4\xaa\xbc\x0e\xf3\x00\xbe'
1321
                       b'v\xb7\xd8=\xcd\xcc\xa0>\xaf/$=K\xc4\x00\xbe\xe5\xb80\xbeU\xc5\xb6\xbe\xf3i\xc4'
1322
                       b'>\xdc5\xa4>\x8dg\x06>\xae!N\xberF2\xbdbh0\xbdew\xf0<\xa0g \xbe\x9e\xbe\xb6>\xc2\xd1'
1323
                       b'\x14PK\x07\x08\xc2yG\xba\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08'
1324
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10'
1325
                       b'\x002\x00lstm.save/data/1FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ>'
1326
                       b'\xe1[|\xbedY\xa2\xbf\to\xa5\xbe\x05\x1cz<\xdb\xb1 >\xfc\xcd\xf0>\xcbu\xa2\xbe{\x87'
1327
                       b'\x8c>^\x9b\x9c>Gm\xac>\x93\x17\xae\xbe\xf0\xc5\x8e>\xfc\x1ct\xbe\x81\x84\xcb> '
1328
                       b'\xa6\xc8=\xaf\xee\x88>\x8d\xc9\n>\xee\xc5\xc0>\x91E\xf0>\xa1^\xf4>F\xbb\xb8\xbe\xfe'
1329
                       b'\x97\x97?\x03\x85\xec=\xf3\x9ch>\x97\xa8\xf2?\r\xfa^\xbe\x94i6\xbew1\xbc=\x8a'
1330
                       b'\xc4h\xbd\x9f\xc8\x94\xbe\x89\xb5\x81>\xb0K(\xbdz:\xf0\xbd\x9b\xc6\xb0=\x88\x00X'
1331
                       b'\xbf\x11\xc7\x05PK\x07\x08\xd0\xbftD\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00'
1332
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1333
                       b'\x00\x10\x002\x00lstm.save/data/2FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1334
                       b'ZZZZZZZZ=f\xc2\xb0<1\xdd@\xbe\xd84\x86?\x13\t\xa0\xbe\x8fg+\xbf\r\xb1u>\xc3lb\xbe'
1335
                       b'\x82\\\xa8\xbd\xf3c\xa4\xbe\xdf\x96,\xbe\xf1\x05\xfe>\x96\xc9\xf8PK\x07\x08"\xc5'
1336
                       b'\xc5O0\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
1337
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00lstm.save/data'
1338
                       b'/3FB\x0e\x00ZZZZZZZZZZZZZZ\xbei\xaa\x04\xbe\x8a\xd8\xce\xbe\xdfO\xe3\xbe\xd2\xc3'
1339
                       b'$\xbe\x80\xb1\x06?\x08&^\xbd}\x1a\x00?\r\xde\x06>\xac\xe7\x04\xbe\xe9@Z>)\xc2\x14'
1340
                       b'>/\xe9\x9cPK\x07\x08\xfb\xfd/\x920\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08'
1341
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11'
1342
                       b'\x00\x11\x00lstm.save/versionFB\r\x00ZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
1343
                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1344
                       b'\x00\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00'
1345
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lstm.save/data.pklPK\x01\x02\x00\x00'
1346
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00'
1347
                       b'\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00ls'
1348
                       b'tm.save/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xc2y'
1349
                       b'G\xba\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1350
                       b'\x00\x00\x00S\x02\x00\x00lstm.save/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
1351
                       b'\x00\x00\x00\x00\x00\xd0\xbftD\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00\x00\x00'
1352
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x03\x00\x00lstm.save/data/1PK\x01\x02\x00'
1353
                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"\xc5\xc5O0\x00\x00\x000\x00\x00\x00'
1354
                       b'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x04\x00\x00lstm.save/'
1355
                       b'data/2PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xfb\xfd/\x920\x00'
1356
                       b'\x00\x000\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1357
                       b'\x05\x00\x00lstm.save/data/3PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1358
                       b'\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00'
1359
                       b'\x00\x00\x00\x00\x00\x00\x80\x05\x00\x00lstm.save/versionPK\x06\x06,\x00\x00\x00'
1360
                       b'\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00'
1361
                       b'\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00'
1362
                       b'\xd2\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x8a\x07\x00\x00\x00\x00'
1363
                       b'\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x07\x00\x07\x00\xb8\x01\x00'
1364
                       b'\x00\xd2\x05\x00\x00\x00\x00')
1365

1366
        current_load_endian = get_default_load_endianness()
1367

1368
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1369
        buf_le_bom = io.BytesIO(data_le_bom)
1370
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1371
        buf_be_bom = io.BytesIO(data_be_bom)
1372

1373
        lstm_le_no_bom = torch.nn.LSTM(3, 3)
1374
        lstm_le_bom = torch.nn.LSTM(3, 3)
1375
        lstm_be_no_bom = torch.nn.LSTM(3, 3)
1376
        lstm_be_bom = torch.nn.LSTM(3, 3)
1377

1378
        lstm_le_no_bom_little = torch.nn.LSTM(3, 3)
1379
        lstm_be_no_bom_little = torch.nn.LSTM(3, 3)
1380
        lstm_le_no_bom_big = torch.nn.LSTM(3, 3)
1381
        lstm_be_no_bom_big = torch.nn.LSTM(3, 3)
1382

1383
        try:
1384
            set_default_load_endianness(LoadEndianness.NATIVE)
1385
            lstm_le_no_bom.load_state_dict(torch.load(buf_le_no_bom), strict=True)
1386
            lstm_be_no_bom.load_state_dict(torch.load(buf_be_no_bom), strict=True)
1387
        finally:
1388
            set_default_load_endianness(current_load_endian)
1389

1390
        lstm_le_bom.load_state_dict(torch.load(buf_le_bom), strict=True)
1391
        lstm_be_bom.load_state_dict(torch.load(buf_be_bom), strict=True)
1392

1393
        buf_le_no_bom.seek(0)
1394
        buf_be_no_bom.seek(0)
1395

1396
        try:
1397
            set_default_load_endianness(LoadEndianness.LITTLE)
1398
            lstm_le_no_bom_little.load_state_dict(torch.load(buf_le_no_bom), strict=True)
1399
            lstm_be_no_bom_little.load_state_dict(torch.load(buf_be_no_bom), strict=True)
1400
        finally:
1401
            set_default_load_endianness(current_load_endian)
1402

1403
        buf_le_no_bom.seek(0)
1404
        buf_be_no_bom.seek(0)
1405

1406
        try:
1407
            set_default_load_endianness(LoadEndianness.BIG)
1408
            lstm_le_no_bom_big.load_state_dict(torch.load(buf_le_no_bom), strict=True)
1409
            lstm_be_no_bom_big.load_state_dict(torch.load(buf_be_no_bom), strict=True)
1410
        finally:
1411
            set_default_load_endianness(current_load_endian)
1412

1413
        self.assertEqual(lstm_le_bom.state_dict(), lstm_be_bom.state_dict())
1414
        self.assertNotEqual(lstm_le_no_bom.state_dict(), lstm_be_no_bom.state_dict())
1415
        self.assertEqual(lstm_le_no_bom_little.state_dict(), lstm_le_bom.state_dict())
1416
        self.assertNotEqual(lstm_be_no_bom_little.state_dict(), lstm_be_bom.state_dict())
1417
        self.assertNotEqual(lstm_le_no_bom_big.state_dict(), lstm_le_bom.state_dict())
1418
        self.assertEqual(lstm_be_no_bom_big.state_dict(), lstm_be_bom.state_dict())
1419

1420
        if (sys.byteorder == 'little'):
1421
            self.assertEqual(lstm_le_no_bom.state_dict(), lstm_le_bom.state_dict())
1422
            self.assertEqual(lstm_le_no_bom.state_dict(), lstm_be_bom.state_dict())
1423
            self.assertNotEqual(lstm_be_no_bom.state_dict(), lstm_le_bom.state_dict())
1424
            self.assertNotEqual(lstm_be_no_bom.state_dict(), lstm_be_bom.state_dict())
1425
        else:
1426
            self.assertNotEqual(lstm_le_no_bom.state_dict(), lstm_le_bom.state_dict())
1427
            self.assertNotEqual(lstm_le_no_bom.state_dict(), lstm_be_bom.state_dict())
1428
            self.assertEqual(lstm_be_no_bom.state_dict(), lstm_le_bom.state_dict())
1429
            self.assertEqual(lstm_be_no_bom.state_dict(), lstm_be_bom.state_dict())
1430

1431
    def test_serialization_load_bom_data_double(self):
1432
        # 1. Generated on LE system using following commands:
1433
        #
1434
        # import torch
1435
        #
1436
        # x = torch.randn(2,2, dtype=torch.double)
1437
        #
1438
        # torch.save(x, "tensor.double.LE.pt", _disable_byteorder_record=True)
1439
        # torch.save(x, "tensor.double.LE.BOM.pt")
1440
        #
1441
        # print(x)
1442
        #
1443
        # 2. After that it is resaved on BE system with following commands:
1444
        #
1445
        # import torch
1446
        #
1447
        # x = torch.load('tensor.double.LE.BOM.pt')
1448
        #
1449
        # torch.save(x, 'tensor.double.BE.pt', _disable_byteorder_record=True)
1450
        # torch.save(x, 'tensor.double.BE.BOM.pt')
1451
        #
1452
        # print(x)
1453
        #
1454
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1455
        #
1456
        # file = open('filename', 'rb')
1457
        # data = file.read()
1458
        # file.close()
1459
        # print("\n".join(textwrap.wrap(str(data), 80)))
1460
        #
1461
        # BOM in this context is used as Byte Order Mark.
1462
        #
1463
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1464
                          b'\x00\x00\x00\x00\x00\x19\x00\t\x00tensor.double.LE/data.pklFB\x05\x00ZZZZZ\x80\x02'
1465
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1466
                          b'DoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1467
                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1468
                          b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04\x00'
1469
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1470
                          b'\x00\x17\x00 \x00tensor.double.LE/data/0FB\x1c\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1471
                          b'\x97v\xa4\xff|^\xc9?\xce\xbc\x8cP\x8d\xb0\xe9\xbf\xdc\x0e\xef[\xb7\xdb\xd3\xbf4\xb1'
1472
                          b'\x08Q\xf9\x00\xde?PK\x07\x08\xae\x92t\x0f \x00\x00\x00 \x00\x00\x00PK\x03\x04'
1473
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1474
                          b'\x00\x00\x18\x00\x1a\x00tensor.double.LE/versionFB\x16\x00ZZZZZZZZZZZZZZZZZZZZZZ'
1475
                          b'3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00'
1476
                          b'\x08\x08\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00\x19\x00'
1477
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.double'
1478
                          b'.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xae\x92t\x0f'
1479
                          b' \x00\x00\x00 \x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1480
                          b'\x00\xeb\x00\x00\x00tensor.double.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
1481
                          b'\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00'
1482
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.double.LE/versionPK\x06'
1483
                          b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1484
                          b'\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00'
1485
                          b'\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa4\x02'
1486
                          b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03'
1487
                          b'\x00\xd2\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1488

1489
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1490
                       b'\x00\x00\x00\x00\x00\x1d\x00\x05\x00tensor.double.LE.BOM/data.pklFB\x01\x00Z\x80'
1491
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1492
                       b'h\nDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1493
                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1494
                       b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04'
1495
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1496
                       b'\x00\x00\x1e\x00\x19\x00tensor.double.LE.BOM/byteorderFB\x15\x00ZZZZZZZZZZZZZZZZ'
1497
                       b'ZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
1498
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1499
                       b'\x00\x1b\x001\x00tensor.double.LE.BOM/data/0FB-\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1500
                       b'ZZZZZZZZZZZZZZZZ\x97v\xa4\xff|^\xc9?\xce\xbc\x8cP\x8d\xb0\xe9\xbf\xdc\x0e\xef[\xb7'
1501
                       b'\xdb\xd3\xbf4\xb1\x08Q\xf9\x00\xde?PK\x07\x08\xae\x92t\x0f \x00\x00\x00 \x00\x00'
1502
                       b'\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1503
                       b'\x00\x00\x00\x00\x00\x00\x1c\x00\x16\x00tensor.double.LE.BOM/versionFB\x12\x00ZZ'
1504
                       b'ZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02'
1505
                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00'
1506
                       b'\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1507
                       b'tensor.double.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1508
                       b'\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00'
1509
                       b'\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00tensor.double.LE.BOM/byteorderPK\x01'
1510
                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xae\x92t\x0f '
1511
                       b'\x00\x00\x00 \x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1512
                       b'V\x01\x00\x00tensor.double.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
1513
                       b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00'
1514
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.double.LE.BOM/versio'
1515
                       b'nPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00'
1516
                       b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00'
1517
                       b'\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00|\x03\x00'
1518
                       b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00'
1519
                       b'*\x01\x00\x00R\x02\x00\x00\x00\x00')
1520

1521
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1522
                          b'\x00\x00\x00\x00\x00\x19\x00\t\x00tensor.double.BE/data.pklFB\x05\x00ZZZZZ\x80\x02'
1523
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1524
                          b'DoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1525
                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1526
                          b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04\x00'
1527
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1528
                          b'\x00\x17\x00 \x00tensor.double.BE/data/0FB\x1c\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1529
                          b'?\xc9^|\xff\xa4v\x97\xbf\xe9\xb0\x8dP\x8c\xbc\xce\xbf\xd3\xdb\xb7[\xef\x0e\xdc?\xde'
1530
                          b'\x00\xf9Q\x08\xb14PK\x07\x083@\x82/ \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
1531
                          b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1532
                          b'\x18\x00\x1a\x00tensor.double.BE/versionFB\x16\x00ZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
1533
                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
1534
                          b'\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00\x19\x00\x00'
1535
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.double.BE/da'
1536
                          b'ta.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x003@\x82/ '
1537
                          b'\x00\x00\x00 \x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1538
                          b'\xeb\x00\x00\x00tensor.double.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
1539
                          b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00\x00'
1540
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.double.BE/versionPK\x06\x06'
1541
                          b',\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
1542
                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00'
1543
                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa4\x02\x00'
1544
                          b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00'
1545
                          b'\xd2\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1546

1547
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1548
                       b'\x00\x00\x00\x00\x00\x1d\x00\x05\x00tensor.double.BE.BOM/data.pklFB\x01\x00Z\x80'
1549
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1550
                       b'h\nDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1551
                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1552
                       b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04'
1553
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1554
                       b'\x00\x00\x1e\x00\x19\x00tensor.double.BE.BOM/byteorderFB\x15\x00ZZZZZZZZZZZZZZZZ'
1555
                       b'ZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00'
1556
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1557
                       b'\x1b\x004\x00tensor.double.BE.BOM/data/0FB0\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1558
                       b'ZZZZZZZZZZZZZZZZ?\xc9^|\xff\xa4v\x97\xbf\xe9\xb0\x8dP\x8c\xbc\xce\xbf\xd3\xdb\xb7'
1559
                       b'[\xef\x0e\xdc?\xde\x00\xf9Q\x08\xb14PK\x07\x083@\x82/ \x00\x00\x00 \x00\x00\x00'
1560
                       b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1561
                       b'\x00\x00\x00\x00\x1c\x00\x16\x00tensor.double.BE.BOM/versionFB\x12\x00ZZZZZZZZ'
1562
                       b'ZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00'
1563
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00'
1564
                       b'\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ten'
1565
                       b'sor.double.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1566
                       b'\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00'
1567
                       b'\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00tensor.double.BE.BOM/byteorderPK\x01\x02'
1568
                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x003@\x82/ \x00\x00\x00 \x00\x00\x00'
1569
                       b'\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.do'
1570
                       b'uble.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1'
1571
                       b'\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1572
                       b'\x00\x00\x00\xf0\x01\x00\x00tensor.double.BE.BOM/versionPK\x06\x06,\x00\x00\x00'
1573
                       b'\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00'
1574
                       b'\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00R\x02'
1575
                       b'\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00\x01'
1576
                       b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00*\x01\x00\x00R\x02\x00\x00'
1577
                       b'\x00\x00')
1578

1579
        current_load_endian = get_default_load_endianness()
1580

1581
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1582
        buf_le_bom = io.BytesIO(data_le_bom)
1583
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1584
        buf_be_bom = io.BytesIO(data_be_bom)
1585

1586
        try:
1587
            set_default_load_endianness(LoadEndianness.NATIVE)
1588
            tensor_le_no_bom = torch.load(buf_le_no_bom)
1589
            tensor_be_no_bom = torch.load(buf_be_no_bom)
1590
        finally:
1591
            set_default_load_endianness(current_load_endian)
1592

1593
        tensor_le_bom = torch.load(buf_le_bom)
1594
        tensor_be_bom = torch.load(buf_be_bom)
1595

1596
        buf_le_no_bom.seek(0)
1597
        buf_be_no_bom.seek(0)
1598

1599
        try:
1600
            set_default_load_endianness(LoadEndianness.LITTLE)
1601
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
1602
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
1603
        finally:
1604
            set_default_load_endianness(current_load_endian)
1605

1606
        buf_le_no_bom.seek(0)
1607
        buf_be_no_bom.seek(0)
1608

1609
        try:
1610
            set_default_load_endianness(LoadEndianness.BIG)
1611
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
1612
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
1613
        finally:
1614
            set_default_load_endianness(current_load_endian)
1615

1616
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
1617
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
1618
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
1619
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
1620
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
1621
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
1622

1623
        if (sys.byteorder == 'little'):
1624
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
1625
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
1626
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
1627
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
1628
        else:
1629
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
1630
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
1631
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
1632
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
1633

1634
    def test_serialization_load_bom_data_float(self):
1635
        # 1. Generated on LE system using following commands:
1636
        #
1637
        # import torch
1638
        #
1639
        # x = torch.randn(2,2, dtype=torch.float)
1640
        #
1641
        # torch.save(x, "tensor.float.LE.pt", _disable_byteorder_record=True)
1642
        # torch.save(x, "tensor.float.LE.BOM.pt")
1643
        #
1644
        # print(x)
1645
        #
1646
        # 2. After that it is resaved on BE system with following commands:
1647
        #
1648
        # import torch
1649
        #
1650
        # x = torch.load('tensor.float.LE.BOM.pt')
1651
        #
1652
        # torch.save(x, 'tensor.float.BE.pt', _disable_byteorder_record=True)
1653
        # torch.save(x, 'tensor.float.BE.BOM.pt')
1654
        #
1655
        # print(x)
1656
        #
1657
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1658
        #
1659
        # file = open('filename', 'rb')
1660
        # data = file.read()
1661
        # file.close()
1662
        # print("\n".join(textwrap.wrap(str(data), 80)))
1663
        #
1664
        # BOM in this context is used as Byte Order Mark.
1665
        #
1666
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1667
                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.float.LE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
1668
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1669
                          b'FloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05Q'
1670
                          b'K\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
1671
                          b'Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00\x08'
1672
                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16'
1673
                          b'\x00"\x00tensor.float.LE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x01h\x9e'
1674
                          b'?\r\xb7A?\x1a\x1e\x07\xbf\xd4|\x02?PK\x07\x08\x8fq]\x8c\x10\x00\x00\x00\x10\x00'
1675
                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1676
                          b'\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.float.LE/versionFB\'\x00ZZZZZZZZ'
1677
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
1678
                          b'\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00%Y"N\x9a\x00\x00'
1679
                          b'\x00\x9a\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1680
                          b'\x00\x00\x00tensor.float.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
1681
                          b'\x00\x00\x00\x8fq]\x8c\x10\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00'
1682
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.float.LE/data/0PK\x01\x02'
1683
                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00'
1684
                          b'\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00t'
1685
                          b'ensor.float.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
1686
                          b'\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00'
1687
                          b'\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06'
1688
                          b'\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00'
1689
                          b'\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1690

1691
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1692
                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.float.LE.BOM/data.pklFB\x02\x00ZZ\x80'
1693
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1694
                       b'h\nFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1695
                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1696
                       b')Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00'
1697
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1698
                       b'\x1d\x00\x1b\x00tensor.float.LE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZl'
1699
                       b'ittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08'
1700
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a'
1701
                       b'\x002\x00tensor.float.LE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1702
                       b'ZZZZZZZZZZ\x01h\x9e?\r\xb7A?\x1a\x1e\x07\xbf\xd4|\x02?PK\x07\x08\x8fq]\x8c\x10\x00'
1703
                       b'\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00'
1704
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.float.LE.BOM/ve'
1705
                       b'rsionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00'
1706
                       b'\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
1707
                       b'%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1708
                       b'\x00\x00\x00\x00\x00\x00\x00tensor.float.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00'
1709
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1d'
1710
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.fl'
1711
                       b'oat.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x8f'
1712
                       b'q]\x8c\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1713
                       b'\x00\x00\x00\x00V\x01\x00\x00tensor.float.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00'
1714
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00'
1715
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00tensor.float.'
1716
                       b'LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00'
1717
                       b'\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
1718
                       b'&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00'
1719
                       b'\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04'
1720
                       b'\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
1721

1722
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1723
                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.float.BE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
1724
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1725
                          b'FloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05Q'
1726
                          b'K\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
1727
                          b'Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00\x08'
1728
                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16'
1729
                          b'\x00"\x00tensor.float.BE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ?\x9eh'
1730
                          b'\x01?A\xb7\r\xbf\x07\x1e\x1a?\x02|\xd4PK\x07\x089D\xd6\x8a\x10\x00\x00\x00\x10\x00'
1731
                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1732
                          b'\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.float.BE/versionFB\'\x00ZZZZZZZZ'
1733
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
1734
                          b'\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00%Y"N\x9a\x00\x00'
1735
                          b'\x00\x9a\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1736
                          b'\x00\x00\x00tensor.float.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
1737
                          b'\x00\x00\x009D\xd6\x8a\x10\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00'
1738
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.float.BE/data/0PK\x01\x02'
1739
                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00'
1740
                          b'\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00t'
1741
                          b'ensor.float.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
1742
                          b'\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00'
1743
                          b'\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06'
1744
                          b'\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00'
1745
                          b'\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1746

1747
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1748
                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.float.BE.BOM/data.pklFB\x02\x00ZZ\x80'
1749
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1750
                       b'h\nFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1751
                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1752
                       b')Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00'
1753
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1754
                       b'\x1d\x00\x1b\x00tensor.float.BE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZb'
1755
                       b'igPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08\x08'
1756
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00'
1757
                       b'5\x00tensor.float.BE.BOM/data/0FB1\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1758
                       b'ZZZZZZZZZZ?\x9eh\x01?A\xb7\r\xbf\x07\x1e\x1a?\x02|\xd4PK\x07\x089D\xd6\x8a\x10\x00'
1759
                       b'\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00'
1760
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.float.BE.BOM/ve'
1761
                       b'rsionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00'
1762
                       b'\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
1763
                       b'%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1764
                       b'\x00\x00\x00\x00\x00\x00\x00tensor.float.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00'
1765
                       b'\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1d'
1766
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.fl'
1767
                       b'oat.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x009D'
1768
                       b'\xd6\x8a\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1769
                       b'\x00\x00\x00\x00S\x01\x00\x00tensor.float.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00'
1770
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00'
1771
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00tensor.float.'
1772
                       b'BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00'
1773
                       b'\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
1774
                       b'&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00'
1775
                       b'\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04'
1776
                       b'\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
1777

1778
        current_load_endian = get_default_load_endianness()
1779

1780
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1781
        buf_le_bom = io.BytesIO(data_le_bom)
1782
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1783
        buf_be_bom = io.BytesIO(data_be_bom)
1784

1785
        try:
1786
            set_default_load_endianness(LoadEndianness.NATIVE)
1787
            tensor_le_no_bom = torch.load(buf_le_no_bom)
1788
            tensor_be_no_bom = torch.load(buf_be_no_bom)
1789
        finally:
1790
            set_default_load_endianness(current_load_endian)
1791

1792
        tensor_le_bom = torch.load(buf_le_bom)
1793
        tensor_be_bom = torch.load(buf_be_bom)
1794

1795
        buf_le_no_bom.seek(0)
1796
        buf_be_no_bom.seek(0)
1797

1798
        try:
1799
            set_default_load_endianness(LoadEndianness.LITTLE)
1800
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
1801
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
1802
        finally:
1803
            set_default_load_endianness(current_load_endian)
1804

1805
        buf_le_no_bom.seek(0)
1806
        buf_be_no_bom.seek(0)
1807

1808
        try:
1809
            set_default_load_endianness(LoadEndianness.BIG)
1810
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
1811
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
1812
        finally:
1813
            set_default_load_endianness(current_load_endian)
1814

1815
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
1816
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
1817
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
1818
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
1819
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
1820
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
1821

1822
        if (sys.byteorder == 'little'):
1823
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
1824
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
1825
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
1826
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
1827
        else:
1828
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
1829
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
1830
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
1831
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
1832

1833
    def test_serialization_load_bom_data_half(self):
1834
        # 1. Generated on LE system using following commands:
1835
        #
1836
        # import torch
1837
        #
1838
        # x = torch.randn(2,2, dtype=torch.half)
1839
        #
1840
        # torch.save(x, "tensor.half.LE.pt", _disable_byteorder_record=True)
1841
        # torch.save(x, "tensor.half.LE.BOM.pt")
1842
        #
1843
        # print(x)
1844
        #
1845
        # 2. After that it is resaved on BE system with following commands:
1846
        #
1847
        # import torch
1848
        #
1849
        # x = torch.load('tensor.half.LE.BOM.pt')
1850
        #
1851
        # torch.save(x, 'tensor.half.BE.pt', _disable_byteorder_record=True)
1852
        # torch.save(x, 'tensor.half.BE.BOM.pt')
1853
        #
1854
        # print(x)
1855
        #
1856
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1857
        #
1858
        # file = open('filename', 'rb')
1859
        # data = file.read()
1860
        # file.close()
1861
        # print("\n".join(textwrap.wrap(str(data), 80)))
1862
        #
1863
        # BOM in this context is used as Byte Order Mark.
1864
        #
1865
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1866
                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.half.LE/data.pklFB\x07\x00ZZZZZZZ\x80'
1867
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1868
                          b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1869
                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1870
                          b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
1871
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1872
                          b'\x00\x15\x00$\x00tensor.half.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ0'
1873
                          b'\xbbf;\xcd\xbd\xab9PK\x07\x08,D\x96\x91\x08\x00\x00\x00\x08\x00\x00\x00PK\x03\x04'
1874
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1875
                          b'\x00\x00\x16\x004\x00tensor.half.LE/versionFB0\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1876
                          b'ZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01'
1877
                          b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xabQ\x8c\x99\x00\x00\x00\x99'
1878
                          b'\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1879
                          b'\x00tensor.half.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1880
                          b'\x00,D\x96\x91\x08\x00\x00\x00\x08\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00'
1881
                          b'\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.half.LE/data/0PK\x01\x02\x00\x00'
1882
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
1883
                          b'\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00tensor.ha'
1884
                          b'lf.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00'
1885
                          b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
1886
                          b'\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00'
1887
                          b'\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00'
1888
                          b'\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1889

1890
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1891
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.half.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
1892
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1893
                       b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1894
                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1895
                       b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
1896
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1897
                       b'\x00\x1c\x00\x1d\x00tensor.half.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZZ'
1898
                       b'ZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
1899
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1900
                       b'\x00\x19\x003\x00tensor.half.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1901
                       b'ZZZZZZZZZZZZZZZZ0\xbbf;\xcd\xbd\xab9PK\x07\x08,D\x96\x91\x08\x00\x00\x00\x08\x00'
1902
                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1903
                       b'\x00\x00\x00\x00\x00\x00\x1a\x000\x00tensor.half.LE.BOM/versionFB,\x00ZZZZZZZZ'
1904
                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
1905
                       b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xabQ\x8c\x99'
1906
                       b'\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1907
                       b'\x00\x00\x00\x00\x00tensor.half.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08'
1908
                       b'\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1c\x00'
1909
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.half.LE.'
1910
                       b'BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00,D\x96\x91'
1911
                       b'\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1912
                       b'\x00\x00V\x01\x00\x00tensor.half.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08'
1913
                       b'\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00'
1914
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00tensor.half.LE.BOM/ve'
1915
                       b'rsionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00'
1916
                       b'\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00"\x01\x00'
1917
                       b'\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00t\x03'
1918
                       b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04'
1919
                       b'\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
1920

1921
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1922
                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.half.BE/data.pklFB\x07\x00ZZZZZZZ\x80'
1923
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1924
                          b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1925
                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1926
                          b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
1927
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1928
                          b'\x00\x15\x00$\x00tensor.half.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\xbb'
1929
                          b'0;f\xbd\xcd9\xabPK\x07\x08\xc7\xa1\xfd\x07\x08\x00\x00\x00\x08\x00\x00\x00PK\x03'
1930
                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1931
                          b'\x00\x00\x00\x16\x004\x00tensor.half.BE/versionFB0\x00ZZZZZZZZZZZZZZZZZZZZZZZ'
1932
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
1933
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xabQ\x8c\x99\x00\x00'
1934
                          b'\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1935
                          b'\x00\x00\x00tensor.half.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
1936
                          b'\x00\x00\x00\xc7\xa1\xfd\x07\x08\x00\x00\x00\x08\x00\x00\x00\x15\x00\x00\x00\x00'
1937
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.half.BE/data/0PK\x01'
1938
                          b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02'
1939
                          b'\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00'
1940
                          b'tensor.half.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00'
1941
                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00'
1942
                          b'\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06'
1943
                          b'\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06'
1944
                          b'\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1945

1946
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1947
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.half.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
1948
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1949
                       b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1950
                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1951
                       b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
1952
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1953
                       b'\x00\x1c\x00\x1d\x00tensor.half.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZZ'
1954
                       b'ZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00'
1955
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1956
                       b'\x19\x006\x00tensor.half.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1957
                       b'ZZZZZZZZZZZZZZZZ\xbb0;f\xbd\xcd9\xabPK\x07\x08\xc7\xa1\xfd\x07\x08\x00\x00\x00\x08'
1958
                       b'\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1959
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x000\x00tensor.half.BE.BOM/versionFB,\x00ZZ'
1960
                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
1961
                       b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xab'
1962
                       b'Q\x8c\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1963
                       b'\x00\x00\x00\x00\x00\x00\x00tensor.half.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00'
1964
                       b'\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1c'
1965
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.ha'
1966
                       b'lf.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xc7'
1967
                       b'\xa1\xfd\x07\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00'
1968
                       b'\x00\x00\x00\x00\x00S\x01\x00\x00tensor.half.BE.BOM/data/0PK\x01\x02\x00\x00\x00'
1969
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1a'
1970
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00tensor.ha'
1971
                       b'lf.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00'
1972
                       b'\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00'
1973
                       b'\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00'
1974
                       b'\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00'
1975
                       b'\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
1976

1977
        current_load_endian = get_default_load_endianness()
1978

1979
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1980
        buf_le_bom = io.BytesIO(data_le_bom)
1981
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1982
        buf_be_bom = io.BytesIO(data_be_bom)
1983

1984
        try:
1985
            set_default_load_endianness(LoadEndianness.NATIVE)
1986
            tensor_le_no_bom = torch.load(buf_le_no_bom)
1987
            tensor_be_no_bom = torch.load(buf_be_no_bom)
1988
        finally:
1989
            set_default_load_endianness(current_load_endian)
1990

1991
        tensor_le_bom = torch.load(buf_le_bom)
1992
        tensor_be_bom = torch.load(buf_be_bom)
1993

1994
        buf_le_no_bom.seek(0)
1995
        buf_be_no_bom.seek(0)
1996

1997
        try:
1998
            set_default_load_endianness(LoadEndianness.LITTLE)
1999
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2000
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2001
        finally:
2002
            set_default_load_endianness(current_load_endian)
2003

2004
        buf_le_no_bom.seek(0)
2005
        buf_be_no_bom.seek(0)
2006

2007
        try:
2008
            set_default_load_endianness(LoadEndianness.BIG)
2009
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2010
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2011
        finally:
2012
            set_default_load_endianness(current_load_endian)
2013

2014
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2015
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2016
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2017
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2018
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2019
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2020

2021
        if (sys.byteorder == 'little'):
2022
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2023
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2024
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2025
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2026
        else:
2027
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2028
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2029
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2030
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2031

2032
    def test_serialization_load_bom_data_long(self):
2033
        # 1. Generated on LE system using following commands:
2034
        #
2035
        # import torch
2036
        #
2037
        # x = torch.randint(-4294967295, 4294967295, [4, 4], dtype=torch.long)
2038
        #
2039
        # torch.save(x, "tensor.long.LE.pt", _disable_byteorder_record=True)
2040
        # torch.save(x, "tensor.long.LE.BOM.pt")
2041
        #
2042
        # print(x)
2043
        #
2044
        # 2. After that it is resaved on BE system with following commands:
2045
        #
2046
        # import torch
2047
        #
2048
        # x = torch.load('tensor.long.LE.BOM.pt')
2049
        #
2050
        # torch.save(x, 'tensor.long.BE.pt', _disable_byteorder_record=True)
2051
        # torch.save(x, 'tensor.long.BE.BOM.pt')
2052
        #
2053
        # print(x)
2054
        #
2055
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2056
        #
2057
        # file = open('filename', 'rb')
2058
        # data = file.read()
2059
        # file.close()
2060
        # print("\n".join(textwrap.wrap(str(data), 80)))
2061
        #
2062
        # BOM in this context is used as Byte Order Mark.
2063
        #
2064
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2065
                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.long.LE/data.pklFB\x07\x00ZZZZZZZ\x80'
2066
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2067
                          b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2068
                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2069
                          b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2070
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2071
                          b'\x00\x00\x15\x00$\x00tensor.long.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2072
                          b'ZZl\xfa\xda\xbe\x00\x00\x00\x00GQ^\xa9\xff\xff\xff\xff\xc5\xa4\x19\xa4\x00\x00\x00'
2073
                          b'\x00\xda\x9f\x04\xdd\xff\xff\xff\xff\x9b\xfc\x98\r\x00\x00\x00\x00\x8e\xb3\xb6'
2074
                          b'=\x00\x00\x00\x00n}\xd2\x8f\xff\xff\xff\xff\xe2\xfe\x14u\xff\xff\xff\xff\xf1\x01'
2075
                          b'T\x07\xff\xff\xff\xff\x9b\xb3"\x7f\xff\xff\xff\xff\xb2p\x07\xfc\xff\xff\xff\xff\x1f'
2076
                          b'1\xa6M\x00\x00\x00\x00a\xaa|u\xff\xff\xff\xff2Y\x12;\x00\x00\x00\x00\'J\xb7\xcb'
2077
                          b'\x00\x00\x00\x00m\xb2\x1c\xe1\xff\xff\xff\xffPK\x07\x08\xd5\x00\xa1r\x80\x00\x00'
2078
                          b'\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
2079
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00<\x00tensor.long.LE/versionFB8\x00'
2080
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9eg'
2081
                          b'U\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2082
                          b'\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00'
2083
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.LE/data.pklPK\x01\x02'
2084
                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd5\x00\xa1r\x80\x00\x00\x00\x80'
2085
                          b'\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00'
2086
                          b'\x00tensor.long.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2087
                          b'\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00'
2088
                          b'\x00\x00\x00\x00\x00\xd0\x01\x00\x00tensor.long.LE/versionPK\x06\x06,\x00\x00'
2089
                          b'\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2090
                          b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00'
2091
                          b'R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00'
2092
                          b'\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00'
2093
                          b'R\x02\x00\x00\x00\x00')
2094

2095
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2096
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.long.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
2097
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2098
                       b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2099
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2100
                       b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2101
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2102
                       b'\x00\x00\x1c\x00\x1d\x00tensor.long.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2103
                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2104
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2105
                       b'\x00\x19\x003\x00tensor.long.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2106
                       b'ZZZZZZZZZZZZZZZZZZZl\xfa\xda\xbe\x00\x00\x00\x00GQ^\xa9\xff\xff\xff\xff\xc5\xa4\x19'
2107
                       b'\xa4\x00\x00\x00\x00\xda\x9f\x04\xdd\xff\xff\xff\xff\x9b\xfc\x98\r\x00\x00\x00'
2108
                       b'\x00\x8e\xb3\xb6=\x00\x00\x00\x00n}\xd2\x8f\xff\xff\xff\xff\xe2\xfe\x14u\xff\xff'
2109
                       b'\xff\xff\xf1\x01T\x07\xff\xff\xff\xff\x9b\xb3"\x7f\xff\xff\xff\xff\xb2p\x07\xfc'
2110
                       b'\xff\xff\xff\xff\x1f1\xa6M\x00\x00\x00\x00a\xaa|u\xff\xff\xff\xff2Y\x12;\x00\x00'
2111
                       b'\x00\x00\'J\xb7\xcb\x00\x00\x00\x00m\xb2\x1c\xe1\xff\xff\xff\xffPK\x07\x08\xd5\x00'
2112
                       b'\xa1r\x80\x00\x00\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
2113
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x008\x00tensor.lon'
2114
                       b'g.LE.BOM/versionFB4\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK'
2115
                       b'\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08'
2116
                       b'\x08\x00\x00\x00\x00\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00'
2117
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.LE.'
2118
                       b'BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19'
2119
                       b'\x06\x00\x00\x00\x06\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2120
                       b'\x00\x00\xe9\x00\x00\x00tensor.long.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00'
2121
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd5\x00\xa1r\x80\x00\x00\x00\x80\x00\x00\x00\x19'
2122
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.long.L'
2123
                       b'E.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU'
2124
                       b'\x02\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2125
                       b'\x00\x00P\x02\x00\x00tensor.long.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
2126
                       b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
2127
                       b'\x04\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00'
2128
                       b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\x01\x00'
2129
                       b'\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00\xd2\x02\x00\x00'
2130
                       b'\x00\x00')
2131

2132
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2133
                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.long.BE/data.pklFB\x07\x00ZZZZZZZ\x80'
2134
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2135
                          b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2136
                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2137
                          b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2138
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2139
                          b'\x00\x00\x15\x00$\x00tensor.long.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2140
                          b'ZZ\x00\x00\x00\x00\xbe\xda\xfal\xff\xff\xff\xff\xa9^QG\x00\x00\x00\x00\xa4\x19\xa4'
2141
                          b'\xc5\xff\xff\xff\xff\xdd\x04\x9f\xda\x00\x00\x00\x00\r\x98\xfc\x9b\x00\x00\x00'
2142
                          b'\x00=\xb6\xb3\x8e\xff\xff\xff\xff\x8f\xd2}n\xff\xff\xff\xffu\x14\xfe\xe2\xff\xff'
2143
                          b'\xff\xff\x07T\x01\xf1\xff\xff\xff\xff\x7f"\xb3\x9b\xff\xff\xff\xff\xfc\x07p\xb2\x00'
2144
                          b'\x00\x00\x00M\xa61\x1f\xff\xff\xff\xffu|\xaaa\x00\x00\x00\x00;\x12Y2\x00\x00\x00'
2145
                          b'\x00\xcb\xb7J\'\xff\xff\xff\xff\xe1\x1c\xb2mPK\x07\x08\xb9\x1b\x81j\x80\x00\x00'
2146
                          b'\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
2147
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00<\x00tensor.long.BE/versionFB8\x00'
2148
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9eg'
2149
                          b'U\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2150
                          b'\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00'
2151
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.BE/data.pklPK\x01\x02'
2152
                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xb9\x1b\x81j\x80\x00\x00\x00\x80'
2153
                          b'\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00'
2154
                          b'\x00tensor.long.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2155
                          b'\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00'
2156
                          b'\x00\x00\x00\x00\x00\xd0\x01\x00\x00tensor.long.BE/versionPK\x06\x06,\x00\x00'
2157
                          b'\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2158
                          b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00'
2159
                          b'R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00'
2160
                          b'\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00'
2161
                          b'R\x02\x00\x00\x00\x00')
2162

2163
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2164
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.long.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
2165
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2166
                       b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2167
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2168
                       b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2169
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2170
                       b'\x00\x00\x1c\x00\x1d\x00tensor.long.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2171
                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2172
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2173
                       b'\x00\x19\x006\x00tensor.long.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2174
                       b'ZZZZZZZZZZZZZZZZZZZ\x00\x00\x00\x00\xbe\xda\xfal\xff\xff\xff\xff\xa9^QG\x00\x00\x00'
2175
                       b'\x00\xa4\x19\xa4\xc5\xff\xff\xff\xff\xdd\x04\x9f\xda\x00\x00\x00\x00\r\x98\xfc'
2176
                       b'\x9b\x00\x00\x00\x00=\xb6\xb3\x8e\xff\xff\xff\xff\x8f\xd2}n\xff\xff\xff\xffu\x14'
2177
                       b'\xfe\xe2\xff\xff\xff\xff\x07T\x01\xf1\xff\xff\xff\xff\x7f"\xb3\x9b\xff\xff\xff\xff'
2178
                       b'\xfc\x07p\xb2\x00\x00\x00\x00M\xa61\x1f\xff\xff\xff\xffu|\xaaa\x00\x00\x00\x00'
2179
                       b';\x12Y2\x00\x00\x00\x00\xcb\xb7J\'\xff\xff\xff\xff\xe1\x1c\xb2mPK\x07\x08\xb9\x1b'
2180
                       b'\x81j\x80\x00\x00\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
2181
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x008\x00tensor.lon'
2182
                       b'g.BE.BOM/versionFB4\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK'
2183
                       b'\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08'
2184
                       b'\x08\x00\x00\x00\x00\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00'
2185
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.BE.'
2186
                       b'BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3'
2187
                       b'\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2188
                       b'\x00\x00\xe9\x00\x00\x00tensor.long.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00'
2189
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xb9\x1b\x81j\x80\x00\x00\x00\x80\x00\x00\x00\x19'
2190
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.long.B'
2191
                       b'E.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU'
2192
                       b'\x02\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2193
                       b'\x00\x00P\x02\x00\x00tensor.long.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
2194
                       b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
2195
                       b'\x04\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00'
2196
                       b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\x01\x00'
2197
                       b'\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00\xd2\x02\x00\x00'
2198
                       b'\x00\x00')
2199

2200
        current_load_endian = get_default_load_endianness()
2201

2202
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2203
        buf_le_bom = io.BytesIO(data_le_bom)
2204
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2205
        buf_be_bom = io.BytesIO(data_be_bom)
2206

2207
        try:
2208
            set_default_load_endianness(LoadEndianness.NATIVE)
2209
            tensor_le_no_bom = torch.load(buf_le_no_bom)
2210
            tensor_be_no_bom = torch.load(buf_be_no_bom)
2211
        finally:
2212
            set_default_load_endianness(current_load_endian)
2213

2214
        tensor_le_bom = torch.load(buf_le_bom)
2215
        tensor_be_bom = torch.load(buf_be_bom)
2216

2217
        buf_le_no_bom.seek(0)
2218
        buf_be_no_bom.seek(0)
2219

2220
        try:
2221
            set_default_load_endianness(LoadEndianness.LITTLE)
2222
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2223
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2224
        finally:
2225
            set_default_load_endianness(current_load_endian)
2226

2227
        buf_le_no_bom.seek(0)
2228
        buf_be_no_bom.seek(0)
2229

2230
        try:
2231
            set_default_load_endianness(LoadEndianness.BIG)
2232
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2233
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2234
        finally:
2235
            set_default_load_endianness(current_load_endian)
2236

2237
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2238
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2239
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2240
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2241
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2242
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2243

2244
        if (sys.byteorder == 'little'):
2245
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2246
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2247
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2248
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2249
        else:
2250
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2251
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2252
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2253
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2254

2255
    def test_serialization_load_bom_data_int(self):
2256
        # 1. Generated on LE system using following commands:
2257
        #
2258
        # import torch
2259
        #
2260
        # x = torch.randint(-2147483648, 2147483648, [4, 4], dtype=torch.int)
2261
        #
2262
        # torch.save(x, "tensor.int.LE.pt", _disable_byteorder_record=True)
2263
        # torch.save(x, "tensor.int.LE.BOM.pt")
2264
        #
2265
        # print(x)
2266
        #
2267
        # 2. After that it is resaved on BE system with following commands:
2268
        #
2269
        # import torch
2270
        #
2271
        # x = torch.load('tensor.int.LE.BOM.pt')
2272
        #
2273
        # torch.save(x, 'tensor.int.BE.pt', _disable_byteorder_record=True)
2274
        # torch.save(x, 'tensor.int.BE.BOM.pt')
2275
        #
2276
        # print(x)
2277
        #
2278
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2279
        #
2280
        # file = open('filename', 'rb')
2281
        # data = file.read()
2282
        # file.close()
2283
        # print("\n".join(textwrap.wrap(str(data), 80)))
2284
        #
2285
        # BOM in this context is used as Byte Order Mark.
2286
        #
2287
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2288
                          b'\x00\x00\x00\x00\x00\x16\x00\x0c\x00tensor.int.LE/data.pklFB\x08\x00ZZZZZZZZ\x80'
2289
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2290
                          b'h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2291
                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2292
                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0\'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04'
2293
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2294
                          b'\x00\x00\x14\x00&\x00tensor.int.LE/data/0FB"\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2295
                          b'ZZZ\xf6\x19\x95i\xfaL\x1f\t%\xa3\r\xb8\xe5\xcfN\xe2\xa2\xc7\x8f\xb4\xfd\xf5(2\xe3'
2296
                          b'YX\xf5\x1dhO}\xeb\xba\xcf\x02\x8b\x84\xdd>L\xbc(\xc7\x92Q\x98\xa6\x1aQ^w\xea\x93'
2297
                          b'2>\xad\x87D\xdd\x9el\xb6\x15PK\x07\x08W\x1c\xcd\x19@\x00\x00\x00@\x00\x00\x00PK'
2298
                          b'\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2299
                          b'\x00\x00\x00\x00\x15\x00=\x00tensor.int.LE/versionFB9\x00ZZZZZZZZZZZZZZZZZZZZZZZ'
2300
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2301
                          b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdd\xa0\'\xa8'
2302
                          b'\x98\x00\x00\x00\x98\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2303
                          b'\x00\x00\x00\x00\x00\x00tensor.int.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
2304
                          b'\x00\x00\x00\x00\x00\x00W\x1c\xcd\x19@\x00\x00\x00@\x00\x00\x00\x14\x00\x00\x00'
2305
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00tensor.int.LE/data/0PK\x01'
2306
                          b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00'
2307
                          b'\x02\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x01'
2308
                          b'\x00\x00tensor.int.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00'
2309
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2310
                          b'\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00'
2311
                          b'PK\x06\x07\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2312
                          b'\x06\x00\x00\x00\x00\x03\x00\x03\x00\xc9\x00\x00\x00\x12\x02\x00\x00\x00\x00')
2313

2314
        data_le_bom = (b"PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2315
                       b"\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.int.LE.BOM/data.pklFB\x04\x00ZZZZ\x80"
2316
                       b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
2317
                       b"h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q"
2318
                       b"K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)"
2319
                       b"Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04"
2320
                       b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2321
                       b"\x00\x00\x1b\x00\x1f\x00tensor.int.LE.BOM/byteorderFB\x1b\x00ZZZZZZZZZZZZZZZZZZZ"
2322
                       b"ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00"
2323
                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2324
                       b"\x00\x18\x004\x00tensor.int.LE.BOM/data/0FB0\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
2325
                       b"ZZZZZZZZZZZZZZZZZZZ\xf6\x19\x95i\xfaL\x1f\t%\xa3\r\xb8\xe5\xcfN\xe2\xa2\xc7\x8f\xb4"
2326
                       b"\xfd\xf5(2\xe3YX\xf5\x1dhO}\xeb\xba\xcf\x02\x8b\x84\xdd>L\xbc(\xc7\x92Q\x98\xa6"
2327
                       b"\x1aQ^w\xea\x932>\xad\x87D\xdd\x9el\xb6\x15PK\x07\x08W\x1c\xcd\x19@\x00\x00\x00"
2328
                       b"@\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2329
                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x19\x009\x00tensor.int.LE.BOM/versionFB5\x00ZZZ"
2330
                       b"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00"
2331
                       b"\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
2332
                       b"\xdd\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00"
2333
                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int.LE.BOM/data.pklPK\x01\x02\x00"
2334
                       b"\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00"
2335
                       b"\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00"
2336
                       b"tensor.int.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00"
2337
                       b"\x00W\x1c\xcd\x19@\x00\x00\x00@\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00"
2338
                       b"\x00\x00\x00\x00\x00V\x01\x00\x00tensor.int.LE.BOM/data/0PK\x01\x02\x00\x00\x00"
2339
                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x19"
2340
                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00tensor.int"
2341
                       b".LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00"
2342
                       b"\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00"
2343
                       b"\x1e\x01\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00"
2344
                       b"\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00"
2345
                       b"\x00\x04\x00\x04\x00\x1e\x01\x00\x00\x92\x02\x00\x00\x00\x00")
2346

2347
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2348
                          b'\x00\x00\x00\x00\x00\x16\x00\x0c\x00tensor.int.BE/data.pklFB\x08\x00ZZZZZZZZ\x80'
2349
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2350
                          b'h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2351
                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2352
                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0\'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04'
2353
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2354
                          b'\x00\x00\x14\x00&\x00tensor.int.BE/data/0FB"\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2355
                          b'ZZZi\x95\x19\xf6\t\x1fL\xfa\xb8\r\xa3%\xe2N\xcf\xe5\xb4\x8f\xc7\xa22(\xf5\xfd\xf5'
2356
                          b'XY\xe3}Oh\x1d\x02\xcf\xba\xeb>\xdd\x84\x8b\xc7(\xbcL\xa6\x98Q\x92w^Q\x1a>2\x93\xea'
2357
                          b'\xddD\x87\xad\x15\xb6l\x9ePK\x07\x08rq\x19^@\x00\x00\x00@\x00\x00\x00PK\x03\x04'
2358
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2359
                          b'\x00\x00\x15\x00=\x00tensor.int.BE/versionFB9\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2360
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
2361
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdd\xa0\'\xa8\x98\x00'
2362
                          b'\x00\x00\x98\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2363
                          b'\x00\x00\x00\x00tensor.int.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
2364
                          b'\x00\x00\x00\x00rq\x19^@\x00\x00\x00@\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00'
2365
                          b'\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00tensor.int.BE/data/0PK\x01\x02\x00\x00'
2366
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
2367
                          b'\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00tens'
2368
                          b'or.int.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00'
2369
                          b'\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00'
2370
                          b'\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
2371
                          b'\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00'
2372
                          b'\x00\x00\x03\x00\x03\x00\xc9\x00\x00\x00\x12\x02\x00\x00\x00\x00')
2373

2374
        data_be_bom = (b"PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2375
                       b"\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.int.BE.BOM/data.pklFB\x04\x00ZZZZ\x80"
2376
                       b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
2377
                       b"h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q"
2378
                       b"K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)"
2379
                       b"Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04"
2380
                       b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2381
                       b"\x00\x00\x1b\x00\x1f\x00tensor.int.BE.BOM/byteorderFB\x1b\x00ZZZZZZZZZZZZZZZZZZZ"
2382
                       b"ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00"
2383
                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2384
                       b"\x00\x18\x007\x00tensor.int.BE.BOM/data/0FB3\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
2385
                       b"ZZZZZZZZZZZZZZZZZZZi\x95\x19\xf6\t\x1fL\xfa\xb8\r\xa3%\xe2N\xcf\xe5\xb4\x8f\xc7\xa2"
2386
                       b"2(\xf5\xfd\xf5XY\xe3}Oh\x1d\x02\xcf\xba\xeb>\xdd\x84\x8b\xc7(\xbcL\xa6\x98Q\x92"
2387
                       b"w^Q\x1a>2\x93\xea\xddD\x87\xad\x15\xb6l\x9ePK\x07\x08rq\x19^@\x00\x00\x00@\x00"
2388
                       b"\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2389
                       b"\x00\x00\x00\x00\x00\x00\x19\x009\x00tensor.int.BE.BOM/versionFB5\x00ZZZZZZZZZ"
2390
                       b"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00"
2391
                       b"\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdd"
2392
                       b"\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2393
                       b"\x00\x00\x00\x00\x00\x00\x00\x00tensor.int.BE.BOM/data.pklPK\x01\x02\x00\x00\x00"
2394
                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00"
2395
                       b"\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00tenso"
2396
                       b"r.int.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
2397
                       b"rq\x19^@\x00\x00\x00@\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2398
                       b"\x00\x00S\x01\x00\x00tensor.int.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08"
2399
                       b"\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x19\x00\x00\x00"
2400
                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00tensor.int.BE.BOM/vers"
2401
                       b"ionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00"
2402
                       b"\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00"
2403
                       b"\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00"
2404
                       b"\xb0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00"
2405
                       b"\x04\x00\x1e\x01\x00\x00\x92\x02\x00\x00\x00\x00")
2406

2407
        current_load_endian = get_default_load_endianness()
2408

2409
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2410
        buf_le_bom = io.BytesIO(data_le_bom)
2411
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2412
        buf_be_bom = io.BytesIO(data_be_bom)
2413

2414
        try:
2415
            set_default_load_endianness(LoadEndianness.NATIVE)
2416
            tensor_le_no_bom = torch.load(buf_le_no_bom)
2417
            tensor_be_no_bom = torch.load(buf_be_no_bom)
2418
        finally:
2419
            set_default_load_endianness(current_load_endian)
2420

2421
        tensor_le_bom = torch.load(buf_le_bom)
2422
        tensor_be_bom = torch.load(buf_be_bom)
2423

2424
        buf_le_no_bom.seek(0)
2425
        buf_be_no_bom.seek(0)
2426

2427
        try:
2428
            set_default_load_endianness(LoadEndianness.LITTLE)
2429
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2430
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2431
        finally:
2432
            set_default_load_endianness(current_load_endian)
2433

2434
        buf_le_no_bom.seek(0)
2435
        buf_be_no_bom.seek(0)
2436

2437
        try:
2438
            set_default_load_endianness(LoadEndianness.BIG)
2439
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2440
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2441
        finally:
2442
            set_default_load_endianness(current_load_endian)
2443

2444
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2445
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2446
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2447
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2448
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2449
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2450

2451
        if (sys.byteorder == 'little'):
2452
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2453
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2454
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2455
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2456
        else:
2457
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2458
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2459
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2460
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2461

2462
    def test_serialization_load_bom_data_int16(self):
2463
        # 1. Generated on LE system using following commands:
2464
        #
2465
        # import torch
2466
        #
2467
        # x = torch.randint(-32768, 32768, [4, 4], dtype=torch.int16)
2468
        #
2469
        # torch.save(x, "tensor.int16.LE.pt", _disable_byteorder_record=True)
2470
        # torch.save(x, "tensor.int16.LE.BOM.pt")
2471
        #
2472
        # print(x)
2473
        #
2474
        # 2. After that it is resaved on BE system with following commands:
2475
        #
2476
        # import torch
2477
        #
2478
        # x = torch.load('tensor.int16.LE.BOM.pt')
2479
        #
2480
        # torch.save(x, 'tensor.int16.BE.pt', _disable_byteorder_record=True)
2481
        # torch.save(x, 'tensor.int16.BE.BOM.pt')
2482
        #
2483
        # print(x)
2484
        #
2485
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2486
        #
2487
        # file = open('filename', 'rb')
2488
        # data = file.read()
2489
        # file.close()
2490
        # print("\n".join(textwrap.wrap(str(data), 80)))
2491
        #
2492
        # BOM in this context is used as Byte Order Mark.
2493
        #
2494
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2495
                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.int16.LE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
2496
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
2497
                          b'ShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2498
                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2499
                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2500
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2501
                          b'\x00\x00\x16\x00"\x00tensor.int16.LE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2502
                          b'ZZZO\xa4\x9bJ_Z-\xa5#\xf1y\xef\xb1@\x061"\xe3\x83\x07;\x83\x80\x08\xf1\x18q\xf6\xfe'
2503
                          b'\xf3\xc9,PK\x07\x08\xa0\x98\xd9\xdf \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
2504
                          b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2505
                          b'\x17\x00\x1b\x00tensor.int16.LE/versionFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
2506
                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
2507
                          b'\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00\x18\x00'
2508
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int16.LE/'
2509
                          b'data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa0\x98\xd9\xdf'
2510
                          b' \x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2511
                          b'\x00\xea\x00\x00\x00tensor.int16.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
2512
                          b'\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00'
2513
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.int16.LE/versionPK\x06'
2514
                          b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
2515
                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00'
2516
                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02'
2517
                          b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00'
2518
                          b'\xcf\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2519

2520
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2521
                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.int16.LE.BOM/data.pklFB\x02\x00ZZ\x80'
2522
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2523
                       b'h\nShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2524
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2525
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2526
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2527
                       b'\x00\x00\x1d\x00\x1b\x00tensor.int16.LE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZ'
2528
                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2529
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2530
                       b'\x00\x1a\x002\x00tensor.int16.LE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2531
                       b'ZZZZZZZZZZZZZZZZZZZO\xa4\x9bJ_Z-\xa5#\xf1y\xef\xb1@\x061"\xe3\x83\x07;\x83\x80\x08'
2532
                       b'\xf1\x18q\xf6\xfe\xf3\xc9,PK\x07\x08\xa0\x98\xd9\xdf \x00\x00\x00 \x00\x00\x00'
2533
                       b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2534
                       b'\x00\x00\x00\x00\x1b\x00\x17\x00tensor.int16.LE.BOM/versionFB\x13\x00ZZZZZZZZZ'
2535
                       b'ZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00'
2536
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00'
2537
                       b'\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2538
                       b'tensor.int16.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2539
                       b'\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00'
2540
                       b'\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.int16.LE.BOM/byteorderPK\x01\x02'
2541
                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa0\x98\xd9\xdf \x00\x00\x00 '
2542
                       b'\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00'
2543
                       b'tensor.int16.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2544
                       b'\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00'
2545
                       b'\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.int16.LE.BOM/versionPK\x06\x06,\x00'
2546
                       b'\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00'
2547
                       b'\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00'
2548
                       b'R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00'
2549
                       b'\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02'
2550
                       b'\x00\x00\x00\x00')
2551

2552
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2553
                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.int16.BE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
2554
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
2555
                          b'ShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2556
                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2557
                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2558
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2559
                          b'\x00\x00\x16\x00"\x00tensor.int16.BE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2560
                          b'ZZZ\xa4OJ\x9bZ_\xa5-\xf1#\xefy@\xb11\x06\xe3"\x07\x83\x83;\x08\x80\x18\xf1\xf6q\xf3'
2561
                          b'\xfe,\xc9PK\x07\x08\x8a\xeb\x9b[ \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00\x08'
2562
                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
2563
                          b'\x00\x1b\x00tensor.int16.BE/versionFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
2564
                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
2565
                          b'\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00\x18\x00\x00'
2566
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int16.BE/dat'
2567
                          b'a.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x8a\xeb\x9b[ '
2568
                          b'\x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2569
                          b'\xea\x00\x00\x00tensor.int16.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
2570
                          b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00'
2571
                          b'\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.int16.BE/versionPK\x06\x06'
2572
                          b',\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00'
2573
                          b'\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00'
2574
                          b'\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02\x00'
2575
                          b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcf'
2576
                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2577

2578
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2579
                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.int16.BE.BOM/data.pklFB\x02\x00ZZ\x80'
2580
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2581
                       b'h\nShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2582
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2583
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2584
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2585
                       b'\x00\x00\x1d\x00\x1b\x00tensor.int16.BE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZ'
2586
                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2587
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2588
                       b'\x00\x1a\x005\x00tensor.int16.BE.BOM/data/0FB1\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2589
                       b'ZZZZZZZZZZZZZZZZZZZ\xa4OJ\x9bZ_\xa5-\xf1#\xefy@\xb11\x06\xe3"\x07\x83\x83;\x08\x80'
2590
                       b'\x18\xf1\xf6q\xf3\xfe,\xc9PK\x07\x08\x8a\xeb\x9b[ \x00\x00\x00 \x00\x00\x00PK\x03'
2591
                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2592
                       b'\x00\x00\x00\x1b\x00\x17\x00tensor.int16.BE.BOM/versionFB\x13\x00ZZZZZZZZZZZZ'
2593
                       b'ZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00'
2594
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00'
2595
                       b'\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ten'
2596
                       b'sor.int16.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
2597
                       b'I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00'
2598
                       b'\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.int16.BE.BOM/byteorderPK\x01\x02\x00'
2599
                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x8a\xeb\x9b[ \x00\x00\x00 \x00\x00'
2600
                       b'\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tenso'
2601
                       b'r.int16.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1'
2602
                       b'\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2603
                       b'\x00\x00\x00\x00\xf0\x01\x00\x00tensor.int16.BE.BOM/versionPK\x06\x06,\x00\x00\x00'
2604
                       b'\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00'
2605
                       b'\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00R\x02'
2606
                       b'\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00'
2607
                       b'\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02\x00'
2608
                       b'\x00\x00\x00')
2609

2610
        current_load_endian = get_default_load_endianness()
2611

2612
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2613
        buf_le_bom = io.BytesIO(data_le_bom)
2614
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2615
        buf_be_bom = io.BytesIO(data_be_bom)
2616

2617
        try:
2618
            set_default_load_endianness(LoadEndianness.NATIVE)
2619
            tensor_le_no_bom = torch.load(buf_le_no_bom)
2620
            tensor_be_no_bom = torch.load(buf_be_no_bom)
2621
        finally:
2622
            set_default_load_endianness(current_load_endian)
2623

2624
        tensor_le_bom = torch.load(buf_le_bom)
2625
        tensor_be_bom = torch.load(buf_be_bom)
2626

2627
        buf_le_no_bom.seek(0)
2628
        buf_be_no_bom.seek(0)
2629

2630
        try:
2631
            set_default_load_endianness(LoadEndianness.LITTLE)
2632
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2633
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2634
        finally:
2635
            set_default_load_endianness(current_load_endian)
2636

2637
        buf_le_no_bom.seek(0)
2638
        buf_be_no_bom.seek(0)
2639

2640
        try:
2641
            set_default_load_endianness(LoadEndianness.BIG)
2642
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2643
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2644
        finally:
2645
            set_default_load_endianness(current_load_endian)
2646

2647
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2648
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2649
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2650
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2651
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2652
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2653

2654
        if (sys.byteorder == 'little'):
2655
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2656
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2657
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2658
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2659
        else:
2660
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2661
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2662
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2663
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2664

2665
    def test_serialization_load_bom_data_int8(self):
2666
        # 1. Generated on LE system using following commands:
2667
        #
2668
        # import torch
2669
        #
2670
        # x = torch.randint(-128, 128, [4, 4], dtype=torch.int8)
2671
        #
2672
        # torch.save(x, "tensor.int8.LE.pt", _disable_byteorder_record=True)
2673
        # torch.save(x, "tensor.int8.LE.BOM.pt")
2674
        #
2675
        # print(x)
2676
        #
2677
        # 2. After that it is resaved on BE system with following commands:
2678
        #
2679
        # import torch
2680
        #
2681
        # x = torch.load('tensor.int8.LE.BOM.pt')
2682
        #
2683
        # torch.save(x, 'tensor.int8.BE.pt', _disable_byteorder_record=True)
2684
        # torch.save(x, 'tensor.int8.BE.BOM.pt')
2685
        #
2686
        # print(x)
2687
        #
2688
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2689
        #
2690
        # file = open('filename', 'rb')
2691
        # data = file.read()
2692
        # file.close()
2693
        # print("\n".join(textwrap.wrap(str(data), 80)))
2694
        #
2695
        # BOM in this context is used as Byte Order Mark.
2696
        #
2697
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2698
                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.int8.LE/data.pklFB\x07\x00ZZZZZZZ\x80'
2699
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2700
                          b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2701
                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2702
                          b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2703
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2704
                          b'\x00\x00\x15\x00$\x00tensor.int8.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2705
                          b'ZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10\x00\x00\x00\x10'
2706
                          b'\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2707
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.int8.LE/versionFB(\x00ZZZZZZ'
2708
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2709
                          b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdb6\x08\xe7'
2710
                          b'\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2711
                          b'\x00\x00\x00\x00\x00\x00tensor.int8.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
2712
                          b'\x00\x00\x00\x00\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x15\x00\x00\x00'
2713
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.int8.LE/data/0'
2714
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
2715
                          b'\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01'
2716
                          b'\x00\x00tensor.int8.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00'
2717
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2718
                          b'\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00'
2719
                          b'PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2720
                          b'\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2721

2722
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2723
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.int8.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
2724
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2725
                       b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2726
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2727
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2728
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2729
                       b'\x00\x00\x1c\x00\x1d\x00tensor.int8.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2730
                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2731
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2732
                       b'\x00\x19\x003\x00tensor.int8.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2733
                       b'ZZZZZZZZZZZZZZZZZZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10'
2734
                       b'\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
2735
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00tensor.int8.LE.BOM'
2736
                       b'/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
2737
                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2738
                       b'\x00\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00'
2739
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int8.LE.BOM/data.pklPK\x01\x02\x00'
2740
                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00'
2741
                       b'\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00'
2742
                       b'tensor.int8.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2743
                       b'\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00'
2744
                       b'\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.int8.LE.BOM/data/0PK\x01\x02\x00\x00'
2745
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
2746
                       b'\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00ten'
2747
                       b'sor.int8.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
2748
                       b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00'
2749
                       b'\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
2750
                       b'\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00'
2751
                       b'\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
2752

2753
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2754
                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.int8.BE/data.pklFB\x07\x00ZZZZZZZ\x80'
2755
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2756
                          b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2757
                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2758
                          b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2759
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2760
                          b'\x00\x00\x15\x00$\x00tensor.int8.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2761
                          b'ZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10\x00\x00\x00\x10'
2762
                          b'\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2763
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.int8.BE/versionFB(\x00ZZZZZZ'
2764
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2765
                          b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdb6\x08\xe7'
2766
                          b'\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2767
                          b'\x00\x00\x00\x00\x00\x00tensor.int8.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
2768
                          b'\x00\x00\x00\x00\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x15\x00\x00\x00'
2769
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.int8.BE/data/0'
2770
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
2771
                          b'\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01'
2772
                          b'\x00\x00tensor.int8.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00'
2773
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2774
                          b'\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00'
2775
                          b'PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2776
                          b'\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2777

2778
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2779
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.int8.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
2780
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2781
                       b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2782
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2783
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2784
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2785
                       b'\x00\x00\x1c\x00\x1d\x00tensor.int8.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2786
                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2787
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2788
                       b'\x00\x19\x006\x00tensor.int8.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2789
                       b'ZZZZZZZZZZZZZZZZZZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10'
2790
                       b'\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
2791
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00tensor.int8.BE.BOM'
2792
                       b'/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
2793
                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2794
                       b'\x00\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00'
2795
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int8.BE.BOM/data.pklPK\x01\x02\x00'
2796
                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00'
2797
                       b'\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00'
2798
                       b'tensor.int8.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2799
                       b'\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00'
2800
                       b'\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.int8.BE.BOM/data/0PK\x01\x02\x00\x00'
2801
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
2802
                       b'\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00ten'
2803
                       b'sor.int8.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
2804
                       b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00'
2805
                       b'\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
2806
                       b'\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00'
2807
                       b'\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
2808

2809
        current_load_endian = get_default_load_endianness()
2810

2811
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2812
        buf_le_bom = io.BytesIO(data_le_bom)
2813
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2814
        buf_be_bom = io.BytesIO(data_be_bom)
2815

2816
        try:
2817
            set_default_load_endianness(LoadEndianness.NATIVE)
2818
            tensor_le_no_bom = torch.load(buf_le_no_bom)
2819
            tensor_be_no_bom = torch.load(buf_be_no_bom)
2820
        finally:
2821
            set_default_load_endianness(current_load_endian)
2822

2823
        tensor_le_bom = torch.load(buf_le_bom)
2824
        tensor_be_bom = torch.load(buf_be_bom)
2825

2826
        buf_le_no_bom.seek(0)
2827
        buf_be_no_bom.seek(0)
2828

2829
        try:
2830
            set_default_load_endianness(LoadEndianness.LITTLE)
2831
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2832
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2833
        finally:
2834
            set_default_load_endianness(current_load_endian)
2835

2836
        buf_le_no_bom.seek(0)
2837
        buf_be_no_bom.seek(0)
2838

2839
        try:
2840
            set_default_load_endianness(LoadEndianness.BIG)
2841
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2842
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2843
        finally:
2844
            set_default_load_endianness(current_load_endian)
2845

2846
        # 1-byte types are same on BE and LE
2847
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2848
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2849
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2850
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2851
        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2852
        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2853
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2854
        self.assertTrue(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2855
        self.assertTrue(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2856
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2857

2858
    def test_serialization_load_bom_data_uint8(self):
2859
        # 1. Generated on LE system using following commands:
2860
        #
2861
        # import torch
2862
        #
2863
        # x = torch.randint(0, 256, [4, 4], dtype=torch.uint8)
2864
        #
2865
        # torch.save(x, "tensor.uint8.LE.pt", _disable_byteorder_record=True)
2866
        # torch.save(x, "tensor.uint8.LE.BOM.pt")
2867
        #
2868
        # print(x)
2869
        #
2870
        # 2. After that it is resaved on BE system with following commands:
2871
        #
2872
        # import torch
2873
        #
2874
        # x = torch.load('tensor.uint8.LE.BOM.pt')
2875
        #
2876
        # torch.save(x, 'tensor.uint8.BE.pt', _disable_byteorder_record=True)
2877
        # torch.save(x, 'tensor.uint8.BE.BOM.pt')
2878
        #
2879
        # print(x)
2880
        #
2881
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2882
        #
2883
        # file = open('filename', 'rb')
2884
        # data = file.read()
2885
        # file.close()
2886
        # print("\n".join(textwrap.wrap(str(data), 80)))
2887
        #
2888
        # BOM in this context is used as Byte Order Mark.
2889
        #
2890
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2891
                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.uint8.LE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
2892
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
2893
                          b'ByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05QK'
2894
                          b'\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)R'
2895
                          b'q\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
2896
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2897
                          b'\x00\x16\x00#\x00tensor.uint8.LE/data/0FB\x1f\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2898
                          b'ZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94#\x08\x10\x00\x00'
2899
                          b'\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
2900
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.uint8.LE/versionFB\''
2901
                          b'\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
2902
                          b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xff'
2903
                          b'\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2904
                          b'\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.LE/data.pklPK\x01\x02\x00\x00\x00'
2905
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00'
2906
                          b'\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.'
2907
                          b'uint8.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9e'
2908
                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2909
                          b'\x00\x00`\x01\x00\x00tensor.uint8.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
2910
                          b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
2911
                          b'\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00'
2912
                          b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01'
2913
                          b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00'
2914
                          b'\x00\x00\x00')
2915

2916
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2917
                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.uint8.LE.BOM/data.pklFB\x02\x00ZZ\x80'
2918
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2919
                       b'h\nByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2920
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2921
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2922
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2923
                       b'\x00\x00\x1d\x00\x1c\x00tensor.uint8.LE.BOM/byteorderFB\x18\x00ZZZZZZZZZZZZZZZZ'
2924
                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2925
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2926
                       b'\x00\x1a\x002\x00tensor.uint8.LE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2927
                       b'ZZZZZZZZZZZZZZZZZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94'
2928
                       b'#\x08\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
2929
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.ui'
2930
                       b'nt8.LE.BOM/versionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9e'
2931
                       b'gU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
2932
                       b'\x00\x00\x00\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x1c\x00\x00\x00\x00\x00'
2933
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.LE.BOM/data.pklPK'
2934
                       b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00'
2935
                       b'\x00\x06\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9'
2936
                       b'\x00\x00\x00tensor.uint8.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
2937
                       b'\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00'
2938
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.uint8.LE.BOM/data/0'
2939
                       b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
2940
                       b'\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0'
2941
                       b'\x01\x00\x00tensor.uint8.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
2942
                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
2943
                       b'\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00'
2944
                       b'\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2945
                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
2946

2947
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2948
                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.uint8.BE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
2949
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
2950
                          b'ByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05QK'
2951
                          b'\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)R'
2952
                          b'q\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
2953
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2954
                          b'\x00\x16\x00#\x00tensor.uint8.BE/data/0FB\x1f\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2955
                          b'ZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94#\x08\x10\x00\x00'
2956
                          b'\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
2957
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.uint8.BE/versionFB\''
2958
                          b'\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
2959
                          b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xff'
2960
                          b'\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2961
                          b'\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.BE/data.pklPK\x01\x02\x00\x00\x00'
2962
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00'
2963
                          b'\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.'
2964
                          b'uint8.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9e'
2965
                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2966
                          b'\x00\x00`\x01\x00\x00tensor.uint8.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
2967
                          b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
2968
                          b'\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00'
2969
                          b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01'
2970
                          b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00'
2971
                          b'\x00\x00\x00')
2972

2973
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2974
                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.uint8.BE.BOM/data.pklFB\x02\x00ZZ\x80'
2975
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2976
                       b'h\nByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2977
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2978
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2979
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2980
                       b'\x00\x00\x1d\x00\x1c\x00tensor.uint8.BE.BOM/byteorderFB\x18\x00ZZZZZZZZZZZZZZZZ'
2981
                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2982
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2983
                       b'\x00\x1a\x005\x00tensor.uint8.BE.BOM/data/0FB1\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2984
                       b'ZZZZZZZZZZZZZZZZZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94'
2985
                       b'#\x08\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
2986
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.ui'
2987
                       b'nt8.BE.BOM/versionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9e'
2988
                       b'gU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
2989
                       b'\x00\x00\x00\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x1c\x00\x00\x00\x00\x00'
2990
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.BE.BOM/data.pklPK'
2991
                       b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00'
2992
                       b'\x00\x03\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9'
2993
                       b'\x00\x00\x00tensor.uint8.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
2994
                       b'\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00'
2995
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.uint8.BE.BOM/data/0'
2996
                       b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
2997
                       b'\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0'
2998
                       b'\x01\x00\x00tensor.uint8.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
2999
                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3000
                       b'\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00'
3001
                       b'\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3002
                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
3003

3004
        current_load_endian = get_default_load_endianness()
3005

3006
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3007
        buf_le_bom = io.BytesIO(data_le_bom)
3008
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3009
        buf_be_bom = io.BytesIO(data_be_bom)
3010

3011
        try:
3012
            set_default_load_endianness(LoadEndianness.NATIVE)
3013
            tensor_le_no_bom = torch.load(buf_le_no_bom)
3014
            tensor_be_no_bom = torch.load(buf_be_no_bom)
3015
        finally:
3016
            set_default_load_endianness(current_load_endian)
3017

3018
        tensor_le_bom = torch.load(buf_le_bom)
3019
        tensor_be_bom = torch.load(buf_be_bom)
3020

3021
        buf_le_no_bom.seek(0)
3022
        buf_be_no_bom.seek(0)
3023

3024
        try:
3025
            set_default_load_endianness(LoadEndianness.LITTLE)
3026
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3027
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3028
        finally:
3029
            set_default_load_endianness(current_load_endian)
3030

3031
        buf_le_no_bom.seek(0)
3032
        buf_be_no_bom.seek(0)
3033

3034
        try:
3035
            set_default_load_endianness(LoadEndianness.BIG)
3036
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3037
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3038
        finally:
3039
            set_default_load_endianness(current_load_endian)
3040

3041
        # 1-byte types are same on BE and LE
3042
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3043
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3044
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3045
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3046
        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3047
        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3048
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3049
        self.assertTrue(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3050
        self.assertTrue(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3051
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3052

3053
    def test_serialization_load_bom_data_bool(self):
3054
        # 1. Generated on LE system using following commands:
3055
        #
3056
        # import torch
3057
        #
3058
        # x = torch.randint(0, 2, [4, 4], dtype=torch.bool)
3059
        #
3060
        # torch.save(x, "tensor.bool.LE.pt", _disable_byteorder_record=True)
3061
        # torch.save(x, "tensor.bool.LE.BOM.pt")
3062
        #
3063
        # print(x)
3064
        #
3065
        # 2. After that it is resaved on BE system with following commands:
3066
        #
3067
        # import torch
3068
        #
3069
        # x = torch.load('tensor.bool.LE.BOM.pt')
3070
        #
3071
        # torch.save(x, 'tensor.bool.BE.pt', _disable_byteorder_record=True)
3072
        # torch.save(x, 'tensor.bool.BE.BOM.pt')
3073
        #
3074
        # print(x)
3075
        #
3076
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3077
        #
3078
        # file = open('filename', 'rb')
3079
        # data = file.read()
3080
        # file.close()
3081
        # print("\n".join(textwrap.wrap(str(data), 80)))
3082
        #
3083
        # BOM in this context is used as Byte Order Mark.
3084
        #
3085
        data_le_no_bom = (b"PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3086
                          b"\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.bool.LE/data.pklFB\x07\x00ZZZZZZZ\x80"
3087
                          b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
3088
                          b"h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05"
3089
                          b"QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08"
3090
                          b")Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00"
3091
                          b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3092
                          b"\x00\x15\x00$\x00tensor.bool.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x01"
3093
                          b"\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00PK\x07\x08\x00Y04"
3094
                          b"\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
3095
                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.bool.LE/ve"
3096
                          b"rsionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00"
3097
                          b"\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00"
3098
                          b"\x00\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00"
3099
                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.LE/data.pklPK\x01\x02\x00\x00"
3100
                          b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x15"
3101
                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.bo"
3102
                          b"ol.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU"
3103
                          b"\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3104
                          b"\x00\x00`\x01\x00\x00tensor.bool.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00"
3105
                          b"\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03"
3106
                          b"\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00"
3107
                          b"\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00"
3108
                          b"\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00"
3109
                          b"\x00\x00")
3110

3111
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3112
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bool.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
3113
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3114
                       b'h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
3115
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3116
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
3117
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3118
                       b'\x00\x1c\x00\x1d\x00tensor.bool.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZ'
3119
                       b'ZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
3120
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3121
                       b'\x00\x19\x003\x00tensor.bool.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3122
                       b'ZZZZZZZZZZZZZZZZZ\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00'
3123
                       b'PK\x07\x08\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3124
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00'
3125
                       b'tensor.bool.LE.BOM/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08'
3126
                       b'\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3127
                       b'\x00\x00\x00\x00\x00\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00'
3128
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.LE.BOM/dat'
3129
                       b'a.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06'
3130
                       b'\x00\x00\x00\x06\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3131
                       b'\x00\xe9\x00\x00\x00tensor.bool.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08'
3132
                       b'\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00'
3133
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.bool.LE.BOM/data/0P'
3134
                       b'K\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00'
3135
                       b'\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01'
3136
                       b'\x00\x00tensor.bool.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3137
                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3138
                       b'\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00'
3139
                       b'PK\x06\x07\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3140
                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
3141

3142
        data_be_no_bom = (b"PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3143
                          b"\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.bool.BE/data.pklFB\x07\x00ZZZZZZZ\x80"
3144
                          b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
3145
                          b"h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05"
3146
                          b"QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08"
3147
                          b")Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00"
3148
                          b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3149
                          b"\x00\x15\x00$\x00tensor.bool.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x01"
3150
                          b"\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00PK\x07\x08\x00Y04"
3151
                          b"\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
3152
                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.bool.BE/ve"
3153
                          b"rsionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00"
3154
                          b"\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00"
3155
                          b"\x00\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00"
3156
                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.BE/data.pklPK\x01\x02\x00\x00"
3157
                          b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x15"
3158
                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.bo"
3159
                          b"ol.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU"
3160
                          b"\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3161
                          b"\x00\x00`\x01\x00\x00tensor.bool.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00"
3162
                          b"\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03"
3163
                          b"\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00"
3164
                          b"\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00"
3165
                          b"\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00"
3166
                          b"\x00\x00")
3167

3168
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3169
                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bool.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
3170
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3171
                       b'h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
3172
                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3173
                       b')Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
3174
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3175
                       b'\x00\x1c\x00\x1d\x00tensor.bool.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZ'
3176
                       b'ZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00'
3177
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3178
                       b'\x19\x006\x00tensor.bool.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3179
                       b'ZZZZZZZZZZZZZZZZZ\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00'
3180
                       b'PK\x07\x08\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3181
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00'
3182
                       b'tensor.bool.BE.BOM/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08'
3183
                       b'\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3184
                       b'\x00\x00\x00\x00\x00\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00'
3185
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.BE.BOM/dat'
3186
                       b'a.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03'
3187
                       b'\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3188
                       b'\x00\xe9\x00\x00\x00tensor.bool.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08'
3189
                       b'\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00'
3190
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.bool.BE.BOM/data/0P'
3191
                       b'K\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00'
3192
                       b'\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01'
3193
                       b'\x00\x00tensor.bool.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3194
                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3195
                       b'\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00'
3196
                       b'PK\x06\x07\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3197
                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
3198

3199
        current_load_endian = get_default_load_endianness()
3200

3201
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3202
        buf_le_bom = io.BytesIO(data_le_bom)
3203
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3204
        buf_be_bom = io.BytesIO(data_be_bom)
3205

3206
        try:
3207
            set_default_load_endianness(LoadEndianness.NATIVE)
3208
            tensor_le_no_bom = torch.load(buf_le_no_bom)
3209
            tensor_be_no_bom = torch.load(buf_be_no_bom)
3210
        finally:
3211
            set_default_load_endianness(current_load_endian)
3212

3213
        tensor_le_bom = torch.load(buf_le_bom)
3214
        tensor_be_bom = torch.load(buf_be_bom)
3215

3216
        buf_le_no_bom.seek(0)
3217
        buf_be_no_bom.seek(0)
3218

3219
        try:
3220
            set_default_load_endianness(LoadEndianness.LITTLE)
3221
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3222
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3223
        finally:
3224
            set_default_load_endianness(current_load_endian)
3225

3226
        buf_le_no_bom.seek(0)
3227
        buf_be_no_bom.seek(0)
3228

3229
        try:
3230
            set_default_load_endianness(LoadEndianness.BIG)
3231
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3232
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3233
        finally:
3234
            set_default_load_endianness(current_load_endian)
3235

3236
        # 1-byte types are same on BE and LE
3237
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3238
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3239
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3240
        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3241
        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3242
        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3243
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3244
        self.assertTrue(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3245
        self.assertTrue(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3246
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3247

3248
    def test_serialization_load_bom_data_bfloat16(self):
3249
        # 1. Generated on LE system using following commands:
3250
        #
3251
        # import torch
3252
        #
3253
        # x = torch.randn(2,2, dtype=torch.bfloat16)
3254
        #
3255
        # torch.save(x, "tensor.bfloat16.LE.pt", _disable_byteorder_record=True)
3256
        # torch.save(x, "tensor.bfloat16.LE.BOM.pt")
3257
        #
3258
        # print(x)
3259
        #
3260
        # 2. After that it is resaved on BE system with following commands:
3261
        #
3262
        # import torch
3263
        #
3264
        # x = torch.load('tensor.bfloat16.LE.BOM.pt')
3265
        #
3266
        # torch.save(x, 'tensor.bfloat16.BE.pt', _disable_byteorder_record=True)
3267
        # torch.save(x, 'tensor.bfloat16.BE.BOM.pt')
3268
        #
3269
        # print(x)
3270
        #
3271
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3272
        #
3273
        # file = open('filename', 'rb')
3274
        # data = file.read()
3275
        # file.close()
3276
        # print("\n".join(textwrap.wrap(str(data), 80)))
3277
        #
3278
        # BOM in this context is used as Byte Order Mark.
3279
        #
3280
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3281
                          b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bfloat16.LE/data.pklFB\x03\x00ZZZ\x80'
3282
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3283
                          b'h\nBFloat16Storage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq'
3284
                          b'\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq'
3285
                          b'\x08)Rq\ttq\nRq\x0b.PK\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03'
3286
                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3287
                          b'\x00\x00\x00\x19\x00\x1c\x00tensor.bfloat16.LE/data/0FB\x18\x00ZZZZZZZZZZZZZZZZ'
3288
                          b'ZZZZZZZZ\r@i\xber?\xbc\xbfPK\x07\x085\xd2\x8f\xc7\x08\x00\x00\x00\x08\x00\x00\x00'
3289
                          b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3290
                          b'\x00\x00\x00\x00\x1a\x000\x00tensor.bfloat16.LE/versionFB,\x00ZZZZZZZZZZZZZZZ'
3291
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
3292
                          b'\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00'
3293
                          b'\x00\x00\x9d\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3294
                          b'\x00\x00\x00\x00tensor.bfloat16.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
3295
                          b'\x00\x00\x00\x00\x00\x005\xd2\x8f\xc7\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00'
3296
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00tensor.bfloat16.LE/'
3297
                          b'data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00'
3298
                          b'\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3299
                          b'X\x01\x00\x00tensor.bfloat16.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00'
3300
                          b'\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03'
3301
                          b'\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00'
3302
                          b'\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00'
3303
                          b'\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd8\x00\x00\x00\xd2\x01\x00\x00'
3304
                          b'\x00\x00')
3305

3306
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3307
                       b'\x00\x00\x00\x00\x00\x1f\x00C\x00tensor.bfloat16.LE.BOM/data.pklFB?\x00ZZZZZZZZZ'
3308
                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_re'
3309
                       b'build_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nBFloat16Storage\nq\x02'
3310
                       b'X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05QK\x00K\x02K\x02\x86'
3311
                       b'q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK'
3312
                       b'\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3313
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x15'
3314
                       b'\x00tensor.bfloat16.LE.BOM/byteorderFB\x11\x00ZZZZZZZZZZZZZZZZZlittlePK\x07\x08\x85'
3315
                       b'=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00'
3316
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00/\x00tenso'
3317
                       b'r.bfloat16.LE.BOM/data/0FB+\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\r@i\xbe'
3318
                       b'r?\xbc\xbfPK\x07\x085\xd2\x8f\xc7\x08\x00\x00\x00\x08\x00\x00\x00PK\x03\x04\x00'
3319
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3320
                       b'\x00\x1e\x00,\x00tensor.bfloat16.LE.BOM/versionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZ'
3321
                       b'ZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02'
3322
                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d'
3323
                       b'\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3324
                       b'\x00tensor.bfloat16.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3325
                       b'\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00 \x00\x00\x00\x00\x00'
3326
                       b'\x00\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00tensor.bfloat16.LE.BOM/byteorderPK\x01'
3327
                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x005\xd2\x8f\xc7\x08\x00\x00'
3328
                       b'\x00\x08\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96'
3329
                       b'\x01\x00\x00tensor.bfloat16.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
3330
                       b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1e\x00\x00\x00\x00'
3331
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00tensor.bfloat16.LE.BOM/vers'
3332
                       b'ionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00'
3333
                       b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x002\x01\x00'
3334
                       b'\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xc4'
3335
                       b'\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00'
3336
                       b'\x04\x002\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3337

3338
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3339
                          b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bfloat16.BE/data.pklFB\x03\x00ZZZ\x80'
3340
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3341
                          b'h\nBFloat16Storage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq'
3342
                          b'\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq'
3343
                          b'\x08)Rq\ttq\nRq\x0b.PK\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03'
3344
                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3345
                          b'\x00\x00\x00\x19\x00\x1c\x00tensor.bfloat16.BE/data/0FB\x18\x00ZZZZZZZZZZZZZZZZ'
3346
                          b'ZZZZZZZZ@\r\xbei?r\xbf\xbcPK\x07\x08d\x02=\xc7\x08\x00\x00\x00\x08\x00\x00\x00PK'
3347
                          b'\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3348
                          b'\x00\x00\x00\x00\x1a\x000\x00tensor.bfloat16.BE/versionFB,\x00ZZZZZZZZZZZZZZZZZZ'
3349
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
3350
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00'
3351
                          b'\x00\x00\x9d\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3352
                          b'\x00\x00\x00\x00tensor.bfloat16.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3353
                          b'\x00\x00\x00\x00\x00d\x02=\xc7\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00\x00\x00'
3354
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00tensor.bfloat16.BE/data/0'
3355
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
3356
                          b'\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x01'
3357
                          b'\x00\x00tensor.bfloat16.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03'
3358
                          b'-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00'
3359
                          b'\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00'
3360
                          b'\x00PK\x06\x07\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
3361
                          b'PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd8\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
3362

3363
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3364
                       b'\x00\x00\x00\x00\x00\x1f\x00C\x00tensor.bfloat16.BE.BOM/data.pklFB?\x00ZZZZZZZZZ'
3365
                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_re'
3366
                       b'build_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nBFloat16Storage\nq\x02'
3367
                       b'X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05QK\x00K\x02K\x02\x86'
3368
                       b'q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK'
3369
                       b'\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3370
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x15'
3371
                       b'\x00tensor.bfloat16.BE.BOM/byteorderFB\x11\x00ZZZZZZZZZZZZZZZZZbigPK\x07\x08I\xe2'
3372
                       b'\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
3373
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x002\x00tensor.b'
3374
                       b'float16.BE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ@\r\xbe'
3375
                       b'i?r\xbf\xbcPK\x07\x08d\x02=\xc7\x08\x00\x00\x00\x08\x00\x00\x00PK\x03\x04\x00\x00'
3376
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3377
                       b'\x1e\x00,\x00tensor.bfloat16.BE.BOM/versionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3378
                       b'ZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00'
3379
                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00'
3380
                       b'\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3381
                       b'tensor.bfloat16.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
3382
                       b'\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00 \x00\x00\x00\x00\x00\x00'
3383
                       b'\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00tensor.bfloat16.BE.BOM/byteorderPK\x01'
3384
                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00d\x02=\xc7\x08\x00\x00\x00\x08'
3385
                       b'\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x01\x00'
3386
                       b'\x00tensor.bfloat16.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3387
                       b'\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00'
3388
                       b'\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00tensor.bfloat16.BE.BOM/versionPK\x06'
3389
                       b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3390
                       b'\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00'
3391
                       b'\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xc4\x03'
3392
                       b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00'
3393
                       b'2\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3394

3395
        current_load_endian = get_default_load_endianness()
3396

3397
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3398
        buf_le_bom = io.BytesIO(data_le_bom)
3399
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3400
        buf_be_bom = io.BytesIO(data_be_bom)
3401

3402
        try:
3403
            set_default_load_endianness(LoadEndianness.NATIVE)
3404
            tensor_le_no_bom = torch.load(buf_le_no_bom)
3405
            tensor_be_no_bom = torch.load(buf_be_no_bom)
3406
        finally:
3407
            set_default_load_endianness(current_load_endian)
3408

3409
        tensor_le_bom = torch.load(buf_le_bom)
3410
        tensor_be_bom = torch.load(buf_be_bom)
3411

3412
        buf_le_no_bom.seek(0)
3413
        buf_be_no_bom.seek(0)
3414

3415
        try:
3416
            set_default_load_endianness(LoadEndianness.LITTLE)
3417
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3418
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3419
        finally:
3420
            set_default_load_endianness(current_load_endian)
3421

3422
        buf_le_no_bom.seek(0)
3423
        buf_be_no_bom.seek(0)
3424

3425
        try:
3426
            set_default_load_endianness(LoadEndianness.BIG)
3427
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3428
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3429
        finally:
3430
            set_default_load_endianness(current_load_endian)
3431

3432
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3433
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3434
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3435
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3436
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3437
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3438

3439
        if (sys.byteorder == 'little'):
3440
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3441
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3442
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
3443
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
3444
        else:
3445
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
3446
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
3447
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3448
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3449

3450
    def test_serialization_load_bom_data_cdouble(self):
3451
        # 1. Generated on LE system using following commands:
3452
        #
3453
        # import torch
3454
        #
3455
        # x = torch.randn(2,2, dtype=torch.cdouble)
3456
        #
3457
        # torch.save(x, "tensor.cdouble.LE.pt", _disable_byteorder_record=True)
3458
        # torch.save(x, "tensor.cdouble.LE.BOM.pt")
3459
        #
3460
        # print(x)
3461
        #
3462
        # 2. After that it is resaved on BE system with following commands:
3463
        #
3464
        # import torch
3465
        #
3466
        # x = torch.load('tensor.cdouble.LE.BOM.pt')
3467
        #
3468
        # torch.save(x, 'tensor.cdouble.BE.pt', _disable_byteorder_record=True)
3469
        # torch.save(x, 'tensor.cdouble.BE.BOM.pt')
3470
        #
3471
        # print(x)
3472
        #
3473
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3474
        #
3475
        # file = open('filename', 'rb')
3476
        # data = file.read()
3477
        # file.close()
3478
        # print("\n".join(textwrap.wrap(str(data), 80)))
3479
        #
3480
        # BOM in this context is used as Byte Order Mark.
3481
        #
3482
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3483
                          b'\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.cdouble.LE/data.pklFB\x04\x00ZZZZ\x80'
3484
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3485
                          b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3486
                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3487
                          b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3488
                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3489
                          b'\x00\x00\x00\x18\x00\x18\x00tensor.cdouble.LE/data/0FB\x14\x00ZZZZZZZZZZZZZZZZZZ'
3490
                          b'ZZ\xd1/\x84\xd8,\x00\xcd\xbf|L\xcf\xd0O\xee\xd7\xbfb\xb6<\xb4\xe2_\xec?v+\x86\xd9'
3491
                          b'\xca\x0e\xf8?i#\xbb\xfcU\x1b\xe0\xbf\x984\xcd\x02q\x8a\xe9?\xc1_\xd7R\xe3\xfb\xe3'
3492
                          b'\xbf\xcf\xce>\xcd\xa2\x9f\xe8?PK\x07\x08\x1d\xed\xed\xa0@\x00\x00\x00@\x00\x00'
3493
                          b'\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3494
                          b'\x00\x00\x00\x00\x00\x19\x009\x00tensor.cdouble.LE/versionFB5\x00ZZZZZZZZZZZZZ'
3495
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02'
3496
                          b'\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00(W{\xca'
3497
                          b'\xa2\x00\x00\x00\xa2\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3498
                          b'\x00\x00\x00\x00\x00\x00tensor.cdouble.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08'
3499
                          b'\x08\x00\x00\x00\x00\x00\x00\x1d\xed\xed\xa0@\x00\x00\x00@\x00\x00\x00\x18\x00\x00'
3500
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00tensor.cdouble.LE/'
3501
                          b'data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00'
3502
                          b'\x00\x00\x02\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3503
                          b'\x90\x01\x00\x00tensor.cdouble.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00'
3504
                          b'\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03'
3505
                          b'\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00'
3506
                          b'\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x01\x00'
3507
                          b'\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd5\x00\x00\x00\x12\x02\x00\x00'
3508
                          b'\x00\x00')
3509

3510
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3511
                       b'\x00\x00\x00\x00\x00\x1e\x00\x04\x00tensor.cdouble.LE.BOM/data.pklFB\x00\x00\x80'
3512
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3513
                       b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3514
                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3515
                       b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3516
                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3517
                       b'\x00\x00\x00\x1f\x00\x11\x00tensor.cdouble.LE.BOM/byteorderFB\r\x00ZZZZZZZZZZZZZ'
3518
                       b'littlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08'
3519
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c'
3520
                       b'\x000\x00tensor.cdouble.LE.BOM/data/0FB,\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3521
                       b'ZZZZZZZZZZZ\xd1/\x84\xd8,\x00\xcd\xbf|L\xcf\xd0O\xee\xd7\xbfb\xb6<\xb4\xe2_\xec?'
3522
                       b'v+\x86\xd9\xca\x0e\xf8?i#\xbb\xfcU\x1b\xe0\xbf\x984\xcd\x02q\x8a\xe9?\xc1_\xd7R\xe3'
3523
                       b'\xfb\xe3\xbf\xcf\xce>\xcd\xa2\x9f\xe8?PK\x07\x08\x1d\xed\xed\xa0@\x00\x00\x00'
3524
                       b'@\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3525
                       b'\x00\x00\x00\x00\x00\x00\x00\x1d\x005\x00tensor.cdouble.LE.BOM/versionFB1\x00'
3526
                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
3527
                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
3528
                       b'(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3529
                       b'\x00\x00\x00\x00\x00\x00\x00\x00tensor.cdouble.LE.BOM/data.pklPK\x01\x02\x00\x00'
3530
                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00'
3531
                       b'\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00te'
3532
                       b'nsor.cdouble.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
3533
                       b'\x00\x1d\xed\xed\xa0@\x00\x00\x00@\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00'
3534
                       b'\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.cdouble.LE.BOM/data/0PK\x01\x02\x00'
3535
                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
3536
                       b'\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00te'
3537
                       b'nsor.cdouble.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00'
3538
                       b'\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00'
3539
                       b'\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06'
3540
                       b'\x07\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06'
3541
                       b'\x00\x00\x00\x00\x04\x00\x04\x00.\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3542

3543
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3544
                          b'\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.cdouble.BE/data.pklFB\x04\x00ZZZZ\x80'
3545
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3546
                          b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3547
                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3548
                          b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3549
                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3550
                          b'\x00\x00\x00\x18\x00\x18\x00tensor.cdouble.BE/data/0FB\x14\x00ZZZZZZZZZZZZZZZZZZ'
3551
                          b'ZZ\xbf\xcd\x00,\xd8\x84/\xd1\xbf\xd7\xeeO\xd0\xcfL|?\xec_\xe2\xb4<\xb6b?\xf8\x0e'
3552
                          b'\xca\xd9\x86+v\xbf\xe0\x1bU\xfc\xbb#i?\xe9\x8aq\x02\xcd4\x98\xbf\xe3\xfb\xe3R\xd7'
3553
                          b'_\xc1?\xe8\x9f\xa2\xcd>\xce\xcfPK\x07\x08\x91\xbey\x14@\x00\x00\x00@\x00\x00\x00'
3554
                          b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3555
                          b'\x00\x00\x00\x00\x19\x009\x00tensor.cdouble.BE/versionFB5\x00ZZZZZZZZZZZZZZZZ'
3556
                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02'
3557
                          b'\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00(W{\xca\xa2'
3558
                          b'\x00\x00\x00\xa2\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3559
                          b'\x00\x00\x00\x00\x00tensor.cdouble.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
3560
                          b'\x00\x00\x00\x00\x00\x00\x91\xbey\x14@\x00\x00\x00@\x00\x00\x00\x18\x00\x00\x00'
3561
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00tensor.cdouble.BE/data/0'
3562
                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
3563
                          b'\x00\x02\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90'
3564
                          b'\x01\x00\x00tensor.cdouble.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3565
                          b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00'
3566
                          b'\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00'
3567
                          b'\x00\x00PK\x06\x07\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
3568
                          b'PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd5\x00\x00\x00\x12\x02\x00\x00\x00'
3569
                          b'\x00')
3570

3571
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3572
                       b'\x00\x00\x00\x00\x00\x1e\x00\x04\x00tensor.cdouble.BE.BOM/data.pklFB\x00\x00\x80'
3573
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3574
                       b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3575
                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3576
                       b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3577
                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3578
                       b'\x00\x00\x00\x1f\x00\x11\x00tensor.cdouble.BE.BOM/byteorderFB\r\x00ZZZZZZZZZZZZZ'
3579
                       b'bigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08'
3580
                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c'
3581
                       b'\x003\x00tensor.cdouble.BE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3582
                       b'ZZZZZZZZZZZ\xbf\xcd\x00,\xd8\x84/\xd1\xbf\xd7\xeeO\xd0\xcfL|?\xec_\xe2\xb4<\xb6b'
3583
                       b'?\xf8\x0e\xca\xd9\x86+v\xbf\xe0\x1bU\xfc\xbb#i?\xe9\x8aq\x02\xcd4\x98\xbf\xe3\xfb'
3584
                       b'\xe3R\xd7_\xc1?\xe8\x9f\xa2\xcd>\xce\xcfPK\x07\x08\x91\xbey\x14@\x00\x00\x00@\x00'
3585
                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3586
                       b'\x00\x00\x00\x00\x00\x00\x00\x1d\x005\x00tensor.cdouble.BE.BOM/versionFB1\x00ZZZ'
3587
                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00'
3588
                       b'\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00('
3589
                       b'W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3590
                       b'\x00\x00\x00\x00\x00\x00\x00tensor.cdouble.BE.BOM/data.pklPK\x01\x02\x00\x00\x00'
3591
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00'
3592
                       b'\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00tenso'
3593
                       b'r.cdouble.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
3594
                       b'\x00\x91\xbey\x14@\x00\x00\x00@\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3595
                       b'\x00\x00\x00\x00S\x01\x00\x00tensor.cdouble.BE.BOM/data/0PK\x01\x02\x00\x00\x00'
3596
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
3597
                       b'\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00tensor.c'
3598
                       b'double.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
3599
                       b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00'
3600
                       b'\x00\x00.\x01\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07'
3601
                       b'\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00'
3602
                       b'\x00\x00\x04\x00\x04\x00.\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3603

3604
        current_load_endian = get_default_load_endianness()
3605

3606
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3607
        buf_le_bom = io.BytesIO(data_le_bom)
3608
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3609
        buf_be_bom = io.BytesIO(data_be_bom)
3610

3611
        try:
3612
            set_default_load_endianness(LoadEndianness.NATIVE)
3613
            tensor_le_no_bom = torch.load(buf_le_no_bom)
3614
            tensor_be_no_bom = torch.load(buf_be_no_bom)
3615
        finally:
3616
            set_default_load_endianness(current_load_endian)
3617

3618
        tensor_le_bom = torch.load(buf_le_bom)
3619
        tensor_be_bom = torch.load(buf_be_bom)
3620

3621
        buf_le_no_bom.seek(0)
3622
        buf_be_no_bom.seek(0)
3623

3624
        try:
3625
            set_default_load_endianness(LoadEndianness.LITTLE)
3626
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3627
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3628
        finally:
3629
            set_default_load_endianness(current_load_endian)
3630

3631
        buf_le_no_bom.seek(0)
3632
        buf_be_no_bom.seek(0)
3633

3634
        try:
3635
            set_default_load_endianness(LoadEndianness.BIG)
3636
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3637
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3638
        finally:
3639
            set_default_load_endianness(current_load_endian)
3640

3641
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3642
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3643
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3644
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3645
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3646
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3647

3648
        if (sys.byteorder == 'little'):
3649
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3650
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3651
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
3652
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
3653
        else:
3654
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
3655
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
3656
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3657
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3658

3659
    def test_serialization_load_bom_data_cfloat(self):
3660
        # 1. Generated on LE system using following commands:
3661
        #
3662
        # import torch
3663
        #
3664
        # x = torch.randn(2,2, dtype=torch.cfloat)
3665
        #
3666
        # torch.save(x, "tensor.cfloat.LE.pt", _disable_byteorder_record=True)
3667
        # torch.save(x, "tensor.cfloat.LE.BOM.pt")
3668
        #
3669
        # print(x)
3670
        #
3671
        # 2. After that it is resaved on BE system with following commands:
3672
        #
3673
        # import torch
3674
        #
3675
        # x = torch.load('tensor.cfloat.LE.BOM.pt')
3676
        #
3677
        # torch.save(x, 'tensor.cfloat.BE.pt', _disable_byteorder_record=True)
3678
        # torch.save(x, 'tensor.cfloat.BE.BOM.pt')
3679
        #
3680
        # print(x)
3681
        #
3682
        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3683
        #
3684
        # file = open('filename', 'rb')
3685
        # data = file.read()
3686
        # file.close()
3687
        # print("\n".join(textwrap.wrap(str(data), 80)))
3688
        #
3689
        # BOM in this context is used as Byte Order Mark.
3690
        #
3691
        data_le_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3692
                          b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.le/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3693
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3694
                          b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3695
                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3696
                          b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3697
                          b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3698
                          b'\x00\x00\x00\x00\x10\x00!\x00tensor.le/data/0FB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZ'
3699
                          b'ZZZZZ\x9e<5\xbe\x96\xd1\xf1=Q\xeaj\xbfiX\x02\xbfW`\xfe?+\xfd\x0c>;a\\\xbe.b\xe2>'
3700
                          b'PK\x07\x08\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3701
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00!\x00'
3702
                          b'tensor.le/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9e'
3703
                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3704
                          b'\x00\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00\x00\x00\x00'
3705
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.le/data.pklPK\x01\x02\x00'
3706
                          b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00'
3707
                          b'\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00t'
3708
                          b'ensor.le/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9e'
3709
                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3710
                          b'\x00\x00p\x01\x00\x00tensor.le/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00'
3711
                          b'\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03'
3712
                          b'\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00'
3713
                          b'\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00'
3714
                          b'\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xbd\x00\x00\x00\xd2\x01\x00\x00'
3715
                          b'\x00\x00')
3716

3717
        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3718
                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.le/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3719
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3720
                       b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3721
                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3722
                       b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3723
                       b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3724
                       b'\x00\x00\x00\x00\x13\x00\x1e\x00tensor.le/byteorderFB\x1a\x00ZZZZZZZZZZZZZZZZZZ'
3725
                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
3726
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3727
                       b'\x00\x10\x00<\x00tensor.le/data/0FB8\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3728
                       b'ZZZZZZZZZZZZZZZZZZZ\x9e<5\xbe\x96\xd1\xf1=Q\xeaj\xbfiX\x02\xbfW`\xfe?+\xfd\x0c>;'
3729
                       b'a\\\xbe.b\xe2>PK\x07\x08\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00'
3730
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3731
                       b'\x00\x11\x00!\x00tensor.le/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
3732
                       b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
3733
                       b'\x00\x00\x00\x00\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00'
3734
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.le/data.pk'
3735
                       b'lPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00'
3736
                       b'\x00\x00\x06\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3737
                       b'\xf1\x00\x00\x00tensor.le/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3738
                       b'\x00\x00\x00\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00'
3739
                       b'\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.le/data/0PK\x01\x02\x00\x00\x00'
3740
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
3741
                       b'\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.l'
3742
                       b'e/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00'
3743
                       b'\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xfe'
3744
                       b'\x00\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00'
3745
                       b'\x00P\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00'
3746
                       b'\x04\x00\xfe\x00\x00\x00R\x02\x00\x00\x00\x00')
3747

3748
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3749
                          b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.be/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3750
                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3751
                          b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3752
                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3753
                          b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3754
                          b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3755
                          b'\x00\x00\x00\x00\x10\x00!\x00tensor.be/data/0FB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZ'
3756
                          b'ZZZZZ\xbe5<\x9e=\xf1\xd1\x96\xbfj\xeaQ\xbf\x02Xi?\xfe`W>\x0c\xfd+\xbe\\a;>\xe2b.'
3757
                          b'PK\x07\x08\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
3758
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00!\x00'
3759
                          b'tensor.be/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02'
3760
                          b'\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
3761
                          b'\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00'
3762
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.be/data.pklPK\x01\x02\x00\x00'
3763
                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00'
3764
                          b'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00tensor.'
3765
                          b'be/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02'
3766
                          b'\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3767
                          b'\x00p\x01\x00\x00tensor.be/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03'
3768
                          b'-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00'
3769
                          b'\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00'
3770
                          b'\x00PK\x06\x07\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
3771
                          b'PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xbd\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
3772

3773
        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3774
                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.be/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3775
                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3776
                       b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3777
                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3778
                       b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3779
                       b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3780
                       b'\x00\x00\x00\x00\x13\x00\x1e\x00tensor.be/byteorderFB\x1a\x00ZZZZZZZZZZZZZZZZZZ'
3781
                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
3782
                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3783
                       b'\x00\x10\x00?\x00tensor.be/data/0FB;\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3784
                       b'ZZZZZZZZZZZZZZZZZZZ\xbe5<\x9e=\xf1\xd1\x96\xbfj\xeaQ\xbf\x02Xi?\xfe`W>\x0c\xfd+\xbe'
3785
                       b'\\a;>\xe2b.PK\x07\x08\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
3786
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3787
                       b'\x11\x00!\x00tensor.be/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08'
3788
                       b'\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3789
                       b'\x00\x00\x00\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00'
3790
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.be/data.pklPK'
3791
                       b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00'
3792
                       b'\x00\x03\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1'
3793
                       b'\x00\x00\x00tensor.be/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
3794
                       b'\x00\x00\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00'
3795
                       b'\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.be/data/0PK\x01\x02\x00\x00\x00\x00'
3796
                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00'
3797
                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.be/vers'
3798
                       b'ionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00'
3799
                       b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00'
3800
                       b'\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00P\x03'
3801
                       b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04'
3802
                       b'\x00\xfe\x00\x00\x00R\x02\x00\x00\x00\x00')
3803

3804
        current_load_endian = get_default_load_endianness()
3805

3806
        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3807
        buf_le_bom = io.BytesIO(data_le_bom)
3808
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3809
        buf_be_bom = io.BytesIO(data_be_bom)
3810

3811
        try:
3812
            set_default_load_endianness(LoadEndianness.NATIVE)
3813
            tensor_le_no_bom = torch.load(buf_le_no_bom)
3814
            tensor_be_no_bom = torch.load(buf_be_no_bom)
3815
        finally:
3816
            set_default_load_endianness(current_load_endian)
3817

3818
        tensor_le_bom = torch.load(buf_le_bom)
3819
        tensor_be_bom = torch.load(buf_be_bom)
3820

3821
        buf_le_no_bom.seek(0)
3822
        buf_be_no_bom.seek(0)
3823

3824
        try:
3825
            set_default_load_endianness(LoadEndianness.LITTLE)
3826
            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3827
            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3828
        finally:
3829
            set_default_load_endianness(current_load_endian)
3830

3831
        buf_le_no_bom.seek(0)
3832
        buf_be_no_bom.seek(0)
3833

3834
        try:
3835
            set_default_load_endianness(LoadEndianness.BIG)
3836
            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3837
            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3838
        finally:
3839
            set_default_load_endianness(current_load_endian)
3840

3841
        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3842
        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3843
        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3844
        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3845
        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3846
        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3847

3848
        if (sys.byteorder == 'little'):
3849
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3850
            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3851
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
3852
            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
3853
        else:
3854
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
3855
            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
3856
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3857
            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3858

3859
    @unittest.skipIf(platform.machine() != 's390x', "s390x-specific test")
3860
    def test_serialization_warning_s390x(self):
3861
        data_be_no_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3862
                          b'\x00\x00\x00\x00\x00\x19\x00\t\x00tensor.double.BE/data.pklFB\x05\x00ZZZZZ\x80\x02'
3863
                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
3864
                          b'DoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
3865
                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3866
                          b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04\x00'
3867
                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3868
                          b'\x00\x17\x00 \x00tensor.double.BE/data/0FB\x1c\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3869
                          b'?\xc9^|\xff\xa4v\x97\xbf\xe9\xb0\x8dP\x8c\xbc\xce\xbf\xd3\xdb\xb7[\xef\x0e\xdc?\xde'
3870
                          b'\x00\xf9Q\x08\xb14PK\x07\x083@\x82/ \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
3871
                          b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3872
                          b'\x18\x00\x1a\x00tensor.double.BE/versionFB\x16\x00ZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
3873
                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
3874
                          b'\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00\x19\x00\x00'
3875
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.double.BE/da'
3876
                          b'ta.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x003@\x82/ '
3877
                          b'\x00\x00\x00 \x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3878
                          b'\xeb\x00\x00\x00tensor.double.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
3879
                          b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00\x00'
3880
                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.double.BE/versionPK\x06\x06'
3881
                          b',\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
3882
                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00'
3883
                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa4\x02\x00'
3884
                          b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00'
3885
                          b'\xd2\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
3886

3887
        current_load_endian = get_default_load_endianness()
3888

3889
        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3890

3891
        try:
3892
            set_default_load_endianness(None)
3893
            with self.assertWarnsRegex(UserWarning, "The default load endianness for checkpoints "
3894
                                       "without a byteorder mark on big endian machines "
3895
                                       "was changed from 'native' to 'little' endian"):
3896
                tensor_be_no_bom = torch.load(buf_be_no_bom)
3897
        finally:
3898
            set_default_load_endianness(current_load_endian)
3899

3900
    @parametrize('path_type', (str, pathlib.Path))
3901
    @parametrize('weights_only', (True, False))
3902
    @unittest.skipIf(IS_WINDOWS, "NamedTemporaryFile on windows")
3903
    def test_serialization_mmap_loading(self, weights_only, path_type):
3904
        class DummyModel(torch.nn.Module):
3905
            def __init__(self):
3906
                super().__init__()
3907
                self.fc1 = torch.nn.Linear(3, 1024)
3908
                self.fc2 = torch.nn.Linear(1024, 5)
3909

3910
            def forward(self, input):
3911
                return self.fc2(self.fc1(input))
3912

3913
        with TemporaryFileName() as f:
3914
            f = path_type(f)
3915
            state_dict = DummyModel().state_dict()
3916
            torch.save(state_dict, f)
3917
            result = torch.load(f, mmap=True, weights_only=weights_only)
3918
            result_non_mmap = torch.load(f, mmap=False, weights_only=weights_only)
3919

3920
        model_mmap_state_dict = DummyModel()
3921
        model_mmap_state_dict.load_state_dict(result)
3922
        model_non_mmap_state_dict = DummyModel()
3923
        model_non_mmap_state_dict.load_state_dict(result_non_mmap)
3924
        input = torch.randn(4, 3)
3925
        self.assertEqual(model_mmap_state_dict(input), model_non_mmap_state_dict(input.clone()))
3926

3927
    @unittest.skipIf(not torch.cuda.is_available() or IS_WINDOWS,
3928
                     "CUDA is unavailable or NamedTemporaryFile on Windows")
3929
    def test_serialization_mmap_loading_with_map_location(self):
3930
        class DummyModel(torch.nn.Module):
3931
            def __init__(self):
3932
                super().__init__()
3933
                self.fc1 = torch.nn.Linear(3, 1024)
3934
                self.fc2 = torch.nn.Linear(1024, 5)
3935

3936
            def forward(self, input):
3937
                return self.fc2(self.fc1(input))
3938

3939
        # make sure mmap where tensors' location tags are not CPU does not crash
3940
        # zipfile will first be mmap-ed on CPU and storages are extracted using
3941
        # overall_storage[start_offset:end_offset] before running
3942
        # _{device}_deserialize, which moves the storage to device
3943
        with TemporaryFileName() as f:
3944
            with torch.device('cuda'):
3945
                m = DummyModel()
3946
            state_dict = m.state_dict()
3947
            torch.save(state_dict, f)
3948
            result = torch.load(f, mmap=True)
3949
            for v in result.values():
3950
                self.assertTrue(v.is_cuda)
3951

3952
    @parametrize('dtype', (torch.float8_e5m2, torch.float8_e4m3fn, torch.complex32))
3953
    @parametrize('weights_only', (True, False))
3954
    def test_serialization_dtype(self, dtype, weights_only):
3955
        """ Tests that newer dtypes can be serialized using `_rebuild_tensor_v3` """
3956
        with tempfile.NamedTemporaryFile() as f:
3957
            x = torch.arange(0.0, 100.0).to(dtype=dtype)
3958
            torch.save({'x': x, 'even': x[0::2], 'odd': x[1::2]}, f)
3959
            f.seek(0)
3960
            y = torch.load(f, weights_only=weights_only)
3961
            self.assertEqual(y['x'], x)
3962
            # Check that views are actually views
3963
            y['odd'][0] = torch.tensor(0.25, dtype=dtype)
3964
            y['even'][0] = torch.tensor(-0.25, dtype=dtype)
3965
            self.assertEqual(y['x'][:2].to(dtype=torch.float32), torch.tensor([-0.25, 0.25]))
3966

3967

3968
    def run(self, *args, **kwargs):
3969
        with serialization_method(use_zip=True):
3970
            return super().run(*args, **kwargs)
3971

3972
class TestWrapperSubclass(torch.Tensor):
3973
    elem: torch.Tensor
3974
    __slots__ = ['elem', 'other']
3975

3976
    @staticmethod
3977
    def __new__(cls, elem, *args, **kwargs):
3978
        # The wrapping tensor (TestSubclass) is just a meta tensor, so it
3979
        # doesn't hold any memory (meta tensor is generally the preferred type
3980
        # of tensor you want to make a subclass from)...
3981
        r = torch.Tensor._make_subclass(cls, elem.to('meta'), elem.requires_grad)
3982
        # ...the real tensor is held as an element on the tensor.
3983
        r.elem = elem
3984
        return r
3985

3986
    def clone(self):
3987
        return type(self)(self.elem.clone())
3988

3989

3990
class TestGetStateSubclass(torch.Tensor):
3991
    elem: torch.Tensor
3992
    __slots__ = ['elem']
3993

3994
    @staticmethod
3995
    def __new__(cls, elem, *args, **kwargs):
3996
        # The wrapping tensor (TestSubclass) is just a meta tensor, so it
3997
        # doesn't hold any memory (meta tensor is generally the preferred type
3998
        # of tensor you want to make a subclass from)...
3999
        r = torch.Tensor._make_subclass(cls, elem.to('meta'), elem.requires_grad)
4000
        # ...the real tensor is held as an element on the tensor.
4001
        r.elem = elem
4002
        return r
4003

4004
    def __getstate__(self):
4005
        return ("foo", getattr(self, "elem", None), self.__dict__)
4006

4007
    def __setstate__(self, state):
4008
        marker, self.elem, self.__dict__ = state
4009
        if not marker == "foo":
4010
            raise RuntimeError("Invalid state for TestGetStateSubclass")
4011
        self.reloaded = True
4012

4013

4014
class TestEmptySubclass(torch.Tensor):
4015
    ...
4016

4017

4018
class TestSubclassSerialization(TestCase):
4019
    def test_tensor_subclass_wrapper_serialization(self):
4020
        wrapped_tensor = torch.rand(2)
4021
        my_tensor = TestWrapperSubclass(wrapped_tensor)
4022

4023
        foo_val = "bar"
4024
        my_tensor.foo = foo_val
4025
        self.assertEqual(my_tensor.foo, foo_val)
4026

4027
        with BytesIOContext() as f:
4028
            torch.save(my_tensor, f)
4029
            f.seek(0)
4030
            new_tensor = torch.load(f)
4031

4032
        self.assertIsInstance(new_tensor, TestWrapperSubclass)
4033
        self.assertEqual(new_tensor.elem, my_tensor.elem)
4034
        self.assertEqual(new_tensor.foo, foo_val)
4035

4036
    def test_tensor_subclass_getstate_overwrite(self):
4037
        wrapped_tensor = torch.rand(2)
4038
        my_tensor = TestGetStateSubclass(wrapped_tensor)
4039

4040
        foo_val = "bar"
4041
        my_tensor.foo = foo_val
4042
        self.assertEqual(my_tensor.foo, foo_val)
4043

4044
        with BytesIOContext() as f:
4045
            torch.save(my_tensor, f)
4046
            f.seek(0)
4047
            new_tensor = torch.load(f)
4048

4049
        self.assertIsInstance(new_tensor, TestGetStateSubclass)
4050
        self.assertEqual(new_tensor.elem, my_tensor.elem)
4051
        self.assertEqual(new_tensor.foo, foo_val)
4052
        self.assertTrue(new_tensor.reloaded)
4053

4054
    def test_tensor_subclass_deepcopy(self):
4055
        wrapped_tensor = torch.rand(2)
4056
        my_tensor = TestWrapperSubclass(wrapped_tensor)
4057

4058
        foo_val = "bar"
4059
        my_tensor.foo = foo_val
4060
        self.assertEqual(my_tensor.foo, foo_val)
4061

4062
        new_tensor = deepcopy(my_tensor)
4063

4064
        self.assertIsInstance(new_tensor, TestWrapperSubclass)
4065
        self.assertEqual(new_tensor.elem, my_tensor.elem)
4066
        self.assertEqual(new_tensor.foo, foo_val)
4067

4068
    @parametrize('requires_grad', (True, False))
4069
    def test_cloned_deepcopy(self, requires_grad):
4070
        my_tensor = torch.rand(2, requires_grad=requires_grad, device='meta')
4071

4072
        new_tensor = deepcopy(my_tensor)
4073

4074
        self.assertEqual(new_tensor.requires_grad, my_tensor.requires_grad)
4075

4076
    def test_empty_class_serialization(self):
4077
        tensor = TestEmptySubclass([1.])
4078
        # Ensures it runs fine
4079
        tensor2 = copy.copy(tensor)
4080

4081
        with BytesIOContext() as f:
4082
            torch.save(tensor, f)
4083
            f.seek(0)
4084
            tensor2 = torch.load(f)
4085

4086
        tensor = TestEmptySubclass()
4087
        # Ensures it runs fine
4088
        # Note that tensor.data_ptr() == 0 here
4089
        tensor2 = copy.copy(tensor)
4090

4091
        with BytesIOContext() as f:
4092
            torch.save(tensor, f)
4093
            f.seek(0)
4094
            tensor2 = torch.load(f)
4095

4096

4097
instantiate_device_type_tests(TestBothSerialization, globals())
4098
instantiate_parametrized_tests(TestSubclassSerialization)
4099
instantiate_parametrized_tests(TestOldSerialization)
4100
instantiate_parametrized_tests(TestSerialization)
4101

4102
if __name__ == '__main__':
4103
    run_tests()
4104

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.