提交 a56b1c23 authored 作者: lamblin's avatar lamblin

Merge pull request #404 from nouiz/fix_subtensor_crash

Fix subtensor crash
...@@ -168,6 +168,7 @@ Crashes fixed: ...@@ -168,6 +168,7 @@ Crashes fixed:
* Support for OSX Enthought Python Distribution 7.x. (Graham Taylor, Olivier) * Support for OSX Enthought Python Distribution 7.x. (Graham Taylor, Olivier)
* When the subtensor inputs had 0 dimensions and the outputs 0 dimensions. (Frederic) * When the subtensor inputs had 0 dimensions and the outputs 0 dimensions. (Frederic)
* Crash when the step to subtensor was not 1 in conjunction with some optimization. (Frederic, reported by Olivier Chapelle) * Crash when the step to subtensor was not 1 in conjunction with some optimization. (Frederic, reported by Olivier Chapelle)
* Runtime crash related to an optimization with subtensor of alloc (reported by Razvan, fixed by Frederic)
* Fix dot22scalar cast of integer scalars (Justin Bayer, Frédéric, Olivier) * Fix dot22scalar cast of integer scalars (Justin Bayer, Frédéric, Olivier)
* Fix runtime crash in gemm, dot22. FB * Fix runtime crash in gemm, dot22. FB
* Fix on 32bits computer: make sure all shape are int64.(Olivier) * Fix on 32bits computer: make sure all shape are int64.(Olivier)
......
#!/usr/bin/env python
#print info to check we link with witch version of blas #print info to check we link with witch version of blas
#test the speed of the blas gemm fct: #test the speed of the blas gemm fct:
#C=a*C+dot(A,B)*b #C=a*C+dot(A,B)*b
......
...@@ -1842,7 +1842,13 @@ def local_subtensor_of_alloc(node): ...@@ -1842,7 +1842,13 @@ def local_subtensor_of_alloc(node):
# If val was not copied over that dim, # If val was not copied over that dim,
# we need to take the appropriate subtensor on it. # we need to take the appropriate subtensor on it.
if i >= n_added_dims: if i >= n_added_dims:
val_slices.append(sl) # We check that the corresponding val dimensions was
# not a broadcasted dimensions.
if (val.type.ndim > (i - n_added_dims) and
val.type.broadcastable[i - n_added_dims]):
val_slices.append(slice(None))
else:
val_slices.append(sl)
csl, _ = T.get_canonical_form_slice(sl, dim) csl, _ = T.get_canonical_form_slice(sl, dim)
if type(csl) is not slice: if type(csl) is not slice:
...@@ -2865,6 +2871,7 @@ register_canonicalize(local_neg_to_mul) ...@@ -2865,6 +2871,7 @@ register_canonicalize(local_neg_to_mul)
@gof.local_optimizer([]) @gof.local_optimizer([])
def local_sum_mul_by_scalar(node): def local_sum_mul_by_scalar(node):
"""sum(scalar * smth) -> scalar * sum(smth) """sum(scalar * smth) -> scalar * sum(smth)
sum(-smth) -> -sum(smth)
""" """
# TODO: if the the thing inside the Sum is a division, # TODO: if the the thing inside the Sum is a division,
# we should get at the numerator.... # we should get at the numerator....
......
...@@ -2073,18 +2073,6 @@ class Test_alloc_zero(unittest.TestCase): ...@@ -2073,18 +2073,6 @@ class Test_alloc_zero(unittest.TestCase):
def test_local_subtensor_of_alloc(): def test_local_subtensor_of_alloc():
x = tensor.matrix('x') x = tensor.matrix('x')
y = tensor.vector('y')
# The rows of yx are copies of y
yx = tensor.alloc(y, x.shape[0], x.shape[1])
# Slice of each row
z_mat = yx[:, 3:]
assert z_mat.ndim == 2
# Only one column
z_vec = yx[:, 3]
assert z_vec.ndim == 1
# DebugMode should detect if something goes wrong. # DebugMode should detect if something goes wrong.
# test shape combination of odd and event shape. # test shape combination of odd and event shape.
...@@ -2093,22 +2081,35 @@ def test_local_subtensor_of_alloc(): ...@@ -2093,22 +2081,35 @@ def test_local_subtensor_of_alloc():
xval = numpy.zeros(shape, dtype=config.floatX) xval = numpy.zeros(shape, dtype=config.floatX)
yval = numpy.arange(shape[1], dtype=config.floatX) yval = numpy.arange(shape[1], dtype=config.floatX)
for slices in [ for y in [theano.shared(yval), tensor.constant([1.])]:
# results are vector
(slice(None), 3), # The rows of yx are copies of y
(2, slice(None)), yx = tensor.alloc(y, x.shape[0], x.shape[1])
# results are matrix
(slice(None), slice(3, None)), # Slice of each row
(slice(3, None), ), z_mat = yx[:, 3:]
(slice(3, None), slice(3, None)), assert z_mat.ndim == 2
(slice(1, 3), slice(None, -1)),
(slice(None, None, 2)), # Only one column
(slice(1, None, 2)), z_vec = yx[:, 3]
]: assert z_vec.ndim == 1
z = yx.__getitem__(slices)
f = theano.function([x, y], z) for slices in [
val = f(xval, yval) # results are vector
assert xval.__getitem__(slices).shape == val.shape (slice(None), 3),
(2, slice(None)),
# results are matrix
(slice(None), slice(3, None)),
(slice(3, None), ),
(slice(3, None), slice(3, None)),
(slice(1, 3), slice(None, -1)),
(slice(None, None, 2)),
(slice(1, None, 2)),
]:
z = yx.__getitem__(slices)
f = theano.function([x], z)
val = f(xval)
assert xval.__getitem__(slices).shape == val.shape
def test_local_fill_useless(): def test_local_fill_useless():
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论