xref: /aosp_15_r20/external/pytorch/test/test_serialization.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# Owner(s): ["module: serialization"]
2*da0073e9SAndroid Build Coastguard Worker
3*da0073e9SAndroid Build Coastguard Workerimport torch
4*da0073e9SAndroid Build Coastguard Workerimport unittest
5*da0073e9SAndroid Build Coastguard Workerimport io
6*da0073e9SAndroid Build Coastguard Workerimport tempfile
7*da0073e9SAndroid Build Coastguard Workerimport os
8*da0073e9SAndroid Build Coastguard Workerimport gc
9*da0073e9SAndroid Build Coastguard Workerimport sys
10*da0073e9SAndroid Build Coastguard Workerimport zipfile
11*da0073e9SAndroid Build Coastguard Workerimport warnings
12*da0073e9SAndroid Build Coastguard Workerimport gzip
13*da0073e9SAndroid Build Coastguard Workerimport copy
14*da0073e9SAndroid Build Coastguard Workerimport pickle
15*da0073e9SAndroid Build Coastguard Workerimport shutil
16*da0073e9SAndroid Build Coastguard Workerimport pathlib
17*da0073e9SAndroid Build Coastguard Workerimport platform
18*da0073e9SAndroid Build Coastguard Workerfrom collections import namedtuple, OrderedDict
19*da0073e9SAndroid Build Coastguard Workerfrom copy import deepcopy
20*da0073e9SAndroid Build Coastguard Workerfrom itertools import product
21*da0073e9SAndroid Build Coastguard Worker
22*da0073e9SAndroid Build Coastguard Workerfrom torch._utils_internal import get_file_path_2
23*da0073e9SAndroid Build Coastguard Workerfrom torch._utils import _rebuild_tensor
24*da0073e9SAndroid Build Coastguard Workerfrom torch.utils._import_utils import import_dill
25*da0073e9SAndroid Build Coastguard Workerfrom torch.serialization import check_module_version_greater_or_equal, get_default_load_endianness, \
26*da0073e9SAndroid Build Coastguard Worker    set_default_load_endianness, LoadEndianness, SourceChangeWarning
27*da0073e9SAndroid Build Coastguard Worker
28*da0073e9SAndroid Build Coastguard Workerfrom torch.testing._internal.common_utils import (
29*da0073e9SAndroid Build Coastguard Worker    IS_FILESYSTEM_UTF8_ENCODING, TemporaryDirectoryName,
30*da0073e9SAndroid Build Coastguard Worker    TestCase, IS_FBCODE, IS_WINDOWS, TEST_DILL, run_tests, download_file, BytesIOContext, TemporaryFileName,
31*da0073e9SAndroid Build Coastguard Worker    parametrize, instantiate_parametrized_tests, AlwaysWarnTypedStorageRemoval, serialTest, skipIfTorchDynamo)
32*da0073e9SAndroid Build Coastguard Workerfrom torch.testing._internal.common_device_type import instantiate_device_type_tests
33*da0073e9SAndroid Build Coastguard Workerfrom torch.testing._internal.common_dtype import all_types_and_complex_and
34*da0073e9SAndroid Build Coastguard Workerfrom torch.testing._internal.two_tensor import TwoTensor  # noqa: F401
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Workerif not IS_WINDOWS:
37*da0073e9SAndroid Build Coastguard Worker    from mmap import MAP_SHARED, MAP_PRIVATE
38*da0073e9SAndroid Build Coastguard Workerelse:
39*da0073e9SAndroid Build Coastguard Worker    MAP_SHARED, MAP_PRIVATE = None, None
40*da0073e9SAndroid Build Coastguard Worker
41*da0073e9SAndroid Build Coastguard Worker# These tests were all copied from `test/test_torch.py` at some point, so see
42*da0073e9SAndroid Build Coastguard Worker# the actual blame, see this revision
43*da0073e9SAndroid Build Coastguard Worker# https://github.com/pytorch/pytorch/blame/9a2691f2fc948b9792686085b493c61793c2de30/test/test_torch.py
44*da0073e9SAndroid Build Coastguard Worker
45*da0073e9SAndroid Build Coastguard Workerdill = import_dill()
46*da0073e9SAndroid Build Coastguard WorkerHAS_DILL_AT_LEAST_0_3_1 = dill is not None and check_module_version_greater_or_equal(dill, (0, 3, 1))
47*da0073e9SAndroid Build Coastguard Worker
48*da0073e9SAndroid Build Coastguard Workercan_retrieve_source = True
49*da0073e9SAndroid Build Coastguard Workerwith warnings.catch_warnings(record=True) as warns:
50*da0073e9SAndroid Build Coastguard Worker    with tempfile.NamedTemporaryFile() as checkpoint:
51*da0073e9SAndroid Build Coastguard Worker        x = torch.save(torch.nn.Module(), checkpoint)
52*da0073e9SAndroid Build Coastguard Worker        for warn in warns:
53*da0073e9SAndroid Build Coastguard Worker            if "Couldn't retrieve source code" in warn.message.args[0]:
54*da0073e9SAndroid Build Coastguard Worker                can_retrieve_source = False
55*da0073e9SAndroid Build Coastguard Worker                break
56*da0073e9SAndroid Build Coastguard Worker
57*da0073e9SAndroid Build Coastguard Worker
58*da0073e9SAndroid Build Coastguard Workerclass FilelikeMock:
59*da0073e9SAndroid Build Coastguard Worker    def __init__(self, data, has_fileno=True, has_readinto=False):
60*da0073e9SAndroid Build Coastguard Worker        if has_readinto:
61*da0073e9SAndroid Build Coastguard Worker            self.readinto = self.readinto_opt
62*da0073e9SAndroid Build Coastguard Worker        if has_fileno:
63*da0073e9SAndroid Build Coastguard Worker            # Python 2's StringIO.StringIO has no fileno attribute.
64*da0073e9SAndroid Build Coastguard Worker            # This is used to test that.
65*da0073e9SAndroid Build Coastguard Worker            self.fileno = self.fileno_opt
66*da0073e9SAndroid Build Coastguard Worker
67*da0073e9SAndroid Build Coastguard Worker        self.calls = set()
68*da0073e9SAndroid Build Coastguard Worker        self.bytesio = io.BytesIO(data)
69*da0073e9SAndroid Build Coastguard Worker
70*da0073e9SAndroid Build Coastguard Worker        def trace(fn, name):
71*da0073e9SAndroid Build Coastguard Worker            def result(*args, **kwargs):
72*da0073e9SAndroid Build Coastguard Worker                self.calls.add(name)
73*da0073e9SAndroid Build Coastguard Worker                return fn(*args, **kwargs)
74*da0073e9SAndroid Build Coastguard Worker            return result
75*da0073e9SAndroid Build Coastguard Worker
76*da0073e9SAndroid Build Coastguard Worker        for attr in ['read', 'readline', 'seek', 'tell', 'write', 'flush']:
77*da0073e9SAndroid Build Coastguard Worker            traced_fn = trace(getattr(self.bytesio, attr), attr)
78*da0073e9SAndroid Build Coastguard Worker            setattr(self, attr, traced_fn)
79*da0073e9SAndroid Build Coastguard Worker
80*da0073e9SAndroid Build Coastguard Worker    def fileno_opt(self):
81*da0073e9SAndroid Build Coastguard Worker        raise io.UnsupportedOperation('Not a real file')
82*da0073e9SAndroid Build Coastguard Worker
83*da0073e9SAndroid Build Coastguard Worker    def readinto_opt(self, view):
84*da0073e9SAndroid Build Coastguard Worker        self.calls.add('readinto')
85*da0073e9SAndroid Build Coastguard Worker        return self.bytesio.readinto(view)
86*da0073e9SAndroid Build Coastguard Worker
87*da0073e9SAndroid Build Coastguard Worker    def was_called(self, name):
88*da0073e9SAndroid Build Coastguard Worker        return name in self.calls
89*da0073e9SAndroid Build Coastguard Worker
90*da0073e9SAndroid Build Coastguard Worker
91*da0073e9SAndroid Build Coastguard Workerclass SerializationMixin:
92*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_data(self):
93*da0073e9SAndroid Build Coastguard Worker        a = [torch.randn(5, 5).float() for i in range(2)]
94*da0073e9SAndroid Build Coastguard Worker        b = [a[i % 2] for i in range(4)]  # 0-3
95*da0073e9SAndroid Build Coastguard Worker        b += [a[0].storage()]  # 4
96*da0073e9SAndroid Build Coastguard Worker        b += [a[0].reshape(-1)[1:4].storage()]  # 5
97*da0073e9SAndroid Build Coastguard Worker        b += [torch.arange(1, 11).int()]  # 6
98*da0073e9SAndroid Build Coastguard Worker        t1 = torch.FloatTensor().set_(a[0].reshape(-1)[1:4].clone().storage(), 0, (3,), (1,))
99*da0073e9SAndroid Build Coastguard Worker        t2 = torch.FloatTensor().set_(a[0].reshape(-1)[1:4].clone().storage(), 0, (3,), (1,))
100*da0073e9SAndroid Build Coastguard Worker        b += [(t1.storage(), t1.storage(), t2.storage())]  # 7
101*da0073e9SAndroid Build Coastguard Worker        b += [a[0].reshape(-1)[0:2].storage()]  # 8
102*da0073e9SAndroid Build Coastguard Worker        return b
103*da0073e9SAndroid Build Coastguard Worker
104*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_assert(self, b, c):
105*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(b, c, atol=0, rtol=0)
106*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[0], torch.FloatTensor))
107*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[1], torch.FloatTensor))
108*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[2], torch.FloatTensor))
109*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[3], torch.FloatTensor))
110*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[4], torch.storage.TypedStorage))
111*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[4].dtype, torch.float)
112*da0073e9SAndroid Build Coastguard Worker        c[0].fill_(10)
113*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[0], c[2], atol=0, rtol=0)
114*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[4], torch.FloatStorage(25).fill_(10), atol=0, rtol=0)
115*da0073e9SAndroid Build Coastguard Worker        c[1].fill_(20)
116*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[1], c[3], atol=0, rtol=0)
117*da0073e9SAndroid Build Coastguard Worker        # I have to do it in this roundabout fashion, because there's no
118*da0073e9SAndroid Build Coastguard Worker        # way to slice storages
119*da0073e9SAndroid Build Coastguard Worker        for i in range(4):
120*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(c[4][i + 1], c[5][i])
121*da0073e9SAndroid Build Coastguard Worker
122*da0073e9SAndroid Build Coastguard Worker        # check that serializing the same storage view object unpickles
123*da0073e9SAndroid Build Coastguard Worker        # it as one object not two (and vice versa)
124*da0073e9SAndroid Build Coastguard Worker        views = c[7]
125*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(views[0]._cdata, views[1]._cdata)
126*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(views[0], views[2])
127*da0073e9SAndroid Build Coastguard Worker        self.assertNotEqual(views[0]._cdata, views[2]._cdata)
128*da0073e9SAndroid Build Coastguard Worker
129*da0073e9SAndroid Build Coastguard Worker        rootview = c[8]
130*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(rootview.data_ptr(), c[0].data_ptr())
131*da0073e9SAndroid Build Coastguard Worker
132*da0073e9SAndroid Build Coastguard Worker    def test_serialization_zipfile_utils(self):
133*da0073e9SAndroid Build Coastguard Worker        data = {
134*da0073e9SAndroid Build Coastguard Worker            'a': b'12039810948234589',
135*da0073e9SAndroid Build Coastguard Worker            'b': b'1239081209484958',
136*da0073e9SAndroid Build Coastguard Worker            'c/d': b'94589480984058'
137*da0073e9SAndroid Build Coastguard Worker        }
138*da0073e9SAndroid Build Coastguard Worker
139*da0073e9SAndroid Build Coastguard Worker        def test(name_or_buffer):
140*da0073e9SAndroid Build Coastguard Worker            with torch.serialization._open_zipfile_writer(name_or_buffer) as zip_file:
141*da0073e9SAndroid Build Coastguard Worker                for key in data:
142*da0073e9SAndroid Build Coastguard Worker                    zip_file.write_record(key, data[key], len(data[key]))
143*da0073e9SAndroid Build Coastguard Worker
144*da0073e9SAndroid Build Coastguard Worker            if hasattr(name_or_buffer, 'seek'):
145*da0073e9SAndroid Build Coastguard Worker                name_or_buffer.seek(0)
146*da0073e9SAndroid Build Coastguard Worker
147*da0073e9SAndroid Build Coastguard Worker            with torch.serialization._open_zipfile_reader(name_or_buffer) as zip_file:
148*da0073e9SAndroid Build Coastguard Worker                for key in data:
149*da0073e9SAndroid Build Coastguard Worker                    actual = zip_file.get_record(key)
150*da0073e9SAndroid Build Coastguard Worker                    expected = data[key]
151*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(expected, actual)
152*da0073e9SAndroid Build Coastguard Worker
153*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
154*da0073e9SAndroid Build Coastguard Worker            test(f)
155*da0073e9SAndroid Build Coastguard Worker
156*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as fname:
157*da0073e9SAndroid Build Coastguard Worker            test(fname)
158*da0073e9SAndroid Build Coastguard Worker
159*da0073e9SAndroid Build Coastguard Worker        test(io.BytesIO())
160*da0073e9SAndroid Build Coastguard Worker
161*da0073e9SAndroid Build Coastguard Worker    def _test_serialization(self, weights_only):
162*da0073e9SAndroid Build Coastguard Worker        # Test serialization with a real file
163*da0073e9SAndroid Build Coastguard Worker        b = self._test_serialization_data()
164*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
165*da0073e9SAndroid Build Coastguard Worker            torch.save(b, f)
166*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
167*da0073e9SAndroid Build Coastguard Worker            c = torch.load(f, weights_only=weights_only)
168*da0073e9SAndroid Build Coastguard Worker            self._test_serialization_assert(b, c)
169*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as fname:
170*da0073e9SAndroid Build Coastguard Worker            torch.save(b, fname)
171*da0073e9SAndroid Build Coastguard Worker            c = torch.load(fname, weights_only=weights_only)
172*da0073e9SAndroid Build Coastguard Worker            self._test_serialization_assert(b, c)
173*da0073e9SAndroid Build Coastguard Worker        # test non-ascii encoding of bytes arrays/strings
174*da0073e9SAndroid Build Coastguard Worker        # The following bytes are produced by serializing
175*da0073e9SAndroid Build Coastguard Worker        #   [b'\xc5\xbc\xc4\x85\xc4\x85\xc3\xb3\xc5\xbc\xc4\x85\xc5\xbc', torch.zeros(1, dtype=torch.float), 2]
176*da0073e9SAndroid Build Coastguard Worker        # in Python 2.7.12 and PyTorch 0.4.1, where the first element contains
177*da0073e9SAndroid Build Coastguard Worker        # bytes of some utf-8 characters (i.e., `utf8_str.encode('utf-8')`).
178*da0073e9SAndroid Build Coastguard Worker        serialized = (
179*da0073e9SAndroid Build Coastguard Worker            b'\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9\x03.'
180*da0073e9SAndroid Build Coastguard Worker            b'\x80\x02}q\x01(U\x10protocol_versionq\x02M\xe9\x03U\n'
181*da0073e9SAndroid Build Coastguard Worker            b'type_sizesq\x03}q\x04(U\x03intq\x05K\x04U\x05shortq\x06K\x02U'
182*da0073e9SAndroid Build Coastguard Worker            b'\x04longq\x07K\x04uU\rlittle_endianq\x08\x88u.\x80\x02]q'
183*da0073e9SAndroid Build Coastguard Worker            b'\x01(U\x0e\xc5\xbc\xc4\x85\xc4\x85\xc3\xb3\xc5\xbc\xc4\x85'
184*da0073e9SAndroid Build Coastguard Worker            b'\xc5\xbcq\x02ctorch._utils\n_rebuild_tensor_v2\nq\x03((U'
185*da0073e9SAndroid Build Coastguard Worker            b'\x07storageq\x04ctorch\nFloatStorage\nq\x05U\x0845640624q'
186*da0073e9SAndroid Build Coastguard Worker            b'\x06U\x03cpuq\x07\x8a\x01\x01NtQK\x00K\x01\x85K\x01\x85'
187*da0073e9SAndroid Build Coastguard Worker            b'\x89NtRq\x08K\x02e.\x80\x02]q\x01U\x0845640624q\x02a.\x01\x00'
188*da0073e9SAndroid Build Coastguard Worker            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
189*da0073e9SAndroid Build Coastguard Worker        )
190*da0073e9SAndroid Build Coastguard Worker        buf = io.BytesIO(serialized)
191*da0073e9SAndroid Build Coastguard Worker        utf8_bytes = b'\xc5\xbc\xc4\x85\xc4\x85\xc3\xb3\xc5\xbc\xc4\x85\xc5\xbc'
192*da0073e9SAndroid Build Coastguard Worker        utf8_str = utf8_bytes.decode('utf-8')
193*da0073e9SAndroid Build Coastguard Worker        loaded_utf8 = torch.load(buf, weights_only=weights_only, encoding='utf-8')
194*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(loaded_utf8, [utf8_str, torch.zeros(1, dtype=torch.float), 2])
195*da0073e9SAndroid Build Coastguard Worker        buf.seek(0)
196*da0073e9SAndroid Build Coastguard Worker        loaded_bytes = torch.load(buf, weights_only=weights_only, encoding='bytes')
197*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(loaded_bytes, [utf8_bytes, torch.zeros(1, dtype=torch.float), 2])
198*da0073e9SAndroid Build Coastguard Worker
199*da0073e9SAndroid Build Coastguard Worker    def test_serialization(self):
200*da0073e9SAndroid Build Coastguard Worker        self._test_serialization(False)
201*da0073e9SAndroid Build Coastguard Worker
202*da0073e9SAndroid Build Coastguard Worker    def test_serialization_safe(self):
203*da0073e9SAndroid Build Coastguard Worker        self._test_serialization(True)
204*da0073e9SAndroid Build Coastguard Worker
205*da0073e9SAndroid Build Coastguard Worker    def test_serialization_filelike(self):
206*da0073e9SAndroid Build Coastguard Worker        # Test serialization (load and save) with a filelike object
207*da0073e9SAndroid Build Coastguard Worker        b = self._test_serialization_data()
208*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
209*da0073e9SAndroid Build Coastguard Worker            torch.save(b, f)
210*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
211*da0073e9SAndroid Build Coastguard Worker            c = torch.load(f)
212*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_assert(b, c)
213*da0073e9SAndroid Build Coastguard Worker
214*da0073e9SAndroid Build Coastguard Worker    def test_serialization_fake_zip(self):
215*da0073e9SAndroid Build Coastguard Worker        data = [
216*da0073e9SAndroid Build Coastguard Worker            ord('P'),
217*da0073e9SAndroid Build Coastguard Worker            ord('K'),
218*da0073e9SAndroid Build Coastguard Worker            5,
219*da0073e9SAndroid Build Coastguard Worker            6
220*da0073e9SAndroid Build Coastguard Worker        ]
221*da0073e9SAndroid Build Coastguard Worker        for i in range(0, 100):
222*da0073e9SAndroid Build Coastguard Worker            data.append(0)
223*da0073e9SAndroid Build Coastguard Worker        t = torch.tensor(data, dtype=torch.uint8)
224*da0073e9SAndroid Build Coastguard Worker
225*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
226*da0073e9SAndroid Build Coastguard Worker            torch.save(t, f)
227*da0073e9SAndroid Build Coastguard Worker
228*da0073e9SAndroid Build Coastguard Worker            # If this check is False for all Python versions (i.e. the fix
229*da0073e9SAndroid Build Coastguard Worker            # has been backported), this test and torch.serialization._is_zipfile
230*da0073e9SAndroid Build Coastguard Worker            # can be deleted
231*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(zipfile.is_zipfile(f))
232*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.serialization._is_zipfile(f))
233*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
234*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(torch.load(f), t)
235*da0073e9SAndroid Build Coastguard Worker
236*da0073e9SAndroid Build Coastguard Worker    def test_serialization_gzip(self):
237*da0073e9SAndroid Build Coastguard Worker        # Test serialization with gzip file
238*da0073e9SAndroid Build Coastguard Worker        b = self._test_serialization_data()
239*da0073e9SAndroid Build Coastguard Worker        f1 = tempfile.NamedTemporaryFile(delete=False)
240*da0073e9SAndroid Build Coastguard Worker        f2 = tempfile.NamedTemporaryFile(delete=False)
241*da0073e9SAndroid Build Coastguard Worker        torch.save(b, f1)
242*da0073e9SAndroid Build Coastguard Worker        with open(f1.name, 'rb') as f_in, gzip.open(f2.name, 'wb') as f_out:
243*da0073e9SAndroid Build Coastguard Worker            shutil.copyfileobj(f_in, f_out)
244*da0073e9SAndroid Build Coastguard Worker
245*da0073e9SAndroid Build Coastguard Worker        with gzip.open(f2.name, 'rb') as f:
246*da0073e9SAndroid Build Coastguard Worker            c = torch.load(f)
247*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_assert(b, c)
248*da0073e9SAndroid Build Coastguard Worker
249*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(
250*da0073e9SAndroid Build Coastguard Worker        not TEST_DILL or HAS_DILL_AT_LEAST_0_3_1,
251*da0073e9SAndroid Build Coastguard Worker        '"dill" not found or is correct version'
252*da0073e9SAndroid Build Coastguard Worker    )
253*da0073e9SAndroid Build Coastguard Worker    def test_serialization_dill_version_not_supported(self):
254*da0073e9SAndroid Build Coastguard Worker        x = torch.randn(5, 5)
255*da0073e9SAndroid Build Coastguard Worker
256*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
257*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(ValueError, 'supports dill >='):
258*da0073e9SAndroid Build Coastguard Worker                torch.save(x, f, pickle_module=dill)
259*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
260*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(ValueError, 'supports dill >='):
261*da0073e9SAndroid Build Coastguard Worker                x2 = torch.load(f, pickle_module=dill, encoding='utf-8')
262*da0073e9SAndroid Build Coastguard Worker
263*da0073e9SAndroid Build Coastguard Worker    def test_pickle_module(self):
264*da0073e9SAndroid Build Coastguard Worker        class ThrowingUnpickler(pickle.Unpickler):
265*da0073e9SAndroid Build Coastguard Worker            def load(self, *args, **kwargs):
266*da0073e9SAndroid Build Coastguard Worker                raise RuntimeError("rumpelstiltskin")
267*da0073e9SAndroid Build Coastguard Worker
268*da0073e9SAndroid Build Coastguard Worker        class ThrowingModule:
269*da0073e9SAndroid Build Coastguard Worker            Unpickler = ThrowingUnpickler
270*da0073e9SAndroid Build Coastguard Worker            load = ThrowingUnpickler.load
271*da0073e9SAndroid Build Coastguard Worker
272*da0073e9SAndroid Build Coastguard Worker        x = torch.eye(3)
273*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
274*da0073e9SAndroid Build Coastguard Worker            torch.save(x, f)
275*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
276*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, "rumpelstiltskin"):
277*da0073e9SAndroid Build Coastguard Worker                torch.load(f, pickle_module=ThrowingModule)
278*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
279*da0073e9SAndroid Build Coastguard Worker            z = torch.load(f)
280*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(x, z)
281*da0073e9SAndroid Build Coastguard Worker
282*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(
283*da0073e9SAndroid Build Coastguard Worker        not TEST_DILL or not HAS_DILL_AT_LEAST_0_3_1,
284*da0073e9SAndroid Build Coastguard Worker        '"dill" not found or not correct version'
285*da0073e9SAndroid Build Coastguard Worker    )
286*da0073e9SAndroid Build Coastguard Worker    def test_serialization_dill(self):
287*da0073e9SAndroid Build Coastguard Worker        x = torch.randn(5, 5)
288*da0073e9SAndroid Build Coastguard Worker
289*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
290*da0073e9SAndroid Build Coastguard Worker            torch.save(x, f, pickle_module=dill)
291*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
292*da0073e9SAndroid Build Coastguard Worker            x2 = torch.load(f, pickle_module=dill, encoding='utf-8')
293*da0073e9SAndroid Build Coastguard Worker            self.assertIsInstance(x2, type(x))
294*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(x, x2)
295*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
296*da0073e9SAndroid Build Coastguard Worker            x3 = torch.load(f, pickle_module=dill)
297*da0073e9SAndroid Build Coastguard Worker            self.assertIsInstance(x3, type(x))
298*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(x, x3)
299*da0073e9SAndroid Build Coastguard Worker
300*da0073e9SAndroid Build Coastguard Worker    def test_serialization_offset_gzip(self):
301*da0073e9SAndroid Build Coastguard Worker        a = torch.randn(5, 5)
302*da0073e9SAndroid Build Coastguard Worker        i = 41
303*da0073e9SAndroid Build Coastguard Worker        f1 = tempfile.NamedTemporaryFile(delete=False)
304*da0073e9SAndroid Build Coastguard Worker        f2 = tempfile.NamedTemporaryFile(delete=False)
305*da0073e9SAndroid Build Coastguard Worker        with open(f1.name, 'wb') as f:
306*da0073e9SAndroid Build Coastguard Worker            pickle.dump(i, f)
307*da0073e9SAndroid Build Coastguard Worker            torch.save(a, f)
308*da0073e9SAndroid Build Coastguard Worker        with open(f1.name, 'rb') as f_in, gzip.open(f2.name, 'wb') as f_out:
309*da0073e9SAndroid Build Coastguard Worker            shutil.copyfileobj(f_in, f_out)
310*da0073e9SAndroid Build Coastguard Worker
311*da0073e9SAndroid Build Coastguard Worker        with gzip.open(f2.name, 'rb') as f:
312*da0073e9SAndroid Build Coastguard Worker            j = pickle.load(f)
313*da0073e9SAndroid Build Coastguard Worker            b = torch.load(f)
314*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(a, b))
315*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(i, j)
316*da0073e9SAndroid Build Coastguard Worker
317*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_sparse(self, weights_only):
318*da0073e9SAndroid Build Coastguard Worker        def _test_serialization(conversion):
319*da0073e9SAndroid Build Coastguard Worker            x = torch.zeros(3, 3)
320*da0073e9SAndroid Build Coastguard Worker            x[1][1] = 1
321*da0073e9SAndroid Build Coastguard Worker            x = conversion(x)
322*da0073e9SAndroid Build Coastguard Worker            with tempfile.NamedTemporaryFile() as f:
323*da0073e9SAndroid Build Coastguard Worker                torch.save({"tensor": x}, f)
324*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
325*da0073e9SAndroid Build Coastguard Worker                y = torch.load(f, weights_only=weights_only)
326*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(x, y["tensor"], exact_is_coalesced=True)
327*da0073e9SAndroid Build Coastguard Worker        _test_serialization(lambda x: x.to_sparse())
328*da0073e9SAndroid Build Coastguard Worker        _test_serialization(lambda x: x.to_sparse_csr())
329*da0073e9SAndroid Build Coastguard Worker        _test_serialization(lambda x: x.to_sparse_csc())
330*da0073e9SAndroid Build Coastguard Worker        _test_serialization(lambda x: x.to_sparse_bsr((1, 1)))
331*da0073e9SAndroid Build Coastguard Worker        _test_serialization(lambda x: x.to_sparse_bsc((1, 1)))
332*da0073e9SAndroid Build Coastguard Worker
333*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse(self):
334*da0073e9SAndroid Build Coastguard Worker        self._test_serialization(False)
335*da0073e9SAndroid Build Coastguard Worker
336*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse_safe(self):
337*da0073e9SAndroid Build Coastguard Worker        self._test_serialization(True)
338*da0073e9SAndroid Build Coastguard Worker
339*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse_invalid(self):
340*da0073e9SAndroid Build Coastguard Worker        x = torch.zeros(3, 3)
341*da0073e9SAndroid Build Coastguard Worker        x[1][1] = 1
342*da0073e9SAndroid Build Coastguard Worker        x = x.to_sparse()
343*da0073e9SAndroid Build Coastguard Worker
344*da0073e9SAndroid Build Coastguard Worker        class TensorSerializationSpoofer:
345*da0073e9SAndroid Build Coastguard Worker            def __init__(self, tensor):
346*da0073e9SAndroid Build Coastguard Worker                self.tensor = tensor
347*da0073e9SAndroid Build Coastguard Worker
348*da0073e9SAndroid Build Coastguard Worker            def __reduce_ex__(self, proto):
349*da0073e9SAndroid Build Coastguard Worker                invalid_indices = self.tensor._indices().clone()
350*da0073e9SAndroid Build Coastguard Worker                invalid_indices[0][0] = 3
351*da0073e9SAndroid Build Coastguard Worker                return (
352*da0073e9SAndroid Build Coastguard Worker                    torch._utils._rebuild_sparse_tensor,
353*da0073e9SAndroid Build Coastguard Worker                    (
354*da0073e9SAndroid Build Coastguard Worker                        self.tensor.layout,
355*da0073e9SAndroid Build Coastguard Worker                        (
356*da0073e9SAndroid Build Coastguard Worker                            invalid_indices,
357*da0073e9SAndroid Build Coastguard Worker                            self.tensor._values(),
358*da0073e9SAndroid Build Coastguard Worker                            self.tensor.size())))
359*da0073e9SAndroid Build Coastguard Worker
360*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
361*da0073e9SAndroid Build Coastguard Worker            torch.save({"spoofed": TensorSerializationSpoofer(x)}, f)
362*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
363*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(
364*da0073e9SAndroid Build Coastguard Worker                    RuntimeError,
365*da0073e9SAndroid Build Coastguard Worker                    "size is inconsistent with indices"):
366*da0073e9SAndroid Build Coastguard Worker                y = torch.load(f)
367*da0073e9SAndroid Build Coastguard Worker
368*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_sparse_compressed_invalid(self,
369*da0073e9SAndroid Build Coastguard Worker                                                      conversion,
370*da0073e9SAndroid Build Coastguard Worker                                                      get_compressed_indices,
371*da0073e9SAndroid Build Coastguard Worker                                                      get_plain_indices):
372*da0073e9SAndroid Build Coastguard Worker        x = torch.zeros(3, 3)
373*da0073e9SAndroid Build Coastguard Worker        x[1][1] = 1
374*da0073e9SAndroid Build Coastguard Worker        x = conversion(x)
375*da0073e9SAndroid Build Coastguard Worker
376*da0073e9SAndroid Build Coastguard Worker        class TensorSerializationSpoofer:
377*da0073e9SAndroid Build Coastguard Worker            def __init__(self, tensor):
378*da0073e9SAndroid Build Coastguard Worker                self.tensor = tensor
379*da0073e9SAndroid Build Coastguard Worker
380*da0073e9SAndroid Build Coastguard Worker            def __reduce_ex__(self, proto):
381*da0073e9SAndroid Build Coastguard Worker                invalid_compressed_indices = get_compressed_indices(self.tensor).clone()
382*da0073e9SAndroid Build Coastguard Worker                invalid_compressed_indices[0] = 3
383*da0073e9SAndroid Build Coastguard Worker                return (
384*da0073e9SAndroid Build Coastguard Worker                    torch._utils._rebuild_sparse_tensor,
385*da0073e9SAndroid Build Coastguard Worker                    (
386*da0073e9SAndroid Build Coastguard Worker                        self.tensor.layout,
387*da0073e9SAndroid Build Coastguard Worker                        (
388*da0073e9SAndroid Build Coastguard Worker                            invalid_compressed_indices,
389*da0073e9SAndroid Build Coastguard Worker                            get_plain_indices(self.tensor),
390*da0073e9SAndroid Build Coastguard Worker                            self.tensor.values(),
391*da0073e9SAndroid Build Coastguard Worker                            self.tensor.size())))
392*da0073e9SAndroid Build Coastguard Worker
393*da0073e9SAndroid Build Coastguard Worker        if x.layout in {torch.sparse_csr, torch.sparse_bsr}:
394*da0073e9SAndroid Build Coastguard Worker            compressed_indices_name = 'crow_indices'
395*da0073e9SAndroid Build Coastguard Worker        else:
396*da0073e9SAndroid Build Coastguard Worker            compressed_indices_name = 'ccol_indices'
397*da0073e9SAndroid Build Coastguard Worker
398*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
399*da0073e9SAndroid Build Coastguard Worker            torch.save({"spoofed": TensorSerializationSpoofer(x)}, f)
400*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
401*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(
402*da0073e9SAndroid Build Coastguard Worker                    RuntimeError,
403*da0073e9SAndroid Build Coastguard Worker                    f"`{compressed_indices_name}[[]..., 0[]] == 0` is not satisfied."):
404*da0073e9SAndroid Build Coastguard Worker                y = torch.load(f)
405*da0073e9SAndroid Build Coastguard Worker
406*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse_csr_invalid(self):
407*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_sparse_compressed_invalid(
408*da0073e9SAndroid Build Coastguard Worker            torch.Tensor.to_sparse_csr, torch.Tensor.crow_indices, torch.Tensor.col_indices)
409*da0073e9SAndroid Build Coastguard Worker
410*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse_csc_invalid(self):
411*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_sparse_compressed_invalid(
412*da0073e9SAndroid Build Coastguard Worker            torch.Tensor.to_sparse_csc, torch.Tensor.ccol_indices, torch.Tensor.row_indices)
413*da0073e9SAndroid Build Coastguard Worker
414*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse_bsr_invalid(self):
415*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_sparse_compressed_invalid(
416*da0073e9SAndroid Build Coastguard Worker            lambda x: x.to_sparse_bsr((1, 1)), torch.Tensor.crow_indices, torch.Tensor.col_indices)
417*da0073e9SAndroid Build Coastguard Worker
418*da0073e9SAndroid Build Coastguard Worker    def test_serialization_sparse_bsc_invalid(self):
419*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_sparse_compressed_invalid(
420*da0073e9SAndroid Build Coastguard Worker            lambda x: x.to_sparse_bsc((1, 1)), torch.Tensor.ccol_indices, torch.Tensor.row_indices)
421*da0073e9SAndroid Build Coastguard Worker
422*da0073e9SAndroid Build Coastguard Worker    def test_serialize_device(self):
423*da0073e9SAndroid Build Coastguard Worker        device_str = ['cpu', 'cpu:0', 'cuda', 'cuda:0']
424*da0073e9SAndroid Build Coastguard Worker        device_obj = [torch.device(d) for d in device_str]
425*da0073e9SAndroid Build Coastguard Worker        for device in device_obj:
426*da0073e9SAndroid Build Coastguard Worker            device_copied = copy.deepcopy(device)
427*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(device, device_copied)
428*da0073e9SAndroid Build Coastguard Worker
429*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_backwards_compat(self, weights_only):
430*da0073e9SAndroid Build Coastguard Worker        a = [torch.arange(1 + i, 26 + i).view(5, 5).float() for i in range(2)]
431*da0073e9SAndroid Build Coastguard Worker        b = [a[i % 2] for i in range(4)]
432*da0073e9SAndroid Build Coastguard Worker        b += [a[0].storage()]
433*da0073e9SAndroid Build Coastguard Worker        b += [a[0].reshape(-1)[1:4].clone().storage()]
434*da0073e9SAndroid Build Coastguard Worker        path = download_file('https://download.pytorch.org/test_data/legacy_serialized.pt')
435*da0073e9SAndroid Build Coastguard Worker        c = torch.load(path, weights_only=weights_only)
436*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(b, c, atol=0, rtol=0)
437*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[0], torch.FloatTensor))
438*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[1], torch.FloatTensor))
439*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[2], torch.FloatTensor))
440*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[3], torch.FloatTensor))
441*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(isinstance(c[4], torch.storage.TypedStorage))
442*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[4].dtype, torch.float32)
443*da0073e9SAndroid Build Coastguard Worker        c[0].fill_(10)
444*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[0], c[2], atol=0, rtol=0)
445*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[4], torch.FloatStorage(25).fill_(10), atol=0, rtol=0)
446*da0073e9SAndroid Build Coastguard Worker        c[1].fill_(20)
447*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(c[1], c[3], atol=0, rtol=0)
448*da0073e9SAndroid Build Coastguard Worker
449*da0073e9SAndroid Build Coastguard Worker        # test some old tensor serialization mechanism
450*da0073e9SAndroid Build Coastguard Worker        class OldTensorBase:
451*da0073e9SAndroid Build Coastguard Worker            def __init__(self, new_tensor):
452*da0073e9SAndroid Build Coastguard Worker                self.new_tensor = new_tensor
453*da0073e9SAndroid Build Coastguard Worker
454*da0073e9SAndroid Build Coastguard Worker            def __getstate__(self):
455*da0073e9SAndroid Build Coastguard Worker                return (self.new_tensor.storage(),
456*da0073e9SAndroid Build Coastguard Worker                        self.new_tensor.storage_offset(),
457*da0073e9SAndroid Build Coastguard Worker                        tuple(self.new_tensor.size()),
458*da0073e9SAndroid Build Coastguard Worker                        self.new_tensor.stride())
459*da0073e9SAndroid Build Coastguard Worker
460*da0073e9SAndroid Build Coastguard Worker        class OldTensorV1(OldTensorBase):
461*da0073e9SAndroid Build Coastguard Worker            def __reduce__(self):
462*da0073e9SAndroid Build Coastguard Worker                return (torch.Tensor, (), self.__getstate__())
463*da0073e9SAndroid Build Coastguard Worker
464*da0073e9SAndroid Build Coastguard Worker        class OldTensorV2(OldTensorBase):
465*da0073e9SAndroid Build Coastguard Worker            def __reduce__(self):
466*da0073e9SAndroid Build Coastguard Worker                return (_rebuild_tensor, self.__getstate__())
467*da0073e9SAndroid Build Coastguard Worker
468*da0073e9SAndroid Build Coastguard Worker        x = torch.randn(30).as_strided([2, 3], [9, 3], 2)
469*da0073e9SAndroid Build Coastguard Worker        for old_cls in [OldTensorV1, OldTensorV2]:
470*da0073e9SAndroid Build Coastguard Worker            with tempfile.NamedTemporaryFile() as f:
471*da0073e9SAndroid Build Coastguard Worker                old_x = old_cls(x)
472*da0073e9SAndroid Build Coastguard Worker                torch.save(old_x, f)
473*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
474*da0073e9SAndroid Build Coastguard Worker                load_x = torch.load(f, weights_only=weights_only)
475*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(x.storage(), load_x.storage())
476*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(x.storage_offset(), load_x.storage_offset())
477*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(x.size(), load_x.size())
478*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(x.stride(), load_x.stride())
479*da0073e9SAndroid Build Coastguard Worker
480*da0073e9SAndroid Build Coastguard Worker    def test_serialization_backwards_compat(self):
481*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_backwards_compat(False)
482*da0073e9SAndroid Build Coastguard Worker
483*da0073e9SAndroid Build Coastguard Worker    def test_serialization_backwards_compat_safe(self):
484*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_backwards_compat(True)
485*da0073e9SAndroid Build Coastguard Worker
486*da0073e9SAndroid Build Coastguard Worker    def test_serialization_save_warnings(self):
487*da0073e9SAndroid Build Coastguard Worker        with warnings.catch_warnings(record=True) as warns:
488*da0073e9SAndroid Build Coastguard Worker            with tempfile.NamedTemporaryFile() as checkpoint:
489*da0073e9SAndroid Build Coastguard Worker                x = torch.save(torch.nn.Linear(2, 3), checkpoint)
490*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(len(warns), 0)
491*da0073e9SAndroid Build Coastguard Worker
492*da0073e9SAndroid Build Coastguard Worker    def test_serialization_map_location(self):
493*da0073e9SAndroid Build Coastguard Worker        test_file_path = download_file('https://download.pytorch.org/test_data/gpu_tensors.pt')
494*da0073e9SAndroid Build Coastguard Worker
495*da0073e9SAndroid Build Coastguard Worker        def map_location(storage, loc):
496*da0073e9SAndroid Build Coastguard Worker            return storage
497*da0073e9SAndroid Build Coastguard Worker
498*da0073e9SAndroid Build Coastguard Worker        def generate_map_locations(device_type):
499*da0073e9SAndroid Build Coastguard Worker            return [
500*da0073e9SAndroid Build Coastguard Worker                {'cuda:0': device_type + ':0'},
501*da0073e9SAndroid Build Coastguard Worker                device_type,
502*da0073e9SAndroid Build Coastguard Worker                device_type + ':0',
503*da0073e9SAndroid Build Coastguard Worker                torch.device(device_type),
504*da0073e9SAndroid Build Coastguard Worker                torch.device(device_type, 0)
505*da0073e9SAndroid Build Coastguard Worker            ]
506*da0073e9SAndroid Build Coastguard Worker
507*da0073e9SAndroid Build Coastguard Worker        def load_bytes():
508*da0073e9SAndroid Build Coastguard Worker            with open(test_file_path, 'rb') as f:
509*da0073e9SAndroid Build Coastguard Worker                return io.BytesIO(f.read())
510*da0073e9SAndroid Build Coastguard Worker
511*da0073e9SAndroid Build Coastguard Worker        fileobject_lambdas = [lambda: test_file_path, load_bytes]
512*da0073e9SAndroid Build Coastguard Worker        cpu_map_locations = [
513*da0073e9SAndroid Build Coastguard Worker            map_location,
514*da0073e9SAndroid Build Coastguard Worker            {'cuda:0': 'cpu'},
515*da0073e9SAndroid Build Coastguard Worker            'cpu',
516*da0073e9SAndroid Build Coastguard Worker            torch.device('cpu'),
517*da0073e9SAndroid Build Coastguard Worker        ]
518*da0073e9SAndroid Build Coastguard Worker        gpu_0_map_locations = generate_map_locations('cuda')
519*da0073e9SAndroid Build Coastguard Worker        gpu_last_map_locations = [
520*da0073e9SAndroid Build Coastguard Worker            f'cuda:{torch.cuda.device_count() - 1}',
521*da0073e9SAndroid Build Coastguard Worker        ]
522*da0073e9SAndroid Build Coastguard Worker        xpu_0_map_locations = generate_map_locations('xpu')
523*da0073e9SAndroid Build Coastguard Worker        xpu_last_map_locations = [
524*da0073e9SAndroid Build Coastguard Worker            f'xpu:{torch.xpu.device_count() - 1}',
525*da0073e9SAndroid Build Coastguard Worker        ]
526*da0073e9SAndroid Build Coastguard Worker
527*da0073e9SAndroid Build Coastguard Worker        def check_map_locations(map_locations, dtype, intended_device):
528*da0073e9SAndroid Build Coastguard Worker            for fileobject_lambda in fileobject_lambdas:
529*da0073e9SAndroid Build Coastguard Worker                for map_location in map_locations:
530*da0073e9SAndroid Build Coastguard Worker                    tensor = torch.load(fileobject_lambda(), map_location=map_location)
531*da0073e9SAndroid Build Coastguard Worker
532*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(tensor.device, intended_device)
533*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(tensor.dtype, dtype)
534*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(tensor, torch.tensor([[1.0, 2.0], [3.0, 4.0]], dtype=dtype, device=intended_device))
535*da0073e9SAndroid Build Coastguard Worker
536*da0073e9SAndroid Build Coastguard Worker        check_map_locations(cpu_map_locations, torch.float, torch.device('cpu'))
537*da0073e9SAndroid Build Coastguard Worker        if torch.cuda.is_available():
538*da0073e9SAndroid Build Coastguard Worker            check_map_locations(gpu_0_map_locations, torch.float, torch.device('cuda', 0))
539*da0073e9SAndroid Build Coastguard Worker            check_map_locations(
540*da0073e9SAndroid Build Coastguard Worker                gpu_last_map_locations,
541*da0073e9SAndroid Build Coastguard Worker                torch.float,
542*da0073e9SAndroid Build Coastguard Worker                torch.device('cuda', torch.cuda.device_count() - 1)
543*da0073e9SAndroid Build Coastguard Worker            )
544*da0073e9SAndroid Build Coastguard Worker        if torch.xpu.is_available():
545*da0073e9SAndroid Build Coastguard Worker            check_map_locations(xpu_0_map_locations, torch.float, torch.device('xpu', 0))
546*da0073e9SAndroid Build Coastguard Worker            check_map_locations(
547*da0073e9SAndroid Build Coastguard Worker                xpu_last_map_locations,
548*da0073e9SAndroid Build Coastguard Worker                torch.float,
549*da0073e9SAndroid Build Coastguard Worker                torch.device('xpu', torch.xpu.device_count() - 1)
550*da0073e9SAndroid Build Coastguard Worker            )
551*da0073e9SAndroid Build Coastguard Worker
552*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(torch.cuda.is_available(), "Testing torch.load on CPU-only machine")
553*da0073e9SAndroid Build Coastguard Worker    def test_load_nonexistent_device(self):
554*da0073e9SAndroid Build Coastguard Worker        # Setup: create a serialized file object with a 'cuda:0' restore location
555*da0073e9SAndroid Build Coastguard Worker        # The following was generated by saving a torch.randn(2, device='cuda') tensor.
556*da0073e9SAndroid Build Coastguard Worker        serialized = (b'\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9'
557*da0073e9SAndroid Build Coastguard Worker                      b'\x03.\x80\x02}q\x00(X\x10\x00\x00\x00protocol_versionq'
558*da0073e9SAndroid Build Coastguard Worker                      b'\x01M\xe9\x03X\r\x00\x00\x00little_endianq\x02\x88X\n'
559*da0073e9SAndroid Build Coastguard Worker                      b'\x00\x00\x00type_sizesq\x03}q\x04(X\x05\x00\x00\x00shortq'
560*da0073e9SAndroid Build Coastguard Worker                      b'\x05K\x02X\x03\x00\x00\x00intq\x06K\x04X\x04\x00\x00\x00'
561*da0073e9SAndroid Build Coastguard Worker                      b'longq\x07K\x04uu.\x80\x02ctorch._utils\n_rebuild_tensor_v2'
562*da0073e9SAndroid Build Coastguard Worker                      b'\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nFloatStorage'
563*da0073e9SAndroid Build Coastguard Worker                      b'\nq\x02X\x0e\x00\x00\x0094919395964320q\x03X\x06\x00\x00'
564*da0073e9SAndroid Build Coastguard Worker                      b'\x00cuda:0q\x04K\x02Ntq\x05QK\x00K\x02\x85q\x06K\x01\x85q'
565*da0073e9SAndroid Build Coastguard Worker                      b'\x07\x89Ntq\x08Rq\t.\x80\x02]q\x00X\x0e\x00\x00\x00'
566*da0073e9SAndroid Build Coastguard Worker                      b'94919395964320q\x01a.\x02\x00\x00\x00\x00\x00\x00\x00\xbb'
567*da0073e9SAndroid Build Coastguard Worker                      b'\x1f\x82\xbe\xea\x81\xd1>')
568*da0073e9SAndroid Build Coastguard Worker
569*da0073e9SAndroid Build Coastguard Worker        buf = io.BytesIO(serialized)
570*da0073e9SAndroid Build Coastguard Worker
571*da0073e9SAndroid Build Coastguard Worker        error_msg = r'Attempting to deserialize object on a CUDA device'
572*da0073e9SAndroid Build Coastguard Worker        with self.assertRaisesRegex(RuntimeError, error_msg):
573*da0073e9SAndroid Build Coastguard Worker            _ = torch.load(buf)
574*da0073e9SAndroid Build Coastguard Worker
575*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf((3, 8, 0) <= sys.version_info < (3, 8, 2), "See https://bugs.python.org/issue39681")
576*da0073e9SAndroid Build Coastguard Worker    def test_serialization_filelike_api_requirements(self):
577*da0073e9SAndroid Build Coastguard Worker        filemock = FilelikeMock(b'', has_readinto=False)
578*da0073e9SAndroid Build Coastguard Worker        tensor = torch.randn(3, 5)
579*da0073e9SAndroid Build Coastguard Worker        torch.save(tensor, filemock)
580*da0073e9SAndroid Build Coastguard Worker        expected_superset = {'write', 'flush'}
581*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(expected_superset.issuperset(filemock.calls))
582*da0073e9SAndroid Build Coastguard Worker
583*da0073e9SAndroid Build Coastguard Worker        # Reset between save and load
584*da0073e9SAndroid Build Coastguard Worker        filemock.seek(0)
585*da0073e9SAndroid Build Coastguard Worker        filemock.calls.clear()
586*da0073e9SAndroid Build Coastguard Worker
587*da0073e9SAndroid Build Coastguard Worker        _ = torch.load(filemock)
588*da0073e9SAndroid Build Coastguard Worker        expected_superset = {'read', 'readline', 'seek', 'tell'}
589*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(expected_superset.issuperset(filemock.calls))
590*da0073e9SAndroid Build Coastguard Worker
591*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_filelike(self, tensor, mock, desc):
592*da0073e9SAndroid Build Coastguard Worker        f = mock(b'')
593*da0073e9SAndroid Build Coastguard Worker        torch.save(tensor, f)
594*da0073e9SAndroid Build Coastguard Worker        f.seek(0)
595*da0073e9SAndroid Build Coastguard Worker        data = mock(f.read())
596*da0073e9SAndroid Build Coastguard Worker
597*da0073e9SAndroid Build Coastguard Worker        msg = 'filelike serialization with {}'
598*da0073e9SAndroid Build Coastguard Worker
599*da0073e9SAndroid Build Coastguard Worker        b = torch.load(data)
600*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor, b), msg.format(desc))
601*da0073e9SAndroid Build Coastguard Worker
602*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf((3, 8, 0) <= sys.version_info < (3, 8, 2), "See https://bugs.python.org/issue39681")
603*da0073e9SAndroid Build Coastguard Worker    def test_serialization_filelike_missing_attrs(self):
604*da0073e9SAndroid Build Coastguard Worker        # Test edge cases where filelike objects are missing attributes.
605*da0073e9SAndroid Build Coastguard Worker        # The Python io docs suggests that these attributes should really exist
606*da0073e9SAndroid Build Coastguard Worker        # and throw io.UnsupportedOperation, but that isn't always the case.
607*da0073e9SAndroid Build Coastguard Worker        mocks = [
608*da0073e9SAndroid Build Coastguard Worker            ('no readinto', lambda x: FilelikeMock(x)),
609*da0073e9SAndroid Build Coastguard Worker            ('has readinto', lambda x: FilelikeMock(x, has_readinto=True)),
610*da0073e9SAndroid Build Coastguard Worker            ('no fileno', lambda x: FilelikeMock(x, has_fileno=False)),
611*da0073e9SAndroid Build Coastguard Worker        ]
612*da0073e9SAndroid Build Coastguard Worker
613*da0073e9SAndroid Build Coastguard Worker        to_serialize = torch.randn(3, 10)
614*da0073e9SAndroid Build Coastguard Worker        for desc, mock in mocks:
615*da0073e9SAndroid Build Coastguard Worker            self._test_serialization_filelike(to_serialize, mock, desc)
616*da0073e9SAndroid Build Coastguard Worker
617*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf((3, 8, 0) <= sys.version_info < (3, 8, 2), "See https://bugs.python.org/issue39681")
618*da0073e9SAndroid Build Coastguard Worker    def test_serialization_filelike_stress(self):
619*da0073e9SAndroid Build Coastguard Worker        a = torch.randn(11 * (2 ** 9) + 1, 5 * (2 ** 9))
620*da0073e9SAndroid Build Coastguard Worker
621*da0073e9SAndroid Build Coastguard Worker        # This one should call python read multiple times
622*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_filelike(a, lambda x: FilelikeMock(x, has_readinto=False),
623*da0073e9SAndroid Build Coastguard Worker                                          'read() stress test')
624*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_filelike(a, lambda x: FilelikeMock(x, has_readinto=True),
625*da0073e9SAndroid Build Coastguard Worker                                          'readinto() stress test')
626*da0073e9SAndroid Build Coastguard Worker
627*da0073e9SAndroid Build Coastguard Worker    def test_serialization_filelike_uses_readinto(self):
628*da0073e9SAndroid Build Coastguard Worker        # For maximum effiency, when reading a file-like object,
629*da0073e9SAndroid Build Coastguard Worker        # ensure the C API calls readinto instead of read.
630*da0073e9SAndroid Build Coastguard Worker        a = torch.randn(5, 4)
631*da0073e9SAndroid Build Coastguard Worker
632*da0073e9SAndroid Build Coastguard Worker        f = io.BytesIO()
633*da0073e9SAndroid Build Coastguard Worker        torch.save(a, f)
634*da0073e9SAndroid Build Coastguard Worker        f.seek(0)
635*da0073e9SAndroid Build Coastguard Worker        data = FilelikeMock(f.read(), has_readinto=True)
636*da0073e9SAndroid Build Coastguard Worker
637*da0073e9SAndroid Build Coastguard Worker        b = torch.load(data)
638*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(data.was_called('readinto'))
639*da0073e9SAndroid Build Coastguard Worker
640*da0073e9SAndroid Build Coastguard Worker    def test_serialization_filelike_exceptions(self):
641*da0073e9SAndroid Build Coastguard Worker        # Try to serialize to buffers that does not have write method
642*da0073e9SAndroid Build Coastguard Worker        # Or have a malfrormed one, and make sure it does not cause an abort
643*da0073e9SAndroid Build Coastguard Worker        # See https://github.com/pytorch/pytorch/issues/87997
644*da0073e9SAndroid Build Coastguard Worker        x = torch.rand(10)
645*da0073e9SAndroid Build Coastguard Worker        with self.assertRaises(AttributeError):
646*da0073e9SAndroid Build Coastguard Worker            # Tries to serialize str into tensor
647*da0073e9SAndroid Build Coastguard Worker            torch.save('foo', x)
648*da0073e9SAndroid Build Coastguard Worker        x.write = "bar"
649*da0073e9SAndroid Build Coastguard Worker        x.flush = "baz"
650*da0073e9SAndroid Build Coastguard Worker        with self.assertRaises(TypeError):
651*da0073e9SAndroid Build Coastguard Worker            # Tries to serialize str into tensor with write property
652*da0073e9SAndroid Build Coastguard Worker            torch.save('foo', x)
653*da0073e9SAndroid Build Coastguard Worker        x.write = str.__add__
654*da0073e9SAndroid Build Coastguard Worker        x.flush = str.__mul__
655*da0073e9SAndroid Build Coastguard Worker        with self.assertRaises(TypeError):
656*da0073e9SAndroid Build Coastguard Worker            # Tries to serialize str into tensor with wrong callable write property
657*da0073e9SAndroid Build Coastguard Worker            torch.save('foo', x)
658*da0073e9SAndroid Build Coastguard Worker        s_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
659*da0073e9SAndroid Build Coastguard Worker        s = torch.CharStorage(s_data)
660*da0073e9SAndroid Build Coastguard Worker        with self.assertRaises(AttributeError):
661*da0073e9SAndroid Build Coastguard Worker            # Tries to serialize list into CharStorage
662*da0073e9SAndroid Build Coastguard Worker            torch.save(s_data, s)
663*da0073e9SAndroid Build Coastguard Worker        x = torch.randint(10, (3, 3), dtype=torch.float).cpu().numpy()
664*da0073e9SAndroid Build Coastguard Worker        with self.assertRaises(AttributeError):
665*da0073e9SAndroid Build Coastguard Worker            # Tries to serialize ndarray into ndarray
666*da0073e9SAndroid Build Coastguard Worker            torch.save(x, x)
667*da0073e9SAndroid Build Coastguard Worker
668*da0073e9SAndroid Build Coastguard Worker
669*da0073e9SAndroid Build Coastguard Worker    def test_serialization_storage_slice(self):
670*da0073e9SAndroid Build Coastguard Worker        # Generated using:
671*da0073e9SAndroid Build Coastguard Worker        #
672*da0073e9SAndroid Build Coastguard Worker        # t = torch.zeros(2);
673*da0073e9SAndroid Build Coastguard Worker        # s1 = t.storage()[:1]
674*da0073e9SAndroid Build Coastguard Worker        # s2 = t.storage()[1:]
675*da0073e9SAndroid Build Coastguard Worker        # torch.save((s1, s2), 'foo.ser')
676*da0073e9SAndroid Build Coastguard Worker        #
677*da0073e9SAndroid Build Coastguard Worker        # with PyTorch 0.3.1
678*da0073e9SAndroid Build Coastguard Worker        serialized = (b'\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9\x03'
679*da0073e9SAndroid Build Coastguard Worker                      b'.\x80\x02}q\x00(X\n\x00\x00\x00type_sizesq\x01}q\x02(X\x03'
680*da0073e9SAndroid Build Coastguard Worker                      b'\x00\x00\x00intq\x03K\x04X\x05\x00\x00\x00shortq\x04K\x02X'
681*da0073e9SAndroid Build Coastguard Worker                      b'\x04\x00\x00\x00longq\x05K\x04uX\x10\x00\x00\x00protocol_versionq'
682*da0073e9SAndroid Build Coastguard Worker                      b'\x06M\xe9\x03X\r\x00\x00\x00little_endianq\x07\x88u.\x80\x02'
683*da0073e9SAndroid Build Coastguard Worker                      b'(X\x07\x00\x00\x00storageq\x00ctorch\nFloatStorage\nq\x01X\x0e'
684*da0073e9SAndroid Build Coastguard Worker                      b'\x00\x00\x0094279043900432q\x02X\x03\x00\x00\x00cpuq\x03K\x02'
685*da0073e9SAndroid Build Coastguard Worker                      b'X\x0e\x00\x00\x0094279029750368q\x04K\x00K\x01\x87q\x05tq\x06'
686*da0073e9SAndroid Build Coastguard Worker                      b'Q(h\x00h\x01X\x0e\x00\x00\x0094279043900432q\x07h\x03K\x02X'
687*da0073e9SAndroid Build Coastguard Worker                      b'\x0e\x00\x00\x0094279029750432q\x08K\x01K\x01\x87q\ttq\nQ'
688*da0073e9SAndroid Build Coastguard Worker                      b'\x86q\x0b.\x80\x02]q\x00X\x0e\x00\x00\x0094279043900432q'
689*da0073e9SAndroid Build Coastguard Worker                      b'\x01a.\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
690*da0073e9SAndroid Build Coastguard Worker                      b'\x00\x00\x00\x00')
691*da0073e9SAndroid Build Coastguard Worker
692*da0073e9SAndroid Build Coastguard Worker        buf = io.BytesIO(serialized)
693*da0073e9SAndroid Build Coastguard Worker        (s1, s2) = torch.load(buf)
694*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(s1[0], 0)
695*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(s2[0], 0)
696*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(s1.data_ptr() + 4, s2.data_ptr())
697*da0073e9SAndroid Build Coastguard Worker
698*da0073e9SAndroid Build Coastguard Worker    def test_load_unicode_error_msg(self):
699*da0073e9SAndroid Build Coastguard Worker        # This Pickle contains a Python 2 module with Unicode data and the
700*da0073e9SAndroid Build Coastguard Worker        # loading should fail if the user explicitly specifies ascii encoding!
701*da0073e9SAndroid Build Coastguard Worker        path = download_file('https://download.pytorch.org/test_data/legacy_conv2d.pt')
702*da0073e9SAndroid Build Coastguard Worker        self.assertRaises(UnicodeDecodeError, lambda: torch.load(path, encoding='ascii'))
703*da0073e9SAndroid Build Coastguard Worker
704*da0073e9SAndroid Build Coastguard Worker    def test_load_python2_unicode_module(self):
705*da0073e9SAndroid Build Coastguard Worker        # This Pickle contains some Unicode data!
706*da0073e9SAndroid Build Coastguard Worker        path = download_file('https://download.pytorch.org/test_data/legacy_conv2d.pt')
707*da0073e9SAndroid Build Coastguard Worker        with warnings.catch_warnings(record=True) as w:
708*da0073e9SAndroid Build Coastguard Worker            self.assertIsNotNone(torch.load(path))
709*da0073e9SAndroid Build Coastguard Worker
710*da0073e9SAndroid Build Coastguard Worker    def test_load_error_msg(self):
711*da0073e9SAndroid Build Coastguard Worker        expected_err_msg = (".*You can only torch.load from a file that is seekable. " +
712*da0073e9SAndroid Build Coastguard Worker                            "Please pre-load the data into a buffer like io.BytesIO and " +
713*da0073e9SAndroid Build Coastguard Worker                            "try to load from it instead.")
714*da0073e9SAndroid Build Coastguard Worker
715*da0073e9SAndroid Build Coastguard Worker        resource = FilelikeMock(data=b"data")
716*da0073e9SAndroid Build Coastguard Worker        delattr(resource, "tell")
717*da0073e9SAndroid Build Coastguard Worker        delattr(resource, "seek")
718*da0073e9SAndroid Build Coastguard Worker        with self.assertRaisesRegex(AttributeError, expected_err_msg):
719*da0073e9SAndroid Build Coastguard Worker            torch.load(resource)
720*da0073e9SAndroid Build Coastguard Worker
721*da0073e9SAndroid Build Coastguard Worker    def test_save_different_dtype_unallocated(self):
722*da0073e9SAndroid Build Coastguard Worker        devices = ['cpu']
723*da0073e9SAndroid Build Coastguard Worker        if torch.cuda.is_available():
724*da0073e9SAndroid Build Coastguard Worker            devices.append('cuda')
725*da0073e9SAndroid Build Coastguard Worker
726*da0073e9SAndroid Build Coastguard Worker        def save_load_check(a, b):
727*da0073e9SAndroid Build Coastguard Worker            with io.BytesIO() as f:
728*da0073e9SAndroid Build Coastguard Worker                torch.save([a, b], f)
729*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
730*da0073e9SAndroid Build Coastguard Worker                a_loaded, b_loaded = torch.load(f)
731*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(a, a_loaded)
732*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(b, b_loaded)
733*da0073e9SAndroid Build Coastguard Worker
734*da0073e9SAndroid Build Coastguard Worker        for device, dtype in product(devices, all_types_and_complex_and(torch.half,
735*da0073e9SAndroid Build Coastguard Worker                                                                        torch.bfloat16, torch.bool)):
736*da0073e9SAndroid Build Coastguard Worker            a = torch.tensor([], dtype=dtype, device=device)
737*da0073e9SAndroid Build Coastguard Worker
738*da0073e9SAndroid Build Coastguard Worker            for other_dtype in all_types_and_complex_and(torch.half, torch.bfloat16, torch.bool):
739*da0073e9SAndroid Build Coastguard Worker                s = torch.TypedStorage(
740*da0073e9SAndroid Build Coastguard Worker                    wrap_storage=a.storage().untyped(),
741*da0073e9SAndroid Build Coastguard Worker                    dtype=other_dtype)
742*da0073e9SAndroid Build Coastguard Worker                save_load_check(a, s)
743*da0073e9SAndroid Build Coastguard Worker                save_load_check(a.storage(), s)
744*da0073e9SAndroid Build Coastguard Worker                b = torch.tensor([], dtype=other_dtype, device=device)
745*da0073e9SAndroid Build Coastguard Worker                save_load_check(a, b)
746*da0073e9SAndroid Build Coastguard Worker
747*da0073e9SAndroid Build Coastguard Worker    def test_save_different_dtype_error(self):
748*da0073e9SAndroid Build Coastguard Worker        error_msg = r"Cannot save multiple tensors or storages that view the same data as different types"
749*da0073e9SAndroid Build Coastguard Worker
750*da0073e9SAndroid Build Coastguard Worker        devices = ['cpu']
751*da0073e9SAndroid Build Coastguard Worker        if torch.cuda.is_available():
752*da0073e9SAndroid Build Coastguard Worker            devices.append('cuda')
753*da0073e9SAndroid Build Coastguard Worker
754*da0073e9SAndroid Build Coastguard Worker        for device in devices:
755*da0073e9SAndroid Build Coastguard Worker            a = torch.randn(10, dtype=torch.complex128, device=device)
756*da0073e9SAndroid Build Coastguard Worker            f = io.BytesIO()
757*da0073e9SAndroid Build Coastguard Worker
758*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, error_msg):
759*da0073e9SAndroid Build Coastguard Worker                torch.save([a, a.imag], f)
760*da0073e9SAndroid Build Coastguard Worker
761*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, error_msg):
762*da0073e9SAndroid Build Coastguard Worker                torch.save([a.storage(), a.imag], f)
763*da0073e9SAndroid Build Coastguard Worker
764*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, error_msg):
765*da0073e9SAndroid Build Coastguard Worker                torch.save([a, a.imag.storage()], f)
766*da0073e9SAndroid Build Coastguard Worker
767*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, error_msg):
768*da0073e9SAndroid Build Coastguard Worker                torch.save([a.storage(), a.imag.storage()], f)
769*da0073e9SAndroid Build Coastguard Worker
770*da0073e9SAndroid Build Coastguard Worker            a = torch.randn(10, device=device)
771*da0073e9SAndroid Build Coastguard Worker            s_bytes = torch.TypedStorage(
772*da0073e9SAndroid Build Coastguard Worker                wrap_storage=a.storage().untyped(),
773*da0073e9SAndroid Build Coastguard Worker                dtype=torch.uint8)
774*da0073e9SAndroid Build Coastguard Worker
775*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, error_msg):
776*da0073e9SAndroid Build Coastguard Worker                torch.save([a, s_bytes], f)
777*da0073e9SAndroid Build Coastguard Worker
778*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, error_msg):
779*da0073e9SAndroid Build Coastguard Worker                torch.save([a.storage(), s_bytes], f)
780*da0073e9SAndroid Build Coastguard Worker
781*da0073e9SAndroid Build Coastguard Worker    def test_safe_load_basic_types(self):
782*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
783*da0073e9SAndroid Build Coastguard Worker            data = {"int": 123, "str": "world", "float": 3.14, "bool": False}
784*da0073e9SAndroid Build Coastguard Worker            torch.save(data, f)
785*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
786*da0073e9SAndroid Build Coastguard Worker            loaded_data = torch.load(f, weights_only=True)
787*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(data, loaded_data)
788*da0073e9SAndroid Build Coastguard Worker
789*da0073e9SAndroid Build Coastguard Worker
790*da0073e9SAndroid Build Coastguard Workerclass serialization_method:
791*da0073e9SAndroid Build Coastguard Worker    def __init__(self, use_zip):
792*da0073e9SAndroid Build Coastguard Worker        self.use_zip = use_zip
793*da0073e9SAndroid Build Coastguard Worker        self.torch_save = torch.save
794*da0073e9SAndroid Build Coastguard Worker
795*da0073e9SAndroid Build Coastguard Worker    def __enter__(self, *args, **kwargs):
796*da0073e9SAndroid Build Coastguard Worker        def wrapper(*args, **kwargs):
797*da0073e9SAndroid Build Coastguard Worker            if '_use_new_zipfile_serialization' in kwargs:
798*da0073e9SAndroid Build Coastguard Worker                raise RuntimeError("Cannot set method manually")
799*da0073e9SAndroid Build Coastguard Worker            kwargs['_use_new_zipfile_serialization'] = self.use_zip
800*da0073e9SAndroid Build Coastguard Worker            return self.torch_save(*args, **kwargs)
801*da0073e9SAndroid Build Coastguard Worker
802*da0073e9SAndroid Build Coastguard Worker        torch.save = wrapper
803*da0073e9SAndroid Build Coastguard Worker
804*da0073e9SAndroid Build Coastguard Worker    def __exit__(self, *args, **kwargs):
805*da0073e9SAndroid Build Coastguard Worker        torch.save = self.torch_save
806*da0073e9SAndroid Build Coastguard Worker
807*da0073e9SAndroid Build Coastguard WorkerPoint = namedtuple('Point', ['x', 'y'])
808*da0073e9SAndroid Build Coastguard Worker
809*da0073e9SAndroid Build Coastguard Workerclass ClassThatUsesBuildInstruction:
810*da0073e9SAndroid Build Coastguard Worker    def __init__(self, num):
811*da0073e9SAndroid Build Coastguard Worker        self.num = num
812*da0073e9SAndroid Build Coastguard Worker
813*da0073e9SAndroid Build Coastguard Worker    def __reduce_ex__(self, proto):
814*da0073e9SAndroid Build Coastguard Worker        # Third item, state here will cause pickle to push a BUILD instruction
815*da0073e9SAndroid Build Coastguard Worker        return ClassThatUsesBuildInstruction, (self.num,), {'foo': 'bar'}
816*da0073e9SAndroid Build Coastguard Worker
817*da0073e9SAndroid Build Coastguard Worker
818*da0073e9SAndroid Build Coastguard Worker@unittest.skipIf(IS_WINDOWS, "NamedTemporaryFile on windows")
819*da0073e9SAndroid Build Coastguard Workerclass TestBothSerialization(TestCase):
820*da0073e9SAndroid Build Coastguard Worker    @parametrize("weights_only", (True, False))
821*da0073e9SAndroid Build Coastguard Worker    def test_serialization_new_format_old_format_compat(self, device, weights_only):
822*da0073e9SAndroid Build Coastguard Worker        x = [torch.ones(200, 200, device=device) for i in range(30)]
823*da0073e9SAndroid Build Coastguard Worker
824*da0073e9SAndroid Build Coastguard Worker        def test(f_new, f_old):
825*da0073e9SAndroid Build Coastguard Worker            torch.save(x, f_new, _use_new_zipfile_serialization=True)
826*da0073e9SAndroid Build Coastguard Worker            f_new.seek(0)
827*da0073e9SAndroid Build Coastguard Worker            x_new_load = torch.load(f_new, weights_only=weights_only)
828*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(x, x_new_load)
829*da0073e9SAndroid Build Coastguard Worker
830*da0073e9SAndroid Build Coastguard Worker            torch.save(x, f_old, _use_new_zipfile_serialization=False)
831*da0073e9SAndroid Build Coastguard Worker            f_old.seek(0)
832*da0073e9SAndroid Build Coastguard Worker            x_old_load = torch.load(f_old, weights_only=weights_only)
833*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(x_old_load, x_new_load)
834*da0073e9SAndroid Build Coastguard Worker
835*da0073e9SAndroid Build Coastguard Worker        with AlwaysWarnTypedStorageRemoval(True), warnings.catch_warnings(record=True) as w:
836*da0073e9SAndroid Build Coastguard Worker            with tempfile.NamedTemporaryFile() as f_new, tempfile.NamedTemporaryFile() as f_old:
837*da0073e9SAndroid Build Coastguard Worker                test(f_new, f_old)
838*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(len(w) == 0, msg=f"Expected no warnings but got {[str(x) for x in w]}")
839*da0073e9SAndroid Build Coastguard Worker
840*da0073e9SAndroid Build Coastguard Worker
841*da0073e9SAndroid Build Coastguard Workerclass TestOldSerialization(TestCase, SerializationMixin):
842*da0073e9SAndroid Build Coastguard Worker    # unique_key is necessary because on Python 2.7, if a warning passed to
843*da0073e9SAndroid Build Coastguard Worker    # the warning module is the same, it is not raised again.
844*da0073e9SAndroid Build Coastguard Worker    def _test_serialization_container(self, unique_key, filecontext_lambda):
845*da0073e9SAndroid Build Coastguard Worker
846*da0073e9SAndroid Build Coastguard Worker        tmpmodule_name = f'tmpmodule{unique_key}'
847*da0073e9SAndroid Build Coastguard Worker
848*da0073e9SAndroid Build Coastguard Worker        def import_module(name, filename):
849*da0073e9SAndroid Build Coastguard Worker            import importlib.util
850*da0073e9SAndroid Build Coastguard Worker            spec = importlib.util.spec_from_file_location(name, filename)
851*da0073e9SAndroid Build Coastguard Worker            module = importlib.util.module_from_spec(spec)
852*da0073e9SAndroid Build Coastguard Worker            spec.loader.exec_module(module)
853*da0073e9SAndroid Build Coastguard Worker            sys.modules[module.__name__] = module
854*da0073e9SAndroid Build Coastguard Worker            return module
855*da0073e9SAndroid Build Coastguard Worker
856*da0073e9SAndroid Build Coastguard Worker        with filecontext_lambda() as checkpoint:
857*da0073e9SAndroid Build Coastguard Worker            fname = get_file_path_2(os.path.dirname(os.path.dirname(torch.__file__)), 'torch', 'testing',
858*da0073e9SAndroid Build Coastguard Worker                                    '_internal', 'data', 'network1.py')
859*da0073e9SAndroid Build Coastguard Worker            module = import_module(tmpmodule_name, fname)
860*da0073e9SAndroid Build Coastguard Worker            torch.save(module.Net(), checkpoint)
861*da0073e9SAndroid Build Coastguard Worker
862*da0073e9SAndroid Build Coastguard Worker            # First check that the checkpoint can be loaded without warning about unsafe loads
863*da0073e9SAndroid Build Coastguard Worker            checkpoint.seek(0)
864*da0073e9SAndroid Build Coastguard Worker            with warnings.catch_warnings(record=True) as w:
865*da0073e9SAndroid Build Coastguard Worker                loaded = torch.load(checkpoint)
866*da0073e9SAndroid Build Coastguard Worker                self.assertTrue(isinstance(loaded, module.Net))
867*da0073e9SAndroid Build Coastguard Worker                if can_retrieve_source:
868*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(len(w), 1)
869*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(w[0].category, FutureWarning)
870*da0073e9SAndroid Build Coastguard Worker                    self.assertTrue("You are using `torch.load` with `weights_only=False`" in str(w[0].message))
871*da0073e9SAndroid Build Coastguard Worker
872*da0073e9SAndroid Build Coastguard Worker            # Replace the module with different source
873*da0073e9SAndroid Build Coastguard Worker            fname = get_file_path_2(os.path.dirname(os.path.dirname(torch.__file__)), 'torch', 'testing',
874*da0073e9SAndroid Build Coastguard Worker                                    '_internal', 'data', 'network2.py')
875*da0073e9SAndroid Build Coastguard Worker            module = import_module(tmpmodule_name, fname)
876*da0073e9SAndroid Build Coastguard Worker            checkpoint.seek(0)
877*da0073e9SAndroid Build Coastguard Worker            with warnings.catch_warnings(record=True) as w:
878*da0073e9SAndroid Build Coastguard Worker                loaded = torch.load(checkpoint)
879*da0073e9SAndroid Build Coastguard Worker                self.assertTrue(isinstance(loaded, module.Net))
880*da0073e9SAndroid Build Coastguard Worker                if can_retrieve_source:
881*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(len(w), 2)
882*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(w[0].category, FutureWarning)
883*da0073e9SAndroid Build Coastguard Worker                    self.assertEqual(w[1].category, SourceChangeWarning)
884*da0073e9SAndroid Build Coastguard Worker
885*da0073e9SAndroid Build Coastguard Worker    def test_serialization_container(self):
886*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_container('file', tempfile.NamedTemporaryFile)
887*da0073e9SAndroid Build Coastguard Worker
888*da0073e9SAndroid Build Coastguard Worker    def test_serialization_container_filelike(self):
889*da0073e9SAndroid Build Coastguard Worker        self._test_serialization_container('filelike', BytesIOContext)
890*da0073e9SAndroid Build Coastguard Worker
891*da0073e9SAndroid Build Coastguard Worker    def test_serialization_offset(self):
892*da0073e9SAndroid Build Coastguard Worker        a = torch.randn(5, 5)
893*da0073e9SAndroid Build Coastguard Worker        b = torch.randn(1024, 1024, 512, dtype=torch.float32)
894*da0073e9SAndroid Build Coastguard Worker        m = torch.nn.Conv2d(1, 1, (1, 3))
895*da0073e9SAndroid Build Coastguard Worker        i, j = 41, 43
896*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
897*da0073e9SAndroid Build Coastguard Worker            pickle.dump(i, f)
898*da0073e9SAndroid Build Coastguard Worker            torch.save(a, f)
899*da0073e9SAndroid Build Coastguard Worker            pickle.dump(j, f)
900*da0073e9SAndroid Build Coastguard Worker            torch.save(b, f)
901*da0073e9SAndroid Build Coastguard Worker            torch.save(m, f)
902*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(f.tell() > 2 * 1024 * 1024 * 1024)
903*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
904*da0073e9SAndroid Build Coastguard Worker            i_loaded = pickle.load(f)
905*da0073e9SAndroid Build Coastguard Worker            a_loaded = torch.load(f)
906*da0073e9SAndroid Build Coastguard Worker            j_loaded = pickle.load(f)
907*da0073e9SAndroid Build Coastguard Worker            b_loaded = torch.load(f)
908*da0073e9SAndroid Build Coastguard Worker            m_loaded = torch.load(f)
909*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(a, a_loaded))
910*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(b, b_loaded))
911*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(m.kernel_size == m_loaded.kernel_size)
912*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(i, i_loaded)
913*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(j, j_loaded)
914*da0073e9SAndroid Build Coastguard Worker
915*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
916*da0073e9SAndroid Build Coastguard Worker    def test_serialization_offset_filelike(self, weights_only):
917*da0073e9SAndroid Build Coastguard Worker        a = torch.randn(5, 5)
918*da0073e9SAndroid Build Coastguard Worker        b = torch.randn(1024, 1024, 512, dtype=torch.float32)
919*da0073e9SAndroid Build Coastguard Worker        i, j = 41, 43
920*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
921*da0073e9SAndroid Build Coastguard Worker            pickle.dump(i, f)
922*da0073e9SAndroid Build Coastguard Worker            torch.save(a, f)
923*da0073e9SAndroid Build Coastguard Worker            pickle.dump(j, f)
924*da0073e9SAndroid Build Coastguard Worker            torch.save(b, f)
925*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(f.tell() > 2 * 1024 * 1024 * 1024)
926*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
927*da0073e9SAndroid Build Coastguard Worker            i_loaded = pickle.load(f)
928*da0073e9SAndroid Build Coastguard Worker            a_loaded = torch.load(f, weights_only=weights_only)
929*da0073e9SAndroid Build Coastguard Worker            j_loaded = pickle.load(f)
930*da0073e9SAndroid Build Coastguard Worker            b_loaded = torch.load(f, weights_only=weights_only)
931*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(a, a_loaded))
932*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(b, b_loaded))
933*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(i, i_loaded)
934*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(j, j_loaded)
935*da0073e9SAndroid Build Coastguard Worker
936*da0073e9SAndroid Build Coastguard Worker    def run(self, *args, **kwargs):
937*da0073e9SAndroid Build Coastguard Worker        with serialization_method(use_zip=False):
938*da0073e9SAndroid Build Coastguard Worker            return super().run(*args, **kwargs)
939*da0073e9SAndroid Build Coastguard Worker
940*da0073e9SAndroid Build Coastguard Worker
941*da0073e9SAndroid Build Coastguard Workerclass TestSerialization(TestCase, SerializationMixin):
942*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
943*da0073e9SAndroid Build Coastguard Worker    def test_serialization_zipfile(self, weights_only):
944*da0073e9SAndroid Build Coastguard Worker        data = self._test_serialization_data()
945*da0073e9SAndroid Build Coastguard Worker
946*da0073e9SAndroid Build Coastguard Worker        def test(name_or_buffer):
947*da0073e9SAndroid Build Coastguard Worker            torch.save(data, name_or_buffer)
948*da0073e9SAndroid Build Coastguard Worker
949*da0073e9SAndroid Build Coastguard Worker            if hasattr(name_or_buffer, 'seek'):
950*da0073e9SAndroid Build Coastguard Worker                name_or_buffer.seek(0)
951*da0073e9SAndroid Build Coastguard Worker
952*da0073e9SAndroid Build Coastguard Worker            result = torch.load(name_or_buffer, weights_only=weights_only)
953*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(result, data)
954*da0073e9SAndroid Build Coastguard Worker
955*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
956*da0073e9SAndroid Build Coastguard Worker            test(f)
957*da0073e9SAndroid Build Coastguard Worker
958*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as fname:
959*da0073e9SAndroid Build Coastguard Worker            test(fname)
960*da0073e9SAndroid Build Coastguard Worker
961*da0073e9SAndroid Build Coastguard Worker        if IS_FILESYSTEM_UTF8_ENCODING:
962*da0073e9SAndroid Build Coastguard Worker            with TemporaryDirectoryName(suffix='\u975eASCII\u30d1\u30b9') as dname:
963*da0073e9SAndroid Build Coastguard Worker                with TemporaryFileName(dir=dname) as fname:
964*da0073e9SAndroid Build Coastguard Worker                    test(fname)
965*da0073e9SAndroid Build Coastguard Worker
966*da0073e9SAndroid Build Coastguard Worker        test(io.BytesIO())
967*da0073e9SAndroid Build Coastguard Worker
968*da0073e9SAndroid Build Coastguard Worker    def test_serialization_zipfile_actually_jit(self):
969*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
970*da0073e9SAndroid Build Coastguard Worker            torch.jit.save(torch.jit.script(torch.nn.Linear(3, 4)), f)
971*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
972*da0073e9SAndroid Build Coastguard Worker            torch.load(f)
973*da0073e9SAndroid Build Coastguard Worker
974*da0073e9SAndroid Build Coastguard Worker    # Ensure large zip64 serialization works properly
975*da0073e9SAndroid Build Coastguard Worker    @serialTest()
976*da0073e9SAndroid Build Coastguard Worker    def test_serialization_2gb_file(self):
977*da0073e9SAndroid Build Coastguard Worker        # Run GC to clear up as much memory as possible before running this test
978*da0073e9SAndroid Build Coastguard Worker        gc.collect()
979*da0073e9SAndroid Build Coastguard Worker        big_model = torch.nn.Conv2d(20000, 3200, kernel_size=3)
980*da0073e9SAndroid Build Coastguard Worker
981*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
982*da0073e9SAndroid Build Coastguard Worker            torch.save(big_model.state_dict(), f)
983*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
984*da0073e9SAndroid Build Coastguard Worker            state = torch.load(f)
985*da0073e9SAndroid Build Coastguard Worker
986*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
987*da0073e9SAndroid Build Coastguard Worker    def test_pathlike_serialization(self, weights_only):
988*da0073e9SAndroid Build Coastguard Worker        model = torch.nn.Conv2d(20, 3200, kernel_size=3)
989*da0073e9SAndroid Build Coastguard Worker
990*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as fname:
991*da0073e9SAndroid Build Coastguard Worker            path = pathlib.Path(fname)
992*da0073e9SAndroid Build Coastguard Worker            torch.save(model.state_dict(), path)
993*da0073e9SAndroid Build Coastguard Worker            torch.load(path, weights_only=weights_only)
994*da0073e9SAndroid Build Coastguard Worker
995*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
996*da0073e9SAndroid Build Coastguard Worker    def test_meta_serialization(self, weights_only):
997*da0073e9SAndroid Build Coastguard Worker        big_model = torch.nn.Conv2d(20000, 320000, kernel_size=3, device='meta')
998*da0073e9SAndroid Build Coastguard Worker
999*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
1000*da0073e9SAndroid Build Coastguard Worker            torch.save(big_model.state_dict(), f)
1001*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1002*da0073e9SAndroid Build Coastguard Worker            state = torch.load(f, weights_only=weights_only)
1003*da0073e9SAndroid Build Coastguard Worker
1004*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(state['weight'].size(), big_model.weight.size())
1005*da0073e9SAndroid Build Coastguard Worker
1006*da0073e9SAndroid Build Coastguard Worker    def test_lr_scheduler_serialization(self):
1007*da0073e9SAndroid Build Coastguard Worker        sgd = torch.optim.SGD([
1008*da0073e9SAndroid Build Coastguard Worker            torch.tensor(torch.randn(100, 100, 2000), requires_grad=True)
1009*da0073e9SAndroid Build Coastguard Worker        ], lr=0.1, momentum=0.9)
1010*da0073e9SAndroid Build Coastguard Worker        lr_scheduler = torch.optim.lr_scheduler.OneCycleLR(sgd, 6.0, total_steps=10)
1011*da0073e9SAndroid Build Coastguard Worker
1012*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
1013*da0073e9SAndroid Build Coastguard Worker            torch.save(lr_scheduler.state_dict(), f)
1014*da0073e9SAndroid Build Coastguard Worker            f.seek(0, os.SEEK_END)
1015*da0073e9SAndroid Build Coastguard Worker            size = f.tell()
1016*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1017*da0073e9SAndroid Build Coastguard Worker            lr_scheduler_state = torch.load(f)
1018*da0073e9SAndroid Build Coastguard Worker
1019*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(lr_scheduler_state['base_lrs'], lr_scheduler.base_lrs)
1020*da0073e9SAndroid Build Coastguard Worker        if 'anneal_func' in lr_scheduler_state:
1021*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(hasattr(lr_scheduler_state['anneal_func'], '__self__'))  # check method is not bound
1022*da0073e9SAndroid Build Coastguard Worker        else:
1023*da0073e9SAndroid Build Coastguard Worker            self.assertTrue('_anneal_func_type' in lr_scheduler_state)
1024*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(size < 1024 * 1024)  # Must be less than 1MB
1025*da0073e9SAndroid Build Coastguard Worker
1026*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
1027*da0073e9SAndroid Build Coastguard Worker    def test_serialization_python_attr(self, weights_only):
1028*da0073e9SAndroid Build Coastguard Worker        def _test_save_load_attr(t):
1029*da0073e9SAndroid Build Coastguard Worker            t.foo = 'foo'
1030*da0073e9SAndroid Build Coastguard Worker            t.pi = 3.14
1031*da0073e9SAndroid Build Coastguard Worker
1032*da0073e9SAndroid Build Coastguard Worker            with BytesIOContext() as f:
1033*da0073e9SAndroid Build Coastguard Worker                torch.save(t, f)
1034*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
1035*da0073e9SAndroid Build Coastguard Worker                loaded_t = torch.load(f, weights_only=weights_only)
1036*da0073e9SAndroid Build Coastguard Worker
1037*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(t, loaded_t)
1038*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(t.foo, loaded_t.foo)
1039*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(t.pi, loaded_t.pi)
1040*da0073e9SAndroid Build Coastguard Worker
1041*da0073e9SAndroid Build Coastguard Worker        t = torch.zeros(3, 3)
1042*da0073e9SAndroid Build Coastguard Worker        _test_save_load_attr(t)
1043*da0073e9SAndroid Build Coastguard Worker        _test_save_load_attr(torch.nn.Parameter(t))
1044*da0073e9SAndroid Build Coastguard Worker
1045*da0073e9SAndroid Build Coastguard Worker    def test_weights_only_assert(self):
1046*da0073e9SAndroid Build Coastguard Worker        class HelloWorld:
1047*da0073e9SAndroid Build Coastguard Worker            def __reduce__(self):
1048*da0073e9SAndroid Build Coastguard Worker                return (print, ("Hello World!",))
1049*da0073e9SAndroid Build Coastguard Worker
1050*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
1051*da0073e9SAndroid Build Coastguard Worker            torch.save(HelloWorld(), f)
1052*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1053*da0073e9SAndroid Build Coastguard Worker            # Unsafe load should work
1054*da0073e9SAndroid Build Coastguard Worker            self.assertIsNone(torch.load(f, weights_only=False))
1055*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1056*da0073e9SAndroid Build Coastguard Worker            # Safe load should assert
1057*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(pickle.UnpicklingError, "Unsupported global: GLOBAL builtins.print"):
1058*da0073e9SAndroid Build Coastguard Worker                torch.load(f, weights_only=True)
1059*da0073e9SAndroid Build Coastguard Worker            try:
1060*da0073e9SAndroid Build Coastguard Worker                torch.serialization.add_safe_globals([print])
1061*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
1062*da0073e9SAndroid Build Coastguard Worker                torch.load(f, weights_only=True)
1063*da0073e9SAndroid Build Coastguard Worker            finally:
1064*da0073e9SAndroid Build Coastguard Worker                torch.serialization.clear_safe_globals()
1065*da0073e9SAndroid Build Coastguard Worker
1066*da0073e9SAndroid Build Coastguard Worker    def test_weights_only_safe_globals_newobj(self):
1067*da0073e9SAndroid Build Coastguard Worker        # This will use NEWOBJ
1068*da0073e9SAndroid Build Coastguard Worker        p = Point(x=1, y=2)
1069*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
1070*da0073e9SAndroid Build Coastguard Worker            torch.save(p, f)
1071*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1072*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(pickle.UnpicklingError,
1073*da0073e9SAndroid Build Coastguard Worker                                        "GLOBAL __main__.Point was not an allowed global by default"):
1074*da0073e9SAndroid Build Coastguard Worker                torch.load(f, weights_only=True)
1075*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1076*da0073e9SAndroid Build Coastguard Worker            try:
1077*da0073e9SAndroid Build Coastguard Worker                torch.serialization.add_safe_globals([Point])
1078*da0073e9SAndroid Build Coastguard Worker                loaded_p = torch.load(f, weights_only=True)
1079*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(loaded_p, p)
1080*da0073e9SAndroid Build Coastguard Worker            finally:
1081*da0073e9SAndroid Build Coastguard Worker                torch.serialization.clear_safe_globals()
1082*da0073e9SAndroid Build Coastguard Worker
1083*da0073e9SAndroid Build Coastguard Worker    def test_weights_only_safe_globals_build(self):
1084*da0073e9SAndroid Build Coastguard Worker        counter = 0
1085*da0073e9SAndroid Build Coastguard Worker
1086*da0073e9SAndroid Build Coastguard Worker        def fake_set_state(obj, *args):
1087*da0073e9SAndroid Build Coastguard Worker            nonlocal counter
1088*da0073e9SAndroid Build Coastguard Worker            counter += 1
1089*da0073e9SAndroid Build Coastguard Worker
1090*da0073e9SAndroid Build Coastguard Worker        c = ClassThatUsesBuildInstruction(2)
1091*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
1092*da0073e9SAndroid Build Coastguard Worker            torch.save(c, f)
1093*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1094*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(pickle.UnpicklingError,
1095*da0073e9SAndroid Build Coastguard Worker                                        "GLOBAL __main__.ClassThatUsesBuildInstruction was not an allowed global by default"):
1096*da0073e9SAndroid Build Coastguard Worker                torch.load(f, weights_only=True)
1097*da0073e9SAndroid Build Coastguard Worker            try:
1098*da0073e9SAndroid Build Coastguard Worker                torch.serialization.add_safe_globals([ClassThatUsesBuildInstruction])
1099*da0073e9SAndroid Build Coastguard Worker                # Test dict update path
1100*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
1101*da0073e9SAndroid Build Coastguard Worker                loaded_c = torch.load(f, weights_only=True)
1102*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(loaded_c.num, 2)
1103*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(loaded_c.foo, 'bar')
1104*da0073e9SAndroid Build Coastguard Worker                # Test setstate path
1105*da0073e9SAndroid Build Coastguard Worker                ClassThatUsesBuildInstruction.__setstate__ = fake_set_state
1106*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
1107*da0073e9SAndroid Build Coastguard Worker                loaded_c = torch.load(f, weights_only=True)
1108*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(loaded_c.num, 2)
1109*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(counter, 1)
1110*da0073e9SAndroid Build Coastguard Worker                self.assertFalse(hasattr(loaded_c, 'foo'))
1111*da0073e9SAndroid Build Coastguard Worker            finally:
1112*da0073e9SAndroid Build Coastguard Worker                torch.serialization.clear_safe_globals()
1113*da0073e9SAndroid Build Coastguard Worker                ClassThatUsesBuildInstruction.__setstate__ = None
1114*da0073e9SAndroid Build Coastguard Worker
1115*da0073e9SAndroid Build Coastguard Worker    @parametrize("unsafe_global", [True, False])
1116*da0073e9SAndroid Build Coastguard Worker    def test_weights_only_error(self, unsafe_global):
1117*da0073e9SAndroid Build Coastguard Worker        sd = {'t': TwoTensor(torch.randn(2), torch.randn(2))}
1118*da0073e9SAndroid Build Coastguard Worker        pickle_protocol = torch.serialization.DEFAULT_PROTOCOL if unsafe_global else 5
1119*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
1120*da0073e9SAndroid Build Coastguard Worker            torch.save(sd, f, pickle_protocol=pickle_protocol)
1121*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
1122*da0073e9SAndroid Build Coastguard Worker            if unsafe_global:
1123*da0073e9SAndroid Build Coastguard Worker                with self.assertRaisesRegex(pickle.UnpicklingError,
1124*da0073e9SAndroid Build Coastguard Worker                                            r"use `torch.serialization.add_safe_globals\(\[TwoTensor\]\)` to allowlist"):
1125*da0073e9SAndroid Build Coastguard Worker                    torch.load(f, weights_only=True)
1126*da0073e9SAndroid Build Coastguard Worker            else:
1127*da0073e9SAndroid Build Coastguard Worker                with self.assertRaisesRegex(pickle.UnpicklingError,
1128*da0073e9SAndroid Build Coastguard Worker                                            "file an issue with the following so that we can make `weights_only=True`"):
1129*da0073e9SAndroid Build Coastguard Worker                    torch.load(f, weights_only=True)
1130*da0073e9SAndroid Build Coastguard Worker
1131*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (False, True))
1132*da0073e9SAndroid Build Coastguard Worker    def test_serialization_math_bits(self, weights_only):
1133*da0073e9SAndroid Build Coastguard Worker        t = torch.randn(1, dtype=torch.cfloat)
1134*da0073e9SAndroid Build Coastguard Worker
1135*da0073e9SAndroid Build Coastguard Worker        def _save_load_check(t):
1136*da0073e9SAndroid Build Coastguard Worker            with BytesIOContext() as f:
1137*da0073e9SAndroid Build Coastguard Worker                torch.save(t, f)
1138*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
1139*da0073e9SAndroid Build Coastguard Worker                # Unsafe load should work
1140*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(torch.load(f, weights_only=weights_only), t)
1141*da0073e9SAndroid Build Coastguard Worker
1142*da0073e9SAndroid Build Coastguard Worker        t_conj = torch.conj(t)
1143*da0073e9SAndroid Build Coastguard Worker        _save_load_check(t_conj)
1144*da0073e9SAndroid Build Coastguard Worker
1145*da0073e9SAndroid Build Coastguard Worker        t_neg = torch._neg_view(t)
1146*da0073e9SAndroid Build Coastguard Worker        _save_load_check(t_neg)
1147*da0073e9SAndroid Build Coastguard Worker
1148*da0073e9SAndroid Build Coastguard Worker        t_n_c = torch._neg_view(torch.conj(t))
1149*da0073e9SAndroid Build Coastguard Worker        _save_load_check(t_n_c)
1150*da0073e9SAndroid Build Coastguard Worker
1151*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (False, True))
1152*da0073e9SAndroid Build Coastguard Worker    def test_serialization_efficient_zerotensor(self, weights_only):
1153*da0073e9SAndroid Build Coastguard Worker        # We don't support serializing `ZeroTensor` as it is not public
1154*da0073e9SAndroid Build Coastguard Worker        # facing yet.
1155*da0073e9SAndroid Build Coastguard Worker        # If in future, `ZeroTensor` serialization is supported, this test
1156*da0073e9SAndroid Build Coastguard Worker        # should start failing!
1157*da0073e9SAndroid Build Coastguard Worker        t = torch._efficientzerotensor((4, 5))
1158*da0073e9SAndroid Build Coastguard Worker
1159*da0073e9SAndroid Build Coastguard Worker        def _save_load_check(t):
1160*da0073e9SAndroid Build Coastguard Worker            with BytesIOContext() as f:
1161*da0073e9SAndroid Build Coastguard Worker                torch.save(t, f)
1162*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
1163*da0073e9SAndroid Build Coastguard Worker                # Unsafe load should work
1164*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(torch.load(f, weights_only=weights_only), t)
1165*da0073e9SAndroid Build Coastguard Worker
1166*da0073e9SAndroid Build Coastguard Worker        # NOTE: `torch.save` fails before we hit the TORCH_CHECK in `getTensoMetadata`
1167*da0073e9SAndroid Build Coastguard Worker        #       as nullptr storage is disabled.
1168*da0073e9SAndroid Build Coastguard Worker        with self.assertRaisesRegex(RuntimeError, 'ZeroTensor is not serializable'):
1169*da0073e9SAndroid Build Coastguard Worker            _save_load_check(t)
1170*da0073e9SAndroid Build Coastguard Worker
1171*da0073e9SAndroid Build Coastguard Worker    def test_serialization_byteorder_mark(self):
1172*da0073e9SAndroid Build Coastguard Worker        lstm = torch.nn.LSTM(3, 3)
1173*da0073e9SAndroid Build Coastguard Worker        inputs = [torch.randn(1, 3) for _ in range(5)]
1174*da0073e9SAndroid Build Coastguard Worker        inputs = torch.cat(inputs).view(len(inputs), 1, -1)
1175*da0073e9SAndroid Build Coastguard Worker        hidden = (torch.randn(1, 1, 3), torch.randn(1, 1, 3))  # clean out hidden state
1176*da0073e9SAndroid Build Coastguard Worker
1177*da0073e9SAndroid Build Coastguard Worker        databuffer = io.BytesIO()
1178*da0073e9SAndroid Build Coastguard Worker        torch.save(lstm.state_dict(), databuffer)
1179*da0073e9SAndroid Build Coastguard Worker        databuffer.seek(0)
1180*da0073e9SAndroid Build Coastguard Worker
1181*da0073e9SAndroid Build Coastguard Worker        with torch.serialization._open_zipfile_reader(databuffer) as zip_file:
1182*da0073e9SAndroid Build Coastguard Worker            byteordername = 'byteorder'
1183*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(zip_file.has_record(byteordername))
1184*da0073e9SAndroid Build Coastguard Worker            byteorderdata = zip_file.get_record(byteordername)
1185*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(byteorderdata in [b'little', b'big'])
1186*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(byteorderdata.decode(), sys.byteorder)
1187*da0073e9SAndroid Build Coastguard Worker
1188*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data(self):
1189*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
1190*da0073e9SAndroid Build Coastguard Worker        #
1191*da0073e9SAndroid Build Coastguard Worker        # import torch
1192*da0073e9SAndroid Build Coastguard Worker        #
1193*da0073e9SAndroid Build Coastguard Worker        # lstm = torch.nn.LSTM(3, 3)
1194*da0073e9SAndroid Build Coastguard Worker        # inputs = [torch.randn(1, 3) for _ in range(5)]
1195*da0073e9SAndroid Build Coastguard Worker        #
1196*da0073e9SAndroid Build Coastguard Worker        # inputs = torch.cat(inputs).view(len(inputs), 1, -1)
1197*da0073e9SAndroid Build Coastguard Worker        # hidden = (torch.randn(1, 1, 3), torch.randn(1, 1, 3))
1198*da0073e9SAndroid Build Coastguard Worker        #
1199*da0073e9SAndroid Build Coastguard Worker        # torch.save(lstm.state_dict(), "lstm.LE.pt", _disable_byteorder_record=True)
1200*da0073e9SAndroid Build Coastguard Worker        # torch.save(lstm.state_dict(), "lstm.LE.BOM.pt")
1201*da0073e9SAndroid Build Coastguard Worker        #
1202*da0073e9SAndroid Build Coastguard Worker        # print(lstm.state_dict())
1203*da0073e9SAndroid Build Coastguard Worker        #
1204*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
1205*da0073e9SAndroid Build Coastguard Worker        #
1206*da0073e9SAndroid Build Coastguard Worker        # import torch
1207*da0073e9SAndroid Build Coastguard Worker        #
1208*da0073e9SAndroid Build Coastguard Worker        # lstm = torch.nn.LSTM(3, 3)
1209*da0073e9SAndroid Build Coastguard Worker        # lstm.load_state_dict(torch.load("lstm.LE.BOM.pt"), strict=True)
1210*da0073e9SAndroid Build Coastguard Worker        #
1211*da0073e9SAndroid Build Coastguard Worker        # torch.save(lstm.state_dict(), "lstm.BE.pt", _disable_byteorder_record=True)
1212*da0073e9SAndroid Build Coastguard Worker        # torch.save(lstm.state_dict(), "lstm.BE.BOM.pt")
1213*da0073e9SAndroid Build Coastguard Worker        #
1214*da0073e9SAndroid Build Coastguard Worker        # print(lstm.state_dict())
1215*da0073e9SAndroid Build Coastguard Worker        #
1216*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1217*da0073e9SAndroid Build Coastguard Worker        #
1218*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
1219*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
1220*da0073e9SAndroid Build Coastguard Worker        # file.close()
1221*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
1222*da0073e9SAndroid Build Coastguard Worker        #
1223*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
1224*da0073e9SAndroid Build Coastguard Worker        #
1225*da0073e9SAndroid Build Coastguard Worker        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'
1226*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\r\x00\x15\x00lstm/data.pklFB\x11\x00ZZZZZZZZZZZZZZZZZ\x80\x02'
1227*da0073e9SAndroid Build Coastguard Worker                          b'ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ctor'
1228*da0073e9SAndroid Build Coastguard Worker                          b'ch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFloat'
1229*da0073e9SAndroid Build Coastguard Worker                          b'Storage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1230*da0073e9SAndroid Build Coastguard Worker                          b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weight_'
1231*da0073e9SAndroid Build Coastguard Worker                          b'hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03\x86'
1232*da0073e9SAndroid Build Coastguard Worker                          b'q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_l0'
1233*da0073e9SAndroid Build Coastguard Worker                          b'q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1234*da0073e9SAndroid Build Coastguard Worker                          b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03(('
1235*da0073e9SAndroid Build Coastguard Worker                          b'h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89h\x00'
1236*da0073e9SAndroid Build Coastguard Worker                          b')Rq#tq$Rq%u}q&X\t\x00\x00\x00_metadataq\'h\x00)Rq(X\x00\x00\x00\x00q)}q*X\x07'
1237*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1238*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1239*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x0b\x00\x0f\x00lstm/data/0FB\x0b\x00ZZZZZZZZZZZ\nuJ\xbe'
1240*da0073e9SAndroid Build Coastguard Worker                          b'X*\xa2\xbe\xc4\xea\x10>\xd4\n\x8d\xbe\x1c\x10\x8a\xbe\xb02\xe4\xbe,\xcb4>\x00'
1241*da0073e9SAndroid Build Coastguard Worker                          b'\x17!>H\x9c\xe0\xbe\xd2\x15!\xbe6C\xc6>v\xc5\x89>\xae\x14\x81\xbeZ\xc7\x99>\x90P'
1242*da0073e9SAndroid Build Coastguard Worker                          b'\x01?`\xb9\x9a<\xc0 <=\'\xc7\x9e\xbe\xaa\xf4\x02?\x00\xf3\x0e\xbc\xd8\xb7v\xbe\xa0'
1243*da0073e9SAndroid Build Coastguard Worker                          b'\xcc\xcd=$/\xaf>\x00\xc4K=0\xb8\xe5\xbe\xb6\xc5U\xbe\xc4i\xf3\xbe\xa45\xdc>\x06'
1244*da0073e9SAndroid Build Coastguard Worker                          b'g\x8d>N!\xae>2Fr\xbe0hb\xbd\xf0we\xbd g\xa0<\xb6\xbe\x9e\xbe\x14\xd1\xc2>PK\x07'
1245*da0073e9SAndroid Build Coastguard Worker                          b'\x08j\xd9\xb9M\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1246*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x007\x00lst'
1247*da0073e9SAndroid Build Coastguard Worker                          b'm/data/1FB3\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ|[\xe1>\xa2Yd\xbe'
1248*da0073e9SAndroid Build Coastguard Worker                          b'\xa5o\t\xbfz\x1c\x05\xbe \xb1\xdb<\xf0\xcd\xfc>\xa2u\xcb>\x8c\x87{\xbe\x9c\x9b'
1249*da0073e9SAndroid Build Coastguard Worker                          b'^>\xacmG>\xae\x17\x93>\x8e\xc5\xf0\xbet\x1c\xfc>\xcb\x84\x81\xbe\xc8\xa6 >\x88\xee'
1250*da0073e9SAndroid Build Coastguard Worker                          b'\xaf=\n\xc9\x8d>\xc0\xc5\xee>\xf0E\x91>\xf4^\xa1>\xb8\xbbF>\x97\x97\xfe\xbe\xec'
1251*da0073e9SAndroid Build Coastguard Worker                          b'\x85\x03?h\x9c\xf3=\xf2\xa8\x97>^\xfa\r?6i\x94\xbe\xbc1w\xbeh\xc4\x8a=\x94\xc8'
1252*da0073e9SAndroid Build Coastguard Worker                          b'\x9f\xbd\x81\xb5\x89\xbe(K\xb0>\xf0:z\xbd\xb0\xc6\x9b\xbdX\x00\x88=\x05\xc7\x11\xbf'
1253*da0073e9SAndroid Build Coastguard Worker                          b'PK\x07\x08\x12\xc0\x87\x96\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08'
1254*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b'
1255*da0073e9SAndroid Build Coastguard Worker                          b'\x007\x00lstm/data/2FB3\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1256*da0073e9SAndroid Build Coastguard Worker                          b'Z\xb0\xc2f=@\xdd1<\x864\xd8\xbe\xa0\t\x13?+g\x8f\xbeu\xb1\r\xbfbl\xc3>\xa8\\\x82'
1257*da0073e9SAndroid Build Coastguard Worker                          b'\xbe\xa4c\xf3\xbd,\x96\xdf\xbe\xfe\x05\xf1\xbe\xf8\xc9\x96>PK\x07\x08\x92\tK?0\x00'
1258*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
1259*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x17\x00lstm/data/3FB\x13\x00ZZ'
1260*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZ\x04\xaai\xbe\xce\xd8\x8a\xbe\xe3O\xdf\xbe$\xc3\xd2\xbe\x06\xb1'
1261*da0073e9SAndroid Build Coastguard Worker                          b'\x80\xbe^&\x08?\x00\x1a}\xbd\x06\xde\r?\x04\xe7\xac>Z@\xe9\xbe\x14\xc2)>\x9c\xe9'
1262*da0073e9SAndroid Build Coastguard Worker                          b'/>PK\x07\x08\x1axU\xe80\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1263*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x16\x00'
1264*da0073e9SAndroid Build Coastguard Worker                          b'lstm/versionFB\x12\x00ZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
1265*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xab\xf1'
1266*da0073e9SAndroid Build Coastguard Worker                          b'\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1267*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00lstm/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
1268*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00j\xd9\xb9M\x90\x00\x00\x00\x90\x00\x00\x00\x0b\x00\x00\x00'
1269*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00lstm/data/0PK\x01\x02\x00'
1270*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x12\xc0\x87\x96\x90\x00\x00\x00\x90'
1271*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x02\x00'
1272*da0073e9SAndroid Build Coastguard Worker                          b'\x00lstm/data/1PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x92'
1273*da0073e9SAndroid Build Coastguard Worker                          b'\tK?0\x00\x00\x000\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1274*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xe0\x03\x00\x00lstm/data/2PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1275*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x1axU\xe80\x00\x00\x000\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00'
1276*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x80\x04\x00\x00lstm/data/3PK\x01\x02\x00\x00\x00\x00\x08'
1277*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x0c\x00\x00'
1278*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00lstm/versionPK\x06'
1279*da0073e9SAndroid Build Coastguard Worker                          b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06'
1280*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00Y\x01\x00\x00\x00\x00'
1281*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00R\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xab\x06\x00\x00'
1282*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x06\x00\x06\x00Y\x01'
1283*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00R\x05\x00\x00\x00\x00')
1284*da0073e9SAndroid Build Coastguard Worker
1285*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1286*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00lstm.save/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
1287*da0073e9SAndroid Build Coastguard Worker                       b'\x02ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ct'
1288*da0073e9SAndroid Build Coastguard Worker                       b'orch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFlo'
1289*da0073e9SAndroid Build Coastguard Worker                       b'atStorage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1290*da0073e9SAndroid Build Coastguard Worker                       b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weigh'
1291*da0073e9SAndroid Build Coastguard Worker                       b't_hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03'
1292*da0073e9SAndroid Build Coastguard Worker                       b'\x86q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_'
1293*da0073e9SAndroid Build Coastguard Worker                       b'l0q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1294*da0073e9SAndroid Build Coastguard Worker                       b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03'
1295*da0073e9SAndroid Build Coastguard Worker                       b'((h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89'
1296*da0073e9SAndroid Build Coastguard Worker                       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'
1297*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1298*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1299*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x13\x00\x07\x00lstm.save/byteorderFB\x03\x00ZZZlit'
1300*da0073e9SAndroid Build Coastguard Worker                       b'tlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08'
1301*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10'
1302*da0073e9SAndroid Build Coastguard Worker                       b'\x00<\x00lstm.save/data/0FB8\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1303*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZ\nuJ\xbeX*\xa2\xbe\xc4\xea\x10>\xd4\n\x8d\xbe\x1c\x10\x8a\xbe\xb02\xe4\xbe'
1304*da0073e9SAndroid Build Coastguard Worker                       b',\xcb4>\x00\x17!>H\x9c\xe0\xbe\xd2\x15!\xbe6C\xc6>v\xc5\x89>\xae\x14\x81\xbeZ\xc7'
1305*da0073e9SAndroid Build Coastguard Worker                       b'\x99>\x90P\x01?`\xb9\x9a<\xc0 <=\'\xc7\x9e\xbe\xaa\xf4\x02?\x00\xf3\x0e\xbc\xd8'
1306*da0073e9SAndroid Build Coastguard Worker                       b'\xb7v\xbe\xa0\xcc\xcd=$/\xaf>\x00\xc4K=0\xb8\xe5\xbe\xb6\xc5U\xbe\xc4i\xf3\xbe'
1307*da0073e9SAndroid Build Coastguard Worker                       b'\xa45\xdc>\x06g\x8d>N!\xae>2Fr\xbe0hb\xbd\xf0we\xbd g\xa0<\xb6\xbe\x9e\xbe\x14\xd1'
1308*da0073e9SAndroid Build Coastguard Worker                       b'\xc2>PK\x07\x08j\xd9\xb9M\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08'
1309*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10'
1310*da0073e9SAndroid Build Coastguard Worker                       b'\x002\x00lstm.save/data/1FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ|'
1311*da0073e9SAndroid Build Coastguard Worker                       b'[\xe1>\xa2Yd\xbe\xa5o\t\xbfz\x1c\x05\xbe \xb1\xdb<\xf0\xcd\xfc>\xa2u\xcb>\x8c\x87'
1312*da0073e9SAndroid Build Coastguard Worker                       b'{\xbe\x9c\x9b^>\xacmG>\xae\x17\x93>\x8e\xc5\xf0\xbet\x1c\xfc>\xcb\x84\x81\xbe\xc8'
1313*da0073e9SAndroid Build Coastguard Worker                       b'\xa6 >\x88\xee\xaf=\n\xc9\x8d>\xc0\xc5\xee>\xf0E\x91>\xf4^\xa1>\xb8\xbbF>\x97\x97'
1314*da0073e9SAndroid Build Coastguard Worker                       b'\xfe\xbe\xec\x85\x03?h\x9c\xf3=\xf2\xa8\x97>^\xfa\r?6i\x94\xbe\xbc1w\xbeh\xc4'
1315*da0073e9SAndroid Build Coastguard Worker                       b'\x8a=\x94\xc8\x9f\xbd\x81\xb5\x89\xbe(K\xb0>\xf0:z\xbd\xb0\xc6\x9b\xbdX\x00\x88='
1316*da0073e9SAndroid Build Coastguard Worker                       b'\x05\xc7\x11\xbfPK\x07\x08\x12\xc0\x87\x96\x90\x00\x00\x00\x90\x00\x00\x00PK\x03'
1317*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1318*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x10\x002\x00lstm.save/data/2FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1319*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZ\xb0\xc2f=@\xdd1<\x864\xd8\xbe\xa0\t\x13?+g\x8f\xbeu\xb1\r\xbfbl\xc3'
1320*da0073e9SAndroid Build Coastguard Worker                       b'>\xa8\\\x82\xbe\xa4c\xf3\xbd,\x96\xdf\xbe\xfe\x05\xf1\xbe\xf8\xc9\x96>PK\x07\x08'
1321*da0073e9SAndroid Build Coastguard Worker                       b'\x92\tK?0\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1322*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00lstm.save/'
1323*da0073e9SAndroid Build Coastguard Worker                       b'data/3FB\x0e\x00ZZZZZZZZZZZZZZ\x04\xaai\xbe\xce\xd8\x8a\xbe\xe3O\xdf\xbe$\xc3\xd2'
1324*da0073e9SAndroid Build Coastguard Worker                       b'\xbe\x06\xb1\x80\xbe^&\x08?\x00\x1a}\xbd\x06\xde\r?\x04\xe7\xac>Z@\xe9\xbe\x14\xc2'
1325*da0073e9SAndroid Build Coastguard Worker                       b')>\x9c\xe9/>PK\x07\x08\x1axU\xe80\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08'
1326*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11'
1327*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x11\x00lstm.save/versionFB\r\x00ZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02'
1328*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1329*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00'
1330*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lstm.save/data.pklPK\x01\x02\x00\x00'
1331*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00'
1332*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00l'
1333*da0073e9SAndroid Build Coastguard Worker                       b'stm.save/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00j\xd9'
1334*da0073e9SAndroid Build Coastguard Worker                       b'\xb9M\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1335*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00V\x02\x00\x00lstm.save/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
1336*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x12\xc0\x87\x96\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00'
1337*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x03\x00\x00lstm.save/data/1PK\x01'
1338*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x92\tK?0\x00\x00\x000\x00\x00'
1339*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x04\x00\x00lstm.'
1340*da0073e9SAndroid Build Coastguard Worker                       b'save/data/2PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1axU\xe80'
1341*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x000\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1342*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x05\x00\x00lstm.save/data/3PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1343*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00'
1344*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x80\x05\x00\x00lstm.save/versionPK\x06\x06,\x00\x00'
1345*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00'
1346*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00'
1347*da0073e9SAndroid Build Coastguard Worker                       b'\xd2\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x8a\x07\x00\x00\x00'
1348*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x07\x00\x07\x00\xb8\x01\x00'
1349*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xd2\x05\x00\x00\x00\x00')
1350*da0073e9SAndroid Build Coastguard Worker
1351*da0073e9SAndroid Build Coastguard Worker        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'
1352*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x12\x00\x10\x00lstm.save/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
1353*da0073e9SAndroid Build Coastguard Worker                          b'\x02ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ct'
1354*da0073e9SAndroid Build Coastguard Worker                          b'orch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFlo'
1355*da0073e9SAndroid Build Coastguard Worker                          b'atStorage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1356*da0073e9SAndroid Build Coastguard Worker                          b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weigh'
1357*da0073e9SAndroid Build Coastguard Worker                          b't_hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03'
1358*da0073e9SAndroid Build Coastguard Worker                          b'\x86q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_'
1359*da0073e9SAndroid Build Coastguard Worker                          b'l0q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1360*da0073e9SAndroid Build Coastguard Worker                          b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03'
1361*da0073e9SAndroid Build Coastguard Worker                          b'((h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89'
1362*da0073e9SAndroid Build Coastguard Worker                          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'
1363*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1364*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1365*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x10\x00\n\x00lstm.save/data/0FB\x06\x00ZZZZZZ\xbeJ'
1366*da0073e9SAndroid Build Coastguard Worker                          b'u\n\xbe\xa2*X>\x10\xea\xc4\xbe\x8d\n\xd4\xbe\x8a\x10\x1c\xbe\xe42\xb0>4\xcb,>!\x17'
1367*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xbe\xe0\x9cH\xbe!\x15\xd2>\xc6C6>\x89\xc5v\xbe\x81\x14\xae>\x99\xc7Z?\x01'
1368*da0073e9SAndroid Build Coastguard Worker                          b'P\x90<\x9a\xb9`=< \xc0\xbe\x9e\xc7\'?\x02\xf4\xaa\xbc\x0e\xf3\x00\xbev\xb7\xd8=\xcd'
1369*da0073e9SAndroid Build Coastguard Worker                          b'\xcc\xa0>\xaf/$=K\xc4\x00\xbe\xe5\xb80\xbeU\xc5\xb6\xbe\xf3i\xc4>\xdc5\xa4>\x8d'
1370*da0073e9SAndroid Build Coastguard Worker                          b'g\x06>\xae!N\xberF2\xbdbh0\xbdew\xf0<\xa0g \xbe\x9e\xbe\xb6>\xc2\xd1\x14PK\x07'
1371*da0073e9SAndroid Build Coastguard Worker                          b'\x08\xc2yG\xba\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1372*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x002\x00lst'
1373*da0073e9SAndroid Build Coastguard Worker                          b'm.save/data/1FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ>\xe1[|\xbedY\xa2'
1374*da0073e9SAndroid Build Coastguard Worker                          b'\xbf\to\xa5\xbe\x05\x1cz<\xdb\xb1 >\xfc\xcd\xf0>\xcbu\xa2\xbe{\x87\x8c>^\x9b\x9c'
1375*da0073e9SAndroid Build Coastguard Worker                          b'>Gm\xac>\x93\x17\xae\xbe\xf0\xc5\x8e>\xfc\x1ct\xbe\x81\x84\xcb> \xa6\xc8=\xaf'
1376*da0073e9SAndroid Build Coastguard Worker                          b'\xee\x88>\x8d\xc9\n>\xee\xc5\xc0>\x91E\xf0>\xa1^\xf4>F\xbb\xb8\xbe\xfe\x97\x97?\x03'
1377*da0073e9SAndroid Build Coastguard Worker                          b'\x85\xec=\xf3\x9ch>\x97\xa8\xf2?\r\xfa^\xbe\x94i6\xbew1\xbc=\x8a\xc4h\xbd\x9f'
1378*da0073e9SAndroid Build Coastguard Worker                          b'\xc8\x94\xbe\x89\xb5\x81>\xb0K(\xbdz:\xf0\xbd\x9b\xc6\xb0=\x88\x00X\xbf\x11\xc7\x05'
1379*da0073e9SAndroid Build Coastguard Worker                          b'PK\x07\x08\xd0\xbftD\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08\x08'
1380*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00'
1381*da0073e9SAndroid Build Coastguard Worker                          b'2\x00lstm.save/data/2FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ=f\xc2'
1382*da0073e9SAndroid Build Coastguard Worker                          b'\xb0<1\xdd@\xbe\xd84\x86?\x13\t\xa0\xbe\x8fg+\xbf\r\xb1u>\xc3lb\xbe\x82\\\xa8\xbd'
1383*da0073e9SAndroid Build Coastguard Worker                          b'\xf3c\xa4\xbe\xdf\x96,\xbe\xf1\x05\xfe>\x96\xc9\xf8PK\x07\x08"\xc5\xc5O0\x00\x00'
1384*da0073e9SAndroid Build Coastguard Worker                          b'\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1385*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00lstm.save/data/3FB\x0e\x00Z'
1386*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZ\xbei\xaa\x04\xbe\x8a\xd8\xce\xbe\xdfO\xe3\xbe\xd2\xc3$\xbe\x80\xb1'
1387*da0073e9SAndroid Build Coastguard Worker                          b'\x06?\x08&^\xbd}\x1a\x00?\r\xde\x06>\xac\xe7\x04\xbe\xe9@Z>)\xc2\x14>/\xe9\x9cPK'
1388*da0073e9SAndroid Build Coastguard Worker                          b'\x07\x08\xfb\xfd/\x920\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
1389*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x11\x00'
1390*da0073e9SAndroid Build Coastguard Worker                          b'lstm.save/versionFB\r\x00ZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02'
1391*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xab\xf1'
1392*da0073e9SAndroid Build Coastguard Worker                          b'\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1393*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00lstm.save/data.pklPK\x01\x02\x00\x00\x00\x00\x08'
1394*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\xc2yG\xba\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00'
1395*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00lstm.save/data/0PK'
1396*da0073e9SAndroid Build Coastguard Worker                          b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd0\xbftD\x90\x00\x00\x00'
1397*da0073e9SAndroid Build Coastguard Worker                          b'\x90\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x02'
1398*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00lstm.save/data/1PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1399*da0073e9SAndroid Build Coastguard Worker                          b'\x00"\xc5\xc5O0\x00\x00\x000\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1400*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xe0\x03\x00\x00lstm.save/data/2PK\x01\x02\x00\x00\x00\x00\x08\x08'
1401*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xfb\xfd/\x920\x00\x00\x000\x00\x00\x00\x10\x00\x00\x00'
1402*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x00\x00lstm.save/data/3PK\x01\x02'
1403*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02'
1404*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00'
1405*da0073e9SAndroid Build Coastguard Worker                          b'\x00lstm.save/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
1406*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00'
1407*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00w\x01\x00\x00\x00\x00\x00\x00R\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
1408*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xc9\x06\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00'
1409*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x06\x00\x06\x00w\x01\x00\x00R\x05\x00\x00\x00\x00')
1410*da0073e9SAndroid Build Coastguard Worker
1411*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1412*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00lstm.save/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
1413*da0073e9SAndroid Build Coastguard Worker                       b'\x02ccollections\nOrderedDict\nq\x00)Rq\x01(X\x0c\x00\x00\x00weight_ih_l0q\x02ct'
1414*da0073e9SAndroid Build Coastguard Worker                       b'orch._utils\n_rebuild_tensor_v2\nq\x03((X\x07\x00\x00\x00storageq\x04ctorch\nFlo'
1415*da0073e9SAndroid Build Coastguard Worker                       b'atStorage\nq\x05X\x01\x00\x00\x000q\x06X\x03\x00\x00\x00cpuq\x07K$tq\x08QK\x00K\x0c'
1416*da0073e9SAndroid Build Coastguard Worker                       b'K\x03\x86q\tK\x03K\x01\x86q\n\x89h\x00)Rq\x0btq\x0cRq\rX\x0c\x00\x00\x00weigh'
1417*da0073e9SAndroid Build Coastguard Worker                       b't_hh_l0q\x0eh\x03((h\x04h\x05X\x01\x00\x00\x001q\x0fh\x07K$tq\x10QK\x00K\x0cK\x03'
1418*da0073e9SAndroid Build Coastguard Worker                       b'\x86q\x11K\x03K\x01\x86q\x12\x89h\x00)Rq\x13tq\x14Rq\x15X\n\x00\x00\x00bias_ih_'
1419*da0073e9SAndroid Build Coastguard Worker                       b'l0q\x16h\x03((h\x04h\x05X\x01\x00\x00\x002q\x17h\x07K\x0ctq\x18QK\x00K\x0c\x85q\x19'
1420*da0073e9SAndroid Build Coastguard Worker                       b'K\x01\x85q\x1a\x89h\x00)Rq\x1btq\x1cRq\x1dX\n\x00\x00\x00bias_hh_l0q\x1eh\x03'
1421*da0073e9SAndroid Build Coastguard Worker                       b'((h\x04h\x05X\x01\x00\x00\x003q\x1fh\x07K\x0ctq QK\x00K\x0c\x85q!K\x01\x85q"\x89'
1422*da0073e9SAndroid Build Coastguard Worker                       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'
1423*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00versionq+K\x01sssb.PK\x07\x08\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01'
1424*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1425*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x13\x00\x07\x00lstm.save/byteorderFB\x03\x00ZZZbig'
1426*da0073e9SAndroid Build Coastguard Worker                       b'PK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08\x08'
1427*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00'
1428*da0073e9SAndroid Build Coastguard Worker                       b'?\x00lstm.save/data/0FB;\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1429*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZ\xbeJu\n\xbe\xa2*X>\x10\xea\xc4\xbe\x8d\n\xd4\xbe\x8a\x10\x1c\xbe\xe42\xb0'
1430*da0073e9SAndroid Build Coastguard Worker                       b'>4\xcb,>!\x17\x00\xbe\xe0\x9cH\xbe!\x15\xd2>\xc6C6>\x89\xc5v\xbe\x81\x14\xae>\x99'
1431*da0073e9SAndroid Build Coastguard Worker                       b'\xc7Z?\x01P\x90<\x9a\xb9`=< \xc0\xbe\x9e\xc7\'?\x02\xf4\xaa\xbc\x0e\xf3\x00\xbe'
1432*da0073e9SAndroid Build Coastguard Worker                       b'v\xb7\xd8=\xcd\xcc\xa0>\xaf/$=K\xc4\x00\xbe\xe5\xb80\xbeU\xc5\xb6\xbe\xf3i\xc4'
1433*da0073e9SAndroid Build Coastguard Worker                       b'>\xdc5\xa4>\x8dg\x06>\xae!N\xberF2\xbdbh0\xbdew\xf0<\xa0g \xbe\x9e\xbe\xb6>\xc2\xd1'
1434*da0073e9SAndroid Build Coastguard Worker                       b'\x14PK\x07\x08\xc2yG\xba\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00\x00\x08'
1435*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10'
1436*da0073e9SAndroid Build Coastguard Worker                       b'\x002\x00lstm.save/data/1FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ>'
1437*da0073e9SAndroid Build Coastguard Worker                       b'\xe1[|\xbedY\xa2\xbf\to\xa5\xbe\x05\x1cz<\xdb\xb1 >\xfc\xcd\xf0>\xcbu\xa2\xbe{\x87'
1438*da0073e9SAndroid Build Coastguard Worker                       b'\x8c>^\x9b\x9c>Gm\xac>\x93\x17\xae\xbe\xf0\xc5\x8e>\xfc\x1ct\xbe\x81\x84\xcb> '
1439*da0073e9SAndroid Build Coastguard Worker                       b'\xa6\xc8=\xaf\xee\x88>\x8d\xc9\n>\xee\xc5\xc0>\x91E\xf0>\xa1^\xf4>F\xbb\xb8\xbe\xfe'
1440*da0073e9SAndroid Build Coastguard Worker                       b'\x97\x97?\x03\x85\xec=\xf3\x9ch>\x97\xa8\xf2?\r\xfa^\xbe\x94i6\xbew1\xbc=\x8a'
1441*da0073e9SAndroid Build Coastguard Worker                       b'\xc4h\xbd\x9f\xc8\x94\xbe\x89\xb5\x81>\xb0K(\xbdz:\xf0\xbd\x9b\xc6\xb0=\x88\x00X'
1442*da0073e9SAndroid Build Coastguard Worker                       b'\xbf\x11\xc7\x05PK\x07\x08\xd0\xbftD\x90\x00\x00\x00\x90\x00\x00\x00PK\x03\x04\x00'
1443*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1444*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x10\x002\x00lstm.save/data/2FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1445*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZ=f\xc2\xb0<1\xdd@\xbe\xd84\x86?\x13\t\xa0\xbe\x8fg+\xbf\r\xb1u>\xc3lb\xbe'
1446*da0073e9SAndroid Build Coastguard Worker                       b'\x82\\\xa8\xbd\xf3c\xa4\xbe\xdf\x96,\xbe\xf1\x05\xfe>\x96\xc9\xf8PK\x07\x08"\xc5'
1447*da0073e9SAndroid Build Coastguard Worker                       b'\xc5O0\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
1448*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00lstm.save/data'
1449*da0073e9SAndroid Build Coastguard Worker                       b'/3FB\x0e\x00ZZZZZZZZZZZZZZ\xbei\xaa\x04\xbe\x8a\xd8\xce\xbe\xdfO\xe3\xbe\xd2\xc3'
1450*da0073e9SAndroid Build Coastguard Worker                       b'$\xbe\x80\xb1\x06?\x08&^\xbd}\x1a\x00?\r\xde\x06>\xac\xe7\x04\xbe\xe9@Z>)\xc2\x14'
1451*da0073e9SAndroid Build Coastguard Worker                       b'>/\xe9\x9cPK\x07\x08\xfb\xfd/\x920\x00\x00\x000\x00\x00\x00PK\x03\x04\x00\x00\x08'
1452*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11'
1453*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x11\x00lstm.save/versionFB\r\x00ZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
1454*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1455*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xab\xf1\xfb\x01\xb8\x01\x00\x00\xb8\x01\x00\x00\x12\x00\x00\x00\x00\x00\x00'
1456*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lstm.save/data.pklPK\x01\x02\x00\x00'
1457*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00'
1458*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x02\x00\x00ls'
1459*da0073e9SAndroid Build Coastguard Worker                       b'tm.save/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xc2y'
1460*da0073e9SAndroid Build Coastguard Worker                       b'G\xba\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1461*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00S\x02\x00\x00lstm.save/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
1462*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\xd0\xbftD\x90\x00\x00\x00\x90\x00\x00\x00\x10\x00\x00\x00\x00'
1463*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x03\x00\x00lstm.save/data/1PK\x01\x02\x00'
1464*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"\xc5\xc5O0\x00\x00\x000\x00\x00\x00'
1465*da0073e9SAndroid Build Coastguard Worker                       b'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x04\x00\x00lstm.save/'
1466*da0073e9SAndroid Build Coastguard Worker                       b'data/2PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xfb\xfd/\x920\x00'
1467*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x000\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1468*da0073e9SAndroid Build Coastguard Worker                       b'\x05\x00\x00lstm.save/data/3PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1469*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00'
1470*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x80\x05\x00\x00lstm.save/versionPK\x06\x06,\x00\x00\x00'
1471*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00'
1472*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x00\x00'
1473*da0073e9SAndroid Build Coastguard Worker                       b'\xd2\x05\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x8a\x07\x00\x00\x00\x00'
1474*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x07\x00\x07\x00\xb8\x01\x00'
1475*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xd2\x05\x00\x00\x00\x00')
1476*da0073e9SAndroid Build Coastguard Worker
1477*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
1478*da0073e9SAndroid Build Coastguard Worker
1479*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1480*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
1481*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1482*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
1483*da0073e9SAndroid Build Coastguard Worker
1484*da0073e9SAndroid Build Coastguard Worker        lstm_le_no_bom = torch.nn.LSTM(3, 3)
1485*da0073e9SAndroid Build Coastguard Worker        lstm_le_bom = torch.nn.LSTM(3, 3)
1486*da0073e9SAndroid Build Coastguard Worker        lstm_be_no_bom = torch.nn.LSTM(3, 3)
1487*da0073e9SAndroid Build Coastguard Worker        lstm_be_bom = torch.nn.LSTM(3, 3)
1488*da0073e9SAndroid Build Coastguard Worker
1489*da0073e9SAndroid Build Coastguard Worker        lstm_le_no_bom_little = torch.nn.LSTM(3, 3)
1490*da0073e9SAndroid Build Coastguard Worker        lstm_be_no_bom_little = torch.nn.LSTM(3, 3)
1491*da0073e9SAndroid Build Coastguard Worker        lstm_le_no_bom_big = torch.nn.LSTM(3, 3)
1492*da0073e9SAndroid Build Coastguard Worker        lstm_be_no_bom_big = torch.nn.LSTM(3, 3)
1493*da0073e9SAndroid Build Coastguard Worker
1494*da0073e9SAndroid Build Coastguard Worker        try:
1495*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
1496*da0073e9SAndroid Build Coastguard Worker            lstm_le_no_bom.load_state_dict(torch.load(buf_le_no_bom), strict=True)
1497*da0073e9SAndroid Build Coastguard Worker            lstm_be_no_bom.load_state_dict(torch.load(buf_be_no_bom), strict=True)
1498*da0073e9SAndroid Build Coastguard Worker        finally:
1499*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1500*da0073e9SAndroid Build Coastguard Worker
1501*da0073e9SAndroid Build Coastguard Worker        lstm_le_bom.load_state_dict(torch.load(buf_le_bom), strict=True)
1502*da0073e9SAndroid Build Coastguard Worker        lstm_be_bom.load_state_dict(torch.load(buf_be_bom), strict=True)
1503*da0073e9SAndroid Build Coastguard Worker
1504*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
1505*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
1506*da0073e9SAndroid Build Coastguard Worker
1507*da0073e9SAndroid Build Coastguard Worker        try:
1508*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
1509*da0073e9SAndroid Build Coastguard Worker            lstm_le_no_bom_little.load_state_dict(torch.load(buf_le_no_bom), strict=True)
1510*da0073e9SAndroid Build Coastguard Worker            lstm_be_no_bom_little.load_state_dict(torch.load(buf_be_no_bom), strict=True)
1511*da0073e9SAndroid Build Coastguard Worker        finally:
1512*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1513*da0073e9SAndroid Build Coastguard Worker
1514*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
1515*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
1516*da0073e9SAndroid Build Coastguard Worker
1517*da0073e9SAndroid Build Coastguard Worker        try:
1518*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
1519*da0073e9SAndroid Build Coastguard Worker            lstm_le_no_bom_big.load_state_dict(torch.load(buf_le_no_bom), strict=True)
1520*da0073e9SAndroid Build Coastguard Worker            lstm_be_no_bom_big.load_state_dict(torch.load(buf_be_no_bom), strict=True)
1521*da0073e9SAndroid Build Coastguard Worker        finally:
1522*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1523*da0073e9SAndroid Build Coastguard Worker
1524*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(lstm_le_bom.state_dict(), lstm_be_bom.state_dict())
1525*da0073e9SAndroid Build Coastguard Worker        self.assertNotEqual(lstm_le_no_bom.state_dict(), lstm_be_no_bom.state_dict())
1526*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(lstm_le_no_bom_little.state_dict(), lstm_le_bom.state_dict())
1527*da0073e9SAndroid Build Coastguard Worker        self.assertNotEqual(lstm_be_no_bom_little.state_dict(), lstm_be_bom.state_dict())
1528*da0073e9SAndroid Build Coastguard Worker        self.assertNotEqual(lstm_le_no_bom_big.state_dict(), lstm_le_bom.state_dict())
1529*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(lstm_be_no_bom_big.state_dict(), lstm_be_bom.state_dict())
1530*da0073e9SAndroid Build Coastguard Worker
1531*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
1532*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(lstm_le_no_bom.state_dict(), lstm_le_bom.state_dict())
1533*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(lstm_le_no_bom.state_dict(), lstm_be_bom.state_dict())
1534*da0073e9SAndroid Build Coastguard Worker            self.assertNotEqual(lstm_be_no_bom.state_dict(), lstm_le_bom.state_dict())
1535*da0073e9SAndroid Build Coastguard Worker            self.assertNotEqual(lstm_be_no_bom.state_dict(), lstm_be_bom.state_dict())
1536*da0073e9SAndroid Build Coastguard Worker        else:
1537*da0073e9SAndroid Build Coastguard Worker            self.assertNotEqual(lstm_le_no_bom.state_dict(), lstm_le_bom.state_dict())
1538*da0073e9SAndroid Build Coastguard Worker            self.assertNotEqual(lstm_le_no_bom.state_dict(), lstm_be_bom.state_dict())
1539*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(lstm_be_no_bom.state_dict(), lstm_le_bom.state_dict())
1540*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(lstm_be_no_bom.state_dict(), lstm_be_bom.state_dict())
1541*da0073e9SAndroid Build Coastguard Worker
1542*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_double(self):
1543*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
1544*da0073e9SAndroid Build Coastguard Worker        #
1545*da0073e9SAndroid Build Coastguard Worker        # import torch
1546*da0073e9SAndroid Build Coastguard Worker        #
1547*da0073e9SAndroid Build Coastguard Worker        # x = torch.randn(2,2, dtype=torch.double)
1548*da0073e9SAndroid Build Coastguard Worker        #
1549*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.double.LE.pt", _disable_byteorder_record=True)
1550*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.double.LE.BOM.pt")
1551*da0073e9SAndroid Build Coastguard Worker        #
1552*da0073e9SAndroid Build Coastguard Worker        # print(x)
1553*da0073e9SAndroid Build Coastguard Worker        #
1554*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
1555*da0073e9SAndroid Build Coastguard Worker        #
1556*da0073e9SAndroid Build Coastguard Worker        # import torch
1557*da0073e9SAndroid Build Coastguard Worker        #
1558*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.double.LE.BOM.pt')
1559*da0073e9SAndroid Build Coastguard Worker        #
1560*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.double.BE.pt', _disable_byteorder_record=True)
1561*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.double.BE.BOM.pt')
1562*da0073e9SAndroid Build Coastguard Worker        #
1563*da0073e9SAndroid Build Coastguard Worker        # print(x)
1564*da0073e9SAndroid Build Coastguard Worker        #
1565*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1566*da0073e9SAndroid Build Coastguard Worker        #
1567*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
1568*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
1569*da0073e9SAndroid Build Coastguard Worker        # file.close()
1570*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
1571*da0073e9SAndroid Build Coastguard Worker        #
1572*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
1573*da0073e9SAndroid Build Coastguard Worker        #
1574*da0073e9SAndroid Build Coastguard Worker        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'
1575*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x19\x00\t\x00tensor.double.LE/data.pklFB\x05\x00ZZZZZ\x80\x02'
1576*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1577*da0073e9SAndroid Build Coastguard Worker                          b'DoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1578*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1579*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04\x00'
1580*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1581*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x17\x00 \x00tensor.double.LE/data/0FB\x1c\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1582*da0073e9SAndroid Build Coastguard Worker                          b'\x97v\xa4\xff|^\xc9?\xce\xbc\x8cP\x8d\xb0\xe9\xbf\xdc\x0e\xef[\xb7\xdb\xd3\xbf4\xb1'
1583*da0073e9SAndroid Build Coastguard Worker                          b'\x08Q\xf9\x00\xde?PK\x07\x08\xae\x92t\x0f \x00\x00\x00 \x00\x00\x00PK\x03\x04'
1584*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1585*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x18\x00\x1a\x00tensor.double.LE/versionFB\x16\x00ZZZZZZZZZZZZZZZZZZZZZZ'
1586*da0073e9SAndroid Build Coastguard Worker                          b'3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00'
1587*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x08\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00\x19\x00'
1588*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.double'
1589*da0073e9SAndroid Build Coastguard Worker                          b'.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xae\x92t\x0f'
1590*da0073e9SAndroid Build Coastguard Worker                          b' \x00\x00\x00 \x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1591*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xeb\x00\x00\x00tensor.double.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
1592*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00'
1593*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.double.LE/versionPK\x06'
1594*da0073e9SAndroid Build Coastguard Worker                          b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1595*da0073e9SAndroid Build Coastguard Worker                          b'\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00'
1596*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa4\x02'
1597*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03'
1598*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xd2\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1599*da0073e9SAndroid Build Coastguard Worker
1600*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1601*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1d\x00\x05\x00tensor.double.LE.BOM/data.pklFB\x01\x00Z\x80'
1602*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1603*da0073e9SAndroid Build Coastguard Worker                       b'h\nDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1604*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1605*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04'
1606*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1607*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1e\x00\x19\x00tensor.double.LE.BOM/byteorderFB\x15\x00ZZZZZZZZZZZZZZZZ'
1608*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
1609*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1610*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1b\x001\x00tensor.double.LE.BOM/data/0FB-\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1611*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZ\x97v\xa4\xff|^\xc9?\xce\xbc\x8cP\x8d\xb0\xe9\xbf\xdc\x0e\xef[\xb7'
1612*da0073e9SAndroid Build Coastguard Worker                       b'\xdb\xd3\xbf4\xb1\x08Q\xf9\x00\xde?PK\x07\x08\xae\x92t\x0f \x00\x00\x00 \x00\x00'
1613*da0073e9SAndroid Build Coastguard Worker                       b'\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1614*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x1c\x00\x16\x00tensor.double.LE.BOM/versionFB\x12\x00ZZ'
1615*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02'
1616*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00'
1617*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1618*da0073e9SAndroid Build Coastguard Worker                       b'tensor.double.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
1619*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00'
1620*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00tensor.double.LE.BOM/byteorderPK\x01'
1621*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xae\x92t\x0f '
1622*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00 \x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1623*da0073e9SAndroid Build Coastguard Worker                       b'V\x01\x00\x00tensor.double.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
1624*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00'
1625*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.double.LE.BOM/versio'
1626*da0073e9SAndroid Build Coastguard Worker                       b'nPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00'
1627*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00'
1628*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00|\x03\x00'
1629*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00'
1630*da0073e9SAndroid Build Coastguard Worker                       b'*\x01\x00\x00R\x02\x00\x00\x00\x00')
1631*da0073e9SAndroid Build Coastguard Worker
1632*da0073e9SAndroid Build Coastguard Worker        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'
1633*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x19\x00\t\x00tensor.double.BE/data.pklFB\x05\x00ZZZZZ\x80\x02'
1634*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1635*da0073e9SAndroid Build Coastguard Worker                          b'DoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1636*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1637*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04\x00'
1638*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1639*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x17\x00 \x00tensor.double.BE/data/0FB\x1c\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1640*da0073e9SAndroid Build Coastguard Worker                          b'?\xc9^|\xff\xa4v\x97\xbf\xe9\xb0\x8dP\x8c\xbc\xce\xbf\xd3\xdb\xb7[\xef\x0e\xdc?\xde'
1641*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xf9Q\x08\xb14PK\x07\x083@\x82/ \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
1642*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1643*da0073e9SAndroid Build Coastguard Worker                          b'\x18\x00\x1a\x00tensor.double.BE/versionFB\x16\x00ZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
1644*da0073e9SAndroid Build Coastguard Worker                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
1645*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00\x19\x00\x00'
1646*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.double.BE/da'
1647*da0073e9SAndroid Build Coastguard Worker                          b'ta.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x003@\x82/ '
1648*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00 \x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1649*da0073e9SAndroid Build Coastguard Worker                          b'\xeb\x00\x00\x00tensor.double.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
1650*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00\x00'
1651*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.double.BE/versionPK\x06\x06'
1652*da0073e9SAndroid Build Coastguard Worker                          b',\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
1653*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00'
1654*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa4\x02\x00'
1655*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00'
1656*da0073e9SAndroid Build Coastguard Worker                          b'\xd2\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1657*da0073e9SAndroid Build Coastguard Worker
1658*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1659*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1d\x00\x05\x00tensor.double.BE.BOM/data.pklFB\x01\x00Z\x80'
1660*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1661*da0073e9SAndroid Build Coastguard Worker                       b'h\nDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1662*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1663*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04'
1664*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1665*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1e\x00\x19\x00tensor.double.BE.BOM/byteorderFB\x15\x00ZZZZZZZZZZZZZZZZ'
1666*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00'
1667*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1668*da0073e9SAndroid Build Coastguard Worker                       b'\x1b\x004\x00tensor.double.BE.BOM/data/0FB0\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1669*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZ?\xc9^|\xff\xa4v\x97\xbf\xe9\xb0\x8dP\x8c\xbc\xce\xbf\xd3\xdb\xb7'
1670*da0073e9SAndroid Build Coastguard Worker                       b'[\xef\x0e\xdc?\xde\x00\xf9Q\x08\xb14PK\x07\x083@\x82/ \x00\x00\x00 \x00\x00\x00'
1671*da0073e9SAndroid Build Coastguard Worker                       b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1672*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x1c\x00\x16\x00tensor.double.BE.BOM/versionFB\x12\x00ZZZZZZZZ'
1673*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00'
1674*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00'
1675*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ten'
1676*da0073e9SAndroid Build Coastguard Worker                       b'sor.double.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1677*da0073e9SAndroid Build Coastguard Worker                       b'\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00'
1678*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00tensor.double.BE.BOM/byteorderPK\x01\x02'
1679*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x003@\x82/ \x00\x00\x00 \x00\x00\x00'
1680*da0073e9SAndroid Build Coastguard Worker                       b'\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.do'
1681*da0073e9SAndroid Build Coastguard Worker                       b'uble.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1'
1682*da0073e9SAndroid Build Coastguard Worker                       b'\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1683*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\xf0\x01\x00\x00tensor.double.BE.BOM/versionPK\x06\x06,\x00\x00\x00'
1684*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00'
1685*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00*\x01\x00\x00\x00\x00\x00\x00R\x02'
1686*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00|\x03\x00\x00\x00\x00\x00\x00\x01'
1687*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00*\x01\x00\x00R\x02\x00\x00'
1688*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00')
1689*da0073e9SAndroid Build Coastguard Worker
1690*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
1691*da0073e9SAndroid Build Coastguard Worker
1692*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1693*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
1694*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1695*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
1696*da0073e9SAndroid Build Coastguard Worker
1697*da0073e9SAndroid Build Coastguard Worker        try:
1698*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
1699*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
1700*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
1701*da0073e9SAndroid Build Coastguard Worker        finally:
1702*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1703*da0073e9SAndroid Build Coastguard Worker
1704*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
1705*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
1706*da0073e9SAndroid Build Coastguard Worker
1707*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
1708*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
1709*da0073e9SAndroid Build Coastguard Worker
1710*da0073e9SAndroid Build Coastguard Worker        try:
1711*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
1712*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
1713*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
1714*da0073e9SAndroid Build Coastguard Worker        finally:
1715*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1716*da0073e9SAndroid Build Coastguard Worker
1717*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
1718*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
1719*da0073e9SAndroid Build Coastguard Worker
1720*da0073e9SAndroid Build Coastguard Worker        try:
1721*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
1722*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
1723*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
1724*da0073e9SAndroid Build Coastguard Worker        finally:
1725*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1726*da0073e9SAndroid Build Coastguard Worker
1727*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
1728*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
1729*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
1730*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
1731*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
1732*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
1733*da0073e9SAndroid Build Coastguard Worker
1734*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
1735*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
1736*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
1737*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
1738*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
1739*da0073e9SAndroid Build Coastguard Worker        else:
1740*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
1741*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
1742*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
1743*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
1744*da0073e9SAndroid Build Coastguard Worker
1745*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_float(self):
1746*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
1747*da0073e9SAndroid Build Coastguard Worker        #
1748*da0073e9SAndroid Build Coastguard Worker        # import torch
1749*da0073e9SAndroid Build Coastguard Worker        #
1750*da0073e9SAndroid Build Coastguard Worker        # x = torch.randn(2,2, dtype=torch.float)
1751*da0073e9SAndroid Build Coastguard Worker        #
1752*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.float.LE.pt", _disable_byteorder_record=True)
1753*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.float.LE.BOM.pt")
1754*da0073e9SAndroid Build Coastguard Worker        #
1755*da0073e9SAndroid Build Coastguard Worker        # print(x)
1756*da0073e9SAndroid Build Coastguard Worker        #
1757*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
1758*da0073e9SAndroid Build Coastguard Worker        #
1759*da0073e9SAndroid Build Coastguard Worker        # import torch
1760*da0073e9SAndroid Build Coastguard Worker        #
1761*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.float.LE.BOM.pt')
1762*da0073e9SAndroid Build Coastguard Worker        #
1763*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.float.BE.pt', _disable_byteorder_record=True)
1764*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.float.BE.BOM.pt')
1765*da0073e9SAndroid Build Coastguard Worker        #
1766*da0073e9SAndroid Build Coastguard Worker        # print(x)
1767*da0073e9SAndroid Build Coastguard Worker        #
1768*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1769*da0073e9SAndroid Build Coastguard Worker        #
1770*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
1771*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
1772*da0073e9SAndroid Build Coastguard Worker        # file.close()
1773*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
1774*da0073e9SAndroid Build Coastguard Worker        #
1775*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
1776*da0073e9SAndroid Build Coastguard Worker        #
1777*da0073e9SAndroid Build Coastguard Worker        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'
1778*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.float.LE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
1779*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1780*da0073e9SAndroid Build Coastguard Worker                          b'FloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05Q'
1781*da0073e9SAndroid Build Coastguard Worker                          b'K\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
1782*da0073e9SAndroid Build Coastguard Worker                          b'Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00\x08'
1783*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16'
1784*da0073e9SAndroid Build Coastguard Worker                          b'\x00"\x00tensor.float.LE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x01h\x9e'
1785*da0073e9SAndroid Build Coastguard Worker                          b'?\r\xb7A?\x1a\x1e\x07\xbf\xd4|\x02?PK\x07\x08\x8fq]\x8c\x10\x00\x00\x00\x10\x00'
1786*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1787*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.float.LE/versionFB\'\x00ZZZZZZZZ'
1788*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
1789*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00%Y"N\x9a\x00\x00'
1790*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x9a\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1791*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00tensor.float.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
1792*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x8fq]\x8c\x10\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00'
1793*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.float.LE/data/0PK\x01\x02'
1794*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00'
1795*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00t'
1796*da0073e9SAndroid Build Coastguard Worker                          b'ensor.float.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
1797*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00'
1798*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06'
1799*da0073e9SAndroid Build Coastguard Worker                          b'\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00'
1800*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1801*da0073e9SAndroid Build Coastguard Worker
1802*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1803*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.float.LE.BOM/data.pklFB\x02\x00ZZ\x80'
1804*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1805*da0073e9SAndroid Build Coastguard Worker                       b'h\nFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1806*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1807*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00'
1808*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1809*da0073e9SAndroid Build Coastguard Worker                       b'\x1d\x00\x1b\x00tensor.float.LE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZl'
1810*da0073e9SAndroid Build Coastguard Worker                       b'ittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08'
1811*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a'
1812*da0073e9SAndroid Build Coastguard Worker                       b'\x002\x00tensor.float.LE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1813*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZ\x01h\x9e?\r\xb7A?\x1a\x1e\x07\xbf\xd4|\x02?PK\x07\x08\x8fq]\x8c\x10\x00'
1814*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00'
1815*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.float.LE.BOM/ve'
1816*da0073e9SAndroid Build Coastguard Worker                       b'rsionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00'
1817*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
1818*da0073e9SAndroid Build Coastguard Worker                       b'%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1819*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00tensor.float.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00'
1820*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1d'
1821*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.fl'
1822*da0073e9SAndroid Build Coastguard Worker                       b'oat.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x8f'
1823*da0073e9SAndroid Build Coastguard Worker                       b'q]\x8c\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1824*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00V\x01\x00\x00tensor.float.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00'
1825*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00'
1826*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00tensor.float.'
1827*da0073e9SAndroid Build Coastguard Worker                       b'LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00'
1828*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
1829*da0073e9SAndroid Build Coastguard Worker                       b'&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00'
1830*da0073e9SAndroid Build Coastguard Worker                       b'\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04'
1831*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
1832*da0073e9SAndroid Build Coastguard Worker
1833*da0073e9SAndroid Build Coastguard Worker        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'
1834*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.float.BE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
1835*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
1836*da0073e9SAndroid Build Coastguard Worker                          b'FloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05Q'
1837*da0073e9SAndroid Build Coastguard Worker                          b'K\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
1838*da0073e9SAndroid Build Coastguard Worker                          b'Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00\x08'
1839*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16'
1840*da0073e9SAndroid Build Coastguard Worker                          b'\x00"\x00tensor.float.BE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ?\x9eh'
1841*da0073e9SAndroid Build Coastguard Worker                          b'\x01?A\xb7\r\xbf\x07\x1e\x1a?\x02|\xd4PK\x07\x089D\xd6\x8a\x10\x00\x00\x00\x10\x00'
1842*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1843*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.float.BE/versionFB\'\x00ZZZZZZZZ'
1844*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
1845*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00%Y"N\x9a\x00\x00'
1846*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x9a\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1847*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00tensor.float.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
1848*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x009D\xd6\x8a\x10\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00'
1849*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.float.BE/data/0PK\x01\x02'
1850*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00'
1851*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01\x00\x00t'
1852*da0073e9SAndroid Build Coastguard Worker                          b'ensor.float.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
1853*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00'
1854*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06'
1855*da0073e9SAndroid Build Coastguard Worker                          b'\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00'
1856*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
1857*da0073e9SAndroid Build Coastguard Worker
1858*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1859*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.float.BE.BOM/data.pklFB\x02\x00ZZ\x80'
1860*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1861*da0073e9SAndroid Build Coastguard Worker                       b'h\nFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1862*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1863*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04\x00\x00'
1864*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1865*da0073e9SAndroid Build Coastguard Worker                       b'\x1d\x00\x1b\x00tensor.float.BE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZb'
1866*da0073e9SAndroid Build Coastguard Worker                       b'igPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08\x08'
1867*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00'
1868*da0073e9SAndroid Build Coastguard Worker                       b'5\x00tensor.float.BE.BOM/data/0FB1\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1869*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZ?\x9eh\x01?A\xb7\r\xbf\x07\x1e\x1a?\x02|\xd4PK\x07\x089D\xd6\x8a\x10\x00'
1870*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00'
1871*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.float.BE.BOM/ve'
1872*da0073e9SAndroid Build Coastguard Worker                       b'rsionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00'
1873*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
1874*da0073e9SAndroid Build Coastguard Worker                       b'%Y"N\x9a\x00\x00\x00\x9a\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1875*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00tensor.float.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00'
1876*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1d'
1877*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.fl'
1878*da0073e9SAndroid Build Coastguard Worker                       b'oat.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x009D'
1879*da0073e9SAndroid Build Coastguard Worker                       b'\xd6\x8a\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1880*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00S\x01\x00\x00tensor.float.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00'
1881*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00'
1882*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00tensor.float.'
1883*da0073e9SAndroid Build Coastguard Worker                       b'BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00'
1884*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
1885*da0073e9SAndroid Build Coastguard Worker                       b'&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00'
1886*da0073e9SAndroid Build Coastguard Worker                       b'\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04'
1887*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
1888*da0073e9SAndroid Build Coastguard Worker
1889*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
1890*da0073e9SAndroid Build Coastguard Worker
1891*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
1892*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
1893*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
1894*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
1895*da0073e9SAndroid Build Coastguard Worker
1896*da0073e9SAndroid Build Coastguard Worker        try:
1897*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
1898*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
1899*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
1900*da0073e9SAndroid Build Coastguard Worker        finally:
1901*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1902*da0073e9SAndroid Build Coastguard Worker
1903*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
1904*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
1905*da0073e9SAndroid Build Coastguard Worker
1906*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
1907*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
1908*da0073e9SAndroid Build Coastguard Worker
1909*da0073e9SAndroid Build Coastguard Worker        try:
1910*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
1911*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
1912*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
1913*da0073e9SAndroid Build Coastguard Worker        finally:
1914*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1915*da0073e9SAndroid Build Coastguard Worker
1916*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
1917*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
1918*da0073e9SAndroid Build Coastguard Worker
1919*da0073e9SAndroid Build Coastguard Worker        try:
1920*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
1921*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
1922*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
1923*da0073e9SAndroid Build Coastguard Worker        finally:
1924*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
1925*da0073e9SAndroid Build Coastguard Worker
1926*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
1927*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
1928*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
1929*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
1930*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
1931*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
1932*da0073e9SAndroid Build Coastguard Worker
1933*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
1934*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
1935*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
1936*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
1937*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
1938*da0073e9SAndroid Build Coastguard Worker        else:
1939*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
1940*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
1941*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
1942*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
1943*da0073e9SAndroid Build Coastguard Worker
1944*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_half(self):
1945*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
1946*da0073e9SAndroid Build Coastguard Worker        #
1947*da0073e9SAndroid Build Coastguard Worker        # import torch
1948*da0073e9SAndroid Build Coastguard Worker        #
1949*da0073e9SAndroid Build Coastguard Worker        # x = torch.randn(2,2, dtype=torch.half)
1950*da0073e9SAndroid Build Coastguard Worker        #
1951*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.half.LE.pt", _disable_byteorder_record=True)
1952*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.half.LE.BOM.pt")
1953*da0073e9SAndroid Build Coastguard Worker        #
1954*da0073e9SAndroid Build Coastguard Worker        # print(x)
1955*da0073e9SAndroid Build Coastguard Worker        #
1956*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
1957*da0073e9SAndroid Build Coastguard Worker        #
1958*da0073e9SAndroid Build Coastguard Worker        # import torch
1959*da0073e9SAndroid Build Coastguard Worker        #
1960*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.half.LE.BOM.pt')
1961*da0073e9SAndroid Build Coastguard Worker        #
1962*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.half.BE.pt', _disable_byteorder_record=True)
1963*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.half.BE.BOM.pt')
1964*da0073e9SAndroid Build Coastguard Worker        #
1965*da0073e9SAndroid Build Coastguard Worker        # print(x)
1966*da0073e9SAndroid Build Coastguard Worker        #
1967*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
1968*da0073e9SAndroid Build Coastguard Worker        #
1969*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
1970*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
1971*da0073e9SAndroid Build Coastguard Worker        # file.close()
1972*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
1973*da0073e9SAndroid Build Coastguard Worker        #
1974*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
1975*da0073e9SAndroid Build Coastguard Worker        #
1976*da0073e9SAndroid Build Coastguard Worker        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'
1977*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.half.LE/data.pklFB\x07\x00ZZZZZZZ\x80'
1978*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
1979*da0073e9SAndroid Build Coastguard Worker                          b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
1980*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
1981*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
1982*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1983*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x15\x00$\x00tensor.half.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ0'
1984*da0073e9SAndroid Build Coastguard Worker                          b'\xbbf;\xcd\xbd\xab9PK\x07\x08,D\x96\x91\x08\x00\x00\x00\x08\x00\x00\x00PK\x03\x04'
1985*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1986*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x16\x004\x00tensor.half.LE/versionFB0\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
1987*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01'
1988*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xabQ\x8c\x99\x00\x00\x00\x99'
1989*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1990*da0073e9SAndroid Build Coastguard Worker                          b'\x00tensor.half.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
1991*da0073e9SAndroid Build Coastguard Worker                          b'\x00,D\x96\x91\x08\x00\x00\x00\x08\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00'
1992*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.half.LE/data/0PK\x01\x02\x00\x00'
1993*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
1994*da0073e9SAndroid Build Coastguard Worker                          b'\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00tensor.ha'
1995*da0073e9SAndroid Build Coastguard Worker                          b'lf.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00'
1996*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
1997*da0073e9SAndroid Build Coastguard Worker                          b'\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00'
1998*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00'
1999*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2000*da0073e9SAndroid Build Coastguard Worker
2001*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2002*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.half.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
2003*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2004*da0073e9SAndroid Build Coastguard Worker                       b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
2005*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2006*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
2007*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2008*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1c\x00\x1d\x00tensor.half.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZZ'
2009*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2010*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2011*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x19\x003\x00tensor.half.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2012*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZ0\xbbf;\xcd\xbd\xab9PK\x07\x08,D\x96\x91\x08\x00\x00\x00\x08\x00'
2013*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2014*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x1a\x000\x00tensor.half.LE.BOM/versionFB,\x00ZZZZZZZZ'
2015*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2016*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xabQ\x8c\x99'
2017*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2018*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00tensor.half.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08'
2019*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1c\x00'
2020*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.half.LE.'
2021*da0073e9SAndroid Build Coastguard Worker                       b'BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00,D\x96\x91'
2022*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2023*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00V\x01\x00\x00tensor.half.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08'
2024*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00'
2025*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00tensor.half.LE.BOM/ve'
2026*da0073e9SAndroid Build Coastguard Worker                       b'rsionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00'
2027*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00"\x01\x00'
2028*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00t\x03'
2029*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04'
2030*da0073e9SAndroid Build Coastguard Worker                       b'\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
2031*da0073e9SAndroid Build Coastguard Worker
2032*da0073e9SAndroid Build Coastguard Worker        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'
2033*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.half.BE/data.pklFB\x07\x00ZZZZZZZ\x80'
2034*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2035*da0073e9SAndroid Build Coastguard Worker                          b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
2036*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2037*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
2038*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2039*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x15\x00$\x00tensor.half.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\xbb'
2040*da0073e9SAndroid Build Coastguard Worker                          b'0;f\xbd\xcd9\xabPK\x07\x08\xc7\xa1\xfd\x07\x08\x00\x00\x00\x08\x00\x00\x00PK\x03'
2041*da0073e9SAndroid Build Coastguard Worker                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2042*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x16\x004\x00tensor.half.BE/versionFB0\x00ZZZZZZZZZZZZZZZZZZZZZZZ'
2043*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
2044*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xabQ\x8c\x99\x00\x00'
2045*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2046*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00tensor.half.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
2047*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xc7\xa1\xfd\x07\x08\x00\x00\x00\x08\x00\x00\x00\x15\x00\x00\x00\x00'
2048*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.half.BE/data/0PK\x01'
2049*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02'
2050*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x01\x00\x00'
2051*da0073e9SAndroid Build Coastguard Worker                          b'tensor.half.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00'
2052*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00'
2053*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06'
2054*da0073e9SAndroid Build Coastguard Worker                          b'\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06'
2055*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2056*da0073e9SAndroid Build Coastguard Worker
2057*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2058*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.half.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
2059*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2060*da0073e9SAndroid Build Coastguard Worker                       b'h\nHalfStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
2061*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2062*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08E\xabQ\x8c\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
2063*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2064*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1c\x00\x1d\x00tensor.half.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZZ'
2065*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00'
2066*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2067*da0073e9SAndroid Build Coastguard Worker                       b'\x19\x006\x00tensor.half.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2068*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZ\xbb0;f\xbd\xcd9\xabPK\x07\x08\xc7\xa1\xfd\x07\x08\x00\x00\x00\x08'
2069*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2070*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x000\x00tensor.half.BE.BOM/versionFB,\x00ZZ'
2071*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
2072*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00E\xab'
2073*da0073e9SAndroid Build Coastguard Worker                       b'Q\x8c\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2074*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00tensor.half.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00'
2075*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1c'
2076*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.ha'
2077*da0073e9SAndroid Build Coastguard Worker                       b'lf.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xc7'
2078*da0073e9SAndroid Build Coastguard Worker                       b'\xa1\xfd\x07\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00'
2079*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00S\x01\x00\x00tensor.half.BE.BOM/data/0PK\x01\x02\x00\x00\x00'
2080*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1a'
2081*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x01\x00\x00tensor.ha'
2082*da0073e9SAndroid Build Coastguard Worker                       b'lf.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00'
2083*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00'
2084*da0073e9SAndroid Build Coastguard Worker                       b'\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00'
2085*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00'
2086*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
2087*da0073e9SAndroid Build Coastguard Worker
2088*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
2089*da0073e9SAndroid Build Coastguard Worker
2090*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2091*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
2092*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2093*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
2094*da0073e9SAndroid Build Coastguard Worker
2095*da0073e9SAndroid Build Coastguard Worker        try:
2096*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
2097*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
2098*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
2099*da0073e9SAndroid Build Coastguard Worker        finally:
2100*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2101*da0073e9SAndroid Build Coastguard Worker
2102*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
2103*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
2104*da0073e9SAndroid Build Coastguard Worker
2105*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2106*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2107*da0073e9SAndroid Build Coastguard Worker
2108*da0073e9SAndroid Build Coastguard Worker        try:
2109*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
2110*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2111*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2112*da0073e9SAndroid Build Coastguard Worker        finally:
2113*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2114*da0073e9SAndroid Build Coastguard Worker
2115*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2116*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2117*da0073e9SAndroid Build Coastguard Worker
2118*da0073e9SAndroid Build Coastguard Worker        try:
2119*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
2120*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2121*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2122*da0073e9SAndroid Build Coastguard Worker        finally:
2123*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2124*da0073e9SAndroid Build Coastguard Worker
2125*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2126*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2127*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2128*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2129*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2130*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2131*da0073e9SAndroid Build Coastguard Worker
2132*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
2133*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2134*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2135*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2136*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2137*da0073e9SAndroid Build Coastguard Worker        else:
2138*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2139*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2140*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2141*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2142*da0073e9SAndroid Build Coastguard Worker
2143*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_long(self):
2144*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
2145*da0073e9SAndroid Build Coastguard Worker        #
2146*da0073e9SAndroid Build Coastguard Worker        # import torch
2147*da0073e9SAndroid Build Coastguard Worker        #
2148*da0073e9SAndroid Build Coastguard Worker        # x = torch.randint(-4294967295, 4294967295, [4, 4], dtype=torch.long)
2149*da0073e9SAndroid Build Coastguard Worker        #
2150*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.long.LE.pt", _disable_byteorder_record=True)
2151*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.long.LE.BOM.pt")
2152*da0073e9SAndroid Build Coastguard Worker        #
2153*da0073e9SAndroid Build Coastguard Worker        # print(x)
2154*da0073e9SAndroid Build Coastguard Worker        #
2155*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
2156*da0073e9SAndroid Build Coastguard Worker        #
2157*da0073e9SAndroid Build Coastguard Worker        # import torch
2158*da0073e9SAndroid Build Coastguard Worker        #
2159*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.long.LE.BOM.pt')
2160*da0073e9SAndroid Build Coastguard Worker        #
2161*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.long.BE.pt', _disable_byteorder_record=True)
2162*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.long.BE.BOM.pt')
2163*da0073e9SAndroid Build Coastguard Worker        #
2164*da0073e9SAndroid Build Coastguard Worker        # print(x)
2165*da0073e9SAndroid Build Coastguard Worker        #
2166*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2167*da0073e9SAndroid Build Coastguard Worker        #
2168*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
2169*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
2170*da0073e9SAndroid Build Coastguard Worker        # file.close()
2171*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
2172*da0073e9SAndroid Build Coastguard Worker        #
2173*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
2174*da0073e9SAndroid Build Coastguard Worker        #
2175*da0073e9SAndroid Build Coastguard Worker        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'
2176*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.long.LE/data.pklFB\x07\x00ZZZZZZZ\x80'
2177*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2178*da0073e9SAndroid Build Coastguard Worker                          b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2179*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2180*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2181*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2182*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x15\x00$\x00tensor.long.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2183*da0073e9SAndroid Build Coastguard Worker                          b'ZZl\xfa\xda\xbe\x00\x00\x00\x00GQ^\xa9\xff\xff\xff\xff\xc5\xa4\x19\xa4\x00\x00\x00'
2184*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xda\x9f\x04\xdd\xff\xff\xff\xff\x9b\xfc\x98\r\x00\x00\x00\x00\x8e\xb3\xb6'
2185*da0073e9SAndroid Build Coastguard Worker                          b'=\x00\x00\x00\x00n}\xd2\x8f\xff\xff\xff\xff\xe2\xfe\x14u\xff\xff\xff\xff\xf1\x01'
2186*da0073e9SAndroid Build Coastguard Worker                          b'T\x07\xff\xff\xff\xff\x9b\xb3"\x7f\xff\xff\xff\xff\xb2p\x07\xfc\xff\xff\xff\xff\x1f'
2187*da0073e9SAndroid Build Coastguard Worker                          b'1\xa6M\x00\x00\x00\x00a\xaa|u\xff\xff\xff\xff2Y\x12;\x00\x00\x00\x00\'J\xb7\xcb'
2188*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00m\xb2\x1c\xe1\xff\xff\xff\xffPK\x07\x08\xd5\x00\xa1r\x80\x00\x00'
2189*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
2190*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00<\x00tensor.long.LE/versionFB8\x00'
2191*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9eg'
2192*da0073e9SAndroid Build Coastguard Worker                          b'U\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2193*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00'
2194*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.LE/data.pklPK\x01\x02'
2195*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd5\x00\xa1r\x80\x00\x00\x00\x80'
2196*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00'
2197*da0073e9SAndroid Build Coastguard Worker                          b'\x00tensor.long.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2198*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00'
2199*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\xd0\x01\x00\x00tensor.long.LE/versionPK\x06\x06,\x00\x00'
2200*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2201*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00'
2202*da0073e9SAndroid Build Coastguard Worker                          b'R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00'
2203*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00'
2204*da0073e9SAndroid Build Coastguard Worker                          b'R\x02\x00\x00\x00\x00')
2205*da0073e9SAndroid Build Coastguard Worker
2206*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2207*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.long.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
2208*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2209*da0073e9SAndroid Build Coastguard Worker                       b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2210*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2211*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2212*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2213*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x1d\x00tensor.long.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2214*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2215*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2216*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x19\x003\x00tensor.long.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2217*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZl\xfa\xda\xbe\x00\x00\x00\x00GQ^\xa9\xff\xff\xff\xff\xc5\xa4\x19'
2218*da0073e9SAndroid Build Coastguard Worker                       b'\xa4\x00\x00\x00\x00\xda\x9f\x04\xdd\xff\xff\xff\xff\x9b\xfc\x98\r\x00\x00\x00'
2219*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x8e\xb3\xb6=\x00\x00\x00\x00n}\xd2\x8f\xff\xff\xff\xff\xe2\xfe\x14u\xff\xff'
2220*da0073e9SAndroid Build Coastguard Worker                       b'\xff\xff\xf1\x01T\x07\xff\xff\xff\xff\x9b\xb3"\x7f\xff\xff\xff\xff\xb2p\x07\xfc'
2221*da0073e9SAndroid Build Coastguard Worker                       b'\xff\xff\xff\xff\x1f1\xa6M\x00\x00\x00\x00a\xaa|u\xff\xff\xff\xff2Y\x12;\x00\x00'
2222*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\'J\xb7\xcb\x00\x00\x00\x00m\xb2\x1c\xe1\xff\xff\xff\xffPK\x07\x08\xd5\x00'
2223*da0073e9SAndroid Build Coastguard Worker                       b'\xa1r\x80\x00\x00\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
2224*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x008\x00tensor.lon'
2225*da0073e9SAndroid Build Coastguard Worker                       b'g.LE.BOM/versionFB4\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK'
2226*da0073e9SAndroid Build Coastguard Worker                       b'\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08'
2227*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00'
2228*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.LE.'
2229*da0073e9SAndroid Build Coastguard Worker                       b'BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19'
2230*da0073e9SAndroid Build Coastguard Worker                       b'\x06\x00\x00\x00\x06\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2231*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xe9\x00\x00\x00tensor.long.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00'
2232*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd5\x00\xa1r\x80\x00\x00\x00\x80\x00\x00\x00\x19'
2233*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.long.L'
2234*da0073e9SAndroid Build Coastguard Worker                       b'E.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU'
2235*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2236*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00P\x02\x00\x00tensor.long.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
2237*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
2238*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00'
2239*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\x01\x00'
2240*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00\xd2\x02\x00\x00'
2241*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00')
2242*da0073e9SAndroid Build Coastguard Worker
2243*da0073e9SAndroid Build Coastguard Worker        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'
2244*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.long.BE/data.pklFB\x07\x00ZZZZZZZ\x80'
2245*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2246*da0073e9SAndroid Build Coastguard Worker                          b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2247*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2248*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2249*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2250*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x15\x00$\x00tensor.long.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2251*da0073e9SAndroid Build Coastguard Worker                          b'ZZ\x00\x00\x00\x00\xbe\xda\xfal\xff\xff\xff\xff\xa9^QG\x00\x00\x00\x00\xa4\x19\xa4'
2252*da0073e9SAndroid Build Coastguard Worker                          b'\xc5\xff\xff\xff\xff\xdd\x04\x9f\xda\x00\x00\x00\x00\r\x98\xfc\x9b\x00\x00\x00'
2253*da0073e9SAndroid Build Coastguard Worker                          b'\x00=\xb6\xb3\x8e\xff\xff\xff\xff\x8f\xd2}n\xff\xff\xff\xffu\x14\xfe\xe2\xff\xff'
2254*da0073e9SAndroid Build Coastguard Worker                          b'\xff\xff\x07T\x01\xf1\xff\xff\xff\xff\x7f"\xb3\x9b\xff\xff\xff\xff\xfc\x07p\xb2\x00'
2255*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00M\xa61\x1f\xff\xff\xff\xffu|\xaaa\x00\x00\x00\x00;\x12Y2\x00\x00\x00'
2256*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xcb\xb7J\'\xff\xff\xff\xff\xe1\x1c\xb2mPK\x07\x08\xb9\x1b\x81j\x80\x00\x00'
2257*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
2258*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00<\x00tensor.long.BE/versionFB8\x00'
2259*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9eg'
2260*da0073e9SAndroid Build Coastguard Worker                          b'U\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2261*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00'
2262*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.BE/data.pklPK\x01\x02'
2263*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xb9\x1b\x81j\x80\x00\x00\x00\x80'
2264*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00'
2265*da0073e9SAndroid Build Coastguard Worker                          b'\x00tensor.long.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2266*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00'
2267*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\xd0\x01\x00\x00tensor.long.BE/versionPK\x06\x06,\x00\x00'
2268*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2269*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00'
2270*da0073e9SAndroid Build Coastguard Worker                          b'R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x1e\x03\x00\x00\x00\x00'
2271*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00'
2272*da0073e9SAndroid Build Coastguard Worker                          b'R\x02\x00\x00\x00\x00')
2273*da0073e9SAndroid Build Coastguard Worker
2274*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2275*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.long.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
2276*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2277*da0073e9SAndroid Build Coastguard Worker                       b'h\nLongStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2278*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2279*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2280*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2281*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x1d\x00tensor.long.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2282*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2283*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2284*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x19\x006\x00tensor.long.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2285*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\x00\x00\x00\x00\xbe\xda\xfal\xff\xff\xff\xff\xa9^QG\x00\x00\x00'
2286*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xa4\x19\xa4\xc5\xff\xff\xff\xff\xdd\x04\x9f\xda\x00\x00\x00\x00\r\x98\xfc'
2287*da0073e9SAndroid Build Coastguard Worker                       b'\x9b\x00\x00\x00\x00=\xb6\xb3\x8e\xff\xff\xff\xff\x8f\xd2}n\xff\xff\xff\xffu\x14'
2288*da0073e9SAndroid Build Coastguard Worker                       b'\xfe\xe2\xff\xff\xff\xff\x07T\x01\xf1\xff\xff\xff\xff\x7f"\xb3\x9b\xff\xff\xff\xff'
2289*da0073e9SAndroid Build Coastguard Worker                       b'\xfc\x07p\xb2\x00\x00\x00\x00M\xa61\x1f\xff\xff\xff\xffu|\xaaa\x00\x00\x00\x00'
2290*da0073e9SAndroid Build Coastguard Worker                       b';\x12Y2\x00\x00\x00\x00\xcb\xb7J\'\xff\xff\xff\xff\xe1\x1c\xb2mPK\x07\x08\xb9\x1b'
2291*da0073e9SAndroid Build Coastguard Worker                       b'\x81j\x80\x00\x00\x00\x80\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
2292*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x008\x00tensor.lon'
2293*da0073e9SAndroid Build Coastguard Worker                       b'g.BE.BOM/versionFB4\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK'
2294*da0073e9SAndroid Build Coastguard Worker                       b'\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08'
2295*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00 \xbd\xd7\xb0\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00'
2296*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.long.BE.'
2297*da0073e9SAndroid Build Coastguard Worker                       b'BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3'
2298*da0073e9SAndroid Build Coastguard Worker                       b'\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2299*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xe9\x00\x00\x00tensor.long.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00'
2300*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xb9\x1b\x81j\x80\x00\x00\x00\x80\x00\x00\x00\x19'
2301*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.long.B'
2302*da0073e9SAndroid Build Coastguard Worker                       b'E.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU'
2303*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2304*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00P\x02\x00\x00tensor.long.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
2305*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'
2306*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00\xd2\x02\x00\x00'
2307*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xf4\x03\x00\x00\x00\x00\x00\x00\x01\x00'
2308*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00\xd2\x02\x00\x00'
2309*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00')
2310*da0073e9SAndroid Build Coastguard Worker
2311*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
2312*da0073e9SAndroid Build Coastguard Worker
2313*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2314*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
2315*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2316*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
2317*da0073e9SAndroid Build Coastguard Worker
2318*da0073e9SAndroid Build Coastguard Worker        try:
2319*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
2320*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
2321*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
2322*da0073e9SAndroid Build Coastguard Worker        finally:
2323*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2324*da0073e9SAndroid Build Coastguard Worker
2325*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
2326*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
2327*da0073e9SAndroid Build Coastguard Worker
2328*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2329*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2330*da0073e9SAndroid Build Coastguard Worker
2331*da0073e9SAndroid Build Coastguard Worker        try:
2332*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
2333*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2334*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2335*da0073e9SAndroid Build Coastguard Worker        finally:
2336*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2337*da0073e9SAndroid Build Coastguard Worker
2338*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2339*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2340*da0073e9SAndroid Build Coastguard Worker
2341*da0073e9SAndroid Build Coastguard Worker        try:
2342*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
2343*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2344*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2345*da0073e9SAndroid Build Coastguard Worker        finally:
2346*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2347*da0073e9SAndroid Build Coastguard Worker
2348*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2349*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2350*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2351*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2352*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2353*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2354*da0073e9SAndroid Build Coastguard Worker
2355*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
2356*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2357*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2358*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2359*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2360*da0073e9SAndroid Build Coastguard Worker        else:
2361*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2362*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2363*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2364*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2365*da0073e9SAndroid Build Coastguard Worker
2366*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_int(self):
2367*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
2368*da0073e9SAndroid Build Coastguard Worker        #
2369*da0073e9SAndroid Build Coastguard Worker        # import torch
2370*da0073e9SAndroid Build Coastguard Worker        #
2371*da0073e9SAndroid Build Coastguard Worker        # x = torch.randint(-2147483648, 2147483648, [4, 4], dtype=torch.int)
2372*da0073e9SAndroid Build Coastguard Worker        #
2373*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.int.LE.pt", _disable_byteorder_record=True)
2374*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.int.LE.BOM.pt")
2375*da0073e9SAndroid Build Coastguard Worker        #
2376*da0073e9SAndroid Build Coastguard Worker        # print(x)
2377*da0073e9SAndroid Build Coastguard Worker        #
2378*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
2379*da0073e9SAndroid Build Coastguard Worker        #
2380*da0073e9SAndroid Build Coastguard Worker        # import torch
2381*da0073e9SAndroid Build Coastguard Worker        #
2382*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.int.LE.BOM.pt')
2383*da0073e9SAndroid Build Coastguard Worker        #
2384*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.int.BE.pt', _disable_byteorder_record=True)
2385*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.int.BE.BOM.pt')
2386*da0073e9SAndroid Build Coastguard Worker        #
2387*da0073e9SAndroid Build Coastguard Worker        # print(x)
2388*da0073e9SAndroid Build Coastguard Worker        #
2389*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2390*da0073e9SAndroid Build Coastguard Worker        #
2391*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
2392*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
2393*da0073e9SAndroid Build Coastguard Worker        # file.close()
2394*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
2395*da0073e9SAndroid Build Coastguard Worker        #
2396*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
2397*da0073e9SAndroid Build Coastguard Worker        #
2398*da0073e9SAndroid Build Coastguard Worker        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'
2399*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x16\x00\x0c\x00tensor.int.LE/data.pklFB\x08\x00ZZZZZZZZ\x80'
2400*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2401*da0073e9SAndroid Build Coastguard Worker                          b'h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2402*da0073e9SAndroid Build Coastguard Worker                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2403*da0073e9SAndroid Build Coastguard Worker                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0\'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04'
2404*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2405*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x14\x00&\x00tensor.int.LE/data/0FB"\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2406*da0073e9SAndroid Build Coastguard Worker                          b'ZZZ\xf6\x19\x95i\xfaL\x1f\t%\xa3\r\xb8\xe5\xcfN\xe2\xa2\xc7\x8f\xb4\xfd\xf5(2\xe3'
2407*da0073e9SAndroid Build Coastguard Worker                          b'YX\xf5\x1dhO}\xeb\xba\xcf\x02\x8b\x84\xdd>L\xbc(\xc7\x92Q\x98\xa6\x1aQ^w\xea\x93'
2408*da0073e9SAndroid Build Coastguard Worker                          b'2>\xad\x87D\xdd\x9el\xb6\x15PK\x07\x08W\x1c\xcd\x19@\x00\x00\x00@\x00\x00\x00PK'
2409*da0073e9SAndroid Build Coastguard Worker                          b'\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2410*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x15\x00=\x00tensor.int.LE/versionFB9\x00ZZZZZZZZZZZZZZZZZZZZZZZ'
2411*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2412*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdd\xa0\'\xa8'
2413*da0073e9SAndroid Build Coastguard Worker                          b'\x98\x00\x00\x00\x98\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2414*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00tensor.int.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
2415*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00W\x1c\xcd\x19@\x00\x00\x00@\x00\x00\x00\x14\x00\x00\x00'
2416*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00tensor.int.LE/data/0PK\x01'
2417*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00'
2418*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x01'
2419*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00tensor.int.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00'
2420*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2421*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00'
2422*da0073e9SAndroid Build Coastguard Worker                          b'PK\x06\x07\x00\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2423*da0073e9SAndroid Build Coastguard Worker                          b'\x06\x00\x00\x00\x00\x03\x00\x03\x00\xc9\x00\x00\x00\x12\x02\x00\x00\x00\x00')
2424*da0073e9SAndroid Build Coastguard Worker
2425*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b"PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2426*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.int.LE.BOM/data.pklFB\x04\x00ZZZZ\x80"
2427*da0073e9SAndroid Build Coastguard Worker                       b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
2428*da0073e9SAndroid Build Coastguard Worker                       b"h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q"
2429*da0073e9SAndroid Build Coastguard Worker                       b"K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)"
2430*da0073e9SAndroid Build Coastguard Worker                       b"Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04"
2431*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2432*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x1b\x00\x1f\x00tensor.int.LE.BOM/byteorderFB\x1b\x00ZZZZZZZZZZZZZZZZZZZ"
2433*da0073e9SAndroid Build Coastguard Worker                       b"ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00"
2434*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2435*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x18\x004\x00tensor.int.LE.BOM/data/0FB0\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
2436*da0073e9SAndroid Build Coastguard Worker                       b"ZZZZZZZZZZZZZZZZZZZ\xf6\x19\x95i\xfaL\x1f\t%\xa3\r\xb8\xe5\xcfN\xe2\xa2\xc7\x8f\xb4"
2437*da0073e9SAndroid Build Coastguard Worker                       b"\xfd\xf5(2\xe3YX\xf5\x1dhO}\xeb\xba\xcf\x02\x8b\x84\xdd>L\xbc(\xc7\x92Q\x98\xa6"
2438*da0073e9SAndroid Build Coastguard Worker                       b"\x1aQ^w\xea\x932>\xad\x87D\xdd\x9el\xb6\x15PK\x07\x08W\x1c\xcd\x19@\x00\x00\x00"
2439*da0073e9SAndroid Build Coastguard Worker                       b"@\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2440*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x19\x009\x00tensor.int.LE.BOM/versionFB5\x00ZZZ"
2441*da0073e9SAndroid Build Coastguard Worker                       b"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00"
2442*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
2443*da0073e9SAndroid Build Coastguard Worker                       b"\xdd\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00"
2444*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int.LE.BOM/data.pklPK\x01\x02\x00"
2445*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00"
2446*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00"
2447*da0073e9SAndroid Build Coastguard Worker                       b"tensor.int.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00"
2448*da0073e9SAndroid Build Coastguard Worker                       b"\x00W\x1c\xcd\x19@\x00\x00\x00@\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00"
2449*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00V\x01\x00\x00tensor.int.LE.BOM/data/0PK\x01\x02\x00\x00\x00"
2450*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x19"
2451*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00tensor.int"
2452*da0073e9SAndroid Build Coastguard Worker                       b".LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00"
2453*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00"
2454*da0073e9SAndroid Build Coastguard Worker                       b"\x1e\x01\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00"
2455*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\xb0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00"
2456*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x04\x00\x04\x00\x1e\x01\x00\x00\x92\x02\x00\x00\x00\x00")
2457*da0073e9SAndroid Build Coastguard Worker
2458*da0073e9SAndroid Build Coastguard Worker        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'
2459*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x16\x00\x0c\x00tensor.int.BE/data.pklFB\x08\x00ZZZZZZZZ\x80'
2460*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2461*da0073e9SAndroid Build Coastguard Worker                          b'h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2462*da0073e9SAndroid Build Coastguard Worker                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2463*da0073e9SAndroid Build Coastguard Worker                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0\'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04'
2464*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2465*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x14\x00&\x00tensor.int.BE/data/0FB"\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2466*da0073e9SAndroid Build Coastguard Worker                          b'ZZZi\x95\x19\xf6\t\x1fL\xfa\xb8\r\xa3%\xe2N\xcf\xe5\xb4\x8f\xc7\xa22(\xf5\xfd\xf5'
2467*da0073e9SAndroid Build Coastguard Worker                          b'XY\xe3}Oh\x1d\x02\xcf\xba\xeb>\xdd\x84\x8b\xc7(\xbcL\xa6\x98Q\x92w^Q\x1a>2\x93\xea'
2468*da0073e9SAndroid Build Coastguard Worker                          b'\xddD\x87\xad\x15\xb6l\x9ePK\x07\x08rq\x19^@\x00\x00\x00@\x00\x00\x00PK\x03\x04'
2469*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2470*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x15\x00=\x00tensor.int.BE/versionFB9\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2471*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
2472*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdd\xa0\'\xa8\x98\x00'
2473*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x98\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2474*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00tensor.int.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
2475*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00rq\x19^@\x00\x00\x00@\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00'
2476*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00tensor.int.BE/data/0PK\x01\x02\x00\x00'
2477*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
2478*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x01\x00\x00tens'
2479*da0073e9SAndroid Build Coastguard Worker                          b'or.int.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00'
2480*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00'
2481*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
2482*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xdb\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00'
2483*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x03\x00\x03\x00\xc9\x00\x00\x00\x12\x02\x00\x00\x00\x00')
2484*da0073e9SAndroid Build Coastguard Worker
2485*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b"PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2486*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.int.BE.BOM/data.pklFB\x04\x00ZZZZ\x80"
2487*da0073e9SAndroid Build Coastguard Worker                       b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
2488*da0073e9SAndroid Build Coastguard Worker                       b"h\nIntStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q"
2489*da0073e9SAndroid Build Coastguard Worker                       b"K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)"
2490*da0073e9SAndroid Build Coastguard Worker                       b"Rq\ttq\nRq\x0b.PK\x07\x08\xdd\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00PK\x03\x04"
2491*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2492*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x1b\x00\x1f\x00tensor.int.BE.BOM/byteorderFB\x1b\x00ZZZZZZZZZZZZZZZZZZZ"
2493*da0073e9SAndroid Build Coastguard Worker                       b"ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00"
2494*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2495*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x18\x007\x00tensor.int.BE.BOM/data/0FB3\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
2496*da0073e9SAndroid Build Coastguard Worker                       b"ZZZZZZZZZZZZZZZZZZZi\x95\x19\xf6\t\x1fL\xfa\xb8\r\xa3%\xe2N\xcf\xe5\xb4\x8f\xc7\xa2"
2497*da0073e9SAndroid Build Coastguard Worker                       b"2(\xf5\xfd\xf5XY\xe3}Oh\x1d\x02\xcf\xba\xeb>\xdd\x84\x8b\xc7(\xbcL\xa6\x98Q\x92"
2498*da0073e9SAndroid Build Coastguard Worker                       b"w^Q\x1a>2\x93\xea\xddD\x87\xad\x15\xb6l\x9ePK\x07\x08rq\x19^@\x00\x00\x00@\x00"
2499*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2500*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\x19\x009\x00tensor.int.BE.BOM/versionFB5\x00ZZZZZZZZZ"
2501*da0073e9SAndroid Build Coastguard Worker                       b"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00"
2502*da0073e9SAndroid Build Coastguard Worker                       b"\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdd"
2503*da0073e9SAndroid Build Coastguard Worker                       b"\xa0'\xa8\x98\x00\x00\x00\x98\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2504*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\x00\x00tensor.int.BE.BOM/data.pklPK\x01\x02\x00\x00\x00"
2505*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00"
2506*da0073e9SAndroid Build Coastguard Worker                       b"\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00tenso"
2507*da0073e9SAndroid Build Coastguard Worker                       b"r.int.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
2508*da0073e9SAndroid Build Coastguard Worker                       b"rq\x19^@\x00\x00\x00@\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2509*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00S\x01\x00\x00tensor.int.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08"
2510*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x19\x00\x00\x00"
2511*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00tensor.int.BE.BOM/vers"
2512*da0073e9SAndroid Build Coastguard Worker                       b"ionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00"
2513*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x00"
2514*da0073e9SAndroid Build Coastguard Worker                       b"\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00"
2515*da0073e9SAndroid Build Coastguard Worker                       b"\xb0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00"
2516*da0073e9SAndroid Build Coastguard Worker                       b"\x04\x00\x1e\x01\x00\x00\x92\x02\x00\x00\x00\x00")
2517*da0073e9SAndroid Build Coastguard Worker
2518*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
2519*da0073e9SAndroid Build Coastguard Worker
2520*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2521*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
2522*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2523*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
2524*da0073e9SAndroid Build Coastguard Worker
2525*da0073e9SAndroid Build Coastguard Worker        try:
2526*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
2527*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
2528*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
2529*da0073e9SAndroid Build Coastguard Worker        finally:
2530*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2531*da0073e9SAndroid Build Coastguard Worker
2532*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
2533*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
2534*da0073e9SAndroid Build Coastguard Worker
2535*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2536*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2537*da0073e9SAndroid Build Coastguard Worker
2538*da0073e9SAndroid Build Coastguard Worker        try:
2539*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
2540*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2541*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2542*da0073e9SAndroid Build Coastguard Worker        finally:
2543*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2544*da0073e9SAndroid Build Coastguard Worker
2545*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2546*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2547*da0073e9SAndroid Build Coastguard Worker
2548*da0073e9SAndroid Build Coastguard Worker        try:
2549*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
2550*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2551*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2552*da0073e9SAndroid Build Coastguard Worker        finally:
2553*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2554*da0073e9SAndroid Build Coastguard Worker
2555*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2556*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2557*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2558*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2559*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2560*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2561*da0073e9SAndroid Build Coastguard Worker
2562*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
2563*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2564*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2565*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2566*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2567*da0073e9SAndroid Build Coastguard Worker        else:
2568*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2569*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2570*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2571*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2572*da0073e9SAndroid Build Coastguard Worker
2573*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_int16(self):
2574*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
2575*da0073e9SAndroid Build Coastguard Worker        #
2576*da0073e9SAndroid Build Coastguard Worker        # import torch
2577*da0073e9SAndroid Build Coastguard Worker        #
2578*da0073e9SAndroid Build Coastguard Worker        # x = torch.randint(-32768, 32768, [4, 4], dtype=torch.int16)
2579*da0073e9SAndroid Build Coastguard Worker        #
2580*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.int16.LE.pt", _disable_byteorder_record=True)
2581*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.int16.LE.BOM.pt")
2582*da0073e9SAndroid Build Coastguard Worker        #
2583*da0073e9SAndroid Build Coastguard Worker        # print(x)
2584*da0073e9SAndroid Build Coastguard Worker        #
2585*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
2586*da0073e9SAndroid Build Coastguard Worker        #
2587*da0073e9SAndroid Build Coastguard Worker        # import torch
2588*da0073e9SAndroid Build Coastguard Worker        #
2589*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.int16.LE.BOM.pt')
2590*da0073e9SAndroid Build Coastguard Worker        #
2591*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.int16.BE.pt', _disable_byteorder_record=True)
2592*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.int16.BE.BOM.pt')
2593*da0073e9SAndroid Build Coastguard Worker        #
2594*da0073e9SAndroid Build Coastguard Worker        # print(x)
2595*da0073e9SAndroid Build Coastguard Worker        #
2596*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2597*da0073e9SAndroid Build Coastguard Worker        #
2598*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
2599*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
2600*da0073e9SAndroid Build Coastguard Worker        # file.close()
2601*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
2602*da0073e9SAndroid Build Coastguard Worker        #
2603*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
2604*da0073e9SAndroid Build Coastguard Worker        #
2605*da0073e9SAndroid Build Coastguard Worker        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'
2606*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.int16.LE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
2607*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
2608*da0073e9SAndroid Build Coastguard Worker                          b'ShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2609*da0073e9SAndroid Build Coastguard Worker                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2610*da0073e9SAndroid Build Coastguard Worker                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2611*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2612*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x16\x00"\x00tensor.int16.LE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2613*da0073e9SAndroid Build Coastguard Worker                          b'ZZZO\xa4\x9bJ_Z-\xa5#\xf1y\xef\xb1@\x061"\xe3\x83\x07;\x83\x80\x08\xf1\x18q\xf6\xfe'
2614*da0073e9SAndroid Build Coastguard Worker                          b'\xf3\xc9,PK\x07\x08\xa0\x98\xd9\xdf \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
2615*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2616*da0073e9SAndroid Build Coastguard Worker                          b'\x17\x00\x1b\x00tensor.int16.LE/versionFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
2617*da0073e9SAndroid Build Coastguard Worker                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
2618*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00\x18\x00'
2619*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int16.LE/'
2620*da0073e9SAndroid Build Coastguard Worker                          b'data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa0\x98\xd9\xdf'
2621*da0073e9SAndroid Build Coastguard Worker                          b' \x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2622*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xea\x00\x00\x00tensor.int16.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
2623*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00'
2624*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.int16.LE/versionPK\x06'
2625*da0073e9SAndroid Build Coastguard Worker                          b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
2626*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00'
2627*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02'
2628*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00'
2629*da0073e9SAndroid Build Coastguard Worker                          b'\xcf\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2630*da0073e9SAndroid Build Coastguard Worker
2631*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2632*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.int16.LE.BOM/data.pklFB\x02\x00ZZ\x80'
2633*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2634*da0073e9SAndroid Build Coastguard Worker                       b'h\nShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2635*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2636*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2637*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2638*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1d\x00\x1b\x00tensor.int16.LE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZ'
2639*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2640*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2641*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x002\x00tensor.int16.LE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2642*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZO\xa4\x9bJ_Z-\xa5#\xf1y\xef\xb1@\x061"\xe3\x83\x07;\x83\x80\x08'
2643*da0073e9SAndroid Build Coastguard Worker                       b'\xf1\x18q\xf6\xfe\xf3\xc9,PK\x07\x08\xa0\x98\xd9\xdf \x00\x00\x00 \x00\x00\x00'
2644*da0073e9SAndroid Build Coastguard Worker                       b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2645*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x1b\x00\x17\x00tensor.int16.LE.BOM/versionFB\x13\x00ZZZZZZZZZ'
2646*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00'
2647*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00'
2648*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2649*da0073e9SAndroid Build Coastguard Worker                       b'tensor.int16.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2650*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00'
2651*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.int16.LE.BOM/byteorderPK\x01\x02'
2652*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa0\x98\xd9\xdf \x00\x00\x00 '
2653*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00'
2654*da0073e9SAndroid Build Coastguard Worker                       b'tensor.int16.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2655*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00'
2656*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.int16.LE.BOM/versionPK\x06\x06,\x00'
2657*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00'
2658*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00'
2659*da0073e9SAndroid Build Coastguard Worker                       b'R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00'
2660*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02'
2661*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00')
2662*da0073e9SAndroid Build Coastguard Worker
2663*da0073e9SAndroid Build Coastguard Worker        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'
2664*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.int16.BE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
2665*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
2666*da0073e9SAndroid Build Coastguard Worker                          b'ShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05Q'
2667*da0073e9SAndroid Build Coastguard Worker                          b'K\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)'
2668*da0073e9SAndroid Build Coastguard Worker                          b'Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2669*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2670*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x16\x00"\x00tensor.int16.BE/data/0FB\x1e\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2671*da0073e9SAndroid Build Coastguard Worker                          b'ZZZ\xa4OJ\x9bZ_\xa5-\xf1#\xefy@\xb11\x06\xe3"\x07\x83\x83;\x08\x80\x18\xf1\xf6q\xf3'
2672*da0073e9SAndroid Build Coastguard Worker                          b'\xfe,\xc9PK\x07\x08\x8a\xeb\x9b[ \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00\x08'
2673*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
2674*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x1b\x00tensor.int16.BE/versionFB\x17\x00ZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
2675*da0073e9SAndroid Build Coastguard Worker                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
2676*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00\x18\x00\x00'
2677*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int16.BE/dat'
2678*da0073e9SAndroid Build Coastguard Worker                          b'a.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x8a\xeb\x9b[ '
2679*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2680*da0073e9SAndroid Build Coastguard Worker                          b'\xea\x00\x00\x00tensor.int16.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
2681*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00'
2682*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.int16.BE/versionPK\x06\x06'
2683*da0073e9SAndroid Build Coastguard Worker                          b',\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00'
2684*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00'
2685*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02\x00'
2686*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcf'
2687*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2688*da0073e9SAndroid Build Coastguard Worker
2689*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2690*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.int16.BE.BOM/data.pklFB\x02\x00ZZ\x80'
2691*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2692*da0073e9SAndroid Build Coastguard Worker                       b'h\nShortStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2693*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2694*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00\x00PK\x03\x04'
2695*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2696*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1d\x00\x1b\x00tensor.int16.BE.BOM/byteorderFB\x17\x00ZZZZZZZZZZZZZZZ'
2697*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2698*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2699*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x005\x00tensor.int16.BE.BOM/data/0FB1\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2700*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\xa4OJ\x9bZ_\xa5-\xf1#\xefy@\xb11\x06\xe3"\x07\x83\x83;\x08\x80'
2701*da0073e9SAndroid Build Coastguard Worker                       b'\x18\xf1\xf6q\xf3\xfe,\xc9PK\x07\x08\x8a\xeb\x9b[ \x00\x00\x00 \x00\x00\x00PK\x03'
2702*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2703*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x1b\x00\x17\x00tensor.int16.BE.BOM/versionFB\x13\x00ZZZZZZZZZZZZ'
2704*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00'
2705*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xf6\xc8K\xd8\x9a\x00\x00\x00\x9a\x00\x00'
2706*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ten'
2707*da0073e9SAndroid Build Coastguard Worker                       b'sor.int16.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
2708*da0073e9SAndroid Build Coastguard Worker                       b'I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00'
2709*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00tensor.int16.BE.BOM/byteorderPK\x01\x02\x00'
2710*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x8a\xeb\x9b[ \x00\x00\x00 \x00\x00'
2711*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tenso'
2712*da0073e9SAndroid Build Coastguard Worker                       b'r.int16.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1'
2713*da0073e9SAndroid Build Coastguard Worker                       b'\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2714*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\xf0\x01\x00\x00tensor.int16.BE.BOM/versionPK\x06\x06,\x00\x00\x00'
2715*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00'
2716*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00R\x02'
2717*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00'
2718*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02\x00'
2719*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00')
2720*da0073e9SAndroid Build Coastguard Worker
2721*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
2722*da0073e9SAndroid Build Coastguard Worker
2723*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2724*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
2725*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2726*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
2727*da0073e9SAndroid Build Coastguard Worker
2728*da0073e9SAndroid Build Coastguard Worker        try:
2729*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
2730*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
2731*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
2732*da0073e9SAndroid Build Coastguard Worker        finally:
2733*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2734*da0073e9SAndroid Build Coastguard Worker
2735*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
2736*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
2737*da0073e9SAndroid Build Coastguard Worker
2738*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2739*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2740*da0073e9SAndroid Build Coastguard Worker
2741*da0073e9SAndroid Build Coastguard Worker        try:
2742*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
2743*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2744*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2745*da0073e9SAndroid Build Coastguard Worker        finally:
2746*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2747*da0073e9SAndroid Build Coastguard Worker
2748*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2749*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2750*da0073e9SAndroid Build Coastguard Worker
2751*da0073e9SAndroid Build Coastguard Worker        try:
2752*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
2753*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2754*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2755*da0073e9SAndroid Build Coastguard Worker        finally:
2756*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2757*da0073e9SAndroid Build Coastguard Worker
2758*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2759*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2760*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2761*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2762*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2763*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2764*da0073e9SAndroid Build Coastguard Worker
2765*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
2766*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2767*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2768*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
2769*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
2770*da0073e9SAndroid Build Coastguard Worker        else:
2771*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
2772*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
2773*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2774*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2775*da0073e9SAndroid Build Coastguard Worker
2776*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_int8(self):
2777*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
2778*da0073e9SAndroid Build Coastguard Worker        #
2779*da0073e9SAndroid Build Coastguard Worker        # import torch
2780*da0073e9SAndroid Build Coastguard Worker        #
2781*da0073e9SAndroid Build Coastguard Worker        # x = torch.randint(-128, 128, [4, 4], dtype=torch.int8)
2782*da0073e9SAndroid Build Coastguard Worker        #
2783*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.int8.LE.pt", _disable_byteorder_record=True)
2784*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.int8.LE.BOM.pt")
2785*da0073e9SAndroid Build Coastguard Worker        #
2786*da0073e9SAndroid Build Coastguard Worker        # print(x)
2787*da0073e9SAndroid Build Coastguard Worker        #
2788*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
2789*da0073e9SAndroid Build Coastguard Worker        #
2790*da0073e9SAndroid Build Coastguard Worker        # import torch
2791*da0073e9SAndroid Build Coastguard Worker        #
2792*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.int8.LE.BOM.pt')
2793*da0073e9SAndroid Build Coastguard Worker        #
2794*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.int8.BE.pt', _disable_byteorder_record=True)
2795*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.int8.BE.BOM.pt')
2796*da0073e9SAndroid Build Coastguard Worker        #
2797*da0073e9SAndroid Build Coastguard Worker        # print(x)
2798*da0073e9SAndroid Build Coastguard Worker        #
2799*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2800*da0073e9SAndroid Build Coastguard Worker        #
2801*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
2802*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
2803*da0073e9SAndroid Build Coastguard Worker        # file.close()
2804*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
2805*da0073e9SAndroid Build Coastguard Worker        #
2806*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
2807*da0073e9SAndroid Build Coastguard Worker        #
2808*da0073e9SAndroid Build Coastguard Worker        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'
2809*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.int8.LE/data.pklFB\x07\x00ZZZZZZZ\x80'
2810*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2811*da0073e9SAndroid Build Coastguard Worker                          b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2812*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2813*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2814*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2815*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x15\x00$\x00tensor.int8.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2816*da0073e9SAndroid Build Coastguard Worker                          b'ZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10\x00\x00\x00\x10'
2817*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2818*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.int8.LE/versionFB(\x00ZZZZZZ'
2819*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2820*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdb6\x08\xe7'
2821*da0073e9SAndroid Build Coastguard Worker                          b'\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2822*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00tensor.int8.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
2823*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x15\x00\x00\x00'
2824*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.int8.LE/data/0'
2825*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
2826*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01'
2827*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00tensor.int8.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00'
2828*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2829*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00'
2830*da0073e9SAndroid Build Coastguard Worker                          b'PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2831*da0073e9SAndroid Build Coastguard Worker                          b'\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2832*da0073e9SAndroid Build Coastguard Worker
2833*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2834*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.int8.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
2835*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2836*da0073e9SAndroid Build Coastguard Worker                       b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2837*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2838*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2839*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2840*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x1d\x00tensor.int8.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2841*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
2842*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2843*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x19\x003\x00tensor.int8.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2844*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10'
2845*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
2846*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00tensor.int8.LE.BOM'
2847*da0073e9SAndroid Build Coastguard Worker                       b'/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
2848*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2849*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00'
2850*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int8.LE.BOM/data.pklPK\x01\x02\x00'
2851*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00'
2852*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00'
2853*da0073e9SAndroid Build Coastguard Worker                       b'tensor.int8.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2854*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00'
2855*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.int8.LE.BOM/data/0PK\x01\x02\x00\x00'
2856*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
2857*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00ten'
2858*da0073e9SAndroid Build Coastguard Worker                       b'sor.int8.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
2859*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00'
2860*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
2861*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00'
2862*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
2863*da0073e9SAndroid Build Coastguard Worker
2864*da0073e9SAndroid Build Coastguard Worker        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'
2865*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.int8.BE/data.pklFB\x07\x00ZZZZZZZ\x80'
2866*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2867*da0073e9SAndroid Build Coastguard Worker                          b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2868*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2869*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2870*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2871*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x15\x00$\x00tensor.int8.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2872*da0073e9SAndroid Build Coastguard Worker                          b'ZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10\x00\x00\x00\x10'
2873*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2874*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.int8.BE/versionFB(\x00ZZZZZZ'
2875*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00'
2876*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xdb6\x08\xe7'
2877*da0073e9SAndroid Build Coastguard Worker                          b'\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2878*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00tensor.int8.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
2879*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x15\x00\x00\x00'
2880*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.int8.BE/data/0'
2881*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
2882*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x01'
2883*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00tensor.int8.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00'
2884*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00'
2885*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00'
2886*da0073e9SAndroid Build Coastguard Worker                          b'PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
2887*da0073e9SAndroid Build Coastguard Worker                          b'\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
2888*da0073e9SAndroid Build Coastguard Worker
2889*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2890*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.int8.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
2891*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
2892*da0073e9SAndroid Build Coastguard Worker                       b'h\nCharStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
2893*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
2894*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
2895*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2896*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x1d\x00tensor.int8.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZ'
2897*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
2898*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
2899*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x19\x006\x00tensor.int8.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
2900*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\x9d\x1en\xb4\xe0l"s\x15bs\x8aa\xa0\xc6+PK\x07\x08\xe0\xffgs\x10'
2901*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
2902*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00tensor.int8.BE.BOM'
2903*da0073e9SAndroid Build Coastguard Worker                       b'/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
2904*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
2905*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xdb6\x08\xe7\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00'
2906*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.int8.BE.BOM/data.pklPK\x01\x02\x00'
2907*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00'
2908*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00'
2909*da0073e9SAndroid Build Coastguard Worker                       b'tensor.int8.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
2910*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xe0\xffgs\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00'
2911*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.int8.BE.BOM/data/0PK\x01\x02\x00\x00'
2912*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
2913*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00ten'
2914*da0073e9SAndroid Build Coastguard Worker                       b'sor.int8.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
2915*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00'
2916*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00'
2917*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00'
2918*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
2919*da0073e9SAndroid Build Coastguard Worker
2920*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
2921*da0073e9SAndroid Build Coastguard Worker
2922*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
2923*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
2924*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
2925*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
2926*da0073e9SAndroid Build Coastguard Worker
2927*da0073e9SAndroid Build Coastguard Worker        try:
2928*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
2929*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
2930*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
2931*da0073e9SAndroid Build Coastguard Worker        finally:
2932*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2933*da0073e9SAndroid Build Coastguard Worker
2934*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
2935*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
2936*da0073e9SAndroid Build Coastguard Worker
2937*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2938*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2939*da0073e9SAndroid Build Coastguard Worker
2940*da0073e9SAndroid Build Coastguard Worker        try:
2941*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
2942*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
2943*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
2944*da0073e9SAndroid Build Coastguard Worker        finally:
2945*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2946*da0073e9SAndroid Build Coastguard Worker
2947*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
2948*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
2949*da0073e9SAndroid Build Coastguard Worker
2950*da0073e9SAndroid Build Coastguard Worker        try:
2951*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
2952*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
2953*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
2954*da0073e9SAndroid Build Coastguard Worker        finally:
2955*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
2956*da0073e9SAndroid Build Coastguard Worker
2957*da0073e9SAndroid Build Coastguard Worker        # 1-byte types are same on BE and LE
2958*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
2959*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
2960*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
2961*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
2962*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
2963*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
2964*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
2965*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
2966*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
2967*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
2968*da0073e9SAndroid Build Coastguard Worker
2969*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_uint8(self):
2970*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
2971*da0073e9SAndroid Build Coastguard Worker        #
2972*da0073e9SAndroid Build Coastguard Worker        # import torch
2973*da0073e9SAndroid Build Coastguard Worker        #
2974*da0073e9SAndroid Build Coastguard Worker        # x = torch.randint(0, 256, [4, 4], dtype=torch.uint8)
2975*da0073e9SAndroid Build Coastguard Worker        #
2976*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.uint8.LE.pt", _disable_byteorder_record=True)
2977*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.uint8.LE.BOM.pt")
2978*da0073e9SAndroid Build Coastguard Worker        #
2979*da0073e9SAndroid Build Coastguard Worker        # print(x)
2980*da0073e9SAndroid Build Coastguard Worker        #
2981*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
2982*da0073e9SAndroid Build Coastguard Worker        #
2983*da0073e9SAndroid Build Coastguard Worker        # import torch
2984*da0073e9SAndroid Build Coastguard Worker        #
2985*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.uint8.LE.BOM.pt')
2986*da0073e9SAndroid Build Coastguard Worker        #
2987*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.uint8.BE.pt', _disable_byteorder_record=True)
2988*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.uint8.BE.BOM.pt')
2989*da0073e9SAndroid Build Coastguard Worker        #
2990*da0073e9SAndroid Build Coastguard Worker        # print(x)
2991*da0073e9SAndroid Build Coastguard Worker        #
2992*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
2993*da0073e9SAndroid Build Coastguard Worker        #
2994*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
2995*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
2996*da0073e9SAndroid Build Coastguard Worker        # file.close()
2997*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
2998*da0073e9SAndroid Build Coastguard Worker        #
2999*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
3000*da0073e9SAndroid Build Coastguard Worker        #
3001*da0073e9SAndroid Build Coastguard Worker        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'
3002*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.uint8.LE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
3003*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
3004*da0073e9SAndroid Build Coastguard Worker                          b'ByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05QK'
3005*da0073e9SAndroid Build Coastguard Worker                          b'\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)R'
3006*da0073e9SAndroid Build Coastguard Worker                          b'q\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
3007*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3008*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x16\x00#\x00tensor.uint8.LE/data/0FB\x1f\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3009*da0073e9SAndroid Build Coastguard Worker                          b'ZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94#\x08\x10\x00\x00'
3010*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
3011*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.uint8.LE/versionFB\''
3012*da0073e9SAndroid Build Coastguard Worker                          b'\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
3013*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xff'
3014*da0073e9SAndroid Build Coastguard Worker                          b'\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3015*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.LE/data.pklPK\x01\x02\x00\x00\x00'
3016*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00'
3017*da0073e9SAndroid Build Coastguard Worker                          b'\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.'
3018*da0073e9SAndroid Build Coastguard Worker                          b'uint8.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9e'
3019*da0073e9SAndroid Build Coastguard Worker                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3020*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00`\x01\x00\x00tensor.uint8.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
3021*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
3022*da0073e9SAndroid Build Coastguard Worker                          b'\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00'
3023*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01'
3024*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00'
3025*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00')
3026*da0073e9SAndroid Build Coastguard Worker
3027*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3028*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.uint8.LE.BOM/data.pklFB\x02\x00ZZ\x80'
3029*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3030*da0073e9SAndroid Build Coastguard Worker                       b'h\nByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
3031*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3032*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
3033*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3034*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1d\x00\x1c\x00tensor.uint8.LE.BOM/byteorderFB\x18\x00ZZZZZZZZZZZZZZZZ'
3035*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
3036*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3037*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x002\x00tensor.uint8.LE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3038*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94'
3039*da0073e9SAndroid Build Coastguard Worker                       b'#\x08\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
3040*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.ui'
3041*da0073e9SAndroid Build Coastguard Worker                       b'nt8.LE.BOM/versionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9e'
3042*da0073e9SAndroid Build Coastguard Worker                       b'gU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3043*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x1c\x00\x00\x00\x00\x00'
3044*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.LE.BOM/data.pklPK'
3045*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00'
3046*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x06\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9'
3047*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00tensor.uint8.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3048*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00'
3049*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.uint8.LE.BOM/data/0'
3050*da0073e9SAndroid Build Coastguard Worker                       b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
3051*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0'
3052*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x00\x00tensor.uint8.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3053*da0073e9SAndroid Build Coastguard Worker                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3054*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00'
3055*da0073e9SAndroid Build Coastguard Worker                       b'\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3056*da0073e9SAndroid Build Coastguard Worker                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
3057*da0073e9SAndroid Build Coastguard Worker
3058*da0073e9SAndroid Build Coastguard Worker        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'
3059*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x18\x00\n\x00tensor.uint8.BE/data.pklFB\x06\x00ZZZZZZ\x80\x02'
3060*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
3061*da0073e9SAndroid Build Coastguard Worker                          b'ByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05QK'
3062*da0073e9SAndroid Build Coastguard Worker                          b'\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)R'
3063*da0073e9SAndroid Build Coastguard Worker                          b'q\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
3064*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3065*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x16\x00#\x00tensor.uint8.BE/data/0FB\x1f\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3066*da0073e9SAndroid Build Coastguard Worker                          b'ZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94#\x08\x10\x00\x00'
3067*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00'
3068*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00+\x00tensor.uint8.BE/versionFB\''
3069*da0073e9SAndroid Build Coastguard Worker                          b'\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00'
3070*da0073e9SAndroid Build Coastguard Worker                          b'\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xff'
3071*da0073e9SAndroid Build Coastguard Worker                          b'\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3072*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.BE/data.pklPK\x01\x02\x00\x00\x00'
3073*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00'
3074*da0073e9SAndroid Build Coastguard Worker                          b'\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.'
3075*da0073e9SAndroid Build Coastguard Worker                          b'uint8.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9e'
3076*da0073e9SAndroid Build Coastguard Worker                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3077*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00`\x01\x00\x00tensor.uint8.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00'
3078*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
3079*da0073e9SAndroid Build Coastguard Worker                          b'\x03\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00'
3080*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa1\x02\x00\x00\x00\x00\x00\x00\x01'
3081*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcf\x00\x00\x00\xd2\x01\x00'
3082*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00')
3083*da0073e9SAndroid Build Coastguard Worker
3084*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3085*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1c\x00\x06\x00tensor.uint8.BE.BOM/data.pklFB\x02\x00ZZ\x80'
3086*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3087*da0073e9SAndroid Build Coastguard Worker                       b'h\nByteStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
3088*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3089*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04'
3090*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3091*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1d\x00\x1c\x00tensor.uint8.BE.BOM/byteorderFB\x18\x00ZZZZZZZZZZZZZZZZ'
3092*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
3093*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3094*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1a\x005\x00tensor.uint8.BE.BOM/data/0FB1\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3095*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\xf7\xf20\x04\t\x8a!\xbev\xf4\xbe\x0e";\xbb\tPK\x07\x08\xa8\x94'
3096*da0073e9SAndroid Build Coastguard Worker                       b'#\x08\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
3097*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\'\x00tensor.ui'
3098*da0073e9SAndroid Build Coastguard Worker                       b'nt8.BE.BOM/versionFB#\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9e'
3099*da0073e9SAndroid Build Coastguard Worker                       b'gU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3100*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\xff\xb9!\x97\x99\x00\x00\x00\x99\x00\x00\x00\x1c\x00\x00\x00\x00\x00'
3101*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.uint8.BE.BOM/data.pklPK'
3102*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00'
3103*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x03\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9'
3104*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00tensor.uint8.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3105*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\xa8\x94#\x08\x10\x00\x00\x00\x10\x00\x00\x00\x1a\x00\x00\x00'
3106*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.uint8.BE.BOM/data/0'
3107*da0073e9SAndroid Build Coastguard Worker                       b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
3108*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0'
3109*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x00\x00tensor.uint8.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3110*da0073e9SAndroid Build Coastguard Worker                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3111*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00'
3112*da0073e9SAndroid Build Coastguard Worker                       b'\x00PK\x06\x07\x00\x00\x00\x00x\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3113*da0073e9SAndroid Build Coastguard Worker                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00&\x01\x00\x00R\x02\x00\x00\x00\x00')
3114*da0073e9SAndroid Build Coastguard Worker
3115*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
3116*da0073e9SAndroid Build Coastguard Worker
3117*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3118*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
3119*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3120*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
3121*da0073e9SAndroid Build Coastguard Worker
3122*da0073e9SAndroid Build Coastguard Worker        try:
3123*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
3124*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
3125*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
3126*da0073e9SAndroid Build Coastguard Worker        finally:
3127*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3128*da0073e9SAndroid Build Coastguard Worker
3129*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
3130*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
3131*da0073e9SAndroid Build Coastguard Worker
3132*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3133*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3134*da0073e9SAndroid Build Coastguard Worker
3135*da0073e9SAndroid Build Coastguard Worker        try:
3136*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
3137*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3138*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3139*da0073e9SAndroid Build Coastguard Worker        finally:
3140*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3141*da0073e9SAndroid Build Coastguard Worker
3142*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3143*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3144*da0073e9SAndroid Build Coastguard Worker
3145*da0073e9SAndroid Build Coastguard Worker        try:
3146*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
3147*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3148*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3149*da0073e9SAndroid Build Coastguard Worker        finally:
3150*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3151*da0073e9SAndroid Build Coastguard Worker
3152*da0073e9SAndroid Build Coastguard Worker        # 1-byte types are same on BE and LE
3153*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3154*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3155*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3156*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3157*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3158*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3159*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3160*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3161*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3162*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3163*da0073e9SAndroid Build Coastguard Worker
3164*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_bool(self):
3165*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
3166*da0073e9SAndroid Build Coastguard Worker        #
3167*da0073e9SAndroid Build Coastguard Worker        # import torch
3168*da0073e9SAndroid Build Coastguard Worker        #
3169*da0073e9SAndroid Build Coastguard Worker        # x = torch.randint(0, 2, [4, 4], dtype=torch.bool)
3170*da0073e9SAndroid Build Coastguard Worker        #
3171*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.bool.LE.pt", _disable_byteorder_record=True)
3172*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.bool.LE.BOM.pt")
3173*da0073e9SAndroid Build Coastguard Worker        #
3174*da0073e9SAndroid Build Coastguard Worker        # print(x)
3175*da0073e9SAndroid Build Coastguard Worker        #
3176*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
3177*da0073e9SAndroid Build Coastguard Worker        #
3178*da0073e9SAndroid Build Coastguard Worker        # import torch
3179*da0073e9SAndroid Build Coastguard Worker        #
3180*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.bool.LE.BOM.pt')
3181*da0073e9SAndroid Build Coastguard Worker        #
3182*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.bool.BE.pt', _disable_byteorder_record=True)
3183*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.bool.BE.BOM.pt')
3184*da0073e9SAndroid Build Coastguard Worker        #
3185*da0073e9SAndroid Build Coastguard Worker        # print(x)
3186*da0073e9SAndroid Build Coastguard Worker        #
3187*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3188*da0073e9SAndroid Build Coastguard Worker        #
3189*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
3190*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
3191*da0073e9SAndroid Build Coastguard Worker        # file.close()
3192*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
3193*da0073e9SAndroid Build Coastguard Worker        #
3194*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
3195*da0073e9SAndroid Build Coastguard Worker        #
3196*da0073e9SAndroid Build Coastguard Worker        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"
3197*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.bool.LE/data.pklFB\x07\x00ZZZZZZZ\x80"
3198*da0073e9SAndroid Build Coastguard Worker                          b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
3199*da0073e9SAndroid Build Coastguard Worker                          b"h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05"
3200*da0073e9SAndroid Build Coastguard Worker                          b"QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08"
3201*da0073e9SAndroid Build Coastguard Worker                          b")Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00"
3202*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3203*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x15\x00$\x00tensor.bool.LE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x01"
3204*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00PK\x07\x08\x00Y04"
3205*da0073e9SAndroid Build Coastguard Worker                          b"\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
3206*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.bool.LE/ve"
3207*da0073e9SAndroid Build Coastguard Worker                          b"rsionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00"
3208*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00"
3209*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00"
3210*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.LE/data.pklPK\x01\x02\x00\x00"
3211*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x15"
3212*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.bo"
3213*da0073e9SAndroid Build Coastguard Worker                          b"ol.LE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU"
3214*da0073e9SAndroid Build Coastguard Worker                          b"\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3215*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00`\x01\x00\x00tensor.bool.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00"
3216*da0073e9SAndroid Build Coastguard Worker                          b"\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03"
3217*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00"
3218*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00"
3219*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00"
3220*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00")
3221*da0073e9SAndroid Build Coastguard Worker
3222*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3223*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bool.LE.BOM/data.pklFB\x03\x00ZZZ\x80'
3224*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3225*da0073e9SAndroid Build Coastguard Worker                       b'h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
3226*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3227*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
3228*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3229*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1c\x00\x1d\x00tensor.bool.LE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZ'
3230*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
3231*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3232*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x19\x003\x00tensor.bool.LE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3233*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZ\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00'
3234*da0073e9SAndroid Build Coastguard Worker                       b'PK\x07\x08\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3235*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00'
3236*da0073e9SAndroid Build Coastguard Worker                       b'tensor.bool.LE.BOM/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08'
3237*da0073e9SAndroid Build Coastguard Worker                       b'\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3238*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00'
3239*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.LE.BOM/dat'
3240*da0073e9SAndroid Build Coastguard Worker                       b'a.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06'
3241*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x06\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3242*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xe9\x00\x00\x00tensor.bool.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08'
3243*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00'
3244*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.bool.LE.BOM/data/0P'
3245*da0073e9SAndroid Build Coastguard Worker                       b'K\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00'
3246*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01'
3247*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00tensor.bool.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3248*da0073e9SAndroid Build Coastguard Worker                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3249*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00'
3250*da0073e9SAndroid Build Coastguard Worker                       b'PK\x06\x07\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3251*da0073e9SAndroid Build Coastguard Worker                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
3252*da0073e9SAndroid Build Coastguard Worker
3253*da0073e9SAndroid Build Coastguard Worker        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"
3254*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x17\x00\x0b\x00tensor.bool.BE/data.pklFB\x07\x00ZZZZZZZ\x80"
3255*da0073e9SAndroid Build Coastguard Worker                          b"\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc"
3256*da0073e9SAndroid Build Coastguard Worker                          b"h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05"
3257*da0073e9SAndroid Build Coastguard Worker                          b"QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08"
3258*da0073e9SAndroid Build Coastguard Worker                          b")Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00"
3259*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3260*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x15\x00$\x00tensor.bool.BE/data/0FB \x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x01"
3261*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00PK\x07\x08\x00Y04"
3262*da0073e9SAndroid Build Coastguard Worker                          b"\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00"
3263*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00,\x00tensor.bool.BE/ve"
3264*da0073e9SAndroid Build Coastguard Worker                          b"rsionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00"
3265*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00"
3266*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x9a\xab='\x99\x00\x00\x00\x99\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00"
3267*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.BE/data.pklPK\x01\x02\x00\x00"
3268*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x15"
3269*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00tensor.bo"
3270*da0073e9SAndroid Build Coastguard Worker                          b"ol.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU"
3271*da0073e9SAndroid Build Coastguard Worker                          b"\x02\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3272*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00`\x01\x00\x00tensor.bool.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00"
3273*da0073e9SAndroid Build Coastguard Worker                          b"\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03"
3274*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00"
3275*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x9e\x02\x00\x00\x00\x00\x00\x00\x01\x00"
3276*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xcc\x00\x00\x00\xd2\x01\x00\x00"
3277*da0073e9SAndroid Build Coastguard Worker                          b"\x00\x00")
3278*da0073e9SAndroid Build Coastguard Worker
3279*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3280*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bool.BE.BOM/data.pklFB\x03\x00ZZZ\x80'
3281*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3282*da0073e9SAndroid Build Coastguard Worker                       b'h\nBoolStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x10tq\x05'
3283*da0073e9SAndroid Build Coastguard Worker                       b'QK\x00K\x04K\x04\x86q\x06K\x04K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3284*da0073e9SAndroid Build Coastguard Worker                       b')Rq\ttq\nRq\x0b.PK\x07\x08\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00PK\x03\x04\x00'
3285*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3286*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1c\x00\x1d\x00tensor.bool.BE.BOM/byteorderFB\x19\x00ZZZZZZZZZZZZZZZZZZZ'
3287*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00'
3288*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3289*da0073e9SAndroid Build Coastguard Worker                       b'\x19\x006\x00tensor.bool.BE.BOM/data/0FB2\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3290*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZ\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00'
3291*da0073e9SAndroid Build Coastguard Worker                       b'PK\x07\x08\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3292*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00(\x00'
3293*da0073e9SAndroid Build Coastguard Worker                       b'tensor.bool.BE.BOM/versionFB$\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08'
3294*da0073e9SAndroid Build Coastguard Worker                       b'\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3295*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x9a\xab=\'\x99\x00\x00\x00\x99\x00\x00\x00\x1b\x00\x00\x00'
3296*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.bool.BE.BOM/dat'
3297*da0073e9SAndroid Build Coastguard Worker                       b'a.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03'
3298*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3299*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xe9\x00\x00\x00tensor.bool.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08'
3300*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00Y04\x10\x00\x00\x00\x10\x00\x00\x00\x19\x00\x00\x00'
3301*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.bool.BE.BOM/data/0P'
3302*da0073e9SAndroid Build Coastguard Worker                       b'K\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00'
3303*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01'
3304*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00tensor.bool.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3305*da0073e9SAndroid Build Coastguard Worker                       b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00'
3306*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00"\x01\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00'
3307*da0073e9SAndroid Build Coastguard Worker                       b'PK\x06\x07\x00\x00\x00\x00t\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05'
3308*da0073e9SAndroid Build Coastguard Worker                       b'\x06\x00\x00\x00\x00\x04\x00\x04\x00"\x01\x00\x00R\x02\x00\x00\x00\x00')
3309*da0073e9SAndroid Build Coastguard Worker
3310*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
3311*da0073e9SAndroid Build Coastguard Worker
3312*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3313*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
3314*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3315*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
3316*da0073e9SAndroid Build Coastguard Worker
3317*da0073e9SAndroid Build Coastguard Worker        try:
3318*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
3319*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
3320*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
3321*da0073e9SAndroid Build Coastguard Worker        finally:
3322*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3323*da0073e9SAndroid Build Coastguard Worker
3324*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
3325*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
3326*da0073e9SAndroid Build Coastguard Worker
3327*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3328*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3329*da0073e9SAndroid Build Coastguard Worker
3330*da0073e9SAndroid Build Coastguard Worker        try:
3331*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
3332*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3333*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3334*da0073e9SAndroid Build Coastguard Worker        finally:
3335*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3336*da0073e9SAndroid Build Coastguard Worker
3337*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3338*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3339*da0073e9SAndroid Build Coastguard Worker
3340*da0073e9SAndroid Build Coastguard Worker        try:
3341*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
3342*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3343*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3344*da0073e9SAndroid Build Coastguard Worker        finally:
3345*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3346*da0073e9SAndroid Build Coastguard Worker
3347*da0073e9SAndroid Build Coastguard Worker        # 1-byte types are same on BE and LE
3348*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3349*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3350*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3351*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3352*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3353*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3354*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3355*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3356*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3357*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3358*da0073e9SAndroid Build Coastguard Worker
3359*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_bfloat16(self):
3360*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
3361*da0073e9SAndroid Build Coastguard Worker        #
3362*da0073e9SAndroid Build Coastguard Worker        # import torch
3363*da0073e9SAndroid Build Coastguard Worker        #
3364*da0073e9SAndroid Build Coastguard Worker        # x = torch.randn(2,2, dtype=torch.bfloat16)
3365*da0073e9SAndroid Build Coastguard Worker        #
3366*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.bfloat16.LE.pt", _disable_byteorder_record=True)
3367*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.bfloat16.LE.BOM.pt")
3368*da0073e9SAndroid Build Coastguard Worker        #
3369*da0073e9SAndroid Build Coastguard Worker        # print(x)
3370*da0073e9SAndroid Build Coastguard Worker        #
3371*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
3372*da0073e9SAndroid Build Coastguard Worker        #
3373*da0073e9SAndroid Build Coastguard Worker        # import torch
3374*da0073e9SAndroid Build Coastguard Worker        #
3375*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.bfloat16.LE.BOM.pt')
3376*da0073e9SAndroid Build Coastguard Worker        #
3377*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.bfloat16.BE.pt', _disable_byteorder_record=True)
3378*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.bfloat16.BE.BOM.pt')
3379*da0073e9SAndroid Build Coastguard Worker        #
3380*da0073e9SAndroid Build Coastguard Worker        # print(x)
3381*da0073e9SAndroid Build Coastguard Worker        #
3382*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3383*da0073e9SAndroid Build Coastguard Worker        #
3384*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
3385*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
3386*da0073e9SAndroid Build Coastguard Worker        # file.close()
3387*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
3388*da0073e9SAndroid Build Coastguard Worker        #
3389*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
3390*da0073e9SAndroid Build Coastguard Worker        #
3391*da0073e9SAndroid Build Coastguard Worker        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'
3392*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bfloat16.LE/data.pklFB\x03\x00ZZZ\x80'
3393*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3394*da0073e9SAndroid Build Coastguard Worker                          b'h\nBFloat16Storage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq'
3395*da0073e9SAndroid Build Coastguard Worker                          b'\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq'
3396*da0073e9SAndroid Build Coastguard Worker                          b'\x08)Rq\ttq\nRq\x0b.PK\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03'
3397*da0073e9SAndroid Build Coastguard Worker                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3398*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x19\x00\x1c\x00tensor.bfloat16.LE/data/0FB\x18\x00ZZZZZZZZZZZZZZZZ'
3399*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZ\r@i\xber?\xbc\xbfPK\x07\x085\xd2\x8f\xc7\x08\x00\x00\x00\x08\x00\x00\x00'
3400*da0073e9SAndroid Build Coastguard Worker                          b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3401*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x1a\x000\x00tensor.bfloat16.LE/versionFB,\x00ZZZZZZZZZZZZZZZ'
3402*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
3403*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00'
3404*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x9d\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3405*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00tensor.bfloat16.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
3406*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x005\xd2\x8f\xc7\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00'
3407*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00tensor.bfloat16.LE/'
3408*da0073e9SAndroid Build Coastguard Worker                          b'data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00'
3409*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3410*da0073e9SAndroid Build Coastguard Worker                          b'X\x01\x00\x00tensor.bfloat16.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00'
3411*da0073e9SAndroid Build Coastguard Worker                          b'\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03'
3412*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00'
3413*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00'
3414*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd8\x00\x00\x00\xd2\x01\x00\x00'
3415*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00')
3416*da0073e9SAndroid Build Coastguard Worker
3417*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3418*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1f\x00C\x00tensor.bfloat16.LE.BOM/data.pklFB?\x00ZZZZZZZZZ'
3419*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_re'
3420*da0073e9SAndroid Build Coastguard Worker                       b'build_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nBFloat16Storage\nq\x02'
3421*da0073e9SAndroid Build Coastguard Worker                       b'X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05QK\x00K\x02K\x02\x86'
3422*da0073e9SAndroid Build Coastguard Worker                       b'q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK'
3423*da0073e9SAndroid Build Coastguard Worker                       b'\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3424*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x15'
3425*da0073e9SAndroid Build Coastguard Worker                       b'\x00tensor.bfloat16.LE.BOM/byteorderFB\x11\x00ZZZZZZZZZZZZZZZZZlittlePK\x07\x08\x85'
3426*da0073e9SAndroid Build Coastguard Worker                       b'=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00'
3427*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00/\x00tenso'
3428*da0073e9SAndroid Build Coastguard Worker                       b'r.bfloat16.LE.BOM/data/0FB+\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\r@i\xbe'
3429*da0073e9SAndroid Build Coastguard Worker                       b'r?\xbc\xbfPK\x07\x085\xd2\x8f\xc7\x08\x00\x00\x00\x08\x00\x00\x00PK\x03\x04\x00'
3430*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3431*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1e\x00,\x00tensor.bfloat16.LE.BOM/versionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZ'
3432*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02'
3433*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d'
3434*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3435*da0073e9SAndroid Build Coastguard Worker                       b'\x00tensor.bfloat16.LE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3436*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00 \x00\x00\x00\x00\x00'
3437*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00tensor.bfloat16.LE.BOM/byteorderPK\x01'
3438*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x005\xd2\x8f\xc7\x08\x00\x00'
3439*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96'
3440*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x00\x00tensor.bfloat16.LE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
3441*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1e\x00\x00\x00\x00'
3442*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00tensor.bfloat16.LE.BOM/vers'
3443*da0073e9SAndroid Build Coastguard Worker                       b'ionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00'
3444*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x002\x01\x00'
3445*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xc4'
3446*da0073e9SAndroid Build Coastguard Worker                       b'\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00'
3447*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x002\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3448*da0073e9SAndroid Build Coastguard Worker
3449*da0073e9SAndroid Build Coastguard Worker        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'
3450*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x1b\x00\x07\x00tensor.bfloat16.BE/data.pklFB\x03\x00ZZZ\x80'
3451*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3452*da0073e9SAndroid Build Coastguard Worker                          b'h\nBFloat16Storage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq'
3453*da0073e9SAndroid Build Coastguard Worker                          b'\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq'
3454*da0073e9SAndroid Build Coastguard Worker                          b'\x08)Rq\ttq\nRq\x0b.PK\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03'
3455*da0073e9SAndroid Build Coastguard Worker                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3456*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x19\x00\x1c\x00tensor.bfloat16.BE/data/0FB\x18\x00ZZZZZZZZZZZZZZZZ'
3457*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZ@\r\xbei?r\xbf\xbcPK\x07\x08d\x02=\xc7\x08\x00\x00\x00\x08\x00\x00\x00PK'
3458*da0073e9SAndroid Build Coastguard Worker                          b'\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3459*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x1a\x000\x00tensor.bfloat16.BE/versionFB,\x00ZZZZZZZZZZZZZZZZZZ'
3460*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
3461*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00'
3462*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x9d\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3463*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00tensor.bfloat16.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3464*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00d\x02=\xc7\x08\x00\x00\x00\x08\x00\x00\x00\x19\x00\x00\x00\x00'
3465*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x00\x00\x00tensor.bfloat16.BE/data/0'
3466*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
3467*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x02\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x01'
3468*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00tensor.bfloat16.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03'
3469*da0073e9SAndroid Build Coastguard Worker                          b'-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00'
3470*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00'
3471*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x06\x07\x00\x00\x00\x00\xaa\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
3472*da0073e9SAndroid Build Coastguard Worker                          b'PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd8\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
3473*da0073e9SAndroid Build Coastguard Worker
3474*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3475*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1f\x00C\x00tensor.bfloat16.BE.BOM/data.pklFB?\x00ZZZZZZZZZ'
3476*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_re'
3477*da0073e9SAndroid Build Coastguard Worker                       b'build_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nBFloat16Storage\nq\x02'
3478*da0073e9SAndroid Build Coastguard Worker                       b'X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05QK\x00K\x02K\x02\x86'
3479*da0073e9SAndroid Build Coastguard Worker                       b'q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK'
3480*da0073e9SAndroid Build Coastguard Worker                       b'\x07\x08\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3481*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x15'
3482*da0073e9SAndroid Build Coastguard Worker                       b'\x00tensor.bfloat16.BE.BOM/byteorderFB\x11\x00ZZZZZZZZZZZZZZZZZbigPK\x07\x08I\xe2'
3483*da0073e9SAndroid Build Coastguard Worker                       b'\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00'
3484*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x002\x00tensor.b'
3485*da0073e9SAndroid Build Coastguard Worker                       b'float16.BE.BOM/data/0FB.\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ@\r\xbe'
3486*da0073e9SAndroid Build Coastguard Worker                       b'i?r\xbf\xbcPK\x07\x08d\x02=\xc7\x08\x00\x00\x00\x08\x00\x00\x00PK\x03\x04\x00\x00'
3487*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3488*da0073e9SAndroid Build Coastguard Worker                       b'\x1e\x00,\x00tensor.bfloat16.BE.BOM/versionFB(\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3489*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00'
3490*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x1f>\xd9\x7f\x9d\x00\x00\x00\x9d\x00'
3491*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3492*da0073e9SAndroid Build Coastguard Worker                       b'tensor.bfloat16.BE.BOM/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
3493*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00 \x00\x00\x00\x00\x00\x00'
3494*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00-\x01\x00\x00tensor.bfloat16.BE.BOM/byteorderPK\x01'
3495*da0073e9SAndroid Build Coastguard Worker                       b'\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00d\x02=\xc7\x08\x00\x00\x00\x08'
3496*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x01\x00'
3497*da0073e9SAndroid Build Coastguard Worker                       b'\x00tensor.bfloat16.BE.BOM/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3498*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00'
3499*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00tensor.bfloat16.BE.BOM/versionPK\x06'
3500*da0073e9SAndroid Build Coastguard Worker                       b'\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3501*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x002\x01\x00\x00\x00'
3502*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xc4\x03'
3503*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x00'
3504*da0073e9SAndroid Build Coastguard Worker                       b'2\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3505*da0073e9SAndroid Build Coastguard Worker
3506*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
3507*da0073e9SAndroid Build Coastguard Worker
3508*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3509*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
3510*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3511*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
3512*da0073e9SAndroid Build Coastguard Worker
3513*da0073e9SAndroid Build Coastguard Worker        try:
3514*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
3515*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
3516*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
3517*da0073e9SAndroid Build Coastguard Worker        finally:
3518*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3519*da0073e9SAndroid Build Coastguard Worker
3520*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
3521*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
3522*da0073e9SAndroid Build Coastguard Worker
3523*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3524*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3525*da0073e9SAndroid Build Coastguard Worker
3526*da0073e9SAndroid Build Coastguard Worker        try:
3527*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
3528*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3529*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3530*da0073e9SAndroid Build Coastguard Worker        finally:
3531*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3532*da0073e9SAndroid Build Coastguard Worker
3533*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3534*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3535*da0073e9SAndroid Build Coastguard Worker
3536*da0073e9SAndroid Build Coastguard Worker        try:
3537*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
3538*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3539*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3540*da0073e9SAndroid Build Coastguard Worker        finally:
3541*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3542*da0073e9SAndroid Build Coastguard Worker
3543*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3544*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3545*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3546*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3547*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3548*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3549*da0073e9SAndroid Build Coastguard Worker
3550*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
3551*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3552*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3553*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
3554*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
3555*da0073e9SAndroid Build Coastguard Worker        else:
3556*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
3557*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
3558*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3559*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3560*da0073e9SAndroid Build Coastguard Worker
3561*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_cdouble(self):
3562*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
3563*da0073e9SAndroid Build Coastguard Worker        #
3564*da0073e9SAndroid Build Coastguard Worker        # import torch
3565*da0073e9SAndroid Build Coastguard Worker        #
3566*da0073e9SAndroid Build Coastguard Worker        # x = torch.randn(2,2, dtype=torch.cdouble)
3567*da0073e9SAndroid Build Coastguard Worker        #
3568*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.cdouble.LE.pt", _disable_byteorder_record=True)
3569*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.cdouble.LE.BOM.pt")
3570*da0073e9SAndroid Build Coastguard Worker        #
3571*da0073e9SAndroid Build Coastguard Worker        # print(x)
3572*da0073e9SAndroid Build Coastguard Worker        #
3573*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
3574*da0073e9SAndroid Build Coastguard Worker        #
3575*da0073e9SAndroid Build Coastguard Worker        # import torch
3576*da0073e9SAndroid Build Coastguard Worker        #
3577*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.cdouble.LE.BOM.pt')
3578*da0073e9SAndroid Build Coastguard Worker        #
3579*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.cdouble.BE.pt', _disable_byteorder_record=True)
3580*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.cdouble.BE.BOM.pt')
3581*da0073e9SAndroid Build Coastguard Worker        #
3582*da0073e9SAndroid Build Coastguard Worker        # print(x)
3583*da0073e9SAndroid Build Coastguard Worker        #
3584*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3585*da0073e9SAndroid Build Coastguard Worker        #
3586*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
3587*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
3588*da0073e9SAndroid Build Coastguard Worker        # file.close()
3589*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
3590*da0073e9SAndroid Build Coastguard Worker        #
3591*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
3592*da0073e9SAndroid Build Coastguard Worker        #
3593*da0073e9SAndroid Build Coastguard Worker        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'
3594*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.cdouble.LE/data.pklFB\x04\x00ZZZZ\x80'
3595*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3596*da0073e9SAndroid Build Coastguard Worker                          b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3597*da0073e9SAndroid Build Coastguard Worker                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3598*da0073e9SAndroid Build Coastguard Worker                          b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3599*da0073e9SAndroid Build Coastguard Worker                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3600*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x18\x00\x18\x00tensor.cdouble.LE/data/0FB\x14\x00ZZZZZZZZZZZZZZZZZZ'
3601*da0073e9SAndroid Build Coastguard Worker                          b'ZZ\xd1/\x84\xd8,\x00\xcd\xbf|L\xcf\xd0O\xee\xd7\xbfb\xb6<\xb4\xe2_\xec?v+\x86\xd9'
3602*da0073e9SAndroid Build Coastguard Worker                          b'\xca\x0e\xf8?i#\xbb\xfcU\x1b\xe0\xbf\x984\xcd\x02q\x8a\xe9?\xc1_\xd7R\xe3\xfb\xe3'
3603*da0073e9SAndroid Build Coastguard Worker                          b'\xbf\xcf\xce>\xcd\xa2\x9f\xe8?PK\x07\x08\x1d\xed\xed\xa0@\x00\x00\x00@\x00\x00'
3604*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3605*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x19\x009\x00tensor.cdouble.LE/versionFB5\x00ZZZZZZZZZZZZZ'
3606*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02'
3607*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00(W{\xca'
3608*da0073e9SAndroid Build Coastguard Worker                          b'\xa2\x00\x00\x00\xa2\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3609*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00tensor.cdouble.LE/data.pklPK\x01\x02\x00\x00\x00\x00\x08'
3610*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x00\x00\x00\x00\x00\x00\x1d\xed\xed\xa0@\x00\x00\x00@\x00\x00\x00\x18\x00\x00'
3611*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00tensor.cdouble.LE/'
3612*da0073e9SAndroid Build Coastguard Worker                          b'data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00'
3613*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x02\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3614*da0073e9SAndroid Build Coastguard Worker                          b'\x90\x01\x00\x00tensor.cdouble.LE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00'
3615*da0073e9SAndroid Build Coastguard Worker                          b'\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03'
3616*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00'
3617*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x01\x00'
3618*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd5\x00\x00\x00\x12\x02\x00\x00'
3619*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00')
3620*da0073e9SAndroid Build Coastguard Worker
3621*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3622*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1e\x00\x04\x00tensor.cdouble.LE.BOM/data.pklFB\x00\x00\x80'
3623*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3624*da0073e9SAndroid Build Coastguard Worker                       b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3625*da0073e9SAndroid Build Coastguard Worker                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3626*da0073e9SAndroid Build Coastguard Worker                       b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3627*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3628*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x1f\x00\x11\x00tensor.cdouble.LE.BOM/byteorderFB\r\x00ZZZZZZZZZZZZZ'
3629*da0073e9SAndroid Build Coastguard Worker                       b'littlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00\x00\x08'
3630*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c'
3631*da0073e9SAndroid Build Coastguard Worker                       b'\x000\x00tensor.cdouble.LE.BOM/data/0FB,\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3632*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZ\xd1/\x84\xd8,\x00\xcd\xbf|L\xcf\xd0O\xee\xd7\xbfb\xb6<\xb4\xe2_\xec?'
3633*da0073e9SAndroid Build Coastguard Worker                       b'v+\x86\xd9\xca\x0e\xf8?i#\xbb\xfcU\x1b\xe0\xbf\x984\xcd\x02q\x8a\xe9?\xc1_\xd7R\xe3'
3634*da0073e9SAndroid Build Coastguard Worker                       b'\xfb\xe3\xbf\xcf\xce>\xcd\xa2\x9f\xe8?PK\x07\x08\x1d\xed\xed\xa0@\x00\x00\x00'
3635*da0073e9SAndroid Build Coastguard Worker                       b'@\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3636*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x1d\x005\x00tensor.cdouble.LE.BOM/versionFB1\x00'
3637*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00'
3638*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00'
3639*da0073e9SAndroid Build Coastguard Worker                       b'(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3640*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00tensor.cdouble.LE.BOM/data.pklPK\x01\x02\x00\x00'
3641*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00'
3642*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00te'
3643*da0073e9SAndroid Build Coastguard Worker                       b'nsor.cdouble.LE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
3644*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1d\xed\xed\xa0@\x00\x00\x00@\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00'
3645*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.cdouble.LE.BOM/data/0PK\x01\x02\x00'
3646*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00'
3647*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00te'
3648*da0073e9SAndroid Build Coastguard Worker                       b'nsor.cdouble.LE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00'
3649*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00'
3650*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00.\x01\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06'
3651*da0073e9SAndroid Build Coastguard Worker                       b'\x07\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06'
3652*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x04\x00\x04\x00.\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3653*da0073e9SAndroid Build Coastguard Worker
3654*da0073e9SAndroid Build Coastguard Worker        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'
3655*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x1a\x00\x08\x00tensor.cdouble.BE/data.pklFB\x04\x00ZZZZ\x80'
3656*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3657*da0073e9SAndroid Build Coastguard Worker                          b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3658*da0073e9SAndroid Build Coastguard Worker                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3659*da0073e9SAndroid Build Coastguard Worker                          b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3660*da0073e9SAndroid Build Coastguard Worker                          b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3661*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x18\x00\x18\x00tensor.cdouble.BE/data/0FB\x14\x00ZZZZZZZZZZZZZZZZZZ'
3662*da0073e9SAndroid Build Coastguard Worker                          b'ZZ\xbf\xcd\x00,\xd8\x84/\xd1\xbf\xd7\xeeO\xd0\xcfL|?\xec_\xe2\xb4<\xb6b?\xf8\x0e'
3663*da0073e9SAndroid Build Coastguard Worker                          b'\xca\xd9\x86+v\xbf\xe0\x1bU\xfc\xbb#i?\xe9\x8aq\x02\xcd4\x98\xbf\xe3\xfb\xe3R\xd7'
3664*da0073e9SAndroid Build Coastguard Worker                          b'_\xc1?\xe8\x9f\xa2\xcd>\xce\xcfPK\x07\x08\x91\xbey\x14@\x00\x00\x00@\x00\x00\x00'
3665*da0073e9SAndroid Build Coastguard Worker                          b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3666*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x19\x009\x00tensor.cdouble.BE/versionFB5\x00ZZZZZZZZZZZZZZZZ'
3667*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02'
3668*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00(W{\xca\xa2'
3669*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xa2\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3670*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00tensor.cdouble.BE/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08'
3671*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x91\xbey\x14@\x00\x00\x00@\x00\x00\x00\x18\x00\x00\x00'
3672*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00tensor.cdouble.BE/data/0'
3673*da0073e9SAndroid Build Coastguard Worker                          b'PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00'
3674*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x02\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90'
3675*da0073e9SAndroid Build Coastguard Worker                          b'\x01\x00\x00tensor.cdouble.BE/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e'
3676*da0073e9SAndroid Build Coastguard Worker                          b'\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00'
3677*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00'
3678*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00PK\x06\x07\x00\x00\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
3679*da0073e9SAndroid Build Coastguard Worker                          b'PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xd5\x00\x00\x00\x12\x02\x00\x00\x00'
3680*da0073e9SAndroid Build Coastguard Worker                          b'\x00')
3681*da0073e9SAndroid Build Coastguard Worker
3682*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3683*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x1e\x00\x04\x00tensor.cdouble.BE.BOM/data.pklFB\x00\x00\x80'
3684*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3685*da0073e9SAndroid Build Coastguard Worker                       b'h\nComplexDoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3686*da0073e9SAndroid Build Coastguard Worker                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDi'
3687*da0073e9SAndroid Build Coastguard Worker                       b'ct\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08(W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00PK\x03'
3688*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3689*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x1f\x00\x11\x00tensor.cdouble.BE.BOM/byteorderFB\r\x00ZZZZZZZZZZZZZ'
3690*da0073e9SAndroid Build Coastguard Worker                       b'bigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00\x00\x08'
3691*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c'
3692*da0073e9SAndroid Build Coastguard Worker                       b'\x003\x00tensor.cdouble.BE.BOM/data/0FB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3693*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZ\xbf\xcd\x00,\xd8\x84/\xd1\xbf\xd7\xeeO\xd0\xcfL|?\xec_\xe2\xb4<\xb6b'
3694*da0073e9SAndroid Build Coastguard Worker                       b'?\xf8\x0e\xca\xd9\x86+v\xbf\xe0\x1bU\xfc\xbb#i?\xe9\x8aq\x02\xcd4\x98\xbf\xe3\xfb'
3695*da0073e9SAndroid Build Coastguard Worker                       b'\xe3R\xd7_\xc1?\xe8\x9f\xa2\xcd>\xce\xcfPK\x07\x08\x91\xbey\x14@\x00\x00\x00@\x00'
3696*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3697*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x1d\x005\x00tensor.cdouble.BE.BOM/versionFB1\x00ZZZ'
3698*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00'
3699*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00('
3700*da0073e9SAndroid Build Coastguard Worker                       b'W{\xca\xa2\x00\x00\x00\xa2\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3701*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00tensor.cdouble.BE.BOM/data.pklPK\x01\x02\x00\x00\x00'
3702*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00'
3703*da0073e9SAndroid Build Coastguard Worker                       b'\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00tenso'
3704*da0073e9SAndroid Build Coastguard Worker                       b'r.cdouble.BE.BOM/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00'
3705*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x91\xbey\x14@\x00\x00\x00@\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3706*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00S\x01\x00\x00tensor.cdouble.BE.BOM/data/0PK\x01\x02\x00\x00\x00'
3707*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
3708*da0073e9SAndroid Build Coastguard Worker                       b'\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x00\x00tensor.c'
3709*da0073e9SAndroid Build Coastguard Worker                       b'double.BE.BOM/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00'
3710*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00'
3711*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00.\x01\x00\x00\x00\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00PK\x06\x07'
3712*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\xc0\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00'
3713*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x04\x00\x04\x00.\x01\x00\x00\x92\x02\x00\x00\x00\x00')
3714*da0073e9SAndroid Build Coastguard Worker
3715*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
3716*da0073e9SAndroid Build Coastguard Worker
3717*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3718*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
3719*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3720*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
3721*da0073e9SAndroid Build Coastguard Worker
3722*da0073e9SAndroid Build Coastguard Worker        try:
3723*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
3724*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
3725*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
3726*da0073e9SAndroid Build Coastguard Worker        finally:
3727*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3728*da0073e9SAndroid Build Coastguard Worker
3729*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
3730*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
3731*da0073e9SAndroid Build Coastguard Worker
3732*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3733*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3734*da0073e9SAndroid Build Coastguard Worker
3735*da0073e9SAndroid Build Coastguard Worker        try:
3736*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
3737*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3738*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3739*da0073e9SAndroid Build Coastguard Worker        finally:
3740*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3741*da0073e9SAndroid Build Coastguard Worker
3742*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3743*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3744*da0073e9SAndroid Build Coastguard Worker
3745*da0073e9SAndroid Build Coastguard Worker        try:
3746*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
3747*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3748*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3749*da0073e9SAndroid Build Coastguard Worker        finally:
3750*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3751*da0073e9SAndroid Build Coastguard Worker
3752*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3753*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3754*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3755*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3756*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3757*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3758*da0073e9SAndroid Build Coastguard Worker
3759*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
3760*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3761*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3762*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
3763*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
3764*da0073e9SAndroid Build Coastguard Worker        else:
3765*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
3766*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
3767*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3768*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3769*da0073e9SAndroid Build Coastguard Worker
3770*da0073e9SAndroid Build Coastguard Worker    def test_serialization_load_bom_data_cfloat(self):
3771*da0073e9SAndroid Build Coastguard Worker        # 1. Generated on LE system using following commands:
3772*da0073e9SAndroid Build Coastguard Worker        #
3773*da0073e9SAndroid Build Coastguard Worker        # import torch
3774*da0073e9SAndroid Build Coastguard Worker        #
3775*da0073e9SAndroid Build Coastguard Worker        # x = torch.randn(2,2, dtype=torch.cfloat)
3776*da0073e9SAndroid Build Coastguard Worker        #
3777*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.cfloat.LE.pt", _disable_byteorder_record=True)
3778*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, "tensor.cfloat.LE.BOM.pt")
3779*da0073e9SAndroid Build Coastguard Worker        #
3780*da0073e9SAndroid Build Coastguard Worker        # print(x)
3781*da0073e9SAndroid Build Coastguard Worker        #
3782*da0073e9SAndroid Build Coastguard Worker        # 2. After that it is resaved on BE system with following commands:
3783*da0073e9SAndroid Build Coastguard Worker        #
3784*da0073e9SAndroid Build Coastguard Worker        # import torch
3785*da0073e9SAndroid Build Coastguard Worker        #
3786*da0073e9SAndroid Build Coastguard Worker        # x = torch.load('tensor.cfloat.LE.BOM.pt')
3787*da0073e9SAndroid Build Coastguard Worker        #
3788*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.cfloat.BE.pt', _disable_byteorder_record=True)
3789*da0073e9SAndroid Build Coastguard Worker        # torch.save(x, 'tensor.cfloat.BE.BOM.pt')
3790*da0073e9SAndroid Build Coastguard Worker        #
3791*da0073e9SAndroid Build Coastguard Worker        # print(x)
3792*da0073e9SAndroid Build Coastguard Worker        #
3793*da0073e9SAndroid Build Coastguard Worker        # Following commands and a bit of manual work were used to produce python bytes from resulting files:
3794*da0073e9SAndroid Build Coastguard Worker        #
3795*da0073e9SAndroid Build Coastguard Worker        # file = open('filename', 'rb')
3796*da0073e9SAndroid Build Coastguard Worker        # data = file.read()
3797*da0073e9SAndroid Build Coastguard Worker        # file.close()
3798*da0073e9SAndroid Build Coastguard Worker        # print("\n".join(textwrap.wrap(str(data), 80)))
3799*da0073e9SAndroid Build Coastguard Worker        #
3800*da0073e9SAndroid Build Coastguard Worker        # BOM in this context is used as Byte Order Mark.
3801*da0073e9SAndroid Build Coastguard Worker        #
3802*da0073e9SAndroid Build Coastguard Worker        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'
3803*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.le/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3804*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3805*da0073e9SAndroid Build Coastguard Worker                          b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3806*da0073e9SAndroid Build Coastguard Worker                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3807*da0073e9SAndroid Build Coastguard Worker                          b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3808*da0073e9SAndroid Build Coastguard Worker                          b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3809*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x10\x00!\x00tensor.le/data/0FB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZ'
3810*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZ\x9e<5\xbe\x96\xd1\xf1=Q\xeaj\xbfiX\x02\xbfW`\xfe?+\xfd\x0c>;a\\\xbe.b\xe2>'
3811*da0073e9SAndroid Build Coastguard Worker                          b'PK\x07\x08\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00'
3812*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00!\x00'
3813*da0073e9SAndroid Build Coastguard Worker                          b'tensor.le/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9e'
3814*da0073e9SAndroid Build Coastguard Worker                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3815*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00\x00\x00\x00'
3816*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.le/data.pklPK\x01\x02\x00'
3817*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00'
3818*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00t'
3819*da0073e9SAndroid Build Coastguard Worker                          b'ensor.le/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9e'
3820*da0073e9SAndroid Build Coastguard Worker                          b'gU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3821*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00p\x01\x00\x00tensor.le/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00'
3822*da0073e9SAndroid Build Coastguard Worker                          b'\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03'
3823*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00'
3824*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00'
3825*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xbd\x00\x00\x00\xd2\x01\x00\x00'
3826*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00')
3827*da0073e9SAndroid Build Coastguard Worker
3828*da0073e9SAndroid Build Coastguard Worker        data_le_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3829*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.le/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3830*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3831*da0073e9SAndroid Build Coastguard Worker                       b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3832*da0073e9SAndroid Build Coastguard Worker                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3833*da0073e9SAndroid Build Coastguard Worker                       b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3834*da0073e9SAndroid Build Coastguard Worker                       b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3835*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x13\x00\x1e\x00tensor.le/byteorderFB\x1a\x00ZZZZZZZZZZZZZZZZZZ'
3836*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZlittlePK\x07\x08\x85=\xe3\x19\x06\x00\x00\x00\x06\x00\x00\x00PK\x03\x04\x00'
3837*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3838*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x10\x00<\x00tensor.le/data/0FB8\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3839*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\x9e<5\xbe\x96\xd1\xf1=Q\xeaj\xbfiX\x02\xbfW`\xfe?+\xfd\x0c>;'
3840*da0073e9SAndroid Build Coastguard Worker                       b'a\\\xbe.b\xe2>PK\x07\x08\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00'
3841*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3842*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x11\x00!\x00tensor.le/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
3843*da0073e9SAndroid Build Coastguard Worker                       b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
3844*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00'
3845*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.le/data.pk'
3846*da0073e9SAndroid Build Coastguard Worker                       b'lPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x85=\xe3\x19\x06\x00'
3847*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x06\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3848*da0073e9SAndroid Build Coastguard Worker                       b'\xf1\x00\x00\x00tensor.le/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00'
3849*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\xaa\x05\x14\x12 \x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00'
3850*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00V\x01\x00\x00tensor.le/data/0PK\x01\x02\x00\x00\x00'
3851*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00'
3852*da0073e9SAndroid Build Coastguard Worker                       b'\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.l'
3853*da0073e9SAndroid Build Coastguard Worker                       b'e/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00'
3854*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xfe'
3855*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00'
3856*da0073e9SAndroid Build Coastguard Worker                       b'\x00P\x03\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00'
3857*da0073e9SAndroid Build Coastguard Worker                       b'\x04\x00\xfe\x00\x00\x00R\x02\x00\x00\x00\x00')
3858*da0073e9SAndroid Build Coastguard Worker
3859*da0073e9SAndroid Build Coastguard Worker        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'
3860*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.be/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3861*da0073e9SAndroid Build Coastguard Worker                          b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3862*da0073e9SAndroid Build Coastguard Worker                          b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3863*da0073e9SAndroid Build Coastguard Worker                          b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3864*da0073e9SAndroid Build Coastguard Worker                          b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3865*da0073e9SAndroid Build Coastguard Worker                          b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3866*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x10\x00!\x00tensor.be/data/0FB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZ'
3867*da0073e9SAndroid Build Coastguard Worker                          b'ZZZZZ\xbe5<\x9e=\xf1\xd1\x96\xbfj\xeaQ\xbf\x02Xi?\xfe`W>\x0c\xfd+\xbe\\a;>\xe2b.'
3868*da0073e9SAndroid Build Coastguard Worker                          b'PK\x07\x08\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00'
3869*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00!\x00'
3870*da0073e9SAndroid Build Coastguard Worker                          b'tensor.be/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02'
3871*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
3872*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00'
3873*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.be/data.pklPK\x01\x02\x00\x00'
3874*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00'
3875*da0073e9SAndroid Build Coastguard Worker                          b'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00tensor.'
3876*da0073e9SAndroid Build Coastguard Worker                          b'be/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02'
3877*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3878*da0073e9SAndroid Build Coastguard Worker                          b'\x00p\x01\x00\x00tensor.be/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03'
3879*da0073e9SAndroid Build Coastguard Worker                          b'-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00'
3880*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00'
3881*da0073e9SAndroid Build Coastguard Worker                          b'\x00PK\x06\x07\x00\x00\x00\x00\x8f\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
3882*da0073e9SAndroid Build Coastguard Worker                          b'PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xbd\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
3883*da0073e9SAndroid Build Coastguard Worker
3884*da0073e9SAndroid Build Coastguard Worker        data_be_bom = (b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3885*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x12\x00\x10\x00tensor.be/data.pklFB\x0c\x00ZZZZZZZZZZZZ\x80'
3886*da0073e9SAndroid Build Coastguard Worker                       b'\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorc'
3887*da0073e9SAndroid Build Coastguard Worker                       b'h\nComplexFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04'
3888*da0073e9SAndroid Build Coastguard Worker                       b'tq\x05QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDic'
3889*da0073e9SAndroid Build Coastguard Worker                       b't\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00P'
3890*da0073e9SAndroid Build Coastguard Worker                       b'K\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3891*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x13\x00\x1e\x00tensor.be/byteorderFB\x1a\x00ZZZZZZZZZZZZZZZZZZ'
3892*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZbigPK\x07\x08I\xe2\xfb\xd3\x03\x00\x00\x00\x03\x00\x00\x00PK\x03\x04\x00'
3893*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3894*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x10\x00?\x00tensor.be/data/0FB;\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3895*da0073e9SAndroid Build Coastguard Worker                       b'ZZZZZZZZZZZZZZZZZZZ\xbe5<\x9e=\xf1\xd1\x96\xbfj\xeaQ\xbf\x02Xi?\xfe`W>\x0c\xfd+\xbe'
3896*da0073e9SAndroid Build Coastguard Worker                       b'\\a;>\xe2b.PK\x07\x08\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
3897*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3898*da0073e9SAndroid Build Coastguard Worker                       b'\x11\x00!\x00tensor.be/versionFB\x1d\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08'
3899*da0073e9SAndroid Build Coastguard Worker                       b'\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00'
3900*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\xe4\x04T\xec\xa1\x00\x00\x00\xa1\x00\x00\x00\x12\x00\x00'
3901*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.be/data.pklPK'
3902*da0073e9SAndroid Build Coastguard Worker                       b'\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00I\xe2\xfb\xd3\x03\x00\x00'
3903*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x03\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1'
3904*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00tensor.be/byteorderPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00'
3905*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\xe0\x07\xaa8 \x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00'
3906*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00S\x01\x00\x00tensor.be/data/0PK\x01\x02\x00\x00\x00\x00'
3907*da0073e9SAndroid Build Coastguard Worker                       b'\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x11\x00'
3908*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00tensor.be/vers'
3909*da0073e9SAndroid Build Coastguard Worker                       b'ionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00'
3910*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00'
3911*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00R\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00P\x03'
3912*da0073e9SAndroid Build Coastguard Worker                       b'\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x04\x00\x04'
3913*da0073e9SAndroid Build Coastguard Worker                       b'\x00\xfe\x00\x00\x00R\x02\x00\x00\x00\x00')
3914*da0073e9SAndroid Build Coastguard Worker
3915*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
3916*da0073e9SAndroid Build Coastguard Worker
3917*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom = io.BytesIO(data_le_no_bom)
3918*da0073e9SAndroid Build Coastguard Worker        buf_le_bom = io.BytesIO(data_le_bom)
3919*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
3920*da0073e9SAndroid Build Coastguard Worker        buf_be_bom = io.BytesIO(data_be_bom)
3921*da0073e9SAndroid Build Coastguard Worker
3922*da0073e9SAndroid Build Coastguard Worker        try:
3923*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.NATIVE)
3924*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom = torch.load(buf_le_no_bom)
3925*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom = torch.load(buf_be_no_bom)
3926*da0073e9SAndroid Build Coastguard Worker        finally:
3927*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3928*da0073e9SAndroid Build Coastguard Worker
3929*da0073e9SAndroid Build Coastguard Worker        tensor_le_bom = torch.load(buf_le_bom)
3930*da0073e9SAndroid Build Coastguard Worker        tensor_be_bom = torch.load(buf_be_bom)
3931*da0073e9SAndroid Build Coastguard Worker
3932*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3933*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3934*da0073e9SAndroid Build Coastguard Worker
3935*da0073e9SAndroid Build Coastguard Worker        try:
3936*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.LITTLE)
3937*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_little = torch.load(buf_le_no_bom)
3938*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_little = torch.load(buf_be_no_bom)
3939*da0073e9SAndroid Build Coastguard Worker        finally:
3940*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3941*da0073e9SAndroid Build Coastguard Worker
3942*da0073e9SAndroid Build Coastguard Worker        buf_le_no_bom.seek(0)
3943*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom.seek(0)
3944*da0073e9SAndroid Build Coastguard Worker
3945*da0073e9SAndroid Build Coastguard Worker        try:
3946*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(LoadEndianness.BIG)
3947*da0073e9SAndroid Build Coastguard Worker            tensor_le_no_bom_big = torch.load(buf_le_no_bom)
3948*da0073e9SAndroid Build Coastguard Worker            tensor_be_no_bom_big = torch.load(buf_be_no_bom)
3949*da0073e9SAndroid Build Coastguard Worker        finally:
3950*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
3951*da0073e9SAndroid Build Coastguard Worker
3952*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_bom, tensor_be_bom))
3953*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_no_bom))
3954*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_le_no_bom_little, tensor_le_bom))
3955*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_be_no_bom_little, tensor_be_bom))
3956*da0073e9SAndroid Build Coastguard Worker        self.assertFalse(torch.equal(tensor_le_no_bom_big, tensor_le_bom))
3957*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(torch.equal(tensor_be_no_bom_big, tensor_be_bom))
3958*da0073e9SAndroid Build Coastguard Worker
3959*da0073e9SAndroid Build Coastguard Worker        if (sys.byteorder == 'little'):
3960*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_le_bom))
3961*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_le_no_bom, tensor_be_bom))
3962*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_le_bom))
3963*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_be_no_bom, tensor_be_bom))
3964*da0073e9SAndroid Build Coastguard Worker        else:
3965*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_le_bom))
3966*da0073e9SAndroid Build Coastguard Worker            self.assertFalse(torch.equal(tensor_le_no_bom, tensor_be_bom))
3967*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_le_bom))
3968*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(torch.equal(tensor_be_no_bom, tensor_be_bom))
3969*da0073e9SAndroid Build Coastguard Worker
3970*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(platform.machine() != 's390x', "s390x-specific test")
3971*da0073e9SAndroid Build Coastguard Worker    def test_serialization_warning_s390x(self):
3972*da0073e9SAndroid Build Coastguard Worker        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'
3973*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x19\x00\t\x00tensor.double.BE/data.pklFB\x05\x00ZZZZZ\x80\x02'
3974*da0073e9SAndroid Build Coastguard Worker                          b'ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\n'
3975*da0073e9SAndroid Build Coastguard Worker                          b'DoubleStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x00\x00cpuq\x04K\x04tq\x05'
3976*da0073e9SAndroid Build Coastguard Worker                          b'QK\x00K\x02K\x02\x86q\x06K\x02K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08'
3977*da0073e9SAndroid Build Coastguard Worker                          b')Rq\ttq\nRq\x0b.PK\x07\x08S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00PK\x03\x04\x00'
3978*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3979*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x17\x00 \x00tensor.double.BE/data/0FB\x1c\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
3980*da0073e9SAndroid Build Coastguard Worker                          b'?\xc9^|\xff\xa4v\x97\xbf\xe9\xb0\x8dP\x8c\xbc\xce\xbf\xd3\xdb\xb7[\xef\x0e\xdc?\xde'
3981*da0073e9SAndroid Build Coastguard Worker                          b'\x00\xf9Q\x08\xb14PK\x07\x083@\x82/ \x00\x00\x00 \x00\x00\x00PK\x03\x04\x00\x00'
3982*da0073e9SAndroid Build Coastguard Worker                          b'\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3983*da0073e9SAndroid Build Coastguard Worker                          b'\x18\x00\x1a\x00tensor.double.BE/versionFB\x16\x00ZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07'
3984*da0073e9SAndroid Build Coastguard Worker                          b'\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08'
3985*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00S\xd3\xba&\x9b\x00\x00\x00\x9b\x00\x00\x00\x19\x00\x00'
3986*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tensor.double.BE/da'
3987*da0073e9SAndroid Build Coastguard Worker                          b'ta.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x003@\x82/ '
3988*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00 \x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
3989*da0073e9SAndroid Build Coastguard Worker                          b'\xeb\x00\x00\x00tensor.double.BE/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00'
3990*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00\x00'
3991*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x01\x00\x00tensor.double.BE/versionPK\x06\x06'
3992*da0073e9SAndroid Build Coastguard Worker                          b',\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
3993*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00'
3994*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\xd2\x01\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xa4\x02\x00'
3995*da0073e9SAndroid Build Coastguard Worker                          b'\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00'
3996*da0073e9SAndroid Build Coastguard Worker                          b'\xd2\x00\x00\x00\xd2\x01\x00\x00\x00\x00')
3997*da0073e9SAndroid Build Coastguard Worker
3998*da0073e9SAndroid Build Coastguard Worker        current_load_endian = get_default_load_endianness()
3999*da0073e9SAndroid Build Coastguard Worker
4000*da0073e9SAndroid Build Coastguard Worker        buf_be_no_bom = io.BytesIO(data_be_no_bom)
4001*da0073e9SAndroid Build Coastguard Worker
4002*da0073e9SAndroid Build Coastguard Worker        try:
4003*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(None)
4004*da0073e9SAndroid Build Coastguard Worker            with self.assertWarnsRegex(UserWarning, "The default load endianness for checkpoints "
4005*da0073e9SAndroid Build Coastguard Worker                                       "without a byteorder mark on big endian machines "
4006*da0073e9SAndroid Build Coastguard Worker                                       "was changed from 'native' to 'little' endian"):
4007*da0073e9SAndroid Build Coastguard Worker                tensor_be_no_bom = torch.load(buf_be_no_bom)
4008*da0073e9SAndroid Build Coastguard Worker        finally:
4009*da0073e9SAndroid Build Coastguard Worker            set_default_load_endianness(current_load_endian)
4010*da0073e9SAndroid Build Coastguard Worker
4011*da0073e9SAndroid Build Coastguard Worker    @parametrize('path_type', (str, pathlib.Path))
4012*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
4013*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(IS_WINDOWS, "NamedTemporaryFile on windows")
4014*da0073e9SAndroid Build Coastguard Worker    def test_serialization_mmap_loading(self, weights_only, path_type):
4015*da0073e9SAndroid Build Coastguard Worker        class DummyModel(torch.nn.Module):
4016*da0073e9SAndroid Build Coastguard Worker            def __init__(self):
4017*da0073e9SAndroid Build Coastguard Worker                super().__init__()
4018*da0073e9SAndroid Build Coastguard Worker                self.fc1 = torch.nn.Linear(3, 1024)
4019*da0073e9SAndroid Build Coastguard Worker                self.fc2 = torch.nn.Linear(1024, 5)
4020*da0073e9SAndroid Build Coastguard Worker
4021*da0073e9SAndroid Build Coastguard Worker            def forward(self, input):
4022*da0073e9SAndroid Build Coastguard Worker                return self.fc2(self.fc1(input))
4023*da0073e9SAndroid Build Coastguard Worker
4024*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as f:
4025*da0073e9SAndroid Build Coastguard Worker            f = path_type(f)
4026*da0073e9SAndroid Build Coastguard Worker            state_dict = DummyModel().state_dict()
4027*da0073e9SAndroid Build Coastguard Worker            torch.save(state_dict, f)
4028*da0073e9SAndroid Build Coastguard Worker            result = torch.load(f, mmap=True, weights_only=weights_only)
4029*da0073e9SAndroid Build Coastguard Worker            result_non_mmap = torch.load(f, mmap=False, weights_only=weights_only)
4030*da0073e9SAndroid Build Coastguard Worker
4031*da0073e9SAndroid Build Coastguard Worker        model_mmap_state_dict = DummyModel()
4032*da0073e9SAndroid Build Coastguard Worker        model_mmap_state_dict.load_state_dict(result)
4033*da0073e9SAndroid Build Coastguard Worker        model_non_mmap_state_dict = DummyModel()
4034*da0073e9SAndroid Build Coastguard Worker        model_non_mmap_state_dict.load_state_dict(result_non_mmap)
4035*da0073e9SAndroid Build Coastguard Worker        input = torch.randn(4, 3)
4036*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(model_mmap_state_dict(input), model_non_mmap_state_dict(input.clone()))
4037*da0073e9SAndroid Build Coastguard Worker
4038*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(not torch.cuda.is_available() or IS_WINDOWS,
4039*da0073e9SAndroid Build Coastguard Worker                     "CUDA is unavailable or NamedTemporaryFile on Windows")
4040*da0073e9SAndroid Build Coastguard Worker    def test_serialization_mmap_loading_with_map_location(self):
4041*da0073e9SAndroid Build Coastguard Worker        class DummyModel(torch.nn.Module):
4042*da0073e9SAndroid Build Coastguard Worker            def __init__(self):
4043*da0073e9SAndroid Build Coastguard Worker                super().__init__()
4044*da0073e9SAndroid Build Coastguard Worker                self.fc1 = torch.nn.Linear(3, 1024)
4045*da0073e9SAndroid Build Coastguard Worker                self.fc2 = torch.nn.Linear(1024, 5)
4046*da0073e9SAndroid Build Coastguard Worker
4047*da0073e9SAndroid Build Coastguard Worker            def forward(self, input):
4048*da0073e9SAndroid Build Coastguard Worker                return self.fc2(self.fc1(input))
4049*da0073e9SAndroid Build Coastguard Worker
4050*da0073e9SAndroid Build Coastguard Worker        # make sure mmap where tensors' location tags are not CPU does not crash
4051*da0073e9SAndroid Build Coastguard Worker        # zipfile will first be mmap-ed on CPU and storages are extracted using
4052*da0073e9SAndroid Build Coastguard Worker        # overall_storage[start_offset:end_offset] before running
4053*da0073e9SAndroid Build Coastguard Worker        # _{device}_deserialize, which moves the storage to device
4054*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as f:
4055*da0073e9SAndroid Build Coastguard Worker            with torch.device('cuda'):
4056*da0073e9SAndroid Build Coastguard Worker                m = DummyModel()
4057*da0073e9SAndroid Build Coastguard Worker            state_dict = m.state_dict()
4058*da0073e9SAndroid Build Coastguard Worker            torch.save(state_dict, f)
4059*da0073e9SAndroid Build Coastguard Worker            result = torch.load(f, mmap=True)
4060*da0073e9SAndroid Build Coastguard Worker            for v in result.values():
4061*da0073e9SAndroid Build Coastguard Worker                self.assertTrue(v.is_cuda)
4062*da0073e9SAndroid Build Coastguard Worker
4063*da0073e9SAndroid Build Coastguard Worker    def test_serialization_mmap_loading_options(self):
4064*da0073e9SAndroid Build Coastguard Worker        if IS_WINDOWS:
4065*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(RuntimeError, "Changing the default mmap options is currently not supported"):
4066*da0073e9SAndroid Build Coastguard Worker                torch.serialization.set_default_mmap_options(2)
4067*da0073e9SAndroid Build Coastguard Worker            return
4068*da0073e9SAndroid Build Coastguard Worker        m = torch.nn.Linear(3, 5)
4069*da0073e9SAndroid Build Coastguard Worker        sd = m.state_dict()
4070*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
4071*da0073e9SAndroid Build Coastguard Worker            torch.save(sd, f)
4072*da0073e9SAndroid Build Coastguard Worker            # with MmapVisibility.MAP_PRIVATE, should not be able to modify file
4073*da0073e9SAndroid Build Coastguard Worker            sd_loaded = torch.load(f.name, mmap=True)
4074*da0073e9SAndroid Build Coastguard Worker            sd_loaded['weight'][0][0] = 0
4075*da0073e9SAndroid Build Coastguard Worker            sd_loaded2 = torch.load(f.name, mmap=True)
4076*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(sd_loaded2['weight'], sd['weight'])
4077*da0073e9SAndroid Build Coastguard Worker            # with MmapVisibility.MAP_SHARED, should be able to modify file
4078*da0073e9SAndroid Build Coastguard Worker            torch.serialization.set_default_mmap_options(MAP_SHARED)
4079*da0073e9SAndroid Build Coastguard Worker            try:
4080*da0073e9SAndroid Build Coastguard Worker                sd_loaded = torch.load(f.name, mmap=True)
4081*da0073e9SAndroid Build Coastguard Worker                sd_loaded['weight'][0][0] = 0
4082*da0073e9SAndroid Build Coastguard Worker                sd_loaded2 = torch.load(f.name, mmap=True)
4083*da0073e9SAndroid Build Coastguard Worker                self.assertNotEqual(sd_loaded2['weight'], sd['weight'])
4084*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(sd_loaded2['weight'][0][0].item(), 0)
4085*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(sd_loaded2['weight'], sd_loaded['weight'])
4086*da0073e9SAndroid Build Coastguard Worker            finally:
4087*da0073e9SAndroid Build Coastguard Worker                torch.serialization.set_default_mmap_options(MAP_PRIVATE)
4088*da0073e9SAndroid Build Coastguard Worker
4089*da0073e9SAndroid Build Coastguard Worker    @parametrize('dtype', (torch.float8_e5m2, torch.float8_e4m3fn, torch.complex32))
4090*da0073e9SAndroid Build Coastguard Worker    @parametrize('weights_only', (True, False))
4091*da0073e9SAndroid Build Coastguard Worker    def test_serialization_dtype(self, dtype, weights_only):
4092*da0073e9SAndroid Build Coastguard Worker        """ Tests that newer dtypes can be serialized using `_rebuild_tensor_v3` """
4093*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
4094*da0073e9SAndroid Build Coastguard Worker            x = torch.arange(0.0, 100.0).to(dtype=dtype)
4095*da0073e9SAndroid Build Coastguard Worker            torch.save({'x': x, 'even': x[0::2], 'odd': x[1::2]}, f)
4096*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
4097*da0073e9SAndroid Build Coastguard Worker            y = torch.load(f, weights_only=weights_only)
4098*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(y['x'], x)
4099*da0073e9SAndroid Build Coastguard Worker            # Check that views are actually views
4100*da0073e9SAndroid Build Coastguard Worker            y['odd'][0] = torch.tensor(0.25, dtype=dtype)
4101*da0073e9SAndroid Build Coastguard Worker            y['even'][0] = torch.tensor(-0.25, dtype=dtype)
4102*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(y['x'][:2].to(dtype=torch.float32), torch.tensor([-0.25, 0.25]))
4103*da0073e9SAndroid Build Coastguard Worker
4104*da0073e9SAndroid Build Coastguard Worker    @parametrize('filename', (True, False))
4105*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(IS_WINDOWS, "NamedTemporaryFile on windows")
4106*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(IS_FBCODE, "miniz version differs between fbcode and oss")
4107*da0073e9SAndroid Build Coastguard Worker    def test_filewriter_metadata_writing(self, filename):
4108*da0073e9SAndroid Build Coastguard Worker        sd = torch.nn.Linear(3, 5).state_dict()
4109*da0073e9SAndroid Build Coastguard Worker        weight_nbytes = sd['weight'].untyped_storage().nbytes()
4110*da0073e9SAndroid Build Coastguard Worker        bias_nbytes = sd['bias'].untyped_storage().nbytes()
4111*da0073e9SAndroid Build Coastguard Worker        # TemporaryFileName will give a string
4112*da0073e9SAndroid Build Coastguard Worker        # NamedTemporaryFile will be treated as a buffer
4113*da0073e9SAndroid Build Coastguard Worker        file_creation_func = TemporaryFileName if filename else tempfile.NamedTemporaryFile
4114*da0073e9SAndroid Build Coastguard Worker
4115*da0073e9SAndroid Build Coastguard Worker        with file_creation_func() as f, file_creation_func() as g:
4116*da0073e9SAndroid Build Coastguard Worker            # save state_dict in f
4117*da0073e9SAndroid Build Coastguard Worker            torch.save(sd, f)
4118*da0073e9SAndroid Build Coastguard Worker            if not filename:
4119*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
4120*da0073e9SAndroid Build Coastguard Worker            # extract 'data.pkl' for use in our fake checkpoint
4121*da0073e9SAndroid Build Coastguard Worker            with torch.serialization._open_file_like(f, 'rb') as opened_file:
4122*da0073e9SAndroid Build Coastguard Worker                with torch.serialization._open_zipfile_reader(opened_file) as zip_file:
4123*da0073e9SAndroid Build Coastguard Worker                    data_file = io.BytesIO(zip_file.get_record('data.pkl'))
4124*da0073e9SAndroid Build Coastguard Worker                    data_0_offset = zip_file.get_record_offset('data/0')
4125*da0073e9SAndroid Build Coastguard Worker                    data_1_offset = zip_file.get_record_offset('data/1')
4126*da0073e9SAndroid Build Coastguard Worker
4127*da0073e9SAndroid Build Coastguard Worker            # write nulls for 'data/0' and 'data/1'
4128*da0073e9SAndroid Build Coastguard Worker            with open(f if filename else f.name, 'rb+') as opened_f:
4129*da0073e9SAndroid Build Coastguard Worker                opened_f.seek(data_0_offset)
4130*da0073e9SAndroid Build Coastguard Worker                opened_f.write(b'0' * weight_nbytes)
4131*da0073e9SAndroid Build Coastguard Worker                opened_f.seek(data_1_offset)
4132*da0073e9SAndroid Build Coastguard Worker                opened_f.write(b'0' * bias_nbytes)
4133*da0073e9SAndroid Build Coastguard Worker
4134*da0073e9SAndroid Build Coastguard Worker            with torch.serialization._open_zipfile_writer(g) as zip_file:
4135*da0073e9SAndroid Build Coastguard Worker                data_value = data_file.getvalue()
4136*da0073e9SAndroid Build Coastguard Worker                zip_file.write_record('data.pkl', data_value, len(data_value))
4137*da0073e9SAndroid Build Coastguard Worker                zip_file.write_record('byteorder', sys.byteorder, len(sys.byteorder))
4138*da0073e9SAndroid Build Coastguard Worker                # Only write metadata for storages
4139*da0073e9SAndroid Build Coastguard Worker                zip_file.write_record_metadata('data/0', weight_nbytes)
4140*da0073e9SAndroid Build Coastguard Worker                zip_file.write_record_metadata('data/1', bias_nbytes)
4141*da0073e9SAndroid Build Coastguard Worker
4142*da0073e9SAndroid Build Coastguard Worker            if not filename:
4143*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
4144*da0073e9SAndroid Build Coastguard Worker                g.seek(0)
4145*da0073e9SAndroid Build Coastguard Worker            sd_loaded = torch.load(g)
4146*da0073e9SAndroid Build Coastguard Worker            sd_loaded_ref = torch.load(f)
4147*da0073e9SAndroid Build Coastguard Worker            self.assertEqual(sd_loaded, sd_loaded_ref)
4148*da0073e9SAndroid Build Coastguard Worker
4149*da0073e9SAndroid Build Coastguard Worker    def run(self, *args, **kwargs):
4150*da0073e9SAndroid Build Coastguard Worker        with serialization_method(use_zip=True):
4151*da0073e9SAndroid Build Coastguard Worker            return super().run(*args, **kwargs)
4152*da0073e9SAndroid Build Coastguard Worker
4153*da0073e9SAndroid Build Coastguard Workerclass TestWrapperSubclass(torch.Tensor):
4154*da0073e9SAndroid Build Coastguard Worker    elem: torch.Tensor
4155*da0073e9SAndroid Build Coastguard Worker    __slots__ = ['elem', 'other']
4156*da0073e9SAndroid Build Coastguard Worker
4157*da0073e9SAndroid Build Coastguard Worker    @staticmethod
4158*da0073e9SAndroid Build Coastguard Worker    def __new__(cls, elem, *args, **kwargs):
4159*da0073e9SAndroid Build Coastguard Worker        # The wrapping tensor (TestSubclass) is just a meta tensor, so it
4160*da0073e9SAndroid Build Coastguard Worker        # doesn't hold any memory (meta tensor is generally the preferred type
4161*da0073e9SAndroid Build Coastguard Worker        # of tensor you want to make a subclass from)...
4162*da0073e9SAndroid Build Coastguard Worker        r = torch.Tensor._make_subclass(cls, elem.to('meta'), elem.requires_grad)
4163*da0073e9SAndroid Build Coastguard Worker        # ...the real tensor is held as an element on the tensor.
4164*da0073e9SAndroid Build Coastguard Worker        r.elem = elem
4165*da0073e9SAndroid Build Coastguard Worker        return r
4166*da0073e9SAndroid Build Coastguard Worker
4167*da0073e9SAndroid Build Coastguard Worker    def clone(self):
4168*da0073e9SAndroid Build Coastguard Worker        return type(self)(self.elem.clone())
4169*da0073e9SAndroid Build Coastguard Worker
4170*da0073e9SAndroid Build Coastguard Worker
4171*da0073e9SAndroid Build Coastguard Workerclass TestGetStateSubclass(torch.Tensor):
4172*da0073e9SAndroid Build Coastguard Worker    elem: torch.Tensor
4173*da0073e9SAndroid Build Coastguard Worker    __slots__ = ['elem']
4174*da0073e9SAndroid Build Coastguard Worker
4175*da0073e9SAndroid Build Coastguard Worker    @staticmethod
4176*da0073e9SAndroid Build Coastguard Worker    def __new__(cls, elem, *args, **kwargs):
4177*da0073e9SAndroid Build Coastguard Worker        # The wrapping tensor (TestSubclass) is just a meta tensor, so it
4178*da0073e9SAndroid Build Coastguard Worker        # doesn't hold any memory (meta tensor is generally the preferred type
4179*da0073e9SAndroid Build Coastguard Worker        # of tensor you want to make a subclass from)...
4180*da0073e9SAndroid Build Coastguard Worker        r = torch.Tensor._make_subclass(cls, elem.to('meta'), elem.requires_grad)
4181*da0073e9SAndroid Build Coastguard Worker        # ...the real tensor is held as an element on the tensor.
4182*da0073e9SAndroid Build Coastguard Worker        r.elem = elem
4183*da0073e9SAndroid Build Coastguard Worker        return r
4184*da0073e9SAndroid Build Coastguard Worker
4185*da0073e9SAndroid Build Coastguard Worker    def __getstate__(self):
4186*da0073e9SAndroid Build Coastguard Worker        return ("foo", getattr(self, "elem", None), self.__dict__)
4187*da0073e9SAndroid Build Coastguard Worker
4188*da0073e9SAndroid Build Coastguard Worker    def __setstate__(self, state):
4189*da0073e9SAndroid Build Coastguard Worker        marker, self.elem, self.__dict__ = state
4190*da0073e9SAndroid Build Coastguard Worker        if not marker == "foo":
4191*da0073e9SAndroid Build Coastguard Worker            raise RuntimeError("Invalid state for TestGetStateSubclass")
4192*da0073e9SAndroid Build Coastguard Worker        self.reloaded = True
4193*da0073e9SAndroid Build Coastguard Worker
4194*da0073e9SAndroid Build Coastguard Worker
4195*da0073e9SAndroid Build Coastguard Workerclass TestEmptySubclass(torch.Tensor):
4196*da0073e9SAndroid Build Coastguard Worker    ...
4197*da0073e9SAndroid Build Coastguard Worker
4198*da0073e9SAndroid Build Coastguard Worker
4199*da0073e9SAndroid Build Coastguard Workerclass TestSubclassSerialization(TestCase):
4200*da0073e9SAndroid Build Coastguard Worker    def test_tensor_subclass_wrapper_serialization(self):
4201*da0073e9SAndroid Build Coastguard Worker        wrapped_tensor = torch.rand(2)
4202*da0073e9SAndroid Build Coastguard Worker        my_tensor = TestWrapperSubclass(wrapped_tensor)
4203*da0073e9SAndroid Build Coastguard Worker
4204*da0073e9SAndroid Build Coastguard Worker        foo_val = "bar"
4205*da0073e9SAndroid Build Coastguard Worker        my_tensor.foo = foo_val
4206*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(my_tensor.foo, foo_val)
4207*da0073e9SAndroid Build Coastguard Worker
4208*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
4209*da0073e9SAndroid Build Coastguard Worker            torch.save(my_tensor, f)
4210*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
4211*da0073e9SAndroid Build Coastguard Worker            new_tensor = torch.load(f)
4212*da0073e9SAndroid Build Coastguard Worker
4213*da0073e9SAndroid Build Coastguard Worker        self.assertIsInstance(new_tensor, TestWrapperSubclass)
4214*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.elem, my_tensor.elem)
4215*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.foo, foo_val)
4216*da0073e9SAndroid Build Coastguard Worker
4217*da0073e9SAndroid Build Coastguard Worker    def test_tensor_subclass_getstate_overwrite(self):
4218*da0073e9SAndroid Build Coastguard Worker        wrapped_tensor = torch.rand(2)
4219*da0073e9SAndroid Build Coastguard Worker        my_tensor = TestGetStateSubclass(wrapped_tensor)
4220*da0073e9SAndroid Build Coastguard Worker
4221*da0073e9SAndroid Build Coastguard Worker        foo_val = "bar"
4222*da0073e9SAndroid Build Coastguard Worker        my_tensor.foo = foo_val
4223*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(my_tensor.foo, foo_val)
4224*da0073e9SAndroid Build Coastguard Worker
4225*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
4226*da0073e9SAndroid Build Coastguard Worker            torch.save(my_tensor, f)
4227*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
4228*da0073e9SAndroid Build Coastguard Worker            new_tensor = torch.load(f)
4229*da0073e9SAndroid Build Coastguard Worker
4230*da0073e9SAndroid Build Coastguard Worker        self.assertIsInstance(new_tensor, TestGetStateSubclass)
4231*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.elem, my_tensor.elem)
4232*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.foo, foo_val)
4233*da0073e9SAndroid Build Coastguard Worker        self.assertTrue(new_tensor.reloaded)
4234*da0073e9SAndroid Build Coastguard Worker
4235*da0073e9SAndroid Build Coastguard Worker    def test_tensor_subclass_deepcopy(self):
4236*da0073e9SAndroid Build Coastguard Worker        wrapped_tensor = torch.rand(2)
4237*da0073e9SAndroid Build Coastguard Worker        my_tensor = TestWrapperSubclass(wrapped_tensor)
4238*da0073e9SAndroid Build Coastguard Worker
4239*da0073e9SAndroid Build Coastguard Worker        foo_val = "bar"
4240*da0073e9SAndroid Build Coastguard Worker        my_tensor.foo = foo_val
4241*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(my_tensor.foo, foo_val)
4242*da0073e9SAndroid Build Coastguard Worker
4243*da0073e9SAndroid Build Coastguard Worker        new_tensor = deepcopy(my_tensor)
4244*da0073e9SAndroid Build Coastguard Worker
4245*da0073e9SAndroid Build Coastguard Worker        self.assertIsInstance(new_tensor, TestWrapperSubclass)
4246*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.elem, my_tensor.elem)
4247*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.foo, foo_val)
4248*da0073e9SAndroid Build Coastguard Worker
4249*da0073e9SAndroid Build Coastguard Worker    @parametrize('requires_grad', (True, False))
4250*da0073e9SAndroid Build Coastguard Worker    def test_cloned_deepcopy(self, requires_grad):
4251*da0073e9SAndroid Build Coastguard Worker        my_tensor = torch.rand(2, requires_grad=requires_grad, device='meta')
4252*da0073e9SAndroid Build Coastguard Worker
4253*da0073e9SAndroid Build Coastguard Worker        new_tensor = deepcopy(my_tensor)
4254*da0073e9SAndroid Build Coastguard Worker
4255*da0073e9SAndroid Build Coastguard Worker        self.assertEqual(new_tensor.requires_grad, my_tensor.requires_grad)
4256*da0073e9SAndroid Build Coastguard Worker
4257*da0073e9SAndroid Build Coastguard Worker    def test_empty_class_serialization(self):
4258*da0073e9SAndroid Build Coastguard Worker        tensor = TestEmptySubclass([1.])
4259*da0073e9SAndroid Build Coastguard Worker        # Ensures it runs fine
4260*da0073e9SAndroid Build Coastguard Worker        tensor2 = copy.copy(tensor)
4261*da0073e9SAndroid Build Coastguard Worker
4262*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
4263*da0073e9SAndroid Build Coastguard Worker            torch.save(tensor, f)
4264*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
4265*da0073e9SAndroid Build Coastguard Worker            tensor2 = torch.load(f)
4266*da0073e9SAndroid Build Coastguard Worker
4267*da0073e9SAndroid Build Coastguard Worker        tensor = TestEmptySubclass()
4268*da0073e9SAndroid Build Coastguard Worker        # Ensures it runs fine
4269*da0073e9SAndroid Build Coastguard Worker        # Note that tensor.data_ptr() == 0 here
4270*da0073e9SAndroid Build Coastguard Worker        tensor2 = copy.copy(tensor)
4271*da0073e9SAndroid Build Coastguard Worker
4272*da0073e9SAndroid Build Coastguard Worker        with BytesIOContext() as f:
4273*da0073e9SAndroid Build Coastguard Worker            torch.save(tensor, f)
4274*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
4275*da0073e9SAndroid Build Coastguard Worker            tensor2 = torch.load(f)
4276*da0073e9SAndroid Build Coastguard Worker
4277*da0073e9SAndroid Build Coastguard Worker    @skipIfTorchDynamo("name 'SYNTHETIC_LOCAL' is not defined")
4278*da0073e9SAndroid Build Coastguard Worker    def test_safe_globals_for_weights_only(self):
4279*da0073e9SAndroid Build Coastguard Worker        '''
4280*da0073e9SAndroid Build Coastguard Worker        Tests import semantic for tensor subclass and the {add/get/clear}_safe_globals APIs
4281*da0073e9SAndroid Build Coastguard Worker        '''
4282*da0073e9SAndroid Build Coastguard Worker        t = TwoTensor(torch.randn(2, 3), torch.randn(2, 3))
4283*da0073e9SAndroid Build Coastguard Worker        p = torch.nn.Parameter(t)
4284*da0073e9SAndroid Build Coastguard Worker        sd = OrderedDict([('t', t), ('p', p)])
4285*da0073e9SAndroid Build Coastguard Worker
4286*da0073e9SAndroid Build Coastguard Worker        with tempfile.NamedTemporaryFile() as f:
4287*da0073e9SAndroid Build Coastguard Worker            torch.save(sd, f)
4288*da0073e9SAndroid Build Coastguard Worker
4289*da0073e9SAndroid Build Coastguard Worker            # Loading tensor subclass with weights_only=True should fail
4290*da0073e9SAndroid Build Coastguard Worker            # since tensor subclass is not in safe_globals
4291*da0073e9SAndroid Build Coastguard Worker            with self.assertRaisesRegex(pickle.UnpicklingError,
4292*da0073e9SAndroid Build Coastguard Worker                                        "Unsupported global: GLOBAL torch.testing._internal.two_tensor.TwoTensor"):
4293*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
4294*da0073e9SAndroid Build Coastguard Worker                sd = torch.load(f, weights_only=True)
4295*da0073e9SAndroid Build Coastguard Worker
4296*da0073e9SAndroid Build Coastguard Worker            # Loading tensor subclass should work if the class is marked safe
4297*da0073e9SAndroid Build Coastguard Worker            f.seek(0)
4298*da0073e9SAndroid Build Coastguard Worker            try:
4299*da0073e9SAndroid Build Coastguard Worker                torch.serialization.add_safe_globals([TwoTensor])
4300*da0073e9SAndroid Build Coastguard Worker                self.assertTrue(torch.serialization.get_safe_globals() == [TwoTensor])
4301*da0073e9SAndroid Build Coastguard Worker                sd = torch.load(f, weights_only=True)
4302*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(sd['t'], t)
4303*da0073e9SAndroid Build Coastguard Worker                self.assertEqual(sd['p'], p)
4304*da0073e9SAndroid Build Coastguard Worker
4305*da0073e9SAndroid Build Coastguard Worker                # Should fail again when safe globals are cleared
4306*da0073e9SAndroid Build Coastguard Worker                torch.serialization.clear_safe_globals()
4307*da0073e9SAndroid Build Coastguard Worker                f.seek(0)
4308*da0073e9SAndroid Build Coastguard Worker                with self.assertRaisesRegex(pickle.UnpicklingError,
4309*da0073e9SAndroid Build Coastguard Worker                                            "Unsupported global: GLOBAL torch.testing._internal.two_tensor.TwoTensor"):
4310*da0073e9SAndroid Build Coastguard Worker                    torch.load(f, weights_only=True)
4311*da0073e9SAndroid Build Coastguard Worker            finally:
4312*da0073e9SAndroid Build Coastguard Worker                torch.serialization.clear_safe_globals()
4313*da0073e9SAndroid Build Coastguard Worker
4314*da0073e9SAndroid Build Coastguard Worker    @unittest.skipIf(not torch.cuda.is_available(), "map_location loads to cuda")
4315*da0073e9SAndroid Build Coastguard Worker    def test_tensor_subclass_map_location(self):
4316*da0073e9SAndroid Build Coastguard Worker        t = TwoTensor(torch.randn(2, 3), torch.randn(2, 3))
4317*da0073e9SAndroid Build Coastguard Worker        sd = {'t': t}
4318*da0073e9SAndroid Build Coastguard Worker
4319*da0073e9SAndroid Build Coastguard Worker        with TemporaryFileName() as f:
4320*da0073e9SAndroid Build Coastguard Worker            torch.save(sd, f)
4321*da0073e9SAndroid Build Coastguard Worker            sd_loaded = torch.load(f, map_location=torch.device('cuda:0'))
4322*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(sd_loaded['t'].device == torch.device('cuda:0'))
4323*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(sd_loaded['t'].a.device == torch.device('cuda:0'))
4324*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(sd_loaded['t'].b.device == torch.device('cuda:0'))
4325*da0073e9SAndroid Build Coastguard Worker            # make sure map_location is not propagated over multiple torch.load calls
4326*da0073e9SAndroid Build Coastguard Worker            sd_loaded = torch.load(f)
4327*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(sd_loaded['t'].device == torch.device('cpu'))
4328*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(sd_loaded['t'].a.device == torch.device('cpu'))
4329*da0073e9SAndroid Build Coastguard Worker            self.assertTrue(sd_loaded['t'].b.device == torch.device('cpu'))
4330*da0073e9SAndroid Build Coastguard Worker
4331*da0073e9SAndroid Build Coastguard Worker
4332*da0073e9SAndroid Build Coastguard Workerinstantiate_device_type_tests(TestBothSerialization, globals())
4333*da0073e9SAndroid Build Coastguard Workerinstantiate_parametrized_tests(TestSubclassSerialization)
4334*da0073e9SAndroid Build Coastguard Workerinstantiate_parametrized_tests(TestOldSerialization)
4335*da0073e9SAndroid Build Coastguard Workerinstantiate_parametrized_tests(TestSerialization)
4336*da0073e9SAndroid Build Coastguard Worker
4337*da0073e9SAndroid Build Coastguard Workerif __name__ == '__main__':
4338*da0073e9SAndroid Build Coastguard Worker    run_tests()
4339