提交 a0cc7932 authored 作者: Pierre Luc Carrier's avatar Pierre Luc Carrier

Update cython backend to match python backend

上级 5c65d8b9
diff --git a/theano/scan_module/scan_perform.c b/theano/scan_module/scan_perform.c
index aaebb43..2d06b29 100644
--- a/theano/scan_module/scan_perform.c
+++ b/theano/scan_module/scan_perform.c
@@ -5595,7 +5595,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P
@@ -5597,7 +5597,7 @@
* cdef list stack
* cdef int offset
*/
......@@ -11,29 +7,29 @@ index aaebb43..2d06b29 100644
__Pyx_INCREF(__pyx_t_4);
__pyx_v_descr = ((PyArray_Descr *)__pyx_t_4);
__pyx_t_4 = 0;
@@ -7147,7 +7147,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
@@ -7126,7 +7126,7 @@
* arr.base = baseptr
*
*/
- Py_XDECREF(__pyx_v_arr->base);
+ Py_XDECREF(PyArray_BASE(__pyx_v_arr));
/* "/home/anakha/.local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":974
/* "numpy.pxd":973
* baseptr = <PyObject*>base
@@ -7156,7 +7156,11 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
@@ -7135,7 +7135,11 @@
*
* cdef inline object get_array_base(ndarray arr):
*/
- __pyx_v_arr->base = __pyx_v_baseptr;
+#if NPY_API_VERSION < 0x00000007
+ PyArray_BASE(__pyx_v_arr) = __pyx_v_baseptr;
+#else
+ PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_baseptr);
+#endif
+ #if NPY_API_VERSION < 0x00000007
+ PyArray_BASE(__pyx_v_arr) = __pyx_v_baseptr;
+ #else
+ PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_baseptr);
+ #endif
/* "/home/anakha/.local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":966
*
@@ -7191,7 +7195,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
__Pyx_RefNannyFinishContext();
}
@@ -7161,7 +7165,7 @@
* return None
* else:
*/
......@@ -41,8 +37,8 @@ index aaebb43..2d06b29 100644
+ __pyx_t_1 = ((PyArray_BASE(__pyx_v_arr) == NULL) != 0);
if (__pyx_t_1) {
/* "/home/anakha/.local/lib/python2.7/site-packages/Cython/Includes/numpy/__init__.pxd":978
@@ -7214,8 +7218,8 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
/* "numpy.pxd":977
@@ -7185,8 +7189,8 @@
* return <object>arr.base # <<<<<<<<<<<<<<
*/
__Pyx_XDECREF(__pyx_r);
......@@ -52,4 +48,6 @@ index aaebb43..2d06b29 100644
+ __pyx_r = ((PyObject *)PyArray_BASE(__pyx_v_arr));
goto __pyx_L0;
}
__pyx_L3:;
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -191,6 +191,10 @@ def perform(
cdef unsigned int begin
cdef unsigned int end
cdef int cond
cdef unsigned int len_output_storage = (n_mit_mot_outs + n_mit_sot +
n_sit_sot + n_nit_sot +
n_shared_outs)
cdef int output_reused[500] # max 500 outputs
if n_steps < 0:
......@@ -304,11 +308,14 @@ def perform(
offset += 1
# 4. collecting slices where the output should be stored
# 4.1. Collect slices for mitmots
for idx in range(n_mit_mot_outs):
output_storage[idx].storage[0] = None
# 4.2. Collect slices for mitsots, sitsots and nitsots
offset = n_mit_mot_outs
if i !=0 and n_nit_sot >0:
if i != 0:
for idx in range(n_outs + n_nit_sot - n_mit_mot):
if ( store_steps[<unsigned int>(idx+n_mit_mot)] == 1 or
vector_outs[<unsigned int>(idx+n_mit_mot)] == 1):
......@@ -321,12 +328,21 @@ def perform(
for idx in range(n_outs + n_nit_sot - n_mit_mot):
output_storage[<unsigned int>(idx+offset)].storage[0] = None
# 4.3. Collect slices for shared outputs
offset += n_outs+n_nit_sot - n_mit_mot
for idx in range(n_shared_outs):
output_storage[<unsigned int>(idx+offset)].storage[0] = None
# 4.4. If there is a condition add it to the mix
if as_while:
pdx = offset + n_shared_outs
output_storage[<unsigned int>pdx].storage[0] = None
# 4.5. Keep a reference to the variables currently in the
# output_storage to be able to compare them with the actual
# outputs of the inner function after its execution
old_output_storage = [o.storage[0] for o in output_storage]
# 5. compute outputs
t0_fn = time.time()
......@@ -348,6 +364,11 @@ def perform(
pdx = offset + n_shared_outs
cond = output_storage[pdx].storage[0] == 0
# Check which of the pre-allocated outputs (if applicable) have
# been reused by the inner function
for j in range(len_output_storage):
output_reused[j] = (old_output_storage[j] is
output_storage[j].storage[0])
offset_out = 0
# 5.1 Copy over the values for mit_mot outputs
......@@ -363,8 +384,8 @@ def perform(
offset_out -= n_mit_mot
for j in range(begin, end):
if ( store_steps[j] == 1 or vector_outs[j] ==1 or
outs[j][0][pos[j]] is not output_storage[<unsigned int>(offset_out+j)].storage[0]):
if (store_steps[j] == 1 or vector_outs[j] == 1 or
not output_reused[<unsigned int>(offset_out+j)]):
outs[j][0][pos[j]] = output_storage[<unsigned int>(offset_out+j)].storage[0]
......@@ -387,7 +408,7 @@ def perform(
outs[j][0] = outs[j][0][:store_steps[j]]
outs[j][0][pos[j]] = output_storage[jout].storage[0]
elif (store_steps[j] == 1 or vector_outs[j] == 1 or
outs[j][0][pos[j]] is not output_storage[j+offset_out].storage[0]):
not output_reused[<unsigned int>(offset_out+j)]):
outs[j][0][pos[j]] = output_storage[j+offset_out].storage[0]
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论