提交 165eb70c authored 作者: Hengjean's avatar Hengjean

Fixed bugs with float 32 and Fast_compile

上级 23145a75
...@@ -63,11 +63,12 @@ class GetItem(Op): ...@@ -63,11 +63,12 @@ class GetItem(Op):
index = Constant(SliceType(), index) index = Constant(SliceType(), index)
return Apply(self, [x, index], [x.type()]) return Apply(self, [x, index], [x.type()])
else: else:
index = T.constant(index, ndim=0) index = T.constant(index, ndim=0, dtype='int32')
return Apply(self, [x, index], [x.ttype()]) return Apply(self, [x, index], [x.ttype()])
if isinstance(index.type, SliceType): if isinstance(index.type, SliceType):
return Apply(self, [x, index], [x.type()]) return Apply(self, [x, index], [x.type()])
elif isinstance(index, T.TensorVariable) and index.ndim == 0: elif isinstance(index, T.TensorVariable) and index.ndim == 0:
assert index.dtype == 'int32'
return Apply(self, [x, index], [x.ttype()]) return Apply(self, [x, index], [x.ttype()])
else: else:
raise TypeError('Expected scalar or slice as index.') raise TypeError('Expected scalar or slice as index.')
...@@ -85,7 +86,7 @@ class GetItem(Op): ...@@ -85,7 +86,7 @@ class GetItem(Op):
output_name = out[0] output_name = out[0]
fail = sub['fail'] fail = sub['fail']
return """ return """
%(output_name)s = (typeof %(output_name)s) PyList_GetItem( (PyObject*) %(x_name)s, *((double *) PyArray_DATA(%(index)s))); %(output_name)s = (typeof %(output_name)s) PyList_GetItem( (PyObject*) %(x_name)s, *((int *) PyArray_DATA(%(index)s)));
if(%(output_name)s == NULL){ if(%(output_name)s == NULL){
%(fail)s %(fail)s
} }
...@@ -228,8 +229,9 @@ class Insert(Op): ...@@ -228,8 +229,9 @@ class Insert(Op):
assert isinstance(x.type, TypedListType) assert isinstance(x.type, TypedListType)
assert x.ttype == toInsert.type assert x.ttype == toInsert.type
if not isinstance(index, Variable): if not isinstance(index, Variable):
index = T.constant(index, ndim=0) index = T.constant(index, ndim=0, dtype='int32')
else: else:
assert index.dtype == 'int32'
assert isinstance(index, T.TensorVariable) and index.ndim == 0 assert isinstance(index, T.TensorVariable) and index.ndim == 0
return Apply(self, [x, index, toInsert], [x.type()]) return Apply(self, [x, index, toInsert], [x.type()])
...@@ -259,7 +261,7 @@ class Insert(Op): ...@@ -259,7 +261,7 @@ class Insert(Op):
if(%(output_name)s==NULL){ if(%(output_name)s==NULL){
%(fail)s %(fail)s
}; };
if(PyList_Insert((PyObject*) %(output_name)s, *((double *) PyArray_DATA(%(index)s)), (PyObject*) %(toInsert)s)==-1){ if(PyList_Insert((PyObject*) %(output_name)s, *((int *) PyArray_DATA(%(index)s)), (PyObject*) %(toInsert)s)==-1){
%(fail)s %(fail)s
}; };
Py_INCREF(%(output_name)s); Py_INCREF(%(output_name)s);
......
...@@ -68,7 +68,7 @@ class test_get_item(unittest.TestCase): ...@@ -68,7 +68,7 @@ class test_get_item(unittest.TestCase):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
mySymbolicScalar = T.scalar() mySymbolicScalar = T.scalar(dtype='int32')
z = GetItem()(mySymbolicMatricesList, mySymbolicScalar) z = GetItem()(mySymbolicMatricesList, mySymbolicScalar)
...@@ -79,12 +79,12 @@ class test_get_item(unittest.TestCase): ...@@ -79,12 +79,12 @@ class test_get_item(unittest.TestCase):
y = rand_ranged_matrix(-1000, 1000, [100, 101]) y = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x], numpy.asarray(0, self.assertTrue(numpy.array_equal(f([x], numpy.asarray(0,
dtype=theano.config.floatX)), x)) dtype='int32')), x))
def test_interface(self): def test_interface(self):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
mySymbolicScalar = T.scalar() mySymbolicScalar = T.scalar(dtype='int32')
z = mySymbolicMatricesList[mySymbolicScalar] z = mySymbolicMatricesList[mySymbolicScalar]
...@@ -94,14 +94,14 @@ class test_get_item(unittest.TestCase): ...@@ -94,14 +94,14 @@ class test_get_item(unittest.TestCase):
x = rand_ranged_matrix(-1000, 1000, [100, 101]) x = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x], numpy.asarray(0, self.assertTrue(numpy.array_equal(f([x], numpy.asarray(0,
dtype=theano.config.floatX)), x)) dtype='int32')), x))
z = mySymbolicMatricesList[0: 1: 1] z = mySymbolicMatricesList[0]
f = theano.function([mySymbolicMatricesList], f = theano.function([mySymbolicMatricesList],
z) z)
self.assertTrue(numpy.array_equal(f([x]), [x])) self.assertTrue(numpy.array_equal(f([x]), x))
def test_wrong_input(self): def test_wrong_input(self):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
...@@ -241,7 +241,7 @@ class test_insert(unittest.TestCase): ...@@ -241,7 +241,7 @@ class test_insert(unittest.TestCase):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
myMatrix = T.matrix() myMatrix = T.matrix()
myScalar = T.scalar() myScalar = T.scalar(dtype='int32')
z = Insert(True)(mySymbolicMatricesList, myScalar, myMatrix) z = Insert(True)(mySymbolicMatricesList, myScalar, myMatrix)
...@@ -253,13 +253,13 @@ class test_insert(unittest.TestCase): ...@@ -253,13 +253,13 @@ class test_insert(unittest.TestCase):
y = rand_ranged_matrix(-1000, 1000, [100, 101]) y = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1, self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1,
dtype=theano.config.floatX), y), [x, y])) dtype='int32'), y), [x, y]))
def test_sanity_check(self): def test_sanity_check(self):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
myMatrix = T.matrix() myMatrix = T.matrix()
myScalar = T.scalar() myScalar = T.scalar(dtype='int32')
z = Insert()(mySymbolicMatricesList, myScalar, myMatrix) z = Insert()(mySymbolicMatricesList, myScalar, myMatrix)
...@@ -270,13 +270,13 @@ class test_insert(unittest.TestCase): ...@@ -270,13 +270,13 @@ class test_insert(unittest.TestCase):
y = rand_ranged_matrix(-1000, 1000, [100, 101]) y = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1, self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1,
dtype=theano.config.floatX), y), [x, y])) dtype='int32'), y), [x, y]))
def test_interface(self): def test_interface(self):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
myMatrix = T.matrix() myMatrix = T.matrix()
myScalar = T.scalar() myScalar = T.scalar(dtype='int32')
z = mySymbolicMatricesList.insert(myScalar, myMatrix) z = mySymbolicMatricesList.insert(myScalar, myMatrix)
...@@ -287,7 +287,7 @@ class test_insert(unittest.TestCase): ...@@ -287,7 +287,7 @@ class test_insert(unittest.TestCase):
y = rand_ranged_matrix(-1000, 1000, [100, 101]) y = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1, self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1,
dtype=theano.config.floatX), y), [x, y])) dtype='int32'), y), [x, y]))
class test_remove(unittest.TestCase): class test_remove(unittest.TestCase):
......
...@@ -26,9 +26,9 @@ class test_inplace(unittest.TestCase): ...@@ -26,9 +26,9 @@ class test_inplace(unittest.TestCase):
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
z = Reverse()(mySymbolicMatricesList) z = Reverse()(mySymbolicMatricesList)
m = theano.compile.mode.get_default_mode().including("typed_list_inplace_opt")
f = theano.function([In(mySymbolicMatricesList, borrow=True, f = theano.function([In(mySymbolicMatricesList, borrow=True,
mutable=True)], z, accept_inplace=True) mutable=True)], z, accept_inplace=True, mode=m)
self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace) self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace)
x = rand_ranged_matrix(-1000, 1000, [100, 101]) x = rand_ranged_matrix(-1000, 1000, [100, 101])
...@@ -42,10 +42,10 @@ class test_inplace(unittest.TestCase): ...@@ -42,10 +42,10 @@ class test_inplace(unittest.TestCase):
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
mySymbolicMatrix = T.matrix() mySymbolicMatrix = T.matrix()
z = Append()(mySymbolicMatricesList, mySymbolicMatrix) z = Append()(mySymbolicMatricesList, mySymbolicMatrix)
m = theano.compile.mode.get_default_mode().including("typed_list_inplace_opt")
f = theano.function([In(mySymbolicMatricesList, borrow=True, f = theano.function([In(mySymbolicMatricesList, borrow=True,
mutable=True), In(mySymbolicMatrix, borrow=True, mutable=True), In(mySymbolicMatrix, borrow=True,
mutable=True)], z, accept_inplace=True) mutable=True)], z, accept_inplace=True, mode=m)
self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace) self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace)
x = rand_ranged_matrix(-1000, 1000, [100, 101]) x = rand_ranged_matrix(-1000, 1000, [100, 101])
...@@ -62,10 +62,10 @@ class test_inplace(unittest.TestCase): ...@@ -62,10 +62,10 @@ class test_inplace(unittest.TestCase):
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
z = Extend()(mySymbolicMatricesList1, mySymbolicMatricesList2) z = Extend()(mySymbolicMatricesList1, mySymbolicMatricesList2)
m = theano.compile.mode.get_default_mode().including("typed_list_inplace_opt")
f = theano.function([In(mySymbolicMatricesList1, borrow=True, f = theano.function([In(mySymbolicMatricesList1, borrow=True,
mutable=True), mySymbolicMatricesList2], mutable=True), mySymbolicMatricesList2],
z) z, mode=m)
self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace) self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace)
x = rand_ranged_matrix(-1000, 1000, [100, 101]) x = rand_ranged_matrix(-1000, 1000, [100, 101])
...@@ -77,14 +77,15 @@ class test_inplace(unittest.TestCase): ...@@ -77,14 +77,15 @@ class test_inplace(unittest.TestCase):
def test_insert_inplace(self): def test_insert_inplace(self):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
mySymbolicIndex = T.scalar() mySymbolicIndex = T.scalar(dtype='int32')
mySymbolicMatrix = T.matrix() mySymbolicMatrix = T.matrix()
z = Insert()(mySymbolicMatricesList, mySymbolicIndex, mySymbolicMatrix) z = Insert()(mySymbolicMatricesList, mySymbolicIndex, mySymbolicMatrix)
m = theano.compile.mode.get_default_mode().including("typed_list_inplace_opt")
f = theano.function([In(mySymbolicMatricesList, borrow=True, f = theano.function([In(mySymbolicMatricesList, borrow=True,
mutable=True), mySymbolicIndex, mySymbolicMatrix], mutable=True), mySymbolicIndex, mySymbolicMatrix],
z, accept_inplace=True) z, accept_inplace=True, mode=m)
self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace) self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace)
x = rand_ranged_matrix(-1000, 1000, [100, 101]) x = rand_ranged_matrix(-1000, 1000, [100, 101])
...@@ -92,21 +93,21 @@ class test_inplace(unittest.TestCase): ...@@ -92,21 +93,21 @@ class test_inplace(unittest.TestCase):
y = rand_ranged_matrix(-1000, 1000, [100, 101]) y = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1, self.assertTrue(numpy.array_equal(f([x], numpy.asarray(1,
dtype=theano.config.floatX), y), [x, y])) dtype='int32'), y), [x, y]))
def test_remove_inplace(self): def test_remove_inplace(self):
mySymbolicMatricesList = TypedListType(T.TensorType( mySymbolicMatricesList = TypedListType(T.TensorType(
theano.config.floatX, (False, False)))() theano.config.floatX, (False, False)))()
mySymbolicMatrix = T.matrix() mySymbolicMatrix = T.matrix()
z = Remove()(mySymbolicMatricesList, mySymbolicMatrix) z = Remove()(mySymbolicMatricesList, mySymbolicMatrix)
m = theano.compile.mode.get_default_mode().including("typed_list_inplace_opt")
f = theano.function([In(mySymbolicMatricesList, borrow=True, f = theano.function([In(mySymbolicMatricesList, borrow=True,
mutable=True), In(mySymbolicMatrix, borrow=True, mutable=True), In(mySymbolicMatrix, borrow=True,
mutable=True)], z, accept_inplace=True) mutable=True)], z, accept_inplace=True, mode=m)
self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace) self.assertTrue(f.maker.fgraph.toposort()[0].op.inplace)
x = rand_ranged_matrix(-1000, 1000, [100, 101]) x = rand_ranged_matrix(-1000, 1000, [100, 101])
y = rand_ranged_matrix(-1000, 1000, [100, 101]) y = rand_ranged_matrix(-1000, 1000, [100, 101])
self.assertTrue(numpy.array_equal(f([x, y], y), [x,])) self.assertTrue(numpy.array_equal(f([x, y], y), [x]))
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论