提交 31f86c5c authored 作者: Jerry James and Rebecca N. Palmer's avatar Jerry James and Rebecca N. Palmer 提交者: Rebecca N. Palmer

MAINT: Be compatible with numpy 1.17 and scipy 1.3

Fixes #6715. Includes and supersedes #6721.
上级 c86a0e02
...@@ -285,12 +285,12 @@ class TestComputeTestValue(unittest.TestCase): ...@@ -285,12 +285,12 @@ class TestComputeTestValue(unittest.TestCase):
except ValueError: except ValueError:
# Get traceback # Get traceback
tb = sys.exc_info()[2] tb = sys.exc_info()[2]
# Get frame info 4 layers up frame_infos = traceback.extract_tb(tb)
frame_info = traceback.extract_tb(tb)[-5]
# We should be in the "fx" function defined above # We should be in the "fx" function defined above
expected = 'test_compute_test_value.py' expected = 'test_compute_test_value.py'
assert os.path.split(frame_info[0])[1] == expected, frame_info assert any((os.path.split(frame_info[0])[1] == expected
assert frame_info[2] == 'fx' and frame_info[2] == 'fx') for frame_info
in frame_infos), frame_infos
finally: finally:
theano.config.compute_test_value = orig_compute_test_value theano.config.compute_test_value = orig_compute_test_value
......
...@@ -160,7 +160,15 @@ def sparse_random_inputs(format, shape, n=1, out_dtype=None, p=0.5, gap=None, ...@@ -160,7 +160,15 @@ def sparse_random_inputs(format, shape, n=1, out_dtype=None, p=0.5, gap=None,
if unsorted_indices: if unsorted_indices:
for idx in range(n): for idx in range(n):
d = data[idx] d = data[idx]
d = d[list(range(d.shape[0]))] # these flip the matrix, but it's random anyway
if format == 'csr':
d = scipy.sparse.csr_matrix(
(d.data, d.shape[1] - 1 - d.indices, d.indptr),
shape=d.shape)
if format == 'csc':
d = scipy.sparse.csc_matrix(
(d.data, d.shape[0] - 1 - d.indices, d.indptr),
shape=d.shape)
assert not d.has_sorted_indices assert not d.has_sorted_indices
data[idx] = d data[idx] = d
if explicit_zero: if explicit_zero:
......
...@@ -45,6 +45,10 @@ class SortOp(theano.Op): ...@@ -45,6 +45,10 @@ class SortOp(theano.Op):
def perform(self, node, inputs, output_storage): def perform(self, node, inputs, output_storage):
a = inputs[0] a = inputs[0]
axis = inputs[1] axis = inputs[1]
if axis is not None:
if axis != int(axis):
raise ValueError("sort axis must be an integer or None")
axis = int(axis)
z = output_storage[0] z = output_storage[0]
z[0] = np.sort(a, axis, self.kind, self.order) z[0] = np.sort(a, axis, self.kind, self.order)
...@@ -172,6 +176,10 @@ class ArgSortOp(theano.Op): ...@@ -172,6 +176,10 @@ class ArgSortOp(theano.Op):
def perform(self, node, inputs, output_storage): def perform(self, node, inputs, output_storage):
a = inputs[0] a = inputs[0]
axis = inputs[1] axis = inputs[1]
if axis is not None:
if axis != int(axis):
raise ValueError("sort axis must be an integer or None")
axis = int(axis)
z = output_storage[0] z = output_storage[0]
z[0] = theano._asarray(np.argsort(a, axis, self.kind, self.order), z[0] = theano._asarray(np.argsort(a, axis, self.kind, self.order),
dtype=node.outputs[0].dtype) dtype=node.outputs[0].dtype)
......
...@@ -2835,11 +2835,7 @@ ClipTester = makeTester( ...@@ -2835,11 +2835,7 @@ ClipTester = makeTester(
correct6=(randint(5, 5).astype('int64'), correct6=(randint(5, 5).astype('int64'),
np.array(-1, dtype='int64'), np.array(-1, dtype='int64'),
np.array(1, dtype='int64')), np.array(1, dtype='int64')),
# min > max. messed up behaviour, but # min > max case removed as numpy has changed
# should be same as NumPy's
correct7=((5 * rand(5, 5)).astype('float64'),
np.array(1, dtype='float64'),
np.array(-1, dtype='float64')),
correct8=(randint(0, 5).astype('uint8'), correct8=(randint(0, 5).astype('uint8'),
np.array(2, dtype='uint8'), np.array(2, dtype='uint8'),
np.array(4, dtype='uint8')), np.array(4, dtype='uint8')),
......
...@@ -678,10 +678,10 @@ class T_random_function(utt.InferShapeTester): ...@@ -678,10 +678,10 @@ class T_random_function(utt.InferShapeTester):
numpy_val1c = as_floatX(numpy_rng.uniform(low=[-4.], high=[-1])) numpy_val1c = as_floatX(numpy_rng.uniform(low=[-4.], high=[-1]))
assert np.all(val0c == numpy_val0c) assert np.all(val0c == numpy_val0c)
assert np.all(val1c == numpy_val1c) assert np.all(val1c == numpy_val1c)
self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1, 0], [1]) #self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1, 0], [1])
self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1, 0], [1, 2]) self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1, 0], [1, 2])
self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1, 0], [2, 1]) self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1, 0], [2, 1])
self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1], [1]) #self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1], [1])
# TODO: do we want that? # TODO: do we want that?
#self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1], [2]) #self.assertRaises(ValueError, fc, post1c, [-4., -2], [-1], [2])
......
...@@ -466,10 +466,10 @@ class T_SharedRandomStreams(unittest.TestCase): ...@@ -466,10 +466,10 @@ class T_SharedRandomStreams(unittest.TestCase):
numpy_val1c = numpy_rng.uniform(low=[-4.], high=[-1]) numpy_val1c = numpy_rng.uniform(low=[-4.], high=[-1])
assert np.all(val0c == numpy_val0c) assert np.all(val0c == numpy_val0c)
assert np.all(val1c == numpy_val1c) assert np.all(val1c == numpy_val1c)
self.assertRaises(ValueError, fc, [-4., -2], [-1, 0], [1]) #self.assertRaises(ValueError, fc, [-4., -2], [-1, 0], [1])
self.assertRaises(ValueError, fc, [-4., -2], [-1, 0], [1, 2]) self.assertRaises(ValueError, fc, [-4., -2], [-1, 0], [1, 2])
self.assertRaises(ValueError, fc, [-4., -2], [-1, 0], [2, 1]) self.assertRaises(ValueError, fc, [-4., -2], [-1, 0], [2, 1])
self.assertRaises(ValueError, fc, [-4., -2], [-1], [1]) #self.assertRaises(ValueError, fc, [-4., -2], [-1], [1])
# TODO: do we want that? # TODO: do we want that?
#self.assertRaises(ValueError, fc, [-4., -2], [-1], [2]) #self.assertRaises(ValueError, fc, [-4., -2], [-1], [2])
......
...@@ -247,6 +247,15 @@ class _tensor_py_operators(object): ...@@ -247,6 +247,15 @@ class _tensor_py_operators(object):
def __rpow__(self, other): def __rpow__(self, other):
return theano.tensor.basic.pow(other, self) return theano.tensor.basic.pow(other, self)
def __ceil__(self):
return theano.tensor.ceil(self)
def __floor__(self):
return theano.tensor.floor(self)
def __trunc__(self):
return theano.tensor.trunc(self)
# TRANSPOSE # TRANSPOSE
T = property(lambda self: theano.tensor.basic.transpose(self)) T = property(lambda self: theano.tensor.basic.transpose(self))
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论