提交 2f0aa480 authored 作者: lamblin's avatar lamblin

Merge pull request #1429 from nouiz/err_msg_test_compute_value

fix gh-1133, don't replace error message from compute_test_value.
...@@ -44,6 +44,10 @@ def execute(execute=True, verbose=True, M=2000, N=2000, K=2000, ...@@ -44,6 +44,10 @@ def execute(execute=True, verbose=True, M=2000, N=2000, K=2000,
print ' compiledir=', theano.config.compiledir print ' compiledir=', theano.config.compiledir
print ' floatX=', theano.config.floatX print ' floatX=', theano.config.floatX
print ' device=', theano.config.device print ' device=', theano.config.device
print 'Some OS information:'
print ' sys.platform=', sys.platform
print ' sys.version=', sys.version
print ' sys.prefix=', sys.prefix
print 'Some environment variables:' print 'Some environment variables:'
print ' MKL_NUM_THREADS=', os.getenv('MKL_NUM_THREADS') print ' MKL_NUM_THREADS=', os.getenv('MKL_NUM_THREADS')
print ' OMP_NUM_THREADS=', os.getenv('OMP_NUM_THREADS') print ' OMP_NUM_THREADS=', os.getenv('OMP_NUM_THREADS')
......
...@@ -106,8 +106,11 @@ try: ...@@ -106,8 +106,11 @@ try:
strides = [1] strides = [1]
for i in x.shape[::-1][:-1]: for i in x.shape[::-1][:-1]:
strides.append(strides[-1]*i) strides.append(strides[-1]*i)
strides = tuple(strides[::-1]) strides = strides[::-1]
for i in range(len(strides)):
if x.shape[i] == 1:
strides[i] = 0
strides = tuple(strides)
import ctypes import ctypes
ptr_long = long(ctypes.cast(x._base.mat.data_device, ctypes.c_void_p).value) ptr_long = long(ctypes.cast(x._base.mat.data_device, ctypes.c_void_p).value)
......
...@@ -63,3 +63,16 @@ def test2(shape=(3, 4, 5)): ...@@ -63,3 +63,16 @@ def test2(shape=(3, 4, 5)):
assert A_cnd.gpudata == B.gpudata assert A_cnd.gpudata == B.gpudata
v = numpy.asarray(B) v = numpy.asarray(B)
assert (v == A).all() assert (v == A).all()
def test_broadcast_dims():
"""
Test with some dimensions being 1.
CudaNdarray use 0 for strides for those dimensions.
"""
test((1, 2, 3))
test((2, 1, 3))
test((2, 3, 1))
test2((1, 2, 3))
test2((2, 1, 3))
test2((2, 3, 1))
...@@ -69,6 +69,13 @@ class ShapeError(Exception): ...@@ -69,6 +69,13 @@ class ShapeError(Exception):
pass pass
class AsTensorError(TypeError):
"""Raised when as_tensor_variable isn't able to create a
TensorVariable.
"""
pass
def check_equal_numpy(x, y): def check_equal_numpy(x, y):
""" """
Returns True iff x and y are equal (checks the dtype and Returns True iff x and y are equal (checks the dtype and
...@@ -151,8 +158,8 @@ def as_tensor_variable(x, name=None, ndim=None): ...@@ -151,8 +158,8 @@ def as_tensor_variable(x, name=None, ndim=None):
not possible. not possible.
:Exceptions: :Exceptions:
- `ValueError`: raised if an `Apply` with no default output is fetched - `ValueError`: raised if an `Apply` with more then one output is fetched
- `TypeError`: raised if `x` cannot be converted to a TensorType Variable - `AsTensorError`: raised if `x` cannot be converted to a TensorType Variable
""" """
if hasattr(x, '_as_TensorVariable'): if hasattr(x, '_as_TensorVariable'):
...@@ -171,7 +178,7 @@ def as_tensor_variable(x, name=None, ndim=None): ...@@ -171,7 +178,7 @@ def as_tensor_variable(x, name=None, ndim=None):
x = tensor_from_scalar(x) x = tensor_from_scalar(x)
if not isinstance(x.type, TensorType): if not isinstance(x.type, TensorType):
raise TypeError( raise AsTensorError(
"Variable type field must be a TensorType.", x, x.type) "Variable type field must be a TensorType.", x, x.type)
if ndim is None: if ndim is None:
...@@ -194,7 +201,7 @@ def as_tensor_variable(x, name=None, ndim=None): ...@@ -194,7 +201,7 @@ def as_tensor_variable(x, name=None, ndim=None):
pass pass
if isinstance(x, bool): if isinstance(x, bool):
raise TypeError( raise AsTensorError(
"Cannot cast True or False as a tensor variable. Please use 1 or " "Cannot cast True or False as a tensor variable. Please use 1 or "
"0. This error might be caused by using the == operator on " "0. This error might be caused by using the == operator on "
"Variables. v == w does not do what you think it does, " "Variables. v == w does not do what you think it does, "
...@@ -207,7 +214,7 @@ def as_tensor_variable(x, name=None, ndim=None): ...@@ -207,7 +214,7 @@ def as_tensor_variable(x, name=None, ndim=None):
str_x = str(x) str_x = str(x)
except Exception: except Exception:
str_x = repr(x) str_x = repr(x)
raise TypeError("Cannot convert %s to TensorType" % str_x, type(x)) raise AsTensorError("Cannot convert %s to TensorType" % str_x, type(x))
# this has a different name, because _as_tensor_variable is the # this has a different name, because _as_tensor_variable is the
# function which ops use to upcast their arguments... this # function which ops use to upcast their arguments... this
...@@ -1584,9 +1591,9 @@ class _tensor_py_operators: ...@@ -1584,9 +1591,9 @@ class _tensor_py_operators:
# Otherwise this will convert error when Theano flags # Otherwise this will convert error when Theano flags
# compute_test_value is used # compute_test_value is used
# Evidently, we need to catch NotImplementedError # Evidently, we need to catch NotImplementedError
# But we also need to catch TypeError # TypeError from as_tensor_variable are caught in Elemwise.make_node
# Oterwise TensorVariable * SparseVariable won't work! # Oterwise TensorVariable * SparseVariable won't work!
except (NotImplementedError, TypeError): except (NotImplementedError, AsTensorError):
# We must return NotImplemented and not an # We must return NotImplemented and not an
# NotImplementedError or raise an NotImplementedError. # NotImplementedError or raise an NotImplementedError.
# That way python will give a good error message like this # That way python will give a good error message like this
...@@ -1599,7 +1606,7 @@ class _tensor_py_operators: ...@@ -1599,7 +1606,7 @@ class _tensor_py_operators:
# and the return value in that case # and the return value in that case
try: try:
return sub(self, other) return sub(self, other)
except (NotImplementedError, TypeError): except (NotImplementedError, AsTensorError):
return NotImplemented return NotImplemented
def __mul__(self, other): def __mul__(self, other):
...@@ -1607,7 +1614,7 @@ class _tensor_py_operators: ...@@ -1607,7 +1614,7 @@ class _tensor_py_operators:
# and the return value in that case # and the return value in that case
try: try:
return mul(self, other) return mul(self, other)
except (NotImplementedError, TypeError): except (NotImplementedError, AsTensorError):
return NotImplemented return NotImplemented
def __div__(self, other): def __div__(self, other):
...@@ -1619,7 +1626,7 @@ class _tensor_py_operators: ...@@ -1619,7 +1626,7 @@ class _tensor_py_operators:
# This is to raise the exception that occurs when trying to divide # This is to raise the exception that occurs when trying to divide
# two integer arrays (currently forbidden). # two integer arrays (currently forbidden).
raise raise
except (NotImplementedError, TypeError): except (NotImplementedError, AsTensorError):
return NotImplemented return NotImplemented
if PY3: if PY3:
__truediv__ = __div__ __truediv__ = __div__
...@@ -1629,7 +1636,7 @@ class _tensor_py_operators: ...@@ -1629,7 +1636,7 @@ class _tensor_py_operators:
# adn the return value in that case # adn the return value in that case
try: try:
return pow(self, other) return pow(self, other)
except (NotImplementedError, TypeError): except (NotImplementedError, AsTensorError):
return NotImplemented return NotImplemented
def __mod__(self, other): def __mod__(self, other):
...@@ -1641,7 +1648,7 @@ class _tensor_py_operators: ...@@ -1641,7 +1648,7 @@ class _tensor_py_operators:
# This is to raise the exception that occurs when trying to compute # This is to raise the exception that occurs when trying to compute
# x % y with either x or y a complex number. # x % y with either x or y a complex number.
raise raise
except (NotImplementedError, TypeError): except (NotImplementedError, AsTensorError):
return NotImplemented return NotImplemented
def __truediv__(self, other): def __truediv__(self, other):
......
...@@ -530,7 +530,6 @@ class Elemwise(Op): ...@@ -530,7 +530,6 @@ class Elemwise(Op):
is left-completed to the greatest number of dimensions with 1s is left-completed to the greatest number of dimensions with 1s
using DimShuffle. using DimShuffle.
""" """
inputs = map(as_tensor_variable, inputs) inputs = map(as_tensor_variable, inputs)
shadow = self.scalar_op.make_node( shadow = self.scalar_op.make_node(
*[Scalar(dtype=i.type.dtype)() for i in inputs]) *[Scalar(dtype=i.type.dtype)() for i in inputs])
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论