提交 5b5735d6 authored 作者: Frederic Bastien's avatar Frederic Bastien

Fix a bug found with James in CudaNdarray.__getitem__ with negitave index.

Fix a bug found with new test. We did not raise correctly error when we where out of bound. Added more tests case that cover those case.
上级 989b631a
...@@ -1098,12 +1098,12 @@ CudaNdarray_Subscript(PyObject * py_self, PyObject * key) ...@@ -1098,12 +1098,12 @@ CudaNdarray_Subscript(PyObject * py_self, PyObject * key)
else if ((d_idx < 0) && (d_idx >= -d_dim)) else if ((d_idx < 0) && (d_idx >= -d_dim))
{ {
//end-based indexing //end-based indexing
offset += (d_dim - d_idx) * CudaNdarray_HOST_STRIDES(self)[0]; // d_idx is negative
offset += (d_dim + d_idx) * CudaNdarray_HOST_STRIDES(self)[0];
} }
else else
{ {
PyErr_SetString(PyExc_IndexError, "index out of bounds"); PyErr_SetString(PyExc_IndexError, "index out of bounds");
Py_DECREF(rval);
return NULL; return NULL;
} }
......
...@@ -257,32 +257,54 @@ def test_mapping_getitem_w_int(): ...@@ -257,32 +257,54 @@ def test_mapping_getitem_w_int():
print y print y
assert numpy.all(x == y) assert numpy.all(x == y)
def _cmpf(x,*y):
try:
x.__getitem__(y)
except IndexError:
pass
else:
raise Exception("Did not generate out or bound error")
dim =(2,) dim =(2,)
a = theano._asarray(numpy.random.rand(*dim), dtype='float32') a = theano._asarray(numpy.random.rand(*dim), dtype='float32')
_a = cuda_ndarray.CudaNdarray(a) _a = cuda_ndarray.CudaNdarray(a)
_cmp(numpy.asarray(_a[1]), a[1]) _cmp(numpy.asarray(_a[1]), a[1])
_cmp(numpy.asarray(_a[-1]), a[-1])
_cmp(numpy.asarray(_a[0]), a[0])
_cmp(numpy.asarray(_a[::1]), a[::1]) _cmp(numpy.asarray(_a[::1]), a[::1])
_cmp(numpy.asarray(_a[::-1]), a[::-1]) _cmp(numpy.asarray(_a[::-1]), a[::-1])
_cmp(numpy.asarray(_a[...]), a[...]) _cmp(numpy.asarray(_a[...]), a[...])
_cmpf(_a,2)
dim =() dim =()
a = theano._asarray(numpy.random.rand(*dim), dtype='float32') a = theano._asarray(numpy.random.rand(*dim), dtype='float32')
_a = cuda_ndarray.CudaNdarray(a) _a = cuda_ndarray.CudaNdarray(a)
_cmp(numpy.asarray(_a[...]), a[...]) _cmp(numpy.asarray(_a[...]), a[...])
#TODO: test slice err
#TODO: test tuple err
dim =(5,4,3,2) dim =(5,4,3,2)
a = theano._asarray(numpy.random.rand(*dim), dtype='float32') a = theano._asarray(numpy.random.rand(*dim), dtype='float32')
_a = cuda_ndarray.CudaNdarray(a) _a = cuda_ndarray.CudaNdarray(a)
_cmpf(_a,slice(-1),slice(-1),10,-10)
_cmpf(_a,slice(-1),slice(-1),-10,slice(-1))
_cmpf(_a,0,slice(0,-1,-20),-10)
_cmpf(_a,10)
_cmpf(_a,-10)
_cmp(numpy.asarray(_a[:,:,::-1, ::-1]), a[:,:,::-1,::-1]) _cmp(numpy.asarray(_a[:,:,::-1, ::-1]), a[:,:,::-1,::-1])
_cmp(numpy.asarray(_a[:,:,::-10, ::-10]), a[:,:,::-10,::-10])
_cmp(numpy.asarray(_a[:,:,1,-1]), a[:,:,1,-1]) _cmp(numpy.asarray(_a[:,:,1,-1]), a[:,:,1,-1])
_cmp(numpy.asarray(_a[:,:,-1,:]), a[:,:,-1,:]) _cmp(numpy.asarray(_a[:,:,-1,:]), a[:,:,-1,:])
_cmp(numpy.asarray(_a[:,::-2,-1,:]), a[:,::-2,-1,:]) _cmp(numpy.asarray(_a[:,::-2,-1,:]), a[:,::-2,-1,:])
_cmp(numpy.asarray(_a[:,::-20,-1,:]), a[:,::-20,-1,:])
_cmp(numpy.asarray(_a[:,::-2,-1]), a[:,::-2,-1]) _cmp(numpy.asarray(_a[:,::-2,-1]), a[:,::-2,-1])
_cmp(numpy.asarray(_a[0,::-2,-1]), a[0,::-2,-1]) _cmp(numpy.asarray(_a[0,::-2,-1]), a[0,::-2,-1])
_cmp(numpy.asarray(_a[1]), a[1]) _cmp(numpy.asarray(_a[1]), a[1])
_cmp(numpy.asarray(_a[-1]), a[-1])
_cmp(numpy.asarray(_a[-1,-1,-1,-2]), a[-1,-1,-1,-2])
_cmp(numpy.asarray(_a[...]), a[...]) _cmp(numpy.asarray(_a[...]), a[...])
def test_gemm_vector_vector(): def test_gemm_vector_vector():
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论