提交 746b85f4 authored 作者: Brandon T. Willard's avatar Brandon T. Willard

Remove Python 2.x pickle compatibility class and more stale pickle data tests

上级 af703ed2
...@@ -15,10 +15,6 @@ ...@@ -15,10 +15,6 @@
.. autoclass:: theano.misc.pkl_utils.StripPickler .. autoclass:: theano.misc.pkl_utils.StripPickler
.. autoclass:: theano.misc.pkl_utils.CompatUnpickler
.. seealso:: .. seealso::
:ref:`tutorial_loadsave` :ref:`tutorial_loadsave`
...@@ -7,9 +7,10 @@ import theano ...@@ -7,9 +7,10 @@ import theano
import tests.unittest_tools as utt import tests.unittest_tools as utt
from pickle import Unpickler
from theano import config, function, tensor from theano import config, function, tensor
from theano.compat import PY3 from theano.compat import PY3
from theano.misc.pkl_utils import CompatUnpickler
from theano.sandbox import multinomial from theano.sandbox import multinomial
from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams
from theano.gpuarray.multinomial import ( from theano.gpuarray.multinomial import (
...@@ -384,6 +385,6 @@ def test_unpickle_legacy_op(): ...@@ -384,6 +385,6 @@ def test_unpickle_legacy_op():
if not PY3: if not PY3:
with open(os.path.join(testfile_dir, fname), "r") as fp: with open(os.path.join(testfile_dir, fname), "r") as fp:
u = CompatUnpickler(fp) u = Unpickler(fp)
m = u.load() m = u.load()
assert isinstance(m, GPUAChoiceFromUniform) assert isinstance(m, GPUAChoiceFromUniform)
...@@ -13,9 +13,9 @@ import pytest ...@@ -13,9 +13,9 @@ import pytest
import numpy as np import numpy as np
from pickle import Unpickler
from theano import config from theano import config
from theano.compat import PY3
from theano.misc.pkl_utils import CompatUnpickler
from theano.gpuarray.type import ContextNotDefined from theano.gpuarray.type import ContextNotDefined
...@@ -37,10 +37,7 @@ def test_unpickle_gpuarray_as_numpy_ndarray_flag1(): ...@@ -37,10 +37,7 @@ def test_unpickle_gpuarray_as_numpy_ndarray_flag1():
fname = "GpuArray.pkl" fname = "GpuArray.pkl"
with open(os.path.join(testfile_dir, fname), "rb") as fp: with open(os.path.join(testfile_dir, fname), "rb") as fp:
if PY3: u = Unpickler(fp, encoding="latin1")
u = CompatUnpickler(fp, encoding="latin1")
else:
u = CompatUnpickler(fp)
with pytest.raises((ImportError, ContextNotDefined)): with pytest.raises((ImportError, ContextNotDefined)):
u.load() u.load()
finally: finally:
...@@ -56,10 +53,7 @@ def test_unpickle_gpuarray_as_numpy_ndarray_flag2(): ...@@ -56,10 +53,7 @@ def test_unpickle_gpuarray_as_numpy_ndarray_flag2():
fname = "GpuArray.pkl" fname = "GpuArray.pkl"
with open(os.path.join(testfile_dir, fname), "rb") as fp: with open(os.path.join(testfile_dir, fname), "rb") as fp:
if PY3: u = Unpickler(fp, encoding="latin1")
u = CompatUnpickler(fp, encoding="latin1")
else:
u = CompatUnpickler(fp)
try: try:
mat = u.load() mat = u.load()
except ImportError: except ImportError:
......
...@@ -5,10 +5,10 @@ import theano ...@@ -5,10 +5,10 @@ import theano
pygpu = pytest.importorskip("pygpu") pygpu = pytest.importorskip("pygpu")
from theano.compat import PY3 from pickle import Unpickler
from theano import config from theano import config
from theano.compile import DeepCopyOp, Rebroadcast, ViewOp from theano.compile import DeepCopyOp, Rebroadcast, ViewOp
from theano.misc.pkl_utils import CompatUnpickler
from theano.gpuarray.type import GpuArrayType, gpuarray_shared_constructor from theano.gpuarray.type import GpuArrayType, gpuarray_shared_constructor
from tests.gpuarray.config import test_ctx_name from tests.gpuarray.config import test_ctx_name
...@@ -122,10 +122,7 @@ def test_unpickle_gpuarray_as_numpy_ndarray_flag0(): ...@@ -122,10 +122,7 @@ def test_unpickle_gpuarray_as_numpy_ndarray_flag0():
fname = "GpuArray.pkl" fname = "GpuArray.pkl"
with open(os.path.join(testfile_dir, fname), "rb") as fp: with open(os.path.join(testfile_dir, fname), "rb") as fp:
if PY3: u = Unpickler(fp, encoding="latin1")
u = CompatUnpickler(fp, encoding="latin1")
else:
u = CompatUnpickler(fp)
mat = u.load() mat = u.load()
assert isinstance(mat, pygpu.gpuarray.GpuArray) assert isinstance(mat, pygpu.gpuarray.GpuArray)
assert np.asarray(mat)[0] == -42.0 assert np.asarray(mat)[0] == -42.0
......
import os
import sys
import numpy as np import numpy as np
import theano
import tests.unittest_tools as utt import tests.unittest_tools as utt
from theano import config, function, tensor from theano import config, function, tensor
from theano.sandbox import multinomial from theano.sandbox import multinomial
from theano.compat import PY3
from theano.misc.pkl_utils import CompatUnpickler
def test_n_samples_1(): def test_n_samples_1():
...@@ -51,40 +45,6 @@ def test_n_samples_2(): ...@@ -51,40 +45,6 @@ def test_n_samples_2():
assert res.sum() == i assert res.sum() == i
def test_n_samples_compatibility():
# This test checks if the new change to MultinomialFromUniform is still compatible
# with old interface. Here I will load a graph created (using the old interface) as follows:
# RandomStreams = theano.sandbox.rng_mrg.MRG_RandomStreams
# th_rng = RandomStreams(12345)
# X = T.matrix('X')
# pvals = T.exp(X)
# pvals = pvals / pvals.sum(axis=1, keepdims=True)
# samples = th_rng.multinomial(pvals=pvals)
# pickle.dump([X, samples], open("multinomial_test_graph.pkl", "w"))
folder = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(folder, "multinomial_test_graph.pkl"), "rb") as pkl_file:
if PY3:
u = CompatUnpickler(pkl_file, encoding="latin1")
else:
u = CompatUnpickler(pkl_file)
try:
X, samples = u.load()
except ImportError:
# Windows sometimes fail with nonsensical errors like:
# ImportError: No module named type
# ImportError: No module named copy_reg
# when "type" and "copy_reg" are builtin modules.
if sys.platform == "win32":
exc_type, exc_value, exc_trace = sys.exc_info()
raise
raise
f = theano.function([X], samples)
res = f(np.random.randn(20, 10))
assert np.all(res.sum(axis=1) == 1)
def test_multinomial_0(): def test_multinomial_0():
# This tests the MultinomialFromUniform Op directly, not going through the # This tests the MultinomialFromUniform Op directly, not going through the
# multinomial() call in GPU random generation. # multinomial() call in GPU random generation.
......
import numpy as np import numpy as np
import pytest import pytest
import os
from theano import config, function, tensor from theano import config, function, tensor
from theano.compat import PY3
from theano.misc.pkl_utils import CompatUnpickler
from theano.sandbox import multinomial from theano.sandbox import multinomial
from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams
...@@ -214,14 +212,3 @@ class TestFunction: ...@@ -214,14 +212,3 @@ class TestFunction:
avg_pvals /= avg_pvals.sum() avg_pvals /= avg_pvals.sum()
avg_diff = np.mean(abs(avg_pvals - pvals)) avg_diff = np.mean(abs(avg_pvals - pvals))
assert avg_diff < mean_rtol assert avg_diff < mean_rtol
def test_unpickle_legacy_op(self):
testfile_dir = os.path.dirname(os.path.realpath(__file__))
fname = "test_sandbox_multinomial_wo_replacement.pkl"
if not PY3:
with open(os.path.join(testfile_dir, fname), "r") as fp:
u = CompatUnpickler(fp)
m = u.load()
print(m)
assert isinstance(m, multinomial.ChoiceFromUniform)
...@@ -12,6 +12,9 @@ import sys ...@@ -12,6 +12,9 @@ import sys
import tempfile import tempfile
import zipfile import zipfile
import warnings import warnings
import theano
from collections import defaultdict from collections import defaultdict
from contextlib import closing from contextlib import closing
from pickle import HIGHEST_PROTOCOL from pickle import HIGHEST_PROTOCOL
...@@ -22,10 +25,7 @@ try: ...@@ -22,10 +25,7 @@ try:
except ImportError: except ImportError:
DEFAULT_PROTOCOL = HIGHEST_PROTOCOL DEFAULT_PROTOCOL = HIGHEST_PROTOCOL
import theano
from theano import config from theano import config
from theano.compat import PY3
from six import string_types
from theano.compile.sharedvalue import SharedVariable from theano.compile.sharedvalue import SharedVariable
__docformat__ = "restructuredtext en" __docformat__ = "restructuredtext en"
...@@ -80,93 +80,6 @@ class StripPickler(Pickler): ...@@ -80,93 +80,6 @@ class StripPickler(Pickler):
return Pickler.save(self, obj) return Pickler.save(self, obj)
# Make an unpickler that tries encoding byte streams before raising TypeError.
# This is useful with python 3, in order to unpickle files created with
# python 2.
# This code is taken from Pandas, https://github.com/pydata/pandas,
# under the same 3-clause BSD license.
def load_reduce(self):
stack = self.stack
args = stack.pop()
func = stack[-1]
try:
value = func(*args)
except Exception:
# try to reencode the arguments
if self.encoding is not None:
new_args = []
for arg in args:
if isinstance(arg, string_types):
new_args.append(arg.encode(self.encoding))
else:
new_args.append(arg)
args = tuple(new_args)
try:
stack[-1] = func(*args)
return
except Exception:
pass
# if self.is_verbose:
# print(sys.exc_info())
# print(func, args)
raise
stack[-1] = value
if PY3:
class CompatUnpickler(pickle._Unpickler):
"""
Allow to reload in python 3 some pickled numpy ndarray.
.. versionadded:: 0.8
Examples
--------
::
with open(fname, 'rb') as fp:
if PY3:
u = CompatUnpickler(fp, encoding="latin1")
else:
u = CompatUnpickler(fp)
mat = u.load()
"""
pass
# Register `load_reduce` defined above in CompatUnpickler
CompatUnpickler.dispatch[pickle.REDUCE[0]] = load_reduce
else:
class CompatUnpickler(pickle.Unpickler):
"""
Allow to reload in python 3 some pickled numpy ndarray.
.. versionadded:: 0.8
Examples
--------
::
with open(fname, 'rb') as fp:
if PY3:
u = CompatUnpickler(fp, encoding="latin1")
else:
u = CompatUnpickler(fp)
mat = u.load()
"""
pass
class PersistentNdarrayID(object): class PersistentNdarrayID(object):
"""Persist ndarrays in an object by saving them to a zip file. """Persist ndarrays in an object by saving them to a zip file.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论