Generated by Cython 0.19 on Mon Sep 30 17:13:04 2013

Raw output: bilinear.c

     1: # -*- coding: utf-8 -*-

      /* "bilinear.pyx":1
     * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
     * #
     * #    Project: Azimuthal integration
     */
      __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
      if (PyDict_SetItem(__pyx_d, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;

     2: #

     3: #    Project: Azimuthal integration

     4: #             https://forge.epn-campus.eu/projects/azimuthal

     5: #

     6: #    File: "$Id$"

     7: #

     8: #    Copyright (C) European Synchrotron Radiation Facility, Grenoble, France

     9: #

     10: #    Principal author:       Jérôme Kieffer (Jerome.Kieffer@ESRF.eu)

     11: #

     12: #    This program is free software: you can redistribute it and/or modify

     13: #    it under the terms of the GNU General Public License as published by

     14: #    the Free Software Foundation, either version 3 of the License, or

     15: #    (at your option) any later version.

     16: #

     17: #    This program is distributed in the hope that it will be useful,

     18: #    but WITHOUT ANY WARRANTY; without even the implied warranty of

     19: #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

     20: #    GNU General Public License for more details.

     21: #

     22: #    You should have received a copy of the GNU General Public License

     23: #    along with this program.  If not, see <http://www.gnu.org/licenses/>.

     24: #

     25:

     26: __author__ = "Jerome Kieffer"

      /* "bilinear.pyx":26
     * #
     *
     * __author__ = "Jerome Kieffer"             # <<<<<<<<<<<<<<
     * __license__ = "GPLv3"
     * __date__ = "31/01/2013"
     */
      if (PyDict_SetItem(__pyx_d, __pyx_n_s____author__, ((PyObject *)__pyx_kp_s_49)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

     27: __license__ = "GPLv3"

      /* "bilinear.pyx":27
     *
     * __author__ = "Jerome Kieffer"
     * __license__ = "GPLv3"             # <<<<<<<<<<<<<<
     * __date__ = "31/01/2013"
     * __copyright__ = "2011-2013, ESRF"
     */
      if (PyDict_SetItem(__pyx_d, __pyx_n_s____license__, ((PyObject *)__pyx_n_s__GPLv3)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

     28: __date__ = "31/01/2013"

      /* "bilinear.pyx":28
     * __author__ = "Jerome Kieffer"
     * __license__ = "GPLv3"
     * __date__ = "31/01/2013"             # <<<<<<<<<<<<<<
     * __copyright__ = "2011-2013, ESRF"
     * __contact__ = "jerome.kieffer@esrf.fr"
     */
      if (PyDict_SetItem(__pyx_d, __pyx_n_s____date__, ((PyObject *)__pyx_kp_s_50)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

     29: __copyright__ = "2011-2013, ESRF"

      /* "bilinear.pyx":29
     * __license__ = "GPLv3"
     * __date__ = "31/01/2013"
     * __copyright__ = "2011-2013, ESRF"             # <<<<<<<<<<<<<<
     * __contact__ = "jerome.kieffer@esrf.fr"
     *
     */
      if (PyDict_SetItem(__pyx_d, __pyx_n_s____copyright__, ((PyObject *)__pyx_kp_s_51)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

     30: __contact__ = "jerome.kieffer@esrf.fr"

      /* "bilinear.pyx":30
     * __date__ = "31/01/2013"
     * __copyright__ = "2011-2013, ESRF"
     * __contact__ = "jerome.kieffer@esrf.fr"             # <<<<<<<<<<<<<<
     *
     * import cython
     */
      if (PyDict_SetItem(__pyx_d, __pyx_n_s____contact__, ((PyObject *)__pyx_kp_s_52)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

     31:

     32: import cython

     33: import numpy

      /* "bilinear.pyx":33
     *
     * import cython
     * import numpy             # <<<<<<<<<<<<<<
     * cimport numpy
     *
     */
      __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      if (PyDict_SetItem(__pyx_d, __pyx_n_s__numpy, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

     34: cimport numpy

     35:

     36: from libc.math cimport floor,ceil

     37:

     38:

     39: cdef class Bilinear:

    /* "bilinear.pyx":39
     *
     *
     * cdef class Bilinear:             # <<<<<<<<<<<<<<
     *     """Bilinear interpolator for finding max"""
     *
     */
    struct __pyx_obj_8bilinear_Bilinear {
      PyObject_HEAD
      __Pyx_memviewslice data;
      float maxi;
      float mini;
      size_t d0_max;
      size_t d1_max;
      size_t r;
    };

     40:     """Bilinear interpolator for finding max"""

     41:

     42:     cdef float[:,:] data

     43:     cdef float maxi, mini

     44:     cdef size_t d0_max, d1_max, r

     45:

     46:     def __cinit__(self, data not None):

    /* "bilinear.pyx":46
     *     cdef size_t d0_max, d1_max, r
     *
     *     def __cinit__(self, data not None):             # <<<<<<<<<<<<<<
     *         assert data.ndim == 2
     *         self.d0_max = data.shape[0] - 1
     */

    static int __pyx_pf_8bilinear_8Bilinear___cinit__(struct __pyx_obj_8bilinear_Bilinear *__pyx_v_self, PyObject *__pyx_v_data) {
      int __pyx_r;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("__cinit__", 0);

     47:         assert data.ndim == 2

      /* "bilinear.pyx":47
     *
     *     def __cinit__(self, data not None):
     *         assert data.ndim == 2             # <<<<<<<<<<<<<<
     *         self.d0_max = data.shape[0] - 1
     *         self.d1_max = data.shape[1] - 1
     */
      #ifndef CYTHON_WITHOUT_ASSERTIONS
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s__ndim); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (unlikely(!__pyx_t_3)) {
        PyErr_SetNone(PyExc_AssertionError);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #endif

     48:         self.d0_max = data.shape[0] - 1

      /* "bilinear.pyx":48
     *     def __cinit__(self, data not None):
     *         assert data.ndim == 2
     *         self.d0_max = data.shape[0] - 1             # <<<<<<<<<<<<<<
     *         self.d1_max = data.shape[1] - 1
     *         self.maxi = data.max()
     */
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s__shape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong, 0, 0, 1); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = __Pyx_PyInt_AsSize_t(__pyx_t_2); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_v_self->d0_max = __pyx_t_4;

     49:         self.d1_max = data.shape[1] - 1

      /* "bilinear.pyx":49
     *         assert data.ndim == 2
     *         self.d0_max = data.shape[0] - 1
     *         self.d1_max = data.shape[1] - 1             # <<<<<<<<<<<<<<
     *         self.maxi = data.max()
     *         self.mini = data.min()
     */
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s__shape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 1, sizeof(long), PyInt_FromLong, 0, 0, 1); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = __Pyx_PyInt_AsSize_t(__pyx_t_2); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_v_self->d1_max = __pyx_t_4;

     50:         self.maxi = data.max()

      /* "bilinear.pyx":50
     *         self.d0_max = data.shape[0] - 1
     *         self.d1_max = data.shape[1] - 1
     *         self.maxi = data.max()             # <<<<<<<<<<<<<<
     *         self.mini = data.min()
     *         self.data = numpy.ascontiguousarray(data, dtype=numpy.float32)
     */
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s__max); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_self->maxi = __pyx_t_5;

     51:         self.mini = data.min()

      /* "bilinear.pyx":51
     *         self.d1_max = data.shape[1] - 1
     *         self.maxi = data.max()
     *         self.mini = data.min()             # <<<<<<<<<<<<<<
     *         self.data = numpy.ascontiguousarray(data, dtype=numpy.float32)
     *
     */
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_data, __pyx_n_s__min); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_2); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_v_self->mini = __pyx_t_5;

     52:         self.data = numpy.ascontiguousarray(data, dtype=numpy.float32)

      /* "bilinear.pyx":52
     *         self.maxi = data.max()
     *         self.mini = data.min()
     *         self.data = numpy.ascontiguousarray(data, dtype=numpy.float32)             # <<<<<<<<<<<<<<
     *
     *     @cython.boundscheck(False)
     */
      __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s__numpy); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s__ascontiguousarray); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_v_data);
      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
      __Pyx_GIVEREF(__pyx_v_data);
      __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
      __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s__numpy); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s__float32); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__dtype), __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
      __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
      __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(__pyx_t_8);
      if (unlikely(!__pyx_t_9.memview)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __PYX_XDEC_MEMVIEW(&__pyx_v_self->data, 0);
      __pyx_v_self->data = __pyx_t_9;
      __pyx_t_9.memview = NULL;
      __pyx_t_9.data = NULL;

      __pyx_r = 0;
      goto __pyx_L0;
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_XDECREF(__pyx_t_2);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1);
      __Pyx_AddTraceback("bilinear.Bilinear.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = -1;
      __pyx_L0:;
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    /* Python wrapper */
    static PyObject *__pyx_pw_8bilinear_8Bilinear_3f_cy(PyObject *__pyx_v_self, PyObject *__pyx_v_x); /*proto*/
    static char __pyx_doc_8bilinear_8Bilinear_2f_cy[] = "\n        Function f((y,x)) where f is a continuous function (y,x) are pixel coordinates\n        @param x: 2-tuple of float\n        @return: Interpolated signal from the image (negative for minimizer)\n\n        ";
    static PyObject *__pyx_pw_8bilinear_8Bilinear_3f_cy(PyObject *__pyx_v_self, PyObject *__pyx_v_x) {
      PyObject *__pyx_r = 0;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("f_cy (wrapper)", 0);
      __pyx_r = __pyx_pf_8bilinear_8Bilinear_2f_cy(((struct __pyx_obj_8bilinear_Bilinear *)__pyx_v_self), ((PyObject *)__pyx_v_x));
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

     53:

     54:     @cython.boundscheck(False)

     55:     @cython.wraparound(False)

     56:     def f_cy(self, x):

    /* "bilinear.pyx":56
     *     @cython.boundscheck(False)
     *     @cython.wraparound(False)
     *     def f_cy(self, x):             # <<<<<<<<<<<<<<
     *         """
     *         Function f((y,x)) where f is a continuous function (y,x) are pixel coordinates
     */

    static PyObject *__pyx_pf_8bilinear_8Bilinear_2f_cy(struct __pyx_obj_8bilinear_Bilinear *__pyx_v_self, PyObject *__pyx_v_x) {
      float __pyx_v_d0;
      float __pyx_v_d1;
      int __pyx_v_i0;
      int __pyx_v_i1;
      int __pyx_v_j0;
      int __pyx_v_j1;
      float __pyx_v_x0;
      float __pyx_v_x1;
      float __pyx_v_y0;
      float __pyx_v_y1;
      float __pyx_v_res;
      PyObject *__pyx_r = NULL;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("f_cy", 0);

     57:         """

     58:         Function f((y,x)) where f is a continuous function (y,x) are pixel coordinates

     59:         @param x: 2-tuple of float

     60:         @return: Interpolated signal from the image (negative for minimizer)

     61:

     62:         """

     63:         cdef float d0 = x[0]

      /* "bilinear.pyx":63
     *
     *         """
     *         cdef float d0 = x[0]             # <<<<<<<<<<<<<<
     *         cdef float d1 = x[1]
     *         cdef int i0, i1, j0, j1
     */
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 0, sizeof(long), PyInt_FromLong, 0, 0, 0); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_d0 = __pyx_t_2;

     64:         cdef float d1 = x[1]

      /* "bilinear.pyx":64
     *         """
     *         cdef float d0 = x[0]
     *         cdef float d1 = x[1]             # <<<<<<<<<<<<<<
     *         cdef int i0, i1, j0, j1
     *         cdef float x0, x1, y0, y1, res
     */
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong, 0, 0, 0); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_d1 = __pyx_t_2;

     65:         cdef int i0, i1, j0, j1

     66:         cdef float x0, x1, y0, y1, res

     67:         with nogil:

      /* "bilinear.pyx":67
     *         cdef int i0, i1, j0, j1
     *         cdef float x0, x1, y0, y1, res
     *         with nogil:             # <<<<<<<<<<<<<<
     *             x0 = floor(d0)
     *             x1 = ceil(d0)
     */
      {
          #ifdef WITH_THREAD
          PyThreadState *_save;
          Py_UNBLOCK_THREADS
          #endif
          /*try:*/ {

          /* "bilinear.pyx":67
     *         cdef int i0, i1, j0, j1
     *         cdef float x0, x1, y0, y1, res
     *         with nogil:             # <<<<<<<<<<<<<<
     *             x0 = floor(d0)
     *             x1 = ceil(d0)
     */
          /*finally:*/ {
            int __pyx_why;
            __pyx_why = 0; goto __pyx_L5;
            __pyx_L4: __pyx_why = 4; goto __pyx_L5;
            __pyx_L5:;
            #ifdef WITH_THREAD
            Py_BLOCK_THREADS
            #endif
            switch (__pyx_why) {
              case 4: goto __pyx_L1_error;
            }
          }
      }

     68:             x0 = floor(d0)

            /* "bilinear.pyx":68
     *         cdef float x0, x1, y0, y1, res
     *         with nogil:
     *             x0 = floor(d0)             # <<<<<<<<<<<<<<
     *             x1 = ceil(d0)
     *             y0 = floor(d1)
     */
            __pyx_v_x0 = floor(__pyx_v_d0);

     69:             x1 = ceil(d0)

            /* "bilinear.pyx":69
     *         with nogil:
     *             x0 = floor(d0)
     *             x1 = ceil(d0)             # <<<<<<<<<<<<<<
     *             y0 = floor(d1)
     *             y1 = ceil(d1)
     */
            __pyx_v_x1 = ceil(__pyx_v_d0);

     70:             y0 = floor(d1)

            /* "bilinear.pyx":70
     *             x0 = floor(d0)
     *             x1 = ceil(d0)
     *             y0 = floor(d1)             # <<<<<<<<<<<<<<
     *             y1 = ceil(d1)
     *             i0 = < int > x0
     */
            __pyx_v_y0 = floor(__pyx_v_d1);

     71:             y1 = ceil(d1)

            /* "bilinear.pyx":71
     *             x1 = ceil(d0)
     *             y0 = floor(d1)
     *             y1 = ceil(d1)             # <<<<<<<<<<<<<<
     *             i0 = < int > x0
     *             i1 = < int > x1
     */
            __pyx_v_y1 = ceil(__pyx_v_d1);

     72:             i0 = < int > x0

            /* "bilinear.pyx":72
     *             y0 = floor(d1)
     *             y1 = ceil(d1)
     *             i0 = < int > x0             # <<<<<<<<<<<<<<
     *             i1 = < int > x1
     *             j0 = < int > y0
     */
            __pyx_v_i0 = ((int)__pyx_v_x0);

     73:             i1 = < int > x1

            /* "bilinear.pyx":73
     *             y1 = ceil(d1)
     *             i0 = < int > x0
     *             i1 = < int > x1             # <<<<<<<<<<<<<<
     *             j0 = < int > y0
     *             j1 = < int > y1
     */
            __pyx_v_i1 = ((int)__pyx_v_x1);

     74:             j0 = < int > y0

            /* "bilinear.pyx":74
     *             i0 = < int > x0
     *             i1 = < int > x1
     *             j0 = < int > y0             # <<<<<<<<<<<<<<
     *             j1 = < int > y1
     *             if d0 < 0:
     */
            __pyx_v_j0 = ((int)__pyx_v_y0);

     75:             j1 = < int > y1

            /* "bilinear.pyx":75
     *             i1 = < int > x1
     *             j0 = < int > y0
     *             j1 = < int > y1             # <<<<<<<<<<<<<<
     *             if d0 < 0:
     *                 res = self.mini + d0
     */
            __pyx_v_j1 = ((int)__pyx_v_y1);

     76:             if d0 < 0:

            /* "bilinear.pyx":76
     *             j0 = < int > y0
     *             j1 = < int > y1
     *             if d0 < 0:             # <<<<<<<<<<<<<<
     *                 res = self.mini + d0
     *             elif d1 < 0:
     */
            __pyx_t_3 = (__pyx_v_d0 < 0.0);
            if (__pyx_t_3) {

     77:                 res = self.mini + d0

              /* "bilinear.pyx":77
     *             j1 = < int > y1
     *             if d0 < 0:
     *                 res = self.mini + d0             # <<<<<<<<<<<<<<
     *             elif d1 < 0:
     *                 res = self.mini + d1
     */
              __pyx_v_res = (__pyx_v_self->mini + __pyx_v_d0);
              goto __pyx_L6;
            }

     78:             elif d1 < 0:

            /* "bilinear.pyx":78
     *             if d0 < 0:
     *                 res = self.mini + d0
     *             elif d1 < 0:             # <<<<<<<<<<<<<<
     *                 res = self.mini + d1
     *             elif d0 > self.d0_max:
     */
            __pyx_t_3 = (__pyx_v_d1 < 0.0);
            if (__pyx_t_3) {

     79:                 res = self.mini + d1

              /* "bilinear.pyx":79
     *                 res = self.mini + d0
     *             elif d1 < 0:
     *                 res = self.mini + d1             # <<<<<<<<<<<<<<
     *             elif d0 > self.d0_max:
     *                 res = self.mini - d0 + self.d0_max
     */
              __pyx_v_res = (__pyx_v_self->mini + __pyx_v_d1);
              goto __pyx_L6;
            }

     80:             elif d0 > self.d0_max:

            /* "bilinear.pyx":80
     *             elif d1 < 0:
     *                 res = self.mini + d1
     *             elif d0 > self.d0_max:             # <<<<<<<<<<<<<<
     *                 res = self.mini - d0 + self.d0_max
     *             elif d1 > self.d1_max:
     */
            __pyx_t_3 = (__pyx_v_d0 > __pyx_v_self->d0_max);
            if (__pyx_t_3) {

     81:                 res = self.mini - d0 + self.d0_max

              /* "bilinear.pyx":81
     *                 res = self.mini + d1
     *             elif d0 > self.d0_max:
     *                 res = self.mini - d0 + self.d0_max             # <<<<<<<<<<<<<<
     *             elif d1 > self.d1_max:
     *                 res = self.mini - d1 + self.d1_max
     */
              __pyx_v_res = ((__pyx_v_self->mini - __pyx_v_d0) + __pyx_v_self->d0_max);
              goto __pyx_L6;
            }

     82:             elif d1 > self.d1_max:

            /* "bilinear.pyx":82
     *             elif d0 > self.d0_max:
     *                 res = self.mini - d0 + self.d0_max
     *             elif d1 > self.d1_max:             # <<<<<<<<<<<<<<
     *                 res = self.mini - d1 + self.d1_max
     *             elif (i0 == i1) and (j0 == j1):
     */
            __pyx_t_3 = (__pyx_v_d1 > __pyx_v_self->d1_max);
            if (__pyx_t_3) {

     83:                 res = self.mini - d1 + self.d1_max

              /* "bilinear.pyx":83
     *                 res = self.mini - d0 + self.d0_max
     *             elif d1 > self.d1_max:
     *                 res = self.mini - d1 + self.d1_max             # <<<<<<<<<<<<<<
     *             elif (i0 == i1) and (j0 == j1):
     *                 res = self.data[i0,j0]
     */
              __pyx_v_res = ((__pyx_v_self->mini - __pyx_v_d1) + __pyx_v_self->d1_max);
              goto __pyx_L6;
            }

     84:             elif (i0 == i1) and (j0 == j1):

            /* "bilinear.pyx":84
     *             elif d1 > self.d1_max:
     *                 res = self.mini - d1 + self.d1_max
     *             elif (i0 == i1) and (j0 == j1):             # <<<<<<<<<<<<<<
     *                 res = self.data[i0,j0]
     *             elif i0 == i1:
     */
            __pyx_t_3 = (__pyx_v_i0 == __pyx_v_i1);
            if (__pyx_t_3) {
              __pyx_t_4 = (__pyx_v_j0 == __pyx_v_j1);
              __pyx_t_5 = __pyx_t_4;
            } else {
              __pyx_t_5 = __pyx_t_3;
            }
            if (__pyx_t_5) {

     85:                 res = self.data[i0,j0]

              /* "bilinear.pyx":85
     *                 res = self.mini - d1 + self.d1_max
     *             elif (i0 == i1) and (j0 == j1):
     *                 res = self.data[i0,j0]             # <<<<<<<<<<<<<<
     *             elif i0 == i1:
     *                 res = (self.data[i0,j0] * (y1 - d1)) + (self.data[i0,j1] * (d1 - y0))
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_6 = __pyx_v_i0;
              __pyx_t_7 = __pyx_v_j0;
              __pyx_v_res = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_6 * __pyx_v_self->data.strides[0]) ) + __pyx_t_7 * __pyx_v_self->data.strides[1]) )));
              goto __pyx_L6;
            }

     86:             elif i0 == i1:

            /* "bilinear.pyx":86
     *             elif (i0 == i1) and (j0 == j1):
     *                 res = self.data[i0,j0]
     *             elif i0 == i1:             # <<<<<<<<<<<<<<
     *                 res = (self.data[i0,j0] * (y1 - d1)) + (self.data[i0,j1] * (d1 - y0))
     *             elif j0 == j1:
     */
            __pyx_t_5 = (__pyx_v_i0 == __pyx_v_i1);
            if (__pyx_t_5) {

     87:                 res = (self.data[i0,j0] * (y1 - d1)) + (self.data[i0,j1] * (d1 - y0))

              /* "bilinear.pyx":87
     *                 res = self.data[i0,j0]
     *             elif i0 == i1:
     *                 res = (self.data[i0,j0] * (y1 - d1)) + (self.data[i0,j1] * (d1 - y0))             # <<<<<<<<<<<<<<
     *             elif j0 == j1:
     *                 res = (self.data[i0,j0] * (x1 - d0)) + (self.data[i1,j0] * (d0 - x0))
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_8 = __pyx_v_i0;
              __pyx_t_9 = __pyx_v_j0;
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_10 = __pyx_v_i0;
              __pyx_t_11 = __pyx_v_j1;
              __pyx_v_res = (((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_8 * __pyx_v_self->data.strides[0]) ) + __pyx_t_9 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_y1 - __pyx_v_d1)) + ((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_10 * __pyx_v_self->data.strides[0]) ) + __pyx_t_11 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_d1 - __pyx_v_y0)));
              goto __pyx_L6;
            }

     88:             elif j0 == j1:

            /* "bilinear.pyx":88
     *             elif i0 == i1:
     *                 res = (self.data[i0,j0] * (y1 - d1)) + (self.data[i0,j1] * (d1 - y0))
     *             elif j0 == j1:             # <<<<<<<<<<<<<<
     *                 res = (self.data[i0,j0] * (x1 - d0)) + (self.data[i1,j0] * (d0 - x0))
     *             else:
     */
            __pyx_t_5 = (__pyx_v_j0 == __pyx_v_j1);
            if (__pyx_t_5) {

     89:                 res = (self.data[i0,j0] * (x1 - d0)) + (self.data[i1,j0] * (d0 - x0))

              /* "bilinear.pyx":89
     *                 res = (self.data[i0,j0] * (y1 - d1)) + (self.data[i0,j1] * (d1 - y0))
     *             elif j0 == j1:
     *                 res = (self.data[i0,j0] * (x1 - d0)) + (self.data[i1,j0] * (d0 - x0))             # <<<<<<<<<<<<<<
     *             else:
     *                 res = (self.data[i0,j0] * (x1 - d0) * (y1 - d1))  \
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_12 = __pyx_v_i0;
              __pyx_t_13 = __pyx_v_j0;
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_14 = __pyx_v_i1;
              __pyx_t_15 = __pyx_v_j0;
              __pyx_v_res = (((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_12 * __pyx_v_self->data.strides[0]) ) + __pyx_t_13 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_x1 - __pyx_v_d0)) + ((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_14 * __pyx_v_self->data.strides[0]) ) + __pyx_t_15 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_d0 - __pyx_v_x0)));
              goto __pyx_L6;
            }
            /*else*/ {

     90:             else:

     91:                 res = (self.data[i0,j0] * (x1 - d0) * (y1 - d1))  \

              /* "bilinear.pyx":91
     *                 res = (self.data[i0,j0] * (x1 - d0)) + (self.data[i1,j0] * (d0 - x0))
     *             else:
     *                 res = (self.data[i0,j0] * (x1 - d0) * (y1 - d1))  \             # <<<<<<<<<<<<<<
     *                     + (self.data[i1,j0] * (d0 - x0) * (y1 - d1))  \
     *                     + (self.data[i0,j1] * (x1 - d0) * (d1 - y0))  \
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_16 = __pyx_v_i0;
              __pyx_t_17 = __pyx_v_j0;

     92:                     + (self.data[i1,j0] * (d0 - x0) * (y1 - d1))  \

              /* "bilinear.pyx":92
     *             else:
     *                 res = (self.data[i0,j0] * (x1 - d0) * (y1 - d1))  \
     *                     + (self.data[i1,j0] * (d0 - x0) * (y1 - d1))  \             # <<<<<<<<<<<<<<
     *                     + (self.data[i0,j1] * (x1 - d0) * (d1 - y0))  \
     *                     + (self.data[i1,j1] * (d0 - x0) * (d1 - y0))
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_18 = __pyx_v_i1;
              __pyx_t_19 = __pyx_v_j0;

     93:                     + (self.data[i0,j1] * (x1 - d0) * (d1 - y0))  \

              /* "bilinear.pyx":93
     *                 res = (self.data[i0,j0] * (x1 - d0) * (y1 - d1))  \
     *                     + (self.data[i1,j0] * (d0 - x0) * (y1 - d1))  \
     *                     + (self.data[i0,j1] * (x1 - d0) * (d1 - y0))  \             # <<<<<<<<<<<<<<
     *                     + (self.data[i1,j1] * (d0 - x0) * (d1 - y0))
     *         return - res
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_20 = __pyx_v_i0;
              __pyx_t_21 = __pyx_v_j1;

     94:                     + (self.data[i1,j1] * (d0 - x0) * (d1 - y0))

              /* "bilinear.pyx":94
     *                     + (self.data[i1,j0] * (d0 - x0) * (y1 - d1))  \
     *                     + (self.data[i0,j1] * (x1 - d0) * (d1 - y0))  \
     *                     + (self.data[i1,j1] * (d0 - x0) * (d1 - y0))             # <<<<<<<<<<<<<<
     *         return - res
     *
     */
              if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L4;}}
              __pyx_t_22 = __pyx_v_i1;
              __pyx_t_23 = __pyx_v_j1;
              __pyx_v_res = ((((((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_16 * __pyx_v_self->data.strides[0]) ) + __pyx_t_17 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_x1 - __pyx_v_d0)) * (__pyx_v_y1 - __pyx_v_d1)) + (((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_18 * __pyx_v_self->data.strides[0]) ) + __pyx_t_19 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_d0 - __pyx_v_x0)) * (__pyx_v_y1 - __pyx_v_d1))) + (((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_20 * __pyx_v_self->data.strides[0]) ) + __pyx_t_21 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_x1 - __pyx_v_d0)) * (__pyx_v_d1 - __pyx_v_y0))) + (((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_22 * __pyx_v_self->data.strides[0]) ) + __pyx_t_23 * __pyx_v_self->data.strides[1]) ))) * (__pyx_v_d0 - __pyx_v_x0)) * (__pyx_v_d1 - __pyx_v_y0)));
            }
            __pyx_L6:;
          }

     95:         return - res

      /* "bilinear.pyx":95
     *                     + (self.data[i0,j1] * (x1 - d0) * (d1 - y0))  \
     *                     + (self.data[i1,j1] * (d0 - x0) * (d1 - y0))
     *         return - res             # <<<<<<<<<<<<<<
     *
     *     @cython.boundscheck(False)
     */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = PyFloat_FromDouble((-__pyx_v_res)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_r = __pyx_t_1;
      __pyx_t_1 = 0;
      goto __pyx_L0;

      __pyx_r = Py_None; __Pyx_INCREF(Py_None);
      goto __pyx_L0;
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_AddTraceback("bilinear.Bilinear.f_cy", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = NULL;
      __pyx_L0:;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    /* Python wrapper */
    static PyObject *__pyx_pw_8bilinear_8Bilinear_5local_maxi(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
    static char __pyx_doc_8bilinear_8Bilinear_4local_maxi[] = "\n        Return the local maximum ... with sub-pixel refinement\n        \n        @param x: 2-tuple of int\n        @param w: half with of the window: 1 or 2 are adviced\n        @return: 2-tuple of int with the nearest local maximum\n\n        Sub-pixel refinement:\n        Second order taylor expansion of the function; first derivative is nul\n        delta = x-i = -Inverse[Hessian].gradient \n        ";
    static PyObject *__pyx_pw_8bilinear_8Bilinear_5local_maxi(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
      PyObject *__pyx_v_x = 0;
      int __pyx_v_w;
      PyObject *__pyx_r = 0;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("local_maxi (wrapper)", 0);
      {
        static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__w,0};
        PyObject* values[2] = {0,0};
        if (unlikely(__pyx_kwds)) {
          Py_ssize_t kw_args;
          const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
          switch (pos_args) {
            case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
            case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
            case  0: break;
            default: goto __pyx_L5_argtuple_error;
          }
          kw_args = PyDict_Size(__pyx_kwds);
          switch (pos_args) {
            case  0:
            if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x)) != 0)) kw_args--;
            else goto __pyx_L5_argtuple_error;
            case  1:
            if (kw_args > 0) {
              PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__w);
              if (value) { values[1] = value; kw_args--; }
            }
          }
          if (unlikely(kw_args > 0)) {
            if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "local_maxi") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
          }
        } else {
          switch (PyTuple_GET_SIZE(__pyx_args)) {
            case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
            case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
            break;
            default: goto __pyx_L5_argtuple_error;
          }
        }
        __pyx_v_x = values[0];
        if (values[1]) {
          __pyx_v_w = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_w == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        } else {
          __pyx_v_w = ((int)1);
        }
      }
      goto __pyx_L4_argument_unpacking_done;
      __pyx_L5_argtuple_error:;
      __Pyx_RaiseArgtupleInvalid("local_maxi", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      __pyx_L3_error:;
      __Pyx_AddTraceback("bilinear.Bilinear.local_maxi", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __Pyx_RefNannyFinishContext();
      return NULL;
      __pyx_L4_argument_unpacking_done:;
      __pyx_r = __pyx_pf_8bilinear_8Bilinear_4local_maxi(((struct __pyx_obj_8bilinear_Bilinear *)__pyx_v_self), __pyx_v_x, __pyx_v_w);
      int __pyx_lineno = 0;
      const char *__pyx_filename = NULL;
      int __pyx_clineno = 0;
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

     96:

     97:     @cython.boundscheck(False)

     98:     @cython.wraparound(False)

     99:     @cython.cdivision(True)

     100:     def local_maxi(self, x, int w=1):

    /* "bilinear.pyx":100
     *     @cython.wraparound(False)
     *     @cython.cdivision(True)
     *     def local_maxi(self, x, int w=1):             # <<<<<<<<<<<<<<
     *         """
     *         Return the local maximum ... with sub-pixel refinement
     */

    static PyObject *__pyx_pf_8bilinear_8Bilinear_4local_maxi(struct __pyx_obj_8bilinear_Bilinear *__pyx_v_self, PyObject *__pyx_v_x, int __pyx_v_w) {
      int __pyx_v_current0;
      int __pyx_v_current1;
      int __pyx_v_i0;
      int __pyx_v_i1;
      int __pyx_v_start0;
      int __pyx_v_stop0;
      int __pyx_v_start1;
      int __pyx_v_stop1;
      int __pyx_v_new0;
      int __pyx_v_new1;
      int __pyx_v_cnt;
      int __pyx_v_width0;
      int __pyx_v_width1;
      float __pyx_v_tmp;
      float __pyx_v_value;
      float __pyx_v_current_value;
      float __pyx_v_sum0;
      float __pyx_v_sum1;
      float __pyx_v_sum;
      float __pyx_v_a00;
      float __pyx_v_a01;
      float __pyx_v_a02;
      float __pyx_v_a10;
      float __pyx_v_a11;
      float __pyx_v_a12;
      float __pyx_v_a20;
      float __pyx_v_a21;
      float __pyx_v_a22;
      float __pyx_v_d00;
      float __pyx_v_d11;
      float __pyx_v_d01;
      float __pyx_v_denom;
      PyObject *__pyx_v_delta0 = NULL;
      PyObject *__pyx_v_delta1 = NULL;
      PyObject *__pyx_r = NULL;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("local_maxi", 0);

     101:         """

     102:         Return the local maximum ... with sub-pixel refinement

     103:

     104:         @param x: 2-tuple of int

     105:         @param w: half with of the window: 1 or 2 are adviced

     106:         @return: 2-tuple of int with the nearest local maximum

     107:

     108:         Sub-pixel refinement:

     109:         Second order taylor expansion of the function; first derivative is nul

     110:         delta = x-i = -Inverse[Hessian].gradient

     111:         """

     112:         cdef int current0 = x[0]

      /* "bilinear.pyx":112
     *         delta = x-i = -Inverse[Hessian].gradient
     *         """
     *         cdef int current0 = x[0]             # <<<<<<<<<<<<<<
     *         cdef int current1 = x[1]
     *         cdef int i0, i1, start0, stop0, start1, stop1, new0, new1, cnt=0, width0=w, width1=w
     */
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 0, sizeof(long), PyInt_FromLong, 0, 0, 0); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_current0 = __pyx_t_2;

     113:         cdef int current1 = x[1]

      /* "bilinear.pyx":113
     *         """
     *         cdef int current0 = x[0]
     *         cdef int current1 = x[1]             # <<<<<<<<<<<<<<
     *         cdef int i0, i1, start0, stop0, start1, stop1, new0, new1, cnt=0, width0=w, width1=w
     *         cdef float tmp, value, current_value, sum0=0,  sum1=0, sum=0
     */
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong, 0, 0, 0); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_current1 = __pyx_t_2;

     114:         cdef int i0, i1, start0, stop0, start1, stop1, new0, new1, cnt=0, width0=w, width1=w

      /* "bilinear.pyx":114
     *         cdef int current0 = x[0]
     *         cdef int current1 = x[1]
     *         cdef int i0, i1, start0, stop0, start1, stop1, new0, new1, cnt=0, width0=w, width1=w             # <<<<<<<<<<<<<<
     *         cdef float tmp, value, current_value, sum0=0,  sum1=0, sum=0
     *         value = self.data[current0,current1]
     */
      __pyx_v_cnt = 0;
      __pyx_v_width0 = __pyx_v_w;
      __pyx_v_width1 = __pyx_v_w;

     115:         cdef float tmp, value, current_value, sum0=0,  sum1=0, sum=0

      /* "bilinear.pyx":115
     *         cdef int current1 = x[1]
     *         cdef int i0, i1, start0, stop0, start1, stop1, new0, new1, cnt=0, width0=w, width1=w
     *         cdef float tmp, value, current_value, sum0=0,  sum1=0, sum=0             # <<<<<<<<<<<<<<
     *         value = self.data[current0,current1]
     *         current_value = value-1.0
     */
      __pyx_v_sum0 = 0.0;
      __pyx_v_sum1 = 0.0;
      __pyx_v_sum = 0.0;

     116:         value = self.data[current0,current1]

      /* "bilinear.pyx":116
     *         cdef int i0, i1, start0, stop0, start1, stop1, new0, new1, cnt=0, width0=w, width1=w
     *         cdef float tmp, value, current_value, sum0=0,  sum1=0, sum=0
     *         value = self.data[current0,current1]             # <<<<<<<<<<<<<<
     *         current_value = value-1.0
     *         new0,new1 = current0,current1
     */
      if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
      __pyx_t_2 = __pyx_v_current0;
      __pyx_t_3 = __pyx_v_current1;
      __pyx_v_value = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_2 * __pyx_v_self->data.strides[0]) ) + __pyx_t_3 * __pyx_v_self->data.strides[1]) )));

     117:         current_value = value-1.0

      /* "bilinear.pyx":117
     *         cdef float tmp, value, current_value, sum0=0,  sum1=0, sum=0
     *         value = self.data[current0,current1]
     *         current_value = value-1.0             # <<<<<<<<<<<<<<
     *         new0,new1 = current0,current1
     *         with nogil:
     */
      __pyx_v_current_value = (__pyx_v_value - 1.0);

     118:         new0,new1 = current0,current1

      /* "bilinear.pyx":118
     *         value = self.data[current0,current1]
     *         current_value = value-1.0
     *         new0,new1 = current0,current1             # <<<<<<<<<<<<<<
     *         with nogil:
     *             while value>current_value:
     */
      __pyx_t_4 = __pyx_v_current0;
      __pyx_t_5 = __pyx_v_current1;
      __pyx_v_new0 = __pyx_t_4;
      __pyx_v_new1 = __pyx_t_5;

     119:         with nogil:

      /* "bilinear.pyx":119
     *         current_value = value-1.0
     *         new0,new1 = current0,current1
     *         with nogil:             # <<<<<<<<<<<<<<
     *             while value>current_value:
     *                 current_value=value
     */
      {
          #ifdef WITH_THREAD
          PyThreadState *_save;
          Py_UNBLOCK_THREADS
          #endif
          /*try:*/ {

          /* "bilinear.pyx":119
     *         current_value = value-1.0
     *         new0,new1 = current0,current1
     *         with nogil:             # <<<<<<<<<<<<<<
     *             while value>current_value:
     *                 current_value=value
     */
          /*finally:*/ {
            int __pyx_why;
            __pyx_why = 0; goto __pyx_L5;
            __pyx_L4: __pyx_why = 4; goto __pyx_L5;
            __pyx_L5:;
            #ifdef WITH_THREAD
            Py_BLOCK_THREADS
            #endif
            switch (__pyx_why) {
              case 4: goto __pyx_L1_error;
            }
          }
      }

     120:             while value>current_value:

            /* "bilinear.pyx":120
     *         new0,new1 = current0,current1
     *         with nogil:
     *             while value>current_value:             # <<<<<<<<<<<<<<
     *                 current_value=value
     *                 cnt+=1
     */
            while (1) {
              __pyx_t_6 = (__pyx_v_value > __pyx_v_current_value);
              if (!__pyx_t_6) break;

     121:                 current_value=value

              /* "bilinear.pyx":121
     *         with nogil:
     *             while value>current_value:
     *                 current_value=value             # <<<<<<<<<<<<<<
     *                 cnt+=1
     *                 if current0 < width0:
     */
              __pyx_v_current_value = __pyx_v_value;

     122:                 cnt+=1

              /* "bilinear.pyx":122
     *             while value>current_value:
     *                 current_value=value
     *                 cnt+=1             # <<<<<<<<<<<<<<
     *                 if current0 < width0:
     *                     start0 = 0
     */
              __pyx_v_cnt = (__pyx_v_cnt + 1);

     123:                 if current0 < width0:

              /* "bilinear.pyx":123
     *                 current_value=value
     *                 cnt+=1
     *                 if current0 < width0:             # <<<<<<<<<<<<<<
     *                     start0 = 0
     *                 else:
     */
              __pyx_t_6 = (__pyx_v_current0 < __pyx_v_width0);
              if (__pyx_t_6) {

     124:                     start0 = 0

                /* "bilinear.pyx":124
     *                 cnt+=1
     *                 if current0 < width0:
     *                     start0 = 0             # <<<<<<<<<<<<<<
     *                 else:
     *                     start0 = current0 - width0
     */
                __pyx_v_start0 = 0;
                goto __pyx_L8;
              }
              /*else*/ {

     125:                 else:

     126:                     start0 = current0 - width0

                /* "bilinear.pyx":126
     *                     start0 = 0
     *                 else:
     *                     start0 = current0 - width0             # <<<<<<<<<<<<<<
     *                 if current0 >= self.d0_max - width0:
     *                     stop0 = self.d0_max
     */
                __pyx_v_start0 = (__pyx_v_current0 - __pyx_v_width0);
              }
              __pyx_L8:;

     127:                 if current0 >= self.d0_max - width0:

              /* "bilinear.pyx":127
     *                 else:
     *                     start0 = current0 - width0
     *                 if current0 >= self.d0_max - width0:             # <<<<<<<<<<<<<<
     *                     stop0 = self.d0_max
     *                 else:
     */
              __pyx_t_6 = (__pyx_v_current0 >= (__pyx_v_self->d0_max - __pyx_v_width0));
              if (__pyx_t_6) {

     128:                     stop0 = self.d0_max

                /* "bilinear.pyx":128
     *                     start0 = current0 - width0
     *                 if current0 >= self.d0_max - width0:
     *                     stop0 = self.d0_max             # <<<<<<<<<<<<<<
     *                 else:
     *                     stop0 = current0 + width0
     */
                __pyx_t_7 = __pyx_v_self->d0_max;
                __pyx_v_stop0 = __pyx_t_7;
                goto __pyx_L9;
              }
              /*else*/ {

     129:                 else:

     130:                     stop0 = current0 + width0

                /* "bilinear.pyx":130
     *                     stop0 = self.d0_max
     *                 else:
     *                     stop0 = current0 + width0             # <<<<<<<<<<<<<<
     *                 if current1 < width1:
     *                     start1 = 0
     */
                __pyx_v_stop0 = (__pyx_v_current0 + __pyx_v_width0);
              }
              __pyx_L9:;

     131:                 if current1 < width1:

              /* "bilinear.pyx":131
     *                 else:
     *                     stop0 = current0 + width0
     *                 if current1 < width1:             # <<<<<<<<<<<<<<
     *                     start1 = 0
     *                 else:
     */
              __pyx_t_6 = (__pyx_v_current1 < __pyx_v_width1);
              if (__pyx_t_6) {

     132:                     start1 = 0

                /* "bilinear.pyx":132
     *                     stop0 = current0 + width0
     *                 if current1 < width1:
     *                     start1 = 0             # <<<<<<<<<<<<<<
     *                 else:
     *                     start1 = current1 - width1
     */
                __pyx_v_start1 = 0;
                goto __pyx_L10;
              }
              /*else*/ {

     133:                 else:

     134:                     start1 = current1 - width1

                /* "bilinear.pyx":134
     *                     start1 = 0
     *                 else:
     *                     start1 = current1 - width1             # <<<<<<<<<<<<<<
     *                 if current1 >= self.d1_max - width1:
     *                     stop1=self.d1_max
     */
                __pyx_v_start1 = (__pyx_v_current1 - __pyx_v_width1);
              }
              __pyx_L10:;

     135:                 if current1 >= self.d1_max - width1:

              /* "bilinear.pyx":135
     *                 else:
     *                     start1 = current1 - width1
     *                 if current1 >= self.d1_max - width1:             # <<<<<<<<<<<<<<
     *                     stop1=self.d1_max
     *                 else:
     */
              __pyx_t_6 = (__pyx_v_current1 >= (__pyx_v_self->d1_max - __pyx_v_width1));
              if (__pyx_t_6) {

     136:                     stop1=self.d1_max

                /* "bilinear.pyx":136
     *                     start1 = current1 - width1
     *                 if current1 >= self.d1_max - width1:
     *                     stop1=self.d1_max             # <<<<<<<<<<<<<<
     *                 else:
     *                     stop1 = current1 + width1
     */
                __pyx_t_7 = __pyx_v_self->d1_max;
                __pyx_v_stop1 = __pyx_t_7;
                goto __pyx_L11;
              }
              /*else*/ {

     137:                 else:

     138:                     stop1 = current1 + width1

                /* "bilinear.pyx":138
     *                     stop1=self.d1_max
     *                 else:
     *                     stop1 = current1 + width1             # <<<<<<<<<<<<<<
     *                 for i0 in range(start0, stop0+1):
     *                     for i1 in range(start1, stop1+1):
     */
                __pyx_v_stop1 = (__pyx_v_current1 + __pyx_v_width1);
              }
              __pyx_L11:;

     139:                 for i0 in range(start0, stop0+1):

              /* "bilinear.pyx":139
     *                 else:
     *                     stop1 = current1 + width1
     *                 for i0 in range(start0, stop0+1):             # <<<<<<<<<<<<<<
     *                     for i1 in range(start1, stop1+1):
     *                         tmp=self.data[i0,i1]
     */
              __pyx_t_8 = (__pyx_v_stop0 + 1);
              for (__pyx_t_5 = __pyx_v_start0; __pyx_t_5 < __pyx_t_8; __pyx_t_5+=1) {
                __pyx_v_i0 = __pyx_t_5;

     140:                     for i1 in range(start1, stop1+1):

                /* "bilinear.pyx":140
     *                     stop1 = current1 + width1
     *                 for i0 in range(start0, stop0+1):
     *                     for i1 in range(start1, stop1+1):             # <<<<<<<<<<<<<<
     *                         tmp=self.data[i0,i1]
     *                         if tmp>current_value:
     */
                __pyx_t_9 = (__pyx_v_stop1 + 1);
                for (__pyx_t_4 = __pyx_v_start1; __pyx_t_4 < __pyx_t_9; __pyx_t_4+=1) {
                  __pyx_v_i1 = __pyx_t_4;

     141:                         tmp=self.data[i0,i1]

                  /* "bilinear.pyx":141
     *                 for i0 in range(start0, stop0+1):
     *                     for i1 in range(start1, stop1+1):
     *                         tmp=self.data[i0,i1]             # <<<<<<<<<<<<<<
     *                         if tmp>current_value:
     *                             new0,new1=i0,i1
     */
                  if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L4;}}
                  __pyx_t_10 = __pyx_v_i0;
                  __pyx_t_11 = __pyx_v_i1;
                  __pyx_v_tmp = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_10 * __pyx_v_self->data.strides[0]) ) + __pyx_t_11 * __pyx_v_self->data.strides[1]) )));

     142:                         if tmp>current_value:

                  /* "bilinear.pyx":142
     *                     for i1 in range(start1, stop1+1):
     *                         tmp=self.data[i0,i1]
     *                         if tmp>current_value:             # <<<<<<<<<<<<<<
     *                             new0,new1=i0,i1
     *                             value = tmp
     */
                  __pyx_t_6 = (__pyx_v_tmp > __pyx_v_current_value);
                  if (__pyx_t_6) {

     143:                             new0,new1=i0,i1

                    /* "bilinear.pyx":143
     *                         tmp=self.data[i0,i1]
     *                         if tmp>current_value:
     *                             new0,new1=i0,i1             # <<<<<<<<<<<<<<
     *                             value = tmp
     *                 current0,current1=new0,new1
     */
                    __pyx_t_12 = __pyx_v_i0;
                    __pyx_t_13 = __pyx_v_i1;
                    __pyx_v_new0 = __pyx_t_12;
                    __pyx_v_new1 = __pyx_t_13;

     144:                             value = tmp

                    /* "bilinear.pyx":144
     *                         if tmp>current_value:
     *                             new0,new1=i0,i1
     *                             value = tmp             # <<<<<<<<<<<<<<
     *                 current0,current1=new0,new1
     *
     */
                    __pyx_v_value = __pyx_v_tmp;
                    goto __pyx_L16;
                  }
                  __pyx_L16:;
                }
              }

     145:                 current0,current1=new0,new1

              /* "bilinear.pyx":145
     *                             new0,new1=i0,i1
     *                             value = tmp
     *                 current0,current1=new0,new1             # <<<<<<<<<<<<<<
     *
     *         cdef float a00, a01, a02, a10, a11, a12, a20, a21, a22 # coefficients of the array
     */
              __pyx_t_5 = __pyx_v_new0;
              __pyx_t_4 = __pyx_v_new1;
              __pyx_v_current0 = __pyx_t_5;
              __pyx_v_current1 = __pyx_t_4;
            }
          }

     146:

     147:         cdef float a00, a01, a02, a10, a11, a12, a20, a21, a22 # coefficients of the array

     148: #        cdef float g0, g1       # gradient values

     149:         cdef float d00, d11, d01, denom # Hessian coefficient

     150: #        print(current0,current1)

     151:         if (stop0>current0) and (current0>start0) and (stop1>current1) and (current1>start1):

      /* "bilinear.pyx":151
     *         cdef float d00, d11, d01, denom # Hessian coefficient
     * #        print(current0,current1)
     *         if (stop0>current0) and (current0>start0) and (stop1>current1) and (current1>start1):             # <<<<<<<<<<<<<<
     *             #Use second order polynomial taylor expansion
     *             a00 = self.data[current0-1,current1-1]
     */
      __pyx_t_6 = (__pyx_v_stop0 > __pyx_v_current0);
      if (__pyx_t_6) {
        __pyx_t_14 = (__pyx_v_current0 > __pyx_v_start0);
        if (__pyx_t_14) {
          __pyx_t_15 = (__pyx_v_stop1 > __pyx_v_current1);
          if (__pyx_t_15) {
            __pyx_t_16 = (__pyx_v_current1 > __pyx_v_start1);
            __pyx_t_17 = __pyx_t_16;
          } else {
            __pyx_t_17 = __pyx_t_15;
          }
          __pyx_t_15 = __pyx_t_17;
        } else {
          __pyx_t_15 = __pyx_t_14;
        }
        __pyx_t_14 = __pyx_t_15;
      } else {
        __pyx_t_14 = __pyx_t_6;
      }
      if (__pyx_t_14) {

     152:             #Use second order polynomial taylor expansion

     153:             a00 = self.data[current0-1,current1-1]

        /* "bilinear.pyx":153
     *         if (stop0>current0) and (current0>start0) and (stop1>current1) and (current1>start1):
     *             #Use second order polynomial taylor expansion
     *             a00 = self.data[current0-1,current1-1]             # <<<<<<<<<<<<<<
     *             a01 = self.data[current0-1,current1  ]
     *             a02 = self.data[current0-1,current1+1]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_8 = (__pyx_v_current0 - 1);
        __pyx_t_9 = (__pyx_v_current1 - 1);
        __pyx_v_a00 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_8 * __pyx_v_self->data.strides[0]) ) + __pyx_t_9 * __pyx_v_self->data.strides[1]) )));

     154:             a01 = self.data[current0-1,current1  ]

        /* "bilinear.pyx":154
     *             #Use second order polynomial taylor expansion
     *             a00 = self.data[current0-1,current1-1]
     *             a01 = self.data[current0-1,current1  ]             # <<<<<<<<<<<<<<
     *             a02 = self.data[current0-1,current1+1]
     *             a10 = self.data[current0  ,current1-1]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_18 = (__pyx_v_current0 - 1);
        __pyx_t_4 = __pyx_v_current1;
        __pyx_v_a01 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_18 * __pyx_v_self->data.strides[0]) ) + __pyx_t_4 * __pyx_v_self->data.strides[1]) )));

     155:             a02 = self.data[current0-1,current1+1]

        /* "bilinear.pyx":155
     *             a00 = self.data[current0-1,current1-1]
     *             a01 = self.data[current0-1,current1  ]
     *             a02 = self.data[current0-1,current1+1]             # <<<<<<<<<<<<<<
     *             a10 = self.data[current0  ,current1-1]
     *             a11 = self.data[current0  ,current1  ]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_19 = (__pyx_v_current0 - 1);
        __pyx_t_20 = (__pyx_v_current1 + 1);
        __pyx_v_a02 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_19 * __pyx_v_self->data.strides[0]) ) + __pyx_t_20 * __pyx_v_self->data.strides[1]) )));

     156:             a10 = self.data[current0  ,current1-1]

        /* "bilinear.pyx":156
     *             a01 = self.data[current0-1,current1  ]
     *             a02 = self.data[current0-1,current1+1]
     *             a10 = self.data[current0  ,current1-1]             # <<<<<<<<<<<<<<
     *             a11 = self.data[current0  ,current1  ]
     *             a12 = self.data[current0  ,current1+1]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_5 = __pyx_v_current0;
        __pyx_t_21 = (__pyx_v_current1 - 1);
        __pyx_v_a10 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_5 * __pyx_v_self->data.strides[0]) ) + __pyx_t_21 * __pyx_v_self->data.strides[1]) )));

     157:             a11 = self.data[current0  ,current1  ]

        /* "bilinear.pyx":157
     *             a02 = self.data[current0-1,current1+1]
     *             a10 = self.data[current0  ,current1-1]
     *             a11 = self.data[current0  ,current1  ]             # <<<<<<<<<<<<<<
     *             a12 = self.data[current0  ,current1+1]
     *             a20 = self.data[current0+1,current1-1]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_13 = __pyx_v_current0;
        __pyx_t_12 = __pyx_v_current1;
        __pyx_v_a11 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_13 * __pyx_v_self->data.strides[0]) ) + __pyx_t_12 * __pyx_v_self->data.strides[1]) )));

     158:             a12 = self.data[current0  ,current1+1]

        /* "bilinear.pyx":158
     *             a10 = self.data[current0  ,current1-1]
     *             a11 = self.data[current0  ,current1  ]
     *             a12 = self.data[current0  ,current1+1]             # <<<<<<<<<<<<<<
     *             a20 = self.data[current0+1,current1-1]
     *             a21 = self.data[current0+1,current1  ]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_22 = __pyx_v_current0;
        __pyx_t_23 = (__pyx_v_current1 + 1);
        __pyx_v_a12 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_22 * __pyx_v_self->data.strides[0]) ) + __pyx_t_23 * __pyx_v_self->data.strides[1]) )));

     159:             a20 = self.data[current0+1,current1-1]

        /* "bilinear.pyx":159
     *             a11 = self.data[current0  ,current1  ]
     *             a12 = self.data[current0  ,current1+1]
     *             a20 = self.data[current0+1,current1-1]             # <<<<<<<<<<<<<<
     *             a21 = self.data[current0+1,current1  ]
     *             a22 = self.data[current0+1,current1-1]
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_24 = (__pyx_v_current0 + 1);
        __pyx_t_25 = (__pyx_v_current1 - 1);
        __pyx_v_a20 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_24 * __pyx_v_self->data.strides[0]) ) + __pyx_t_25 * __pyx_v_self->data.strides[1]) )));

     160:             a21 = self.data[current0+1,current1  ]

        /* "bilinear.pyx":160
     *             a12 = self.data[current0  ,current1+1]
     *             a20 = self.data[current0+1,current1-1]
     *             a21 = self.data[current0+1,current1  ]             # <<<<<<<<<<<<<<
     *             a22 = self.data[current0+1,current1-1]
     * #            g0 = (a21 - a01)/2.0
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_26 = (__pyx_v_current0 + 1);
        __pyx_t_27 = __pyx_v_current1;
        __pyx_v_a21 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_26 * __pyx_v_self->data.strides[0]) ) + __pyx_t_27 * __pyx_v_self->data.strides[1]) )));

     161:             a22 = self.data[current0+1,current1-1]

        /* "bilinear.pyx":161
     *             a20 = self.data[current0+1,current1-1]
     *             a21 = self.data[current0+1,current1  ]
     *             a22 = self.data[current0+1,current1-1]             # <<<<<<<<<<<<<<
     * #            g0 = (a21 - a01)/2.0
     * #            g1 = (a12 - a10)/2.0
     */
        if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
        __pyx_t_28 = (__pyx_v_current0 + 1);
        __pyx_t_29 = (__pyx_v_current1 - 1);
        __pyx_v_a22 = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_28 * __pyx_v_self->data.strides[0]) ) + __pyx_t_29 * __pyx_v_self->data.strides[1]) )));

     162: #            g0 = (a21 - a01)/2.0

     163: #            g1 = (a12 - a10)/2.0

     164:             d00 = a12 - 2.0*a11 + a10

        /* "bilinear.pyx":164
     * #            g0 = (a21 - a01)/2.0
     * #            g1 = (a12 - a10)/2.0
     *             d00 = a12 - 2.0*a11 + a10             # <<<<<<<<<<<<<<
     *             d11 = a21 - 2.0*a11 + a01
     *             d01 = (a00 - a02 - a20 + a22)/4.0
     */
        __pyx_v_d00 = ((__pyx_v_a12 - (2.0 * __pyx_v_a11)) + __pyx_v_a10);

     165:             d11 = a21 - 2.0*a11 + a01

        /* "bilinear.pyx":165
     * #            g1 = (a12 - a10)/2.0
     *             d00 = a12 - 2.0*a11 + a10
     *             d11 = a21 - 2.0*a11 + a01             # <<<<<<<<<<<<<<
     *             d01 = (a00 - a02 - a20 + a22)/4.0
     *             denom = 2.0*(d00*d11-d01*d01)
     */
        __pyx_v_d11 = ((__pyx_v_a21 - (2.0 * __pyx_v_a11)) + __pyx_v_a01);

     166:             d01 = (a00 - a02 - a20 + a22)/4.0

        /* "bilinear.pyx":166
     *             d00 = a12 - 2.0*a11 + a10
     *             d11 = a21 - 2.0*a11 + a01
     *             d01 = (a00 - a02 - a20 + a22)/4.0             # <<<<<<<<<<<<<<
     *             denom = 2.0*(d00*d11-d01*d01)
     *             if abs(denom)<1e-10:
     */
        __pyx_v_d01 = ((((__pyx_v_a00 - __pyx_v_a02) - __pyx_v_a20) + __pyx_v_a22) / 4.0);

     167:             denom = 2.0*(d00*d11-d01*d01)

        /* "bilinear.pyx":167
     *             d11 = a21 - 2.0*a11 + a01
     *             d01 = (a00 - a02 - a20 + a22)/4.0
     *             denom = 2.0*(d00*d11-d01*d01)             # <<<<<<<<<<<<<<
     *             if abs(denom)<1e-10:
     *                 print("Singular determinant, Hessian undefined")
     */
        __pyx_v_denom = (2.0 * ((__pyx_v_d00 * __pyx_v_d11) - (__pyx_v_d01 * __pyx_v_d01)));

     168:             if abs(denom)<1e-10:

        /* "bilinear.pyx":168
     *             d01 = (a00 - a02 - a20 + a22)/4.0
     *             denom = 2.0*(d00*d11-d01*d01)
     *             if abs(denom)<1e-10:             # <<<<<<<<<<<<<<
     *                 print("Singular determinant, Hessian undefined")
     *             else:
     */
        __pyx_t_14 = (fabsf(__pyx_v_denom) < 1e-10);
        if (__pyx_t_14) {

     169:                 print("Singular determinant, Hessian undefined")

          /* "bilinear.pyx":169
     *             denom = 2.0*(d00*d11-d01*d01)
     *             if abs(denom)<1e-10:
     *                 print("Singular determinant, Hessian undefined")             # <<<<<<<<<<<<<<
     *             else:
     *                 delta0 = ((a12 - a10)*d01 + (a01 - a21)*d11)/denom
     */
          if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          goto __pyx_L19;
        }
        /*else*/ {

     170:             else:

     171:                 delta0 = ((a12 - a10)*d01 + (a01 - a21)*d11)/denom

          /* "bilinear.pyx":171
     *                 print("Singular determinant, Hessian undefined")
     *             else:
     *                 delta0 = ((a12 - a10)*d01 + (a01 - a21)*d11)/denom             # <<<<<<<<<<<<<<
     *                 delta1 = ((a10 - a12)*d00 + (a21 - a01)*d01)/denom
     *     #            print(delta0,delta1)
     */
          __pyx_t_1 = PyFloat_FromDouble(((((__pyx_v_a12 - __pyx_v_a10) * __pyx_v_d01) + ((__pyx_v_a01 - __pyx_v_a21) * __pyx_v_d11)) / __pyx_v_denom)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_v_delta0 = __pyx_t_1;
          __pyx_t_1 = 0;

     172:                 delta1 = ((a10 - a12)*d00 + (a21 - a01)*d01)/denom

          /* "bilinear.pyx":172
     *             else:
     *                 delta0 = ((a12 - a10)*d01 + (a01 - a21)*d11)/denom
     *                 delta1 = ((a10 - a12)*d00 + (a21 - a01)*d01)/denom             # <<<<<<<<<<<<<<
     *     #            print(delta0,delta1)
     *                 if abs(delta0)<=1.0 and abs(delta1)<=1.0: #Result is OK is nower than 0.5.
     */
          __pyx_t_1 = PyFloat_FromDouble(((((__pyx_v_a10 - __pyx_v_a12) * __pyx_v_d00) + ((__pyx_v_a21 - __pyx_v_a01) * __pyx_v_d01)) / __pyx_v_denom)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_v_delta1 = __pyx_t_1;
          __pyx_t_1 = 0;

     173:     #            print(delta0,delta1)

     174:                 if abs(delta0)<=1.0 and abs(delta1)<=1.0: #Result is OK is nower than 0.5.

          /* "bilinear.pyx":174
     *                 delta1 = ((a10 - a12)*d00 + (a21 - a01)*d01)/denom
     *     #            print(delta0,delta1)
     *                 if abs(delta0)<=1.0 and abs(delta1)<=1.0: #Result is OK is nower than 0.5.             # <<<<<<<<<<<<<<
     *                     return (float(current0) + delta0, float(current1) + delta1)
     *                 else:
     */
          __pyx_t_1 = PyNumber_Absolute(__pyx_v_delta0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_30 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_t_30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_30);
          __pyx_t_31 = PyObject_RichCompare(__pyx_t_1, __pyx_t_30, Py_LE); __Pyx_XGOTREF(__pyx_t_31); if (unlikely(!__pyx_t_31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_30); __pyx_t_30 = 0;
          __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_31); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_31); __pyx_t_31 = 0;
          if (__pyx_t_14) {
            __pyx_t_31 = PyNumber_Absolute(__pyx_v_delta1); if (unlikely(!__pyx_t_31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_31);
            __pyx_t_30 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_t_30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_30);
            __pyx_t_1 = PyObject_RichCompare(__pyx_t_31, __pyx_t_30, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_DECREF(__pyx_t_31); __pyx_t_31 = 0;
            __Pyx_DECREF(__pyx_t_30); __pyx_t_30 = 0;
            __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
            __pyx_t_15 = __pyx_t_6;
          } else {
            __pyx_t_15 = __pyx_t_14;
          }
          if (__pyx_t_15) {

     175:                     return (float(current0) + delta0, float(current1) + delta1)

            /* "bilinear.pyx":175
     *     #            print(delta0,delta1)
     *                 if abs(delta0)<=1.0 and abs(delta1)<=1.0: #Result is OK is nower than 0.5.
     *                     return (float(current0) + delta0, float(current1) + delta1)             # <<<<<<<<<<<<<<
     *                 else:
     *                     print("Failed to find root using second order expansion")
     */
            __Pyx_XDECREF(__pyx_r);
            __pyx_t_1 = PyFloat_FromDouble(((double)__pyx_v_current0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            __pyx_t_30 = PyNumber_Add(__pyx_t_1, __pyx_v_delta0); if (unlikely(!__pyx_t_30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_30);
            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
            __pyx_t_1 = PyFloat_FromDouble(((double)__pyx_v_current1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            __pyx_t_31 = PyNumber_Add(__pyx_t_1, __pyx_v_delta1); if (unlikely(!__pyx_t_31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_31);
            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_30);
            __Pyx_GIVEREF(__pyx_t_30);
            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_31);
            __Pyx_GIVEREF(__pyx_t_31);
            __pyx_t_30 = 0;
            __pyx_t_31 = 0;
            __pyx_r = ((PyObject *)__pyx_t_1);
            __pyx_t_1 = 0;
            goto __pyx_L0;
            goto __pyx_L20;
          }
          /*else*/ {

     176:                 else:

     177:                     print("Failed to find root using second order expansion")

            /* "bilinear.pyx":177
     *                     return (float(current0) + delta0, float(current1) + delta1)
     *                 else:
     *                     print("Failed to find root using second order expansion")             # <<<<<<<<<<<<<<
     *         #refinement of the position by a simple center of mass of the last valid region used
     *         for i0 in range(start0, stop0+1):
     */
            if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          __pyx_L20:;
        }
        __pyx_L19:;
        goto __pyx_L18;
      }
      __pyx_L18:;

     178:         #refinement of the position by a simple center of mass of the last valid region used

     179:         for i0 in range(start0, stop0+1):

      /* "bilinear.pyx":179
     *                     print("Failed to find root using second order expansion")
     *         #refinement of the position by a simple center of mass of the last valid region used
     *         for i0 in range(start0, stop0+1):             # <<<<<<<<<<<<<<
     *             for i1 in range(start1, stop1+1):
     *                 tmp = self.data[i0,i1]
     */
      __pyx_t_32 = (__pyx_v_stop0 + 1);
      for (__pyx_t_33 = __pyx_v_start0; __pyx_t_33 < __pyx_t_32; __pyx_t_33+=1) {
        __pyx_v_i0 = __pyx_t_33;

     180:             for i1 in range(start1, stop1+1):

        /* "bilinear.pyx":180
     *         #refinement of the position by a simple center of mass of the last valid region used
     *         for i0 in range(start0, stop0+1):
     *             for i1 in range(start1, stop1+1):             # <<<<<<<<<<<<<<
     *                 tmp = self.data[i0,i1]
     *                 sum0 += tmp * i0
     */
        __pyx_t_34 = (__pyx_v_stop1 + 1);
        for (__pyx_t_35 = __pyx_v_start1; __pyx_t_35 < __pyx_t_34; __pyx_t_35+=1) {
          __pyx_v_i1 = __pyx_t_35;

     181:                 tmp = self.data[i0,i1]

          /* "bilinear.pyx":181
     *         for i0 in range(start0, stop0+1):
     *             for i1 in range(start1, stop1+1):
     *                 tmp = self.data[i0,i1]             # <<<<<<<<<<<<<<
     *                 sum0 += tmp * i0
     *                 sum1 += tmp * i1
     */
          if (unlikely(!__pyx_v_self->data.memview)) {PyErr_SetString(PyExc_AttributeError,"Memoryview is not initialized");{__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}}
          __pyx_t_36 = __pyx_v_i0;
          __pyx_t_37 = __pyx_v_i1;
          __pyx_v_tmp = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_self->data.data + __pyx_t_36 * __pyx_v_self->data.strides[0]) ) + __pyx_t_37 * __pyx_v_self->data.strides[1]) )));

     182:                 sum0 += tmp * i0

          /* "bilinear.pyx":182
     *             for i1 in range(start1, stop1+1):
     *                 tmp = self.data[i0,i1]
     *                 sum0 += tmp * i0             # <<<<<<<<<<<<<<
     *                 sum1 += tmp * i1
     *                 sum += tmp
     */
          __pyx_v_sum0 = (__pyx_v_sum0 + (__pyx_v_tmp * __pyx_v_i0));

     183:                 sum1 += tmp * i1

          /* "bilinear.pyx":183
     *                 tmp = self.data[i0,i1]
     *                 sum0 += tmp * i0
     *                 sum1 += tmp * i1             # <<<<<<<<<<<<<<
     *                 sum += tmp
     *         if sum>0:
     */
          __pyx_v_sum1 = (__pyx_v_sum1 + (__pyx_v_tmp * __pyx_v_i1));

     184:                 sum += tmp

          /* "bilinear.pyx":184
     *                 sum0 += tmp * i0
     *                 sum1 += tmp * i1
     *                 sum += tmp             # <<<<<<<<<<<<<<
     *         if sum>0:
     *            #print current0,current1,sum0/sum,sum1/sum
     */
          __pyx_v_sum = (__pyx_v_sum + __pyx_v_tmp);
        }
      }

     185:         if sum>0:

      /* "bilinear.pyx":185
     *                 sum1 += tmp * i1
     *                 sum += tmp
     *         if sum>0:             # <<<<<<<<<<<<<<
     *            #print current0,current1,sum0/sum,sum1/sum
     *            return (sum0/sum,sum1/sum)
     */
      __pyx_t_15 = (__pyx_v_sum > 0.0);
      if (__pyx_t_15) {

     186:            #print current0,current1,sum0/sum,sum1/sum

     187:            return (sum0/sum,sum1/sum)

        /* "bilinear.pyx":187
     *         if sum>0:
     *            #print current0,current1,sum0/sum,sum1/sum
     *            return (sum0/sum,sum1/sum)             # <<<<<<<<<<<<<<
     *         else:
     *             return (current0,current1)
     */
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_1 = PyFloat_FromDouble((__pyx_v_sum0 / __pyx_v_sum)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_31 = PyFloat_FromDouble((__pyx_v_sum1 / __pyx_v_sum)); if (unlikely(!__pyx_t_31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_31);
        __pyx_t_30 = PyTuple_New(2); if (unlikely(!__pyx_t_30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_30);
        PyTuple_SET_ITEM(__pyx_t_30, 0, __pyx_t_1);
        __Pyx_GIVEREF(__pyx_t_1);
        PyTuple_SET_ITEM(__pyx_t_30, 1, __pyx_t_31);
        __Pyx_GIVEREF(__pyx_t_31);
        __pyx_t_1 = 0;
        __pyx_t_31 = 0;
        __pyx_r = ((PyObject *)__pyx_t_30);
        __pyx_t_30 = 0;
        goto __pyx_L0;
        goto __pyx_L25;
      }
      /*else*/ {

     188:         else:

     189:             return (current0,current1)

        /* "bilinear.pyx":189
     *            return (sum0/sum,sum1/sum)
     *         else:
     *             return (current0,current1)             # <<<<<<<<<<<<<<
     */
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_30 = PyInt_FromLong(__pyx_v_current0); if (unlikely(!__pyx_t_30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_30);
        __pyx_t_31 = PyInt_FromLong(__pyx_v_current1); if (unlikely(!__pyx_t_31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_31);
        __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_30);
        __Pyx_GIVEREF(__pyx_t_30);
        PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_31);
        __Pyx_GIVEREF(__pyx_t_31);
        __pyx_t_30 = 0;
        __pyx_t_31 = 0;
        __pyx_r = ((PyObject *)__pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L0;
      }
      __pyx_L25:;

      __pyx_r = Py_None; __Pyx_INCREF(Py_None);
      goto __pyx_L0;
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_XDECREF(__pyx_t_30);
      __Pyx_XDECREF(__pyx_t_31);
      __Pyx_AddTraceback("bilinear.Bilinear.local_maxi", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = NULL;
      __pyx_L0:;
      __Pyx_XDECREF(__pyx_v_delta0);
      __Pyx_XDECREF(__pyx_v_delta1);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    /* Python wrapper */
    static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
    static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
      int __pyx_r;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0);
      __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }