Unverified 提交 f1e4ec47 authored 作者: Frédéric Bastien's avatar Frédéric Bastien 提交者: GitHub

Merge pull request #6749 from rebecca-palmer/numpy117scipy13

MAINT: Be compatible with numpy 1.17 and scipy 1.3
...@@ -552,7 +552,7 @@ TensorVariable ...@@ -552,7 +552,7 @@ TensorVariable
.. method:: nonzero_values(self) .. method:: nonzero_values(self)
.. method:: sort(self, axis=-1, kind='quicksort', order=None) .. method:: sort(self, axis=-1, kind='quicksort', order=None)
.. method:: argsort(self, axis=-1, kind='quicksort', order=None) .. method:: argsort(self, axis=-1, kind='quicksort', order=None)
.. method:: clip(self, a_min, a_max) .. method:: clip(self, a_min, a_max) with a_min <= a_max
.. method:: conf() .. method:: conf()
.. method:: repeat(repeats, axis=None) .. method:: repeat(repeats, axis=None)
.. method:: round(mode="half_away_from_zero") .. method:: round(mode="half_away_from_zero")
...@@ -1350,6 +1350,9 @@ Condition ...@@ -1350,6 +1350,9 @@ Condition
Normal broadcasting rules apply to each of `x`, `min`, and `max`. Normal broadcasting rules apply to each of `x`, `min`, and `max`.
Note that there is no warning for inputs that are the wrong way round
(`min > max`), and that results in this case may differ from ``numpy.clip``.
Bit-wise Bit-wise
-------- --------
......
...@@ -285,12 +285,13 @@ class TestComputeTestValue(unittest.TestCase): ...@@ -285,12 +285,13 @@ 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(
assert frame_info[2] == 'fx' frame_info[0])[1] == expected 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 moved below 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')),
...@@ -2850,6 +2846,18 @@ ClipTester = makeTester( ...@@ -2850,6 +2846,18 @@ ClipTester = makeTester(
) )
# min > max case - numpy.clip has changed but we haven't
# https://github.com/Theano/Theano/issues/6715
BackwardsClipTester = makeTester(
name='BackwardsClipTester',
op=clip,
expected=lambda x, y, z: np.where(x < y, y, np.minimum(x, z)),
good=dict(correct7=((5 * rand(5, 5)).astype('float64'),
np.array(1, dtype='float64'),
np.array(-1, dtype='float64')),)
)
class T_Clip(unittest.TestCase): class T_Clip(unittest.TestCase):
def test_complex_value(self): def test_complex_value(self):
for dtype in ['complex64', 'complex128']: for dtype in ['complex64', 'complex128']:
......
...@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论