Generated by Cython 0.29.26

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: pyrost.c

+0001: cimport numpy as np
  __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_5) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+0002: import numpy as np
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 0003: from libc.math cimport sqrt, exp, pi, floor, ceil, fabs
 0004: from cython.parallel import prange, parallel
 0005: from libc.stdlib cimport malloc, free
 0006: from libc.string cimport memset
 0007: cimport openmp
 0008: from . cimport pyfftw
+0009: from . import pyfftw
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_pyfftw);
  __Pyx_GIVEREF(__pyx_n_s_pyfftw);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_pyfftw);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s__32, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_pyfftw); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyfftw, __pyx_t_1) < 0) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 0010: from . cimport simulation as sim
 0011: 
 0012: # Numpy must be initialized. When using numpy from C or Cython you must
 0013: # *ALWAYS* do that, or you will have segfaults
+0014: np.import_array()
  __pyx_t_3 = __pyx_f_5numpy_import_array(); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 14, __pyx_L1_error)
 0015: 
 0016: ctypedef fused float_t:
 0017:     np.float64_t
 0018:     np.float32_t
 0019: 
 0020: ctypedef fused uint_t:
 0021:     np.uint64_t
 0022:     np.uint32_t
 0023: 
 0024: DEF FLOAT_MAX = 1.7976931348623157e+308
 0025: DEF M_1_SQRT2PI = 0.3989422804014327
 0026: 
+0027: ctypedef double (*loss_func)(double a) nogil
typedef double (*__pyx_t_6pyrost_3bin_6pyrost_loss_func)(double);
 0028: 
+0029: cdef double Huber_loss(double a) nogil:
static double __pyx_f_6pyrost_3bin_6pyrost_Huber_loss(double __pyx_v_a) {
  double __pyx_v_aa;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0030:     cdef double aa = fabs(a)
  __pyx_v_aa = fabs(__pyx_v_a);
+0031:     if aa < 1.345:
  __pyx_t_1 = ((__pyx_v_aa < 1.345) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0032:         return 0.5 * a * a
    __pyx_r = ((0.5 * __pyx_v_a) * __pyx_v_a);
    goto __pyx_L0;
+0033:     elif 1.345 <= aa < 3.0:
  __pyx_t_1 = (1.345 <= __pyx_v_aa);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_aa < 3.0);
  }
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
+0034:         return 1.345 * (aa - 0.6725)
    __pyx_r = (1.345 * (__pyx_v_aa - 0.6725));
    goto __pyx_L0;
 0035:     else:
+0036:         return 3.1304875
  /*else*/ {
    __pyx_r = 3.1304875;
    goto __pyx_L0;
  }
 0037: 
+0038: cdef double Epsilon_loss(double a) nogil:
static double __pyx_f_6pyrost_3bin_6pyrost_Epsilon_loss(double __pyx_v_a) {
  double __pyx_v_aa;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0039:     cdef double aa = fabs(a)
  __pyx_v_aa = fabs(__pyx_v_a);
+0040:     if aa < 0.25:
  __pyx_t_1 = ((__pyx_v_aa < 0.25) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0041:         return 0.0
    __pyx_r = 0.0;
    goto __pyx_L0;
+0042:     elif 0.25 <= aa < 3.0:
  __pyx_t_1 = (0.25 <= __pyx_v_aa);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_aa < 3.0);
  }
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
+0043:         return aa - 0.25
    __pyx_r = (__pyx_v_aa - 0.25);
    goto __pyx_L0;
 0044:     else:
+0045:         return 2.75
  /*else*/ {
    __pyx_r = 2.75;
    goto __pyx_L0;
  }
 0046: 
+0047: cdef double l2_loss(double a) nogil:
static double __pyx_f_6pyrost_3bin_6pyrost_l2_loss(double __pyx_v_a) {
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0048:     if -3.0 < a < 3.0:
  __pyx_t_1 = (-3.0 < __pyx_v_a);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_a < 3.0);
  }
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
+0049:         return a * a
    __pyx_r = (__pyx_v_a * __pyx_v_a);
    goto __pyx_L0;
 0050:     else:
+0051:         return 9.0
  /*else*/ {
    __pyx_r = 9.0;
    goto __pyx_L0;
  }
 0052: 
+0053: cdef double l1_loss(double a) nogil:
static double __pyx_f_6pyrost_3bin_6pyrost_l1_loss(double __pyx_v_a) {
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0054:     if -3.0 < a < 3.0:
  __pyx_t_1 = (-3.0 < __pyx_v_a);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_a < 3.0);
  }
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
+0055:         return fabs(a)
    __pyx_r = fabs(__pyx_v_a);
    goto __pyx_L0;
 0056:     else:
+0057:         return 3.0
  /*else*/ {
    __pyx_r = 3.0;
    goto __pyx_L0;
  }
 0058: 
+0059: cdef loss_func choose_loss(str loss):
static __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_f_6pyrost_3bin_6pyrost_choose_loss(PyObject *__pyx_v_loss) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("choose_loss", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_WriteUnraisable("pyrost.bin.pyrost.choose_loss", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0060:     cdef loss_func f
+0061:     if loss == 'Epsilon':
  __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_loss, __pyx_n_u_Epsilon, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 61, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
    goto __pyx_L3;
  }
+0062:         f = Epsilon_loss
    __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_Epsilon_loss;
+0063:     elif loss == 'Huber':
  __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_loss, __pyx_n_u_Huber, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 63, __pyx_L1_error)
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+0064:         f = Huber_loss
    __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_Huber_loss;
+0065:     elif loss == 'L2':
  __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_loss, __pyx_n_u_L2, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 65, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
    goto __pyx_L3;
  }
+0066:         f = l2_loss
    __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_l2_loss;
+0067:     elif loss == 'L1':
  __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_loss, __pyx_n_u_L1, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 67, __pyx_L1_error)
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (likely(__pyx_t_1)) {
/* … */
    goto __pyx_L3;
  }
+0068:         f = l1_loss
    __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_l1_loss;
 0069:     else:
+0070:         raise ValueError('loss keyword is invalid')
  /*else*/ {
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 70, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 70, __pyx_L1_error)
  }
  __pyx_L3:;
/* … */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_loss_keyword_is_invalid); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
+0071:     return f
  __pyx_r = __pyx_v_f;
  goto __pyx_L0;
 0072: 
+0073: cdef float_t min_float(float_t* array, int a) nogil:
static __pyx_t_5numpy_float64_t __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float(__pyx_t_5numpy_float64_t *__pyx_v_array, int __pyx_v_a) {
  int __pyx_v_i;
  __pyx_t_5numpy_float64_t __pyx_v_mv;
  __pyx_t_5numpy_float64_t __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static __pyx_t_5numpy_float32_t __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float(__pyx_t_5numpy_float32_t *__pyx_v_array, int __pyx_v_a) {
  int __pyx_v_i;
  __pyx_t_5numpy_float32_t __pyx_v_mv;
  __pyx_t_5numpy_float32_t __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0074:     cdef:
 0075:         int i
+0076:         float_t mv = array[0]
  __pyx_v_mv = (__pyx_v_array[0]);
/* … */
  __pyx_v_mv = (__pyx_v_array[0]);
+0077:     for i in range(a):
  __pyx_t_1 = __pyx_v_a;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_a;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+0078:         if array[i] < mv:
    __pyx_t_4 = (((__pyx_v_array[__pyx_v_i]) < __pyx_v_mv) != 0);
    if (__pyx_t_4) {
/* … */
    }
  }
/* … */
    __pyx_t_4 = (((__pyx_v_array[__pyx_v_i]) < __pyx_v_mv) != 0);
    if (__pyx_t_4) {
/* … */
    }
  }
+0079:             mv = array[i]
      __pyx_v_mv = (__pyx_v_array[__pyx_v_i]);
/* … */
      __pyx_v_mv = (__pyx_v_array[__pyx_v_i]);
+0080:     return mv
  __pyx_r = __pyx_v_mv;
  goto __pyx_L0;
/* … */
  __pyx_r = __pyx_v_mv;
  goto __pyx_L0;
 0081: 
+0082: cdef float_t max_float(float_t* array, int a) nogil:
static __pyx_t_5numpy_float64_t __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float(__pyx_t_5numpy_float64_t *__pyx_v_array, int __pyx_v_a) {
  int __pyx_v_i;
  __pyx_t_5numpy_float64_t __pyx_v_mv;
  __pyx_t_5numpy_float64_t __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static __pyx_t_5numpy_float32_t __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float(__pyx_t_5numpy_float32_t *__pyx_v_array, int __pyx_v_a) {
  int __pyx_v_i;
  __pyx_t_5numpy_float32_t __pyx_v_mv;
  __pyx_t_5numpy_float32_t __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0083:     cdef:
 0084:         int i
+0085:         float_t mv = array[0]
  __pyx_v_mv = (__pyx_v_array[0]);
/* … */
  __pyx_v_mv = (__pyx_v_array[0]);
+0086:     for i in range(a):
  __pyx_t_1 = __pyx_v_a;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_a;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+0087:         if array[i] > mv:
    __pyx_t_4 = (((__pyx_v_array[__pyx_v_i]) > __pyx_v_mv) != 0);
    if (__pyx_t_4) {
/* … */
    }
  }
/* … */
    __pyx_t_4 = (((__pyx_v_array[__pyx_v_i]) > __pyx_v_mv) != 0);
    if (__pyx_t_4) {
/* … */
    }
  }
+0088:             mv = array[i]
      __pyx_v_mv = (__pyx_v_array[__pyx_v_i]);
/* … */
      __pyx_v_mv = (__pyx_v_array[__pyx_v_i]);
+0089:     return mv
  __pyx_r = __pyx_v_mv;
  goto __pyx_L0;
/* … */
  __pyx_r = __pyx_v_mv;
  goto __pyx_L0;
 0090: 
+0091: cdef double rbf(double dsq, double h) nogil:
static double __pyx_f_6pyrost_3bin_6pyrost_rbf(double __pyx_v_dsq, double __pyx_v_h) {
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0092:     return exp(-0.5 * dsq / (h * h)) * M_1_SQRT2PI
  __pyx_r = (exp(((-0.5 * __pyx_v_dsq) / (__pyx_v_h * __pyx_v_h))) * 0.3989422804014327);
  goto __pyx_L0;
 0093: 
+0094: cdef void KR_frame_1d(float_t[:, ::1] I0, float_t[:, ::1] w0, uint_t[:, ::1] I_n,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}
 0095:                       float_t[:, ::1] W, float_t[:, :, ::1] u, float_t dj,
 0096:                       double ds_x, double h) nogil:
+0097:     cdef int X = I_n.shape[1], X0 = I0.shape[1], k, kk, k0, kk0, kk1
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
+0098:     cdef int dn = <int>ceil((4.0 * h) / ds_x)
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
 0099:     cdef double x, r
 0100: 
+0101:     for k in range(X):
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
+0102:         x = u[1, 0, k] - dj
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
/* … */
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
/* … */
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
/* … */
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
+0103:         k0 = <int>(x / ds_x) + 1
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
 0104: 
+0105:         kk0 = k0 - dn if k0 - dn > 0 else 0
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
+0106:         kk1 = k0 + dn if k0 + dn < X0 else X0
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
 0107: 
+0108:         for kk in range(kk0, kk1):
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
/* … */
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
/* … */
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
/* … */
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
+0109:             r = rbf((ds_x * kk - x) * (ds_x * kk - x), h)
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
/* … */
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
/* … */
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
/* … */
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
+0110:             I0[0, kk] += I_n[0, k] * W[0, k] * r
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )) += (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_r);
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )) += (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_r);
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )) += (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_r);
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )) += (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_r);
+0111:             w0[0, kk] += W[0, k] * W[0, k] * r
      __pyx_t_10 = 0;
      __pyx_t_4 = __pyx_v_k;
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_k;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_12 * __pyx_v_w0.strides[0]) )) + __pyx_t_11)) )) += (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_10 * __pyx_v_W.strides[0]) )) + __pyx_t_4)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_5 * __pyx_v_W.strides[0]) )) + __pyx_t_6)) )))) * __pyx_v_r);
    }
  }
/* … */
      __pyx_t_10 = 0;
      __pyx_t_4 = __pyx_v_k;
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_k;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_12 * __pyx_v_w0.strides[0]) )) + __pyx_t_11)) )) += (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_10 * __pyx_v_W.strides[0]) )) + __pyx_t_4)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_5 * __pyx_v_W.strides[0]) )) + __pyx_t_6)) )))) * __pyx_v_r);
    }
  }
/* … */
      __pyx_t_10 = 0;
      __pyx_t_4 = __pyx_v_k;
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_k;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_12 * __pyx_v_w0.strides[0]) )) + __pyx_t_11)) )) += (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_10 * __pyx_v_W.strides[0]) )) + __pyx_t_4)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_5 * __pyx_v_W.strides[0]) )) + __pyx_t_6)) )))) * __pyx_v_r);
    }
  }
/* … */
      __pyx_t_10 = 0;
      __pyx_t_4 = __pyx_v_k;
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_k;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_12 * __pyx_v_w0.strides[0]) )) + __pyx_t_11)) )) += (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_10 * __pyx_v_W.strides[0]) )) + __pyx_t_4)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_5 * __pyx_v_W.strides[0]) )) + __pyx_t_6)) )))) * __pyx_v_r);
    }
  }
 0112: 
+0113: cdef void KR_frame_2d(float_t[:, ::1] I0, float_t[:, ::1] w0, uint_t[:, ::1] I_n,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_w0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}
 0114:                       float_t[:, ::1] W, float_t[:, :, ::1] u, float_t di, float_t dj,
 0115:                       double ds_y, double ds_x, double h) nogil:
+0116:     cdef int Y = I_n.shape[0], X = I_n.shape[1], Y0 = I0.shape[0], X0 = I0.shape[1]
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
 0117:     cdef int j, k, jj, kk, j0, k0, jj0, jj1, kk0, kk1
+0118:     cdef int dn_y = <int>ceil((4.0 * h) / ds_y), dn_x = <int>ceil((4.0 * h) / ds_x)
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
 0119:     cdef double y, x, r
 0120: 
+0121:     for j in range(Y):
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+0122:         for k in range(X):
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
+0123:             y = u[0, j, k] - di
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
+0124:             x = u[1, j, k] - dj
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
+0125:             j0 = <int>(y / ds_y) + 1
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
+0126:             k0 = <int>(x / ds_x) + 1
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
 0127: 
+0128:             jj0 = j0 - dn_y if j0 - dn_y > 0 else 0
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
+0129:             jj1 = j0 + dn_y if j0 + dn_y < Y0 else Y0
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
+0130:             kk0 = k0 - dn_x if k0 - dn_x > 0 else 0
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
+0131:             kk1 = k0 + dn_x if k0 + dn_x < X0 else X0
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
 0132: 
+0133:             for jj in range(jj0, jj1):
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
+0134:                 for kk in range(kk0, kk1):
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
+0135:                     r = rbf((ds_y * jj - y) * (ds_y * jj - y) + (ds_x * kk - x) * (ds_x * kk - x), h)
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
+0136:                     I0[jj, kk] += I_n[j, k] * W[j, k] * r
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) )) += (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_r);
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) )) += (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_r);
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) )) += (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_r);
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) )) += (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_r);
+0137:                     w0[jj, kk] += W[j, k] * W[j, k] * r
          __pyx_t_16 = __pyx_v_j;
          __pyx_t_9 = __pyx_v_k;
          __pyx_t_8 = __pyx_v_j;
          __pyx_t_7 = __pyx_v_k;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_18 * __pyx_v_w0.strides[0]) )) + __pyx_t_17)) )) += (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_16 * __pyx_v_W.strides[0]) )) + __pyx_t_9)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) )))) * __pyx_v_r);
        }
      }
    }
  }
/* … */
          __pyx_t_16 = __pyx_v_j;
          __pyx_t_9 = __pyx_v_k;
          __pyx_t_8 = __pyx_v_j;
          __pyx_t_7 = __pyx_v_k;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_18 * __pyx_v_w0.strides[0]) )) + __pyx_t_17)) )) += (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_16 * __pyx_v_W.strides[0]) )) + __pyx_t_9)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) )))) * __pyx_v_r);
        }
      }
    }
  }
/* … */
          __pyx_t_16 = __pyx_v_j;
          __pyx_t_9 = __pyx_v_k;
          __pyx_t_8 = __pyx_v_j;
          __pyx_t_7 = __pyx_v_k;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_18 * __pyx_v_w0.strides[0]) )) + __pyx_t_17)) )) += (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_16 * __pyx_v_W.strides[0]) )) + __pyx_t_9)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) )))) * __pyx_v_r);
        }
      }
    }
  }
/* … */
          __pyx_t_16 = __pyx_v_j;
          __pyx_t_9 = __pyx_v_k;
          __pyx_t_8 = __pyx_v_j;
          __pyx_t_7 = __pyx_v_k;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_w0.data + __pyx_t_18 * __pyx_v_w0.strides[0]) )) + __pyx_t_17)) )) += (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_16 * __pyx_v_W.strides[0]) )) + __pyx_t_9)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) )))) * __pyx_v_r);
        }
      }
    }
  }
 0138: 
+0139: def KR_reference(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, :, ::1] u not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_1KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_KR_reference[] = "Generate an unabberated reference image of the sample based on the pixel\n    mapping `u` and the measured data `I_n` using the Kernel regression.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Initial sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray) : Initial sample's translations along the horizontal\n            detector axis in pixels.\n        ds_y (float) : Sampling interval of reference image in pixels along the\n            vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along the\n            horizontal axis.\n        h (float) : Gaussian kernel bandwidth in pixels.\n        return_nm0 (bool) : If True, also returns the lower bounds (`n0`, `m0`)\n            of the reference image in pixels.\n        num_threads (int) : Number of threads.\n\n    Returns:\n        Tuple[numpy.ndarray, int, int] : A tuple of three elements ('I0', 'n0',\n        'm0'). The elements are the following:\n\n        * 'I0' : Reference image array.\n        * 'n0' : The lower bounds of the vertical detector axis of the reference\n          image at the reference frame in pixels. Only provided if `return_nm0` is\n          True.\n        * 'm0' : The lower bounds of the horizontal detector axis of the reference\n          image at the reference frame in pixels. Only provided if `return_nm0` is\n          True.\n\n    Notes:\n        The pixel mapping `u` maps the intensity measurements from the detector\n        plane to the reference plane as follows:\n\n        .. math::\n            i_{ref}[n, i, j] = u[0, i, j] + di[n], \\; j_{ref}[n, i, j] = u[1, i, j] + dj[n]\n\n        The reference image profile :math:`I_{ref}[ii, jj]` is obtained with the\n        kern""el regression extimator as follows:\n\n        .. math::\n\n            I_{ref}[i, j] = \\frac{\\sum_{n, i^{\\prime}, j^{\\prime}} K[i - i_{ref}[n,\n            i^{\\prime}, j^{\\prime}], j - j_{ref}[n, i^{\\prime}, j^{\\prime}], h]\n            \\; W[i^{\\prime}, j^{\\prime}] I[n, i^{\\prime}, j^{\\prime}]}\n            {\\sum_{n, i^{\\prime}, j^{\\prime}} K[i - i_{ref}[n, i^{\\prime}, j^{\\prime}], \n            j - j_{ref}[n, i^{\\prime}, j^{\\prime}], h] \\; W^2[i^{\\prime}, j^{\\prime}]}\n\n        where :math:`K[i, j, h] = \\frac{1}{\\sqrt{2 \\pi}} \\exp(-\\frac{i^2 + j^2}{h})`\n        is the Gaussian kernel.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_1KR_reference = {"KR_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_1KR_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_KR_reference};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_1KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 139, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 139, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 139, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_KR_reference(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_KR_reference(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("KR_reference", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_8);
    __Pyx_GIVEREF(__pyx_int_8);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_8);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_8);
    __Pyx_GIVEREF(__pyx_int_8);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_8);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 139, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
/* … */
  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_No_matching_signature_found); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 139, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 139, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_136__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_23KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_23KR_reference = {"__pyx_fuse_0_0KR_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_23KR_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_KR_reference};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_23KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("KR_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults4 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 1); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 2); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 3); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 4); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 5); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 6); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 7); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "KR_reference") < 0)) __PYX_ERR(0, 139, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 139, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_22KR_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_22KR_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float64_t __pyx_v_n0;
  __pyx_t_5numpy_float64_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float64_t __pyx_v_I0_sum;
  __pyx_t_5numpy_float64_t __pyx_v_W0_sum;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0KR_reference", 0);
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_Function_call_with_ambiguous_arg); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_14, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __Pyx_XDECREF(__pyx_t_24);
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_138__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_25KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_25KR_reference = {"__pyx_fuse_0_1KR_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_25KR_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_KR_reference};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_25KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("KR_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults5 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 1); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 2); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 3); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 4); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 5); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 6); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 7); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "KR_reference") < 0)) __PYX_ERR(0, 139, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 139, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_24KR_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_24KR_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float32_t __pyx_v_n0;
  __pyx_t_5numpy_float32_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float32_t __pyx_v_I0_sum;
  __pyx_t_5numpy_float32_t __pyx_v_W0_sum;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1KR_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_14, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __Pyx_XDECREF(__pyx_t_24);
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_140__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults6, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults6, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_27KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_27KR_reference = {"__pyx_fuse_1_0KR_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_27KR_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_KR_reference};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_27KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("KR_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults6 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults6, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 1); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 2); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 3); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 4); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 5); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 6); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 7); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "KR_reference") < 0)) __PYX_ERR(0, 139, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 139, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_26KR_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_26KR_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float64_t __pyx_v_n0;
  __pyx_t_5numpy_float64_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float64_t __pyx_v_I0_sum;
  __pyx_t_5numpy_float64_t __pyx_v_W0_sum;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0KR_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_14, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __Pyx_XDECREF(__pyx_t_24);
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_142__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults7, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults7, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_29KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_29KR_reference = {"__pyx_fuse_1_1KR_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_29KR_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_KR_reference};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_29KR_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("KR_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults7 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults7, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 1); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 2); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 3); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 4); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 5); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 6); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, 7); __PYX_ERR(0, 139, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "KR_reference") < 0)) __PYX_ERR(0, 139, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 139, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("KR_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 139, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 139, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 140, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_28KR_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_28KR_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float32_t __pyx_v_n0;
  __pyx_t_5numpy_float32_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float32_t __pyx_v_I0_sum;
  __pyx_t_5numpy_float32_t __pyx_v_W0_sum;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1KR_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_14, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __Pyx_XDECREF(__pyx_t_24);
  __Pyx_AddTraceback("pyrost.bin.pyrost.KR_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
/* … */
  __pyx_tuple__33 = PyTuple_Pack(29, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_h, __pyx_n_s_return_nm0, __pyx_n_s_num_threads, __pyx_n_s_type_num, __pyx_n_s_N, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_t, __pyx_n_s_k, __pyx_n_s_n0, __pyx_n_s_m0, __pyx_n_s_Y0, __pyx_n_s_X0, __pyx_n_s_shape, __pyx_n_s_I0_buf, __pyx_n_s_W0_buf, __pyx_n_s_I0, __pyx_n_s_I0_2, __pyx_n_s_I0_sum, __pyx_n_s_W0_sum); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);
  __pyx_t_1 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_23KR_reference, 0, __pyx_n_s_KR_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults4), 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_t_2)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults4, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_136__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_25KR_reference, 0, __pyx_n_s_KR_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults5), 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_t_2)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults5, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_138__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float32_t, __pyx_t_2) < 0) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_27KR_reference, 0, __pyx_n_s_KR_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults6), 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults6, __pyx_t_2)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults6, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_140__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_29KR_reference, 0, __pyx_n_s_KR_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults7), 0)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults7, __pyx_t_2)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults7, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_142__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float32_t, __pyx_t_2) < 0) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_1KR_reference, 0, __pyx_n_s_KR_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  ((__pyx_FusedFunctionObject *) __pyx_t_2)->__signatures__ = __pyx_t_1;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_KR_reference, __pyx_t_2) < 0) __PYX_ERR(0, 139, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(10, 0, 29, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_KR_reference, 139, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 139, __pyx_L1_error)
 0140:                  float_t[::1] di not None, float_t[::1] dj not None, double ds_y, double ds_x, double h,
+0141:                  bint return_nm0=True, unsigned num_threads=1):
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
 0142:     r"""Generate an unabberated reference image of the sample based on the pixel
 0143:     mapping `u` and the measured data `I_n` using the Kernel regression.
 0144: 
 0145:     Args:
 0146:         I_n (numpy.ndarray) : Measured intensity frames.
 0147:         W (numpy.ndarray) : Measured frames' whitefield.
 0148:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 0149:             plane to the reference image.
 0150:         di (numpy.ndarray) : Initial sample's translations along the vertical
 0151:             detector axis in pixels.
 0152:         dj (numpy.ndarray) : Initial sample's translations along the horizontal
 0153:             detector axis in pixels.
 0154:         ds_y (float) : Sampling interval of reference image in pixels along the
 0155:             vertical axis.
 0156:         ds_x (float) : Sampling interval of reference image in pixels along the
 0157:             horizontal axis.
 0158:         h (float) : Gaussian kernel bandwidth in pixels.
 0159:         return_nm0 (bool) : If True, also returns the lower bounds (`n0`, `m0`)
 0160:             of the reference image in pixels.
 0161:         num_threads (int) : Number of threads.
 0162: 
 0163:     Returns:
 0164:         Tuple[numpy.ndarray, int, int] : A tuple of three elements ('I0', 'n0',
 0165:         'm0'). The elements are the following:
 0166: 
 0167:         * 'I0' : Reference image array.
 0168:         * 'n0' : The lower bounds of the vertical detector axis of the reference
 0169:           image at the reference frame in pixels. Only provided if `return_nm0` is
 0170:           True.
 0171:         * 'm0' : The lower bounds of the horizontal detector axis of the reference
 0172:           image at the reference frame in pixels. Only provided if `return_nm0` is
 0173:           True.
 0174: 
 0175:     Notes:
 0176:         The pixel mapping `u` maps the intensity measurements from the detector
 0177:         plane to the reference plane as follows:
 0178: 
 0179:         .. math::
 0180:             i_{ref}[n, i, j] = u[0, i, j] + di[n], \; j_{ref}[n, i, j] = u[1, i, j] + dj[n]
 0181: 
 0182:         The reference image profile :math:`I_{ref}[ii, jj]` is obtained with the
 0183:         kernel regression extimator as follows:
 0184: 
 0185:         .. math::
 0186: 
 0187:             I_{ref}[i, j] = \frac{\sum_{n, i^{\prime}, j^{\prime}} K[i - i_{ref}[n,
 0188:             i^{\prime}, j^{\prime}], j - j_{ref}[n, i^{\prime}, j^{\prime}], h]
 0189:             \; W[i^{\prime}, j^{\prime}] I[n, i^{\prime}, j^{\prime}]}
 0190:             {\sum_{n, i^{\prime}, j^{\prime}} K[i - i_{ref}[n, i^{\prime}, j^{\prime}], 
 0191:             j - j_{ref}[n, i^{\prime}, j^{\prime}], h] \; W^2[i^{\prime}, j^{\prime}]}
 0192: 
 0193:         where :math:`K[i, j, h] = \frac{1}{\sqrt{2 \pi}} \exp(-\frac{i^2 + j^2}{h})`
 0194:         is the Gaussian kernel.
 0195:     """
+0196:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0197:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 197, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 197, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 197, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 197, __pyx_L1_error)
/* … */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Sampling_intervals_must_be_posit); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 197, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
 0198: 
+0199:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 199, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 199, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 199, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 199, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0200:     cdef int N = I_n.shape[0], Y = I_n.shape[1], X = I_n.shape[2]
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 0201:     cdef int i, j, t, k
 0202: 
+0203:     cdef float_t n0 = -min_float(&u[0, 0, 0], Y * X) + max_float(&di[0], N)
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
+0204:     cdef float_t m0 = -min_float(&u[1, 0, 0], Y * X) + max_float(&dj[0], N)
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
+0205:     cdef int Y0 = <int>((max_float(&u[0, 0, 0], Y * X) - min_float(&di[0], N) + n0) / ds_y) + 1
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y))) + 1);
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0)) / __pyx_v_ds_y)) + 1);
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y))) + 1);
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0)) / __pyx_v_ds_y)) + 1);
+0206:     cdef int X0 = <int>((max_float(&u[1, 0, 0], Y * X) - min_float(&dj[0], N) + m0) / ds_x) + 1
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x))) + 1);
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0)) / __pyx_v_ds_x)) + 1);
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x))) + 1);
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0)) / __pyx_v_ds_x)) + 1);
 0207: 
+0208:     cdef np.npy_intp *shape = [num_threads, Y0, X0]
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_9;
/* … */
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_9;
/* … */
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_9;
/* … */
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_9;
+0209:     cdef float_t[:, :, ::1] I0_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
+0210:     cdef float_t[:, :, ::1] W0_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
+0211:     cdef np.ndarray I0 = np.PyArray_SimpleNew(2, shape + 1, type_num)
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 211, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 211, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 211, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 211, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
 0212: 
+0213:     if Y0 > 1:
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
+0214:         for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
/* … */
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
/* … */
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
/* … */
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_11 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_13 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
+0215:             t = openmp.omp_get_thread_num()
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
+0216:             KR_frame_2d(I0_buf[t], W0_buf[t], I_n[i], W, u, di[i] - n0, dj[i] - m0, ds_y, ds_x, h)
                              __pyx_t_14.data = __pyx_v_I0_buf.data;
                              __pyx_t_14.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_15.data = __pyx_v_W0_buf.data;
                              __pyx_t_15.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_5 = __pyx_v_i;
                              __pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__pyx_t_14, __pyx_t_15, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_14.data = __pyx_v_I0_buf.data;
                              __pyx_t_14.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_15.data = __pyx_v_W0_buf.data;
                              __pyx_t_15.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_5 = __pyx_v_i;
                              __pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__pyx_t_14, __pyx_t_15, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_14.data = __pyx_v_I0_buf.data;
                              __pyx_t_14.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_15.data = __pyx_v_W0_buf.data;
                              __pyx_t_15.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_5 = __pyx_v_i;
                              __pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__pyx_t_14, __pyx_t_15, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_14.data = __pyx_v_I0_buf.data;
                              __pyx_t_14.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_15.data = __pyx_v_W0_buf.data;
                              __pyx_t_15.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_5 = __pyx_v_i;
                              __pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_2d(__pyx_t_14, __pyx_t_15, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
 0217:     else:
+0218:         for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
/* … */
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
/* … */
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
/* … */
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_13 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_11 = (__pyx_t_13 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_11 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_12);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
+0219:             t = openmp.omp_get_thread_num()
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
+0220:             KR_frame_1d(I0_buf[t], W0_buf[t], I_n[i], W, u, dj[i] - m0, ds_x, h)
                              __pyx_t_15.data = __pyx_v_I0_buf.data;
                              __pyx_t_15.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_14.data = __pyx_v_W0_buf.data;
                              __pyx_t_14.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__pyx_t_15, __pyx_t_14, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_I0_buf.data;
                              __pyx_t_15.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_14.data = __pyx_v_W0_buf.data;
                              __pyx_t_14.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__pyx_t_15, __pyx_t_14, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_I0_buf.data;
                              __pyx_t_15.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_14.data = __pyx_v_W0_buf.data;
                              __pyx_t_14.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__pyx_t_15, __pyx_t_14, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_I0_buf.data;
                              __pyx_t_15.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_14.data = __pyx_v_W0_buf.data;
                              __pyx_t_14.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_14, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_14.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_14.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_14.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_14.suboffsets[0] = -1;

__pyx_t_14.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_14.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_14.suboffsets[1] = -1;

__pyx_t_16.data = __pyx_v_I_n.data;
                              __pyx_t_16.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_6 = __pyx_v_i;
                              __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_KR_frame_1d(__pyx_t_15, __pyx_t_14, __pyx_t_16, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_14, 0);
                              __pyx_t_14.memview = NULL;
                              __pyx_t_14.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
 0221: 
+0222:     cdef float_t[:, ::1] _I0 = I0
  __pyx_t_14 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_14.memview)) __PYX_ERR(0, 222, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_14;
  __pyx_t_14.memview = NULL;
  __pyx_t_14.data = NULL;
/* … */
  __pyx_t_14 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_14.memview)) __PYX_ERR(0, 222, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_14;
  __pyx_t_14.memview = NULL;
  __pyx_t_14.data = NULL;
/* … */
  __pyx_t_14 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_14.memview)) __PYX_ERR(0, 222, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_14;
  __pyx_t_14.memview = NULL;
  __pyx_t_14.data = NULL;
/* … */
  __pyx_t_14 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_14.memview)) __PYX_ERR(0, 222, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_14;
  __pyx_t_14.memview = NULL;
  __pyx_t_14.data = NULL;
 0223:     cdef float_t I0_sum, W0_sum
+0224:     for k in prange(X0, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_12);
                            /* Initialize private variables to invalid values */
                            __pyx_v_I0_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_W0_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_12);
                            /* Initialize private variables to invalid values */
                            __pyx_v_I0_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_W0_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_12);
                            /* Initialize private variables to invalid values */
                            __pyx_v_I0_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_W0_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_11 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_13 = (__pyx_t_11 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_13 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_I0_sum) lastprivate(__pyx_v_W0_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_13; __pyx_t_12++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_12);
                            /* Initialize private variables to invalid values */
                            __pyx_v_I0_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_W0_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
+0225:         for j in range(Y0):
                            __pyx_t_17 = __pyx_v_Y0;
                            __pyx_t_18 = __pyx_t_17;
                            for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
                              __pyx_v_j = __pyx_t_19;
/* … */
                            __pyx_t_17 = __pyx_v_Y0;
                            __pyx_t_18 = __pyx_t_17;
                            for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
                              __pyx_v_j = __pyx_t_19;
/* … */
                            __pyx_t_17 = __pyx_v_Y0;
                            __pyx_t_18 = __pyx_t_17;
                            for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
                              __pyx_v_j = __pyx_t_19;
/* … */
                            __pyx_t_17 = __pyx_v_Y0;
                            __pyx_t_18 = __pyx_t_17;
                            for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
                              __pyx_v_j = __pyx_t_19;
+0226:             I0_sum = 0.0; W0_sum = 0.0
                              __pyx_v_I0_sum = 0.0;
                              __pyx_v_W0_sum = 0.0;
/* … */
                              __pyx_v_I0_sum = 0.0;
                              __pyx_v_W0_sum = 0.0;
/* … */
                              __pyx_v_I0_sum = 0.0;
                              __pyx_v_W0_sum = 0.0;
/* … */
                              __pyx_v_I0_sum = 0.0;
                              __pyx_v_W0_sum = 0.0;
+0227:             for i in range(<int>num_threads):
                              __pyx_t_20 = ((int)__pyx_v_num_threads);
                              __pyx_t_21 = __pyx_t_20;
                              for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) {
                                __pyx_v_i = __pyx_t_22;
/* … */
                              __pyx_t_20 = ((int)__pyx_v_num_threads);
                              __pyx_t_21 = __pyx_t_20;
                              for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) {
                                __pyx_v_i = __pyx_t_22;
/* … */
                              __pyx_t_20 = ((int)__pyx_v_num_threads);
                              __pyx_t_21 = __pyx_t_20;
                              for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) {
                                __pyx_v_i = __pyx_t_22;
/* … */
                              __pyx_t_20 = ((int)__pyx_v_num_threads);
                              __pyx_t_21 = __pyx_t_20;
                              for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) {
                                __pyx_v_i = __pyx_t_22;
+0228:                 I0_sum = I0_sum + I0_buf[i, j, k]
                                __pyx_t_6 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_7 = __pyx_v_k;
                                __pyx_v_I0_sum = (__pyx_v_I0_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_6 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[1]) )) + __pyx_t_7)) ))));
/* … */
                                __pyx_t_6 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_7 = __pyx_v_k;
                                __pyx_v_I0_sum = (__pyx_v_I0_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_6 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[1]) )) + __pyx_t_7)) ))));
/* … */
                                __pyx_t_6 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_7 = __pyx_v_k;
                                __pyx_v_I0_sum = (__pyx_v_I0_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_6 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[1]) )) + __pyx_t_7)) ))));
/* … */
                                __pyx_t_6 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_7 = __pyx_v_k;
                                __pyx_v_I0_sum = (__pyx_v_I0_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_6 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[1]) )) + __pyx_t_7)) ))));
+0229:                 W0_sum = W0_sum + W0_buf[i, j, k]
                                __pyx_t_7 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_6 = __pyx_v_k;
                                __pyx_v_W0_sum = (__pyx_v_W0_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) )) + __pyx_t_6)) ))));
                              }
/* … */
                                __pyx_t_7 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_6 = __pyx_v_k;
                                __pyx_v_W0_sum = (__pyx_v_W0_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) )) + __pyx_t_6)) ))));
                              }
/* … */
                                __pyx_t_7 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_6 = __pyx_v_k;
                                __pyx_v_W0_sum = (__pyx_v_W0_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) )) + __pyx_t_6)) ))));
                              }
/* … */
                                __pyx_t_7 = __pyx_v_i;
                                __pyx_t_5 = __pyx_v_j;
                                __pyx_t_6 = __pyx_v_k;
                                __pyx_v_W0_sum = (__pyx_v_W0_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) )) + __pyx_t_6)) ))));
                              }
 0230: 
+0231:             _I0[j, k] = I0_sum / W0_sum if W0_sum > 0.0 else 1.0
                              if (((__pyx_v_W0_sum > 0.0) != 0)) {
                                __pyx_t_23 = (__pyx_v_I0_sum / __pyx_v_W0_sum);
                              } else {
                                __pyx_t_23 = 1.0;
                              }
                              __pyx_t_6 = __pyx_v_j;
                              __pyx_t_5 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_6 * __pyx_v__I0.strides[0]) )) + __pyx_t_5)) )) = __pyx_t_23;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              if (((__pyx_v_W0_sum > 0.0) != 0)) {
                                __pyx_t_23 = (__pyx_v_I0_sum / __pyx_v_W0_sum);
                              } else {
                                __pyx_t_23 = 1.0;
                              }
                              __pyx_t_6 = __pyx_v_j;
                              __pyx_t_5 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_6 * __pyx_v__I0.strides[0]) )) + __pyx_t_5)) )) = __pyx_t_23;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              if (((__pyx_v_W0_sum > 0.0) != 0)) {
                                __pyx_t_23 = (__pyx_v_I0_sum / __pyx_v_W0_sum);
                              } else {
                                __pyx_t_23 = 1.0;
                              }
                              __pyx_t_6 = __pyx_v_j;
                              __pyx_t_5 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_6 * __pyx_v__I0.strides[0]) )) + __pyx_t_5)) )) = __pyx_t_23;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              if (((__pyx_v_W0_sum > 0.0) != 0)) {
                                __pyx_t_23 = (__pyx_v_I0_sum / __pyx_v_W0_sum);
                              } else {
                                __pyx_t_23 = 1.0;
                              }
                              __pyx_t_6 = __pyx_v_j;
                              __pyx_t_5 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_6 * __pyx_v__I0.strides[0]) )) + __pyx_t_5)) )) = __pyx_t_23;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 0232: 
+0233:     if return_nm0:
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
+0234:         return I0, <int>n0, <int>m0
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_24 = PyTuple_New(3); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_24);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_24, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_24, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_24, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_24;
    __pyx_t_24 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_24 = PyTuple_New(3); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_24);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_24, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_24, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_24, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_24;
    __pyx_t_24 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_24 = PyTuple_New(3); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_24);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_24, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_24, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_24, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_24;
    __pyx_t_24 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_24 = PyTuple_New(3); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_24);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_24, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_24, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_24, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_24;
    __pyx_t_24 = 0;
    goto __pyx_L0;
 0235:     else:
+0236:         return I0
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
/* … */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
/* … */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
/* … */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
 0237: 
+0238: cdef void LOWESS_frame_1d(float_t[:, ::1] W_sum, float_t[:, :, ::1] M_mat, float_t[:, :, ::1] I0_mat,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_X;
  int __pyx_v_X0;
  int __pyx_v_k;
  int __pyx_v_kk;
  int __pyx_v_k0;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}
 0239:                           float_t[:, :, ::1] W0_mat, uint_t[:, ::1] I_n, float_t[:, ::1] W,
 0240:                           float_t[:, :, ::1] u, float_t dj, double ds_x, double h) nogil:
+0241:     cdef int X = I_n.shape[1], X0 = W_sum.shape[1]
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
/* … */
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
/* … */
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
/* … */
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
 0242:     cdef int k, kk, j0, k0, kk0, kk1
+0243:     cdef int dn = <int>ceil((4.0 * h) / ds_x)
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
 0244:     cdef double x, r, w
 0245: 
+0246:     for k in range(X):
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_X;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
+0247:         x = u[1, 0, k] - dj
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
/* … */
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
/* … */
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
/* … */
    __pyx_t_4 = 1;
    __pyx_t_5 = 0;
    __pyx_t_6 = __pyx_v_k;
    __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_4 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) ))) - __pyx_v_dj);
+0248:         k0 = <int>(x / ds_x) + 1
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
    __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
 0249: 
+0250:         kk0 = k0 - dn if k0 - dn > 0 else 0
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 - __pyx_v_dn) > 0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 - __pyx_v_dn);
    } else {
      __pyx_t_7 = 0;
    }
    __pyx_v_kk0 = __pyx_t_7;
+0251:         kk1 = k0 + dn if k0 + dn < X0 else X0
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
/* … */
    if ((((__pyx_v_k0 + __pyx_v_dn) < __pyx_v_X0) != 0)) {
      __pyx_t_7 = (__pyx_v_k0 + __pyx_v_dn);
    } else {
      __pyx_t_7 = __pyx_v_X0;
    }
    __pyx_v_kk1 = __pyx_t_7;
 0252: 
+0253:         for kk in range(kk0, kk1):
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
/* … */
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
/* … */
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
/* … */
    __pyx_t_7 = __pyx_v_kk1;
    __pyx_t_8 = __pyx_t_7;
    for (__pyx_t_9 = __pyx_v_kk0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
      __pyx_v_kk = __pyx_t_9;
+0254:             r = rbf((ds_x * kk - x) * (ds_x * kk - x), h)
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
/* … */
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
/* … */
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
/* … */
      __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf((((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x)), __pyx_v_h);
+0255:             W_sum[0, kk] += r
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_6 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_5)) )) += __pyx_v_r;
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_6 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_5)) )) += __pyx_v_r;
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_6 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_5)) )) += __pyx_v_r;
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_6 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_5)) )) += __pyx_v_r;
+0256:             w = r / W_sum[0, kk]
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_kk;
      __pyx_v_w = (((__pyx_t_5numpy_float64_t)__pyx_v_r) / (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_5 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_6)) ))));
/* … */
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_kk;
      __pyx_v_w = (((__pyx_t_5numpy_float64_t)__pyx_v_r) / (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_5 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_6)) ))));
/* … */
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_kk;
      __pyx_v_w = (__pyx_v_r / ((double)(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_5 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_5 = 0;
      __pyx_t_6 = __pyx_v_kk;
      __pyx_v_w = (__pyx_v_r / ((double)(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_5 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_6)) )))));
 0257: 
+0258:             M_mat[0, kk, 1] += w * (x - M_mat[0, kk, 1])
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_4 = 1;
      __pyx_t_10 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_12 = 1;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_10 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_12)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_6 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_4)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_4 = 1;
      __pyx_t_10 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_12 = 1;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_10 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_12)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_6 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_4)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_4 = 1;
      __pyx_t_10 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_12 = 1;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_10 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_12)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_6 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_4)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_4 = 1;
      __pyx_t_10 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_12 = 1;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_10 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_12)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_6 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_4)) )))));
+0259:             M_mat[0, kk, 3] += w * (x * x - M_mat[0, kk, 3])
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 3;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_10 = 3;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_12 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_10)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_4 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 3;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_10 = 3;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_12 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_10)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_4 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 3;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_10 = 3;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_12 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_10)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_4 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 3;
      __pyx_t_12 = 0;
      __pyx_t_11 = __pyx_v_kk;
      __pyx_t_10 = 3;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_12 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_10)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_4 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_6)) )))));
 0260: 
+0261:             I0_mat[0, kk, 0] += w * (I_n[0, k] * W[0, k] - I0_mat[0, kk, 0])
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_14 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_11 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_13)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_14 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_11 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_13)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_14 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_11 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_13)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_14 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_6 * __pyx_v_I_n.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_11 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_13)) )))));
+0262:             I0_mat[0, kk, 2] += w * (I_n[0, k] * W[0, k] * x - I0_mat[0, kk, 2])
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_16 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_13 * __pyx_v_I_n.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_4 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_16 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_13 * __pyx_v_I_n.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_4 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_16 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_13 * __pyx_v_I_n.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_4 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_6)) )))));
/* … */
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_16 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_13 * __pyx_v_I_n.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_4 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_6)) )))));
 0263: 
+0264:             W0_mat[0, kk, 0] += w * (W[0, k] * W[0, k] - W0_mat[0, kk, 0])
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_14 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_6 * __pyx_v_W.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_11 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_13)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_14 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_6 * __pyx_v_W.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_11 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_13)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_14 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_6 * __pyx_v_W.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_11 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_13)) )))));
/* … */
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_12 = __pyx_v_kk;
      __pyx_t_13 = 0;
      __pyx_t_14 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_16 = 0;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_14 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_6 * __pyx_v_W.strides[0]) )) + __pyx_t_5)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_4 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_11 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_13)) )))));
+0265:             W0_mat[0, kk, 2] += w * (W[0, k] * W[0, k] * x - W0_mat[0, kk, 2])
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_16 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_4 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_6)) )))));
    }
  }
/* … */
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_16 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_4 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_6)) )))));
    }
  }
/* … */
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_16 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_4 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_6)) )))));
    }
  }
/* … */
      __pyx_t_13 = 0;
      __pyx_t_12 = __pyx_v_k;
      __pyx_t_11 = 0;
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_4 = 0;
      __pyx_t_5 = __pyx_v_kk;
      __pyx_t_6 = 2;
      __pyx_t_16 = 0;
      __pyx_t_15 = __pyx_v_kk;
      __pyx_t_14 = 2;
      *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_16 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_14)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_10)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_4 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_6)) )))));
    }
  }
 0266: 
+0267: cdef void LOWESS_frame_2d(float_t[:, ::1] W_sum, float_t[:, :, ::1] M_mat, float_t[:, :, ::1] I0_mat,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__Pyx_memviewslice __pyx_v_W_sum, __Pyx_memviewslice __pyx_v_M_mat, __Pyx_memviewslice __pyx_v_I0_mat, __Pyx_memviewslice __pyx_v_W0_mat, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
  double __pyx_v_w;
/* … */
  /* function exit code */
}
 0268:                           float_t[:, :, ::1] W0_mat, uint_t[:, ::1] I_n, float_t[:, ::1] W,
 0269:                           float_t[:, :, ::1] u, float_t di, float_t dj, double ds_y, double ds_x, double h) nogil:
+0270:     cdef int Y = I_n.shape[0], X = I_n.shape[1], Y0 = W_sum.shape[0], X0 = W_sum.shape[1]
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_W_sum.shape[0]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_W_sum.shape[0]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_W_sum.shape[0]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_W_sum.shape[0]);
  __pyx_v_X0 = (__pyx_v_W_sum.shape[1]);
 0271:     cdef int j, k, jj, kk, j0, k0, jj0, jj1, kk0, kk1
+0272:     cdef int dn_y = <int>ceil((4.0 * h) / ds_y), dn_x = <int>ceil((4.0 * h) / ds_x)
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
 0273:     cdef double y, x, r, w
 0274: 
+0275:     for j in range(Y):
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+0276:         for k in range(X):
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
+0277:             y = u[0, j, k] - di
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
+0278:             x = u[1, j, k] - dj
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
+0279:             j0 = <int>(y / ds_y) + 1
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
+0280:             k0 = <int>(x / ds_x) + 1
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
 0281: 
+0282:             jj0 = j0 - dn_y if j0 - dn_y > 0 else 0
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
+0283:             jj1 = j0 + dn_y if j0 + dn_y < Y0 else Y0
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
+0284:             kk0 = k0 - dn_x if k0 - dn_x > 0 else 0
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
+0285:             kk1 = k0 + dn_x if k0 + dn_x < X0 else X0
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
 0286: 
+0287:             for jj in range(jj0, jj1):
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
+0288:                 for kk in range(kk0, kk1):
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
+0289:                     r = rbf((ds_y * jj - y) * (ds_y * jj - y) + (ds_x * kk - x) * (ds_x * kk - x), h)
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
+0290:                     W_sum[jj, kk] += r
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_7 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_8)) )) += __pyx_v_r;
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_7 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_8)) )) += __pyx_v_r;
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_7 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_8)) )) += __pyx_v_r;
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_7 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_8)) )) += __pyx_v_r;
+0291:                     w = r / W_sum[jj, kk]
          __pyx_t_8 = __pyx_v_jj;
          __pyx_t_7 = __pyx_v_kk;
          __pyx_v_w = (((__pyx_t_5numpy_float64_t)__pyx_v_r) / (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_8 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_7)) ))));
/* … */
          __pyx_t_8 = __pyx_v_jj;
          __pyx_t_7 = __pyx_v_kk;
          __pyx_v_w = (((__pyx_t_5numpy_float64_t)__pyx_v_r) / (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_8 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_7)) ))));
/* … */
          __pyx_t_8 = __pyx_v_jj;
          __pyx_t_7 = __pyx_v_kk;
          __pyx_v_w = (__pyx_v_r / ((double)(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_8 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_8 = __pyx_v_jj;
          __pyx_t_7 = __pyx_v_kk;
          __pyx_v_w = (__pyx_v_r / ((double)(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W_sum.data + __pyx_t_8 * __pyx_v_W_sum.strides[0]) )) + __pyx_t_7)) )))));
 0292: 
+0293:                     M_mat[jj, kk, 0] += w * (y - M_mat[jj, kk, 0])
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 0;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 0;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * (__pyx_v_y - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 0;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 0;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * (__pyx_v_y - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 0;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 0;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * (__pyx_v_y - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 0;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 0;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * (__pyx_v_y - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
+0294:                     M_mat[jj, kk, 1] += w * (x - M_mat[jj, kk, 1])
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 1;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 1;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 1;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 1;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * (__pyx_v_x - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
+0295:                     M_mat[jj, kk, 2] += w * (y * y - M_mat[jj, kk, 2])
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 2;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 2;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * ((__pyx_v_y * __pyx_v_y) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 2;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 2;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * ((__pyx_v_y * __pyx_v_y) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 2;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 2;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * ((__pyx_v_y * __pyx_v_y) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
/* … */
          __pyx_t_7 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_9 = 2;
          __pyx_t_16 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_18 = 2;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_16 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_18)) )) += (__pyx_v_w * ((__pyx_v_y * __pyx_v_y) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_7 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_9)) )))));
+0296:                     M_mat[jj, kk, 3] += w * (x * x - M_mat[jj, kk, 3])
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 3;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 3;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 3;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 3;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 3;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 3;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 3;
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          __pyx_t_16 = 3;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_18 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_17 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_16)) )) += (__pyx_v_w * ((__pyx_v_x * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_mat.data + __pyx_t_9 * __pyx_v_M_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_M_mat.strides[1]) )) + __pyx_t_7)) )))));
 0297: 
+0298:                     I0_mat[jj, kk, 0] += w * (I_n[j, k] * W[j, k] - I0_mat[jj, kk, 0])
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 0;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 0;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 0;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 0;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 0;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 0;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 0;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 0;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
+0299:                     I0_mat[jj, kk, 1] += w * (I_n[j, k] * W[j, k] * y - I0_mat[jj, kk, 1])
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 1;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_22 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_19 * __pyx_v_I_n.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_9 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 1;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_22 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_19 * __pyx_v_I_n.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_9 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 1;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_22 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_19 * __pyx_v_I_n.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_9 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 1;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 1;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_22 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_19 * __pyx_v_I_n.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_9 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_7)) )))));
+0300:                     I0_mat[jj, kk, 2] += w * (I_n[j, k] * W[j, k] * x - I0_mat[jj, kk, 2])
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 2;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 2;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 2;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 2;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 2;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 2;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 2;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 2;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_20 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_mat.data + __pyx_t_17 * __pyx_v_I0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_I0_mat.strides[1]) )) + __pyx_t_19)) )))));
 0301: 
+0302:                     W0_mat[jj, kk, 0] += w * (W[j, k] * W[j, k] - W0_mat[jj, kk, 0])
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 0;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 0;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 0;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 0;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 0;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 0;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 0;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 0;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
+0303:                     W0_mat[jj, kk, 1] += w * (W[j, k] * W[j, k] * y - W0_mat[jj, kk, 1])
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 1;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 1;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_20 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_7 * __pyx_v_W.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_17 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 1;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 1;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_20 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_7 * __pyx_v_W.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_17 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 1;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 1;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_20 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_7 * __pyx_v_W.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_17 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_19)) )))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = 1;
          __pyx_t_20 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_22 = 1;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_20 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_22)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_7 * __pyx_v_W.strides[0]) )) + __pyx_t_8)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_y) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_17 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_18 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_19)) )))));
+0304:                     W0_mat[jj, kk, 2] += w * (W[j, k] * W[j, k] * x - W0_mat[jj, kk, 2])
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 2;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 2;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
        }
      }
    }
  }
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 2;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 2;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
        }
      }
    }
  }
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 2;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 2;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
        }
      }
    }
  }
/* … */
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_18 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_jj;
          __pyx_t_8 = __pyx_v_kk;
          __pyx_t_7 = 2;
          __pyx_t_22 = __pyx_v_jj;
          __pyx_t_21 = __pyx_v_kk;
          __pyx_t_20 = 2;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_22 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_21 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_20)) )) += (__pyx_v_w * ((((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_19 * __pyx_v_W.strides[0]) )) + __pyx_t_18)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_17 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) )))) * __pyx_v_x) - (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_mat.data + __pyx_t_9 * __pyx_v_W0_mat.strides[0]) ) + __pyx_t_8 * __pyx_v_W0_mat.strides[1]) )) + __pyx_t_7)) )))));
        }
      }
    }
  }
 0305: 
+0306: def LOWESS_reference(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, :, ::1] u not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_3LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_2LOWESS_reference[] = "Generate an unabberated reference image of the sample based on the\n    pixel mapping `u` and the measured data `I_n` using the Local Weighted\n    Linear Regression (LOWESS).\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Initial sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray) : Initial sample's translations along the horizontal\n            detector axis in pixels.\n        ds_y (float) : Sampling interval of reference image in pixels along the\n            vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along the\n            horizontal axis.\n        h (float) : Gaussian kernel bandwidth in pixels.\n        return_nm0 (bool) : If True, also returns the lower bounds (`n0`, `m0`)\n            of the reference image in pixels.\n        num_threads (int) : Number of threads.\n\n    Returns:\n        Tuple[numpy.ndarray, int, int] : A tuple of three elements ('I0', 'n0',\n        'm0'). The elements are the following:\n\n        * 'I0' : Reference image array.\n        * 'n0' : The lower bounds of the vertical detector axis of the reference\n          image at the reference frame in pixels. Only provided if `return_nm0` is\n          True.\n        * 'm0' : The lower bounds of the horizontal detector axis of the reference\n          image at the reference frame in pixels. Only provided if `return_nm0` is\n          True.\n\n    Notes:\n        The pixel mapping `u` maps the intensity measurements from the\n        detector plane to the reference plane as follows:\n\n        .. math::\n            i_{ref}[n, i, j] = u[0, i, j] + di[n], \\; j_{ref}[n, i, j] = u[1, i, j] + dj[n]\n\n        The reference image profile :math:`I_{ref}[ii, jj]` is ob""tained\n        with the LOWESS regression extimator as follows:\n\n        .. math::\n\n            I_{ref}[i, j] = \\frac{\\sum_{n, i^{\\prime}, j^{\\prime}} K[i - i_{ref}[n,\n            i^{\\prime}, j^{\\prime}], j - j_{ref}[n, i^{\\prime}, j^{\\prime}], h]\n            \\; r_{IW}[n, a^{IW}, b^{IW}_i, b^{IW}_j]}\n            {\\sum_{n, i^{\\prime}, j^{\\prime}} K[i - i_{ref}[n, i^{\\prime}, j^{\\prime}], \n            j - j_{ref}[n, i^{\\prime}, j^{\\prime}], h] \\;\n            r_{WW}[n, a^{WW}, b^{WW}_i, b^{WW}_j]}\n\n        where :math:`r_{IW}[n, a, b_i, b_j]` and :math:`r_{WW}[n, a, b_i, b_j]`\n        are the residuals at the pixel :math:`i, j` with linear coefficients\n        defined with the least squares approach:\n\n        .. math::\n\n            r_{IW}[n, a, b_i, b_j] = I[n, i^{\\prime}, j^{\\prime}] W[i^{\\prime}, j^{\\prime}]\n            - a - b_i (i - i_{ref}[n, i^{\\prime}, j^{\\prime}) - b_j\n            (j - j_{ref}[n, i^{\\prime}, j^{\\prime})\n\n        .. math::\n\n            r_{WW}[n, a, b_i, b_j] = W^2[i^{\\prime}, j^{\\prime}]\n            - a - b_i (i - i_{ref}[n, i^{\\prime}, j^{\\prime}) - b_j\n            (j - j_{ref}[n, i^{\\prime}, j^{\\prime})\n\n        and :math:`K[i, j, h] = \\frac{1}{\\sqrt{2 \\pi}} \\exp(-\\frac{i^2 + j^2}{h})`\n        is the Gaussian kernel.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_3LOWESS_reference = {"LOWESS_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_3LOWESS_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_2LOWESS_reference};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_3LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 306, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 306, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 306, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_2LOWESS_reference(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_2LOWESS_reference(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("LOWESS_reference", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_8);
    __Pyx_GIVEREF(__pyx_int_8);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_8);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_8);
    __Pyx_GIVEREF(__pyx_int_8);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_8);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 306, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 306, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_152__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults12, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults12, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_33LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_33LOWESS_reference = {"__pyx_fuse_0_0LOWESS_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_33LOWESS_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_2LOWESS_reference};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_33LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("LOWESS_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults12 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults12, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 1); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 2); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 3); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 4); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 5); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 6); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 7); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "LOWESS_reference") < 0)) __PYX_ERR(0, 306, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 306, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_32LOWESS_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_32LOWESS_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float64_t __pyx_v_n0;
  __pyx_t_5numpy_float64_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_W_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_M_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float64_t __pyx_v_W_sum;
  __pyx_t_5numpy_float64_t __pyx_v_w;
  __pyx_t_5numpy_float64_t __pyx_v_betta_y;
  __pyx_t_5numpy_float64_t __pyx_v_betta_x;
  __pyx_t_5numpy_float64_t __pyx_v_var_y;
  __pyx_t_5numpy_float64_t __pyx_v_var_x;
  __pyx_t_5numpy_float64_t __pyx_v_I0_pred;
  __pyx_t_5numpy_float64_t __pyx_v_W0_pred;
  __pyx_t_5numpy_float64_t *__pyx_v_M_mat;
  __pyx_t_5numpy_float64_t *__pyx_v_I0_mat;
  __pyx_t_5numpy_float64_t *__pyx_v_W0_mat;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0LOWESS_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1);
  __Pyx_XDECREF(__pyx_t_27);
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_W_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_M_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_154__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults13, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults13, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_35LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_35LOWESS_reference = {"__pyx_fuse_0_1LOWESS_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_35LOWESS_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_2LOWESS_reference};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_35LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("LOWESS_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults13 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults13, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 1); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 2); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 3); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 4); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 5); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 6); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 7); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "LOWESS_reference") < 0)) __PYX_ERR(0, 306, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 306, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_34LOWESS_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_34LOWESS_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float32_t __pyx_v_n0;
  __pyx_t_5numpy_float32_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_W_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_M_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float32_t __pyx_v_W_sum;
  __pyx_t_5numpy_float32_t __pyx_v_w;
  __pyx_t_5numpy_float32_t __pyx_v_betta_y;
  __pyx_t_5numpy_float32_t __pyx_v_betta_x;
  __pyx_t_5numpy_float32_t __pyx_v_var_y;
  __pyx_t_5numpy_float32_t __pyx_v_var_x;
  __pyx_t_5numpy_float32_t __pyx_v_I0_pred;
  __pyx_t_5numpy_float32_t __pyx_v_W0_pred;
  __pyx_t_5numpy_float32_t *__pyx_v_M_mat;
  __pyx_t_5numpy_float32_t *__pyx_v_I0_mat;
  __pyx_t_5numpy_float32_t *__pyx_v_W0_mat;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1LOWESS_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1);
  __Pyx_XDECREF(__pyx_t_27);
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_W_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_M_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_156__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults14, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults14, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_37LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_37LOWESS_reference = {"__pyx_fuse_1_0LOWESS_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_37LOWESS_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_2LOWESS_reference};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_37LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("LOWESS_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults14 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults14, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 1); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 2); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 3); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 4); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 5); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 6); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 7); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "LOWESS_reference") < 0)) __PYX_ERR(0, 306, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 306, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_36LOWESS_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_36LOWESS_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float64_t __pyx_v_n0;
  __pyx_t_5numpy_float64_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_W_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_M_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float64_t __pyx_v_W_sum;
  __pyx_t_5numpy_float64_t __pyx_v_w;
  __pyx_t_5numpy_float64_t __pyx_v_betta_y;
  __pyx_t_5numpy_float64_t __pyx_v_betta_x;
  __pyx_t_5numpy_float64_t __pyx_v_var_y;
  __pyx_t_5numpy_float64_t __pyx_v_var_x;
  __pyx_t_5numpy_float64_t __pyx_v_I0_pred;
  __pyx_t_5numpy_float64_t __pyx_v_W0_pred;
  __pyx_t_5numpy_float64_t *__pyx_v_M_mat;
  __pyx_t_5numpy_float64_t *__pyx_v_I0_mat;
  __pyx_t_5numpy_float64_t *__pyx_v_W0_mat;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0LOWESS_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1);
  __Pyx_XDECREF(__pyx_t_27);
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_W_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_M_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_158__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__Pyx_CyFunction_Defaults(__pyx_defaults15, __pyx_self)->__pyx_arg_return_nm0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults15, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_39LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_39LOWESS_reference = {"__pyx_fuse_1_1LOWESS_reference", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_39LOWESS_reference, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_2LOWESS_reference};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_39LOWESS_reference(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  int __pyx_v_return_nm0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("LOWESS_reference (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_return_nm0,&__pyx_n_s_num_threads,0};
    PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults15 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults15, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 1); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 2); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 3); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 4); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 5); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 6); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, 7); __PYX_ERR(0, 306, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_return_nm0);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[9] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "LOWESS_reference") < 0)) __PYX_ERR(0, 306, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 306, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L3_error)
    if (values[8]) {
      __pyx_v_return_nm0 = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_return_nm0 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_return_nm0 = __pyx_dynamic_args->__pyx_arg_return_nm0;
    }
    if (values[9]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("LOWESS_reference", 0, 8, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 306, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 306, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 307, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_38LOWESS_reference(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_return_nm0, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_38LOWESS_reference(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, int __pyx_v_return_nm0, unsigned int __pyx_v_num_threads) {
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  __pyx_t_5numpy_float32_t __pyx_v_n0;
  __pyx_t_5numpy_float32_t __pyx_v_m0;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_W_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_M_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W0_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_I0 = 0;
  __Pyx_memviewslice __pyx_v__I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float32_t __pyx_v_W_sum;
  __pyx_t_5numpy_float32_t __pyx_v_w;
  __pyx_t_5numpy_float32_t __pyx_v_betta_y;
  __pyx_t_5numpy_float32_t __pyx_v_betta_x;
  __pyx_t_5numpy_float32_t __pyx_v_var_y;
  __pyx_t_5numpy_float32_t __pyx_v_var_x;
  __pyx_t_5numpy_float32_t __pyx_v_I0_pred;
  __pyx_t_5numpy_float32_t __pyx_v_W0_pred;
  __pyx_t_5numpy_float32_t *__pyx_v_M_mat;
  __pyx_t_5numpy_float32_t *__pyx_v_I0_mat;
  __pyx_t_5numpy_float32_t *__pyx_v_W0_mat;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1LOWESS_reference", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_15, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_16, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1);
  __Pyx_XDECREF(__pyx_t_27);
  __Pyx_AddTraceback("pyrost.bin.pyrost.LOWESS_reference", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_W_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_M_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W0_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_I0);
  __PYX_XDEC_MEMVIEW(&__pyx_v__I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
  __pyx_t_4 = 0;
  __pyx_t_2 = 0;
/* … */
  __pyx_tuple__35 = PyTuple_Pack(40, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_h, __pyx_n_s_return_nm0, __pyx_n_s_num_threads, __pyx_n_s_type_num, __pyx_n_s_N, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_t, __pyx_n_s_k, __pyx_n_s_n0, __pyx_n_s_m0, __pyx_n_s_Y0, __pyx_n_s_X0, __pyx_n_s_shape, __pyx_n_s_W_buf, __pyx_n_s_M_buf, __pyx_n_s_I0_buf, __pyx_n_s_W0_buf, __pyx_n_s_I0, __pyx_n_s_I0_2, __pyx_n_s_W_sum, __pyx_n_s_w, __pyx_n_s_betta_y, __pyx_n_s_betta_x, __pyx_n_s_var_y, __pyx_n_s_var_x, __pyx_n_s_I0_pred, __pyx_n_s_W0_pred, __pyx_n_s_M_mat, __pyx_n_s_I0_mat, __pyx_n_s_W0_mat); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);
  __pyx_t_2 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_33LOWESS_reference, 0, __pyx_n_s_LOWESS_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults12), 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults12, __pyx_t_4)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults12, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_152__defaults__);
  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_s_uint64_t_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_35LOWESS_reference, 0, __pyx_n_s_LOWESS_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults13), 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults13, __pyx_t_4)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults13, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_154__defaults__);
  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_s_uint64_t_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_37LOWESS_reference, 0, __pyx_n_s_LOWESS_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults14), 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults14, __pyx_t_4)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults14, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_156__defaults__);
  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_s_uint32_t_float64_t, __pyx_t_4) < 0) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_39LOWESS_reference, 0, __pyx_n_s_LOWESS_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults15), 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults15, __pyx_t_4)->__pyx_arg_return_nm0 = 1;
  __Pyx_CyFunction_Defaults(__pyx_defaults15, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_158__defaults__);
  if (PyDict_SetItem(__pyx_t_2, __pyx_kp_s_uint32_t_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_3LOWESS_reference, 0, __pyx_n_s_LOWESS_reference, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_LOWESS_reference, __pyx_t_4) < 0) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(10, 0, 40, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_LOWESS_reference, 306, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 306, __pyx_L1_error)
 0307:                      float_t[::1] di not None, float_t[::1] dj not None, double ds_y, double ds_x, double h,
+0308:                      bint return_nm0=True, unsigned num_threads=1):
  __pyx_t_4 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 308, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 308, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
 0309:     r"""Generate an unabberated reference image of the sample based on the
 0310:     pixel mapping `u` and the measured data `I_n` using the Local Weighted
 0311:     Linear Regression (LOWESS).
 0312: 
 0313:     Args:
 0314:         I_n (numpy.ndarray) : Measured intensity frames.
 0315:         W (numpy.ndarray) : Measured frames' whitefield.
 0316:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 0317:             plane to the reference image.
 0318:         di (numpy.ndarray) : Initial sample's translations along the vertical
 0319:             detector axis in pixels.
 0320:         dj (numpy.ndarray) : Initial sample's translations along the horizontal
 0321:             detector axis in pixels.
 0322:         ds_y (float) : Sampling interval of reference image in pixels along the
 0323:             vertical axis.
 0324:         ds_x (float) : Sampling interval of reference image in pixels along the
 0325:             horizontal axis.
 0326:         h (float) : Gaussian kernel bandwidth in pixels.
 0327:         return_nm0 (bool) : If True, also returns the lower bounds (`n0`, `m0`)
 0328:             of the reference image in pixels.
 0329:         num_threads (int) : Number of threads.
 0330: 
 0331:     Returns:
 0332:         Tuple[numpy.ndarray, int, int] : A tuple of three elements ('I0', 'n0',
 0333:         'm0'). The elements are the following:
 0334: 
 0335:         * 'I0' : Reference image array.
 0336:         * 'n0' : The lower bounds of the vertical detector axis of the reference
 0337:           image at the reference frame in pixels. Only provided if `return_nm0` is
 0338:           True.
 0339:         * 'm0' : The lower bounds of the horizontal detector axis of the reference
 0340:           image at the reference frame in pixels. Only provided if `return_nm0` is
 0341:           True.
 0342: 
 0343:     Notes:
 0344:         The pixel mapping `u` maps the intensity measurements from the
 0345:         detector plane to the reference plane as follows:
 0346: 
 0347:         .. math::
 0348:             i_{ref}[n, i, j] = u[0, i, j] + di[n], \; j_{ref}[n, i, j] = u[1, i, j] + dj[n]
 0349: 
 0350:         The reference image profile :math:`I_{ref}[ii, jj]` is obtained
 0351:         with the LOWESS regression extimator as follows:
 0352: 
 0353:         .. math::
 0354: 
 0355:             I_{ref}[i, j] = \frac{\sum_{n, i^{\prime}, j^{\prime}} K[i - i_{ref}[n,
 0356:             i^{\prime}, j^{\prime}], j - j_{ref}[n, i^{\prime}, j^{\prime}], h]
 0357:             \; r_{IW}[n, a^{IW}, b^{IW}_i, b^{IW}_j]}
 0358:             {\sum_{n, i^{\prime}, j^{\prime}} K[i - i_{ref}[n, i^{\prime}, j^{\prime}], 
 0359:             j - j_{ref}[n, i^{\prime}, j^{\prime}], h] \;
 0360:             r_{WW}[n, a^{WW}, b^{WW}_i, b^{WW}_j]}
 0361: 
 0362:         where :math:`r_{IW}[n, a, b_i, b_j]` and :math:`r_{WW}[n, a, b_i, b_j]`
 0363:         are the residuals at the pixel :math:`i, j` with linear coefficients
 0364:         defined with the least squares approach:
 0365: 
 0366:         .. math::
 0367: 
 0368:             r_{IW}[n, a, b_i, b_j] = I[n, i^{\prime}, j^{\prime}] W[i^{\prime}, j^{\prime}]
 0369:             - a - b_i (i - i_{ref}[n, i^{\prime}, j^{\prime}) - b_j
 0370:             (j - j_{ref}[n, i^{\prime}, j^{\prime})
 0371: 
 0372:         .. math::
 0373: 
 0374:             r_{WW}[n, a, b_i, b_j] = W^2[i^{\prime}, j^{\prime}]
 0375:             - a - b_i (i - i_{ref}[n, i^{\prime}, j^{\prime}) - b_j
 0376:             (j - j_{ref}[n, i^{\prime}, j^{\prime})
 0377: 
 0378:         and :math:`K[i, j, h] = \frac{1}{\sqrt{2 \pi}} \exp(-\frac{i^2 + j^2}{h})`
 0379:         is the Gaussian kernel.
 0380:     """
+0381:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0382:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 382, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 382, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 382, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 382, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 382, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 382, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 382, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 382, __pyx_L1_error)
 0383: 
+0384:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 384, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 384, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 384, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 384, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0385:     cdef int N = I_n.shape[0], Y = I_n.shape[1], X = I_n.shape[2]
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 0386:     cdef int i, j, t, k
 0387: 
+0388:     cdef float_t n0 = -min_float(&u[0, 0, 0], Y * X) + max_float(&di[0], N)
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_n0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N));
+0389:     cdef float_t m0 = -min_float(&u[1, 0, 0], Y * X) + max_float(&dj[0], N)
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_m0 = ((-__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X))) + __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N));
+0390:     cdef int Y0 = <int>((max_float(&u[0, 0, 0], Y * X) - min_float(&di[0], N) + n0) / ds_y) + 1
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y))) + 1);
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0)) / __pyx_v_ds_y)) + 1);
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y))) + 1);
/* … */
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_8 = 0;
  __pyx_v_Y0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_5 * __pyx_v_u.strides[0]) ) + __pyx_t_6 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_8)) )))), __pyx_v_N)) + __pyx_v_n0)) / __pyx_v_ds_y)) + 1);
+0391:     cdef int X0 = <int>((max_float(&u[1, 0, 0], Y * X) - min_float(&dj[0], N) + m0) / ds_x) + 1
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x))) + 1);
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0)) / __pyx_v_ds_x)) + 1);
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((__pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_0__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x))) + 1);
/* … */
  __pyx_t_8 = 1;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_v_X0 = (((int)(((double)((__pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_max_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )))), (__pyx_v_Y * __pyx_v_X)) - __pyx_fuse_1__pyx_f_6pyrost_3bin_6pyrost_min_float((&(*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_5)) )))), __pyx_v_N)) + __pyx_v_m0)) / __pyx_v_ds_x)) + 1);
 0392: 
+0393:     cdef np.npy_intp *shape = [num_threads, Y0, X0, 4]
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_t_9[3] = 4;
  __pyx_v_shape = __pyx_t_9;
/* … */
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_t_9[3] = 4;
  __pyx_v_shape = __pyx_t_9;
/* … */
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_t_9[3] = 4;
  __pyx_v_shape = __pyx_t_9;
/* … */
  __pyx_t_9[0] = __pyx_v_num_threads;
  __pyx_t_9[1] = __pyx_v_Y0;
  __pyx_t_9[2] = __pyx_v_X0;
  __pyx_t_9[3] = 4;
  __pyx_v_shape = __pyx_t_9;
+0394:     cdef float_t[:, :, ::1] W_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W_buf = __pyx_t_10;
  __pyx_t_10.memview = NULL;
  __pyx_t_10.data = NULL;
+0395:     cdef float_t[:, :, :, ::1] M_buf = np.PyArray_ZEROS(4, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_M_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_M_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_M_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 395, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_M_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
+0396:     shape[3] = 3
  (__pyx_v_shape[3]) = 3;
/* … */
  (__pyx_v_shape[3]) = 3;
/* … */
  (__pyx_v_shape[3]) = 3;
/* … */
  (__pyx_v_shape[3]) = 3;
+0397:     cdef float_t[:, :, :, ::1] I0_buf = np.PyArray_ZEROS(4, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_I0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
+0398:     cdef float_t[:, :, :, ::1] W0_buf = np.PyArray_ZEROS(4, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(4, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_W0_buf = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
+0399:     cdef np.ndarray I0 = np.PyArray_SimpleNew(2, shape + 1, type_num)
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 399, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 399, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 399, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 399, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 399, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 399, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 399, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 399, __pyx_L1_error)
  __pyx_v_I0 = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
 0400: 
+0401:     if Y0 > 1:
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_Y0 > 1) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L6;
  }
+0402:         for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
/* … */
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
/* … */
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
/* … */
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_12 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_14 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L9;
          }
          __pyx_L9:;
        }
    }
+0403:             t = openmp.omp_get_thread_num()
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
+0404:             LOWESS_frame_2d(W_buf[t], M_buf[t], I0_buf[t], W0_buf[t], I_n[i], W, u,
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_10.data = __pyx_v_M_buf.data;
                              __pyx_t_10.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_17.data = __pyx_v_W0_buf.data;
                              __pyx_t_17.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__pyx_t_15, __pyx_t_10, __pyx_t_16, __pyx_t_17, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_10.data = __pyx_v_M_buf.data;
                              __pyx_t_10.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_17.data = __pyx_v_W0_buf.data;
                              __pyx_t_17.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__pyx_t_15, __pyx_t_10, __pyx_t_16, __pyx_t_17, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_10.data = __pyx_v_M_buf.data;
                              __pyx_t_10.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_17.data = __pyx_v_W0_buf.data;
                              __pyx_t_17.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__pyx_t_15, __pyx_t_10, __pyx_t_16, __pyx_t_17, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_10.data = __pyx_v_M_buf.data;
                              __pyx_t_10.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_17.data = __pyx_v_W0_buf.data;
                              __pyx_t_17.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_2d(__pyx_t_15, __pyx_t_10, __pyx_t_16, __pyx_t_17, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_5)) ))) - __pyx_v_n0), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
+0405:                             di[i] - n0, dj[i] - m0, ds_y, ds_x, h)
__pyx_t_5 = __pyx_v_i;
/* … */
                              __pyx_t_6 = __pyx_v_i;
__pyx_t_5 = __pyx_v_i;
/* … */
                              __pyx_t_6 = __pyx_v_i;
__pyx_t_5 = __pyx_v_i;
/* … */
                              __pyx_t_6 = __pyx_v_i;
__pyx_t_5 = __pyx_v_i;
/* … */
                              __pyx_t_6 = __pyx_v_i;
 0406:     else:
+0407:         for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
/* … */
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
/* … */
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
/* … */
  /*else*/ {
    {
        #ifdef WITH_THREAD
        PyThreadState *_save;
        Py_UNBLOCK_THREADS
        __Pyx_FastGIL_Remember();
        #endif
        /*try:*/ {
          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)          __pyx_t_14 = __pyx_v_N;
          if ((1 == 0)) abort();
          {
              #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                  #undef likely
                  #undef unlikely
                  #define likely(x)   (x)
                  #define unlikely(x) (x)
              #endif
              __pyx_t_12 = (__pyx_t_14 - 0 + 1 - 1/abs(1)) / 1;
              if (__pyx_t_12 > 0)
              {
                  #ifdef _OPENMP
                  #pragma omp parallel
                  #endif /* _OPENMP */
                  {
                      #ifdef _OPENMP
                      #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                      #endif /* _OPENMP */
                      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13++){
                          {
                              __pyx_v_i = (int)(0 + 1 * __pyx_t_13);
                              /* Initialize private variables to invalid values */
                              __pyx_v_t = ((int)0xbad0bad0);
/* … */
        /*finally:*/ {
          /*normal exit:*/{
            #ifdef WITH_THREAD
            __Pyx_FastGIL_Forget();
            Py_BLOCK_THREADS
            #endif
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
    }
  }
  __pyx_L6:;
+0408:             t = openmp.omp_get_thread_num()
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
/* … */
                              __pyx_v_t = omp_get_thread_num();
+0409:             LOWESS_frame_1d(W_buf[t], M_buf[t], I0_buf[t], W0_buf[t], I_n[i], W, u,
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_17.data = __pyx_v_M_buf.data;
                              __pyx_t_17.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_10.data = __pyx_v_W0_buf.data;
                              __pyx_t_10.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__pyx_t_15, __pyx_t_17, __pyx_t_16, __pyx_t_10, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_17.data = __pyx_v_M_buf.data;
                              __pyx_t_17.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_10.data = __pyx_v_W0_buf.data;
                              __pyx_t_10.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__pyx_t_15, __pyx_t_17, __pyx_t_16, __pyx_t_10, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_17.data = __pyx_v_M_buf.data;
                              __pyx_t_17.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_10.data = __pyx_v_W0_buf.data;
                              __pyx_t_10.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__pyx_t_15, __pyx_t_17, __pyx_t_16, __pyx_t_10, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
/* … */
                              __pyx_t_15.data = __pyx_v_W_buf.data;
                              __pyx_t_15.memview = __pyx_v_W_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_15, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W_buf.strides[0];
        __pyx_t_15.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_15.shape[0] = __pyx_v_W_buf.shape[1];
__pyx_t_15.strides[0] = __pyx_v_W_buf.strides[1];
    __pyx_t_15.suboffsets[0] = -1;

__pyx_t_15.shape[1] = __pyx_v_W_buf.shape[2];
__pyx_t_15.strides[1] = __pyx_v_W_buf.strides[2];
    __pyx_t_15.suboffsets[1] = -1;

__pyx_t_17.data = __pyx_v_M_buf.data;
                              __pyx_t_17.memview = __pyx_v_M_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_17, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_M_buf.strides[0];
        __pyx_t_17.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_17.shape[0] = __pyx_v_M_buf.shape[1];
__pyx_t_17.strides[0] = __pyx_v_M_buf.strides[1];
    __pyx_t_17.suboffsets[0] = -1;

__pyx_t_17.shape[1] = __pyx_v_M_buf.shape[2];
__pyx_t_17.strides[1] = __pyx_v_M_buf.strides[2];
    __pyx_t_17.suboffsets[1] = -1;

__pyx_t_17.shape[2] = __pyx_v_M_buf.shape[3];
__pyx_t_17.strides[2] = __pyx_v_M_buf.strides[3];
    __pyx_t_17.suboffsets[2] = -1;

__pyx_t_16.data = __pyx_v_I0_buf.data;
                              __pyx_t_16.memview = __pyx_v_I0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_16, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I0_buf.strides[0];
        __pyx_t_16.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_16.shape[0] = __pyx_v_I0_buf.shape[1];
__pyx_t_16.strides[0] = __pyx_v_I0_buf.strides[1];
    __pyx_t_16.suboffsets[0] = -1;

__pyx_t_16.shape[1] = __pyx_v_I0_buf.shape[2];
__pyx_t_16.strides[1] = __pyx_v_I0_buf.strides[2];
    __pyx_t_16.suboffsets[1] = -1;

__pyx_t_16.shape[2] = __pyx_v_I0_buf.shape[3];
__pyx_t_16.strides[2] = __pyx_v_I0_buf.strides[3];
    __pyx_t_16.suboffsets[2] = -1;

__pyx_t_10.data = __pyx_v_W0_buf.data;
                              __pyx_t_10.memview = __pyx_v_W0_buf.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_W0_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_W0_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_W0_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_W0_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_W0_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_10.shape[2] = __pyx_v_W0_buf.shape[3];
__pyx_t_10.strides[2] = __pyx_v_W0_buf.strides[3];
    __pyx_t_10.suboffsets[2] = -1;

__pyx_t_18.data = __pyx_v_I_n.data;
                              __pyx_t_18.memview = __pyx_v_I_n.memview;
                              __PYX_INC_MEMVIEW(&__pyx_t_18, 0);
                              {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_18.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_18.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_18.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_18.suboffsets[0] = -1;

__pyx_t_18.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_18.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_18.suboffsets[1] = -1;
/* … */
                              __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_LOWESS_frame_1d(__pyx_t_15, __pyx_t_17, __pyx_t_16, __pyx_t_10, __pyx_t_18, __pyx_v_W, __pyx_v_u, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_6)) ))) - __pyx_v_m0), __pyx_v_ds_x, __pyx_v_h);
                              __PYX_XDEC_MEMVIEW(&__pyx_t_15, 0);
                              __pyx_t_15.memview = NULL;
                              __pyx_t_15.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_17, 0);
                              __pyx_t_17.memview = NULL;
                              __pyx_t_17.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_16, 0);
                              __pyx_t_16.memview = NULL;
                              __pyx_t_16.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                              __pyx_t_10.memview = NULL;
                              __pyx_t_10.data = NULL;
                              __PYX_XDEC_MEMVIEW(&__pyx_t_18, 0);
                              __pyx_t_18.memview = NULL;
                              __pyx_t_18.data = NULL;
                          }
                      }
                  }
              }
          }
          #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
              #undef likely
              #undef unlikely
              #define likely(x)   __builtin_expect(!!(x), 1)
              #define unlikely(x) __builtin_expect(!!(x), 0)
          #endif
        }
+0410:                             dj[i] - m0, ds_x, h)
__pyx_t_6 = __pyx_v_i;
__pyx_t_6 = __pyx_v_i;
__pyx_t_6 = __pyx_v_i;
__pyx_t_6 = __pyx_v_i;
 0411: 
+0412:     cdef float_t[:, ::1] _I0 = I0
  __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 412, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_15;
  __pyx_t_15.memview = NULL;
  __pyx_t_15.data = NULL;
/* … */
  __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 412, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_15;
  __pyx_t_15.memview = NULL;
  __pyx_t_15.data = NULL;
/* … */
  __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 412, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_15;
  __pyx_t_15.memview = NULL;
  __pyx_t_15.data = NULL;
/* … */
  __pyx_t_15 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_I0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_15.memview)) __PYX_ERR(0, 412, __pyx_L1_error)
  __pyx_v__I0 = __pyx_t_15;
  __pyx_t_15.memview = NULL;
  __pyx_t_15.data = NULL;
 0413:     cdef float_t W_sum, w, betta_y, betta_x, var_y, var_x, I0_pred, W0_pred
 0414:     cdef float_t *M_mat
 0415:     cdef float_t *I0_mat
 0416:     cdef float_t *W0_mat
 0417: 
+0418:     with nogil, parallel(num_threads=num_threads):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float64_t *)1);
                __pyx_v_M_mat = ((__pyx_t_5numpy_float64_t *)1);
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float64_t *)1);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float32_t *)1);
                __pyx_v_M_mat = ((__pyx_t_5numpy_float32_t *)1);
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float32_t *)1);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float64_t *)1);
                __pyx_v_M_mat = ((__pyx_t_5numpy_float64_t *)1);
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float64_t *)1);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_I0_mat, __pyx_v_M_mat, __pyx_v_W0_mat) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float32_t *)1);
                __pyx_v_M_mat = ((__pyx_t_5numpy_float32_t *)1);
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float32_t *)1);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L27;
        }
        __pyx_L27:;
      }
  }
+0419:         M_mat = <float_t *>malloc(4 * sizeof(float_t))
                __pyx_v_M_mat = ((__pyx_t_5numpy_float64_t *)malloc((4 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                __pyx_v_M_mat = ((__pyx_t_5numpy_float32_t *)malloc((4 * (sizeof(__pyx_t_5numpy_float32_t)))));
/* … */
                __pyx_v_M_mat = ((__pyx_t_5numpy_float64_t *)malloc((4 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                __pyx_v_M_mat = ((__pyx_t_5numpy_float32_t *)malloc((4 * (sizeof(__pyx_t_5numpy_float32_t)))));
+0420:         I0_mat = <float_t *>malloc(3 * sizeof(float_t))
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float64_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float32_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float32_t)))));
/* … */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float64_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                __pyx_v_I0_mat = ((__pyx_t_5numpy_float32_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float32_t)))));
+0421:         W0_mat = <float_t *>malloc(3 * sizeof(float_t))
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float64_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float32_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float32_t)))));
/* … */
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float64_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                __pyx_v_W0_mat = ((__pyx_t_5numpy_float32_t *)malloc((3 * (sizeof(__pyx_t_5numpy_float32_t)))));
 0422: 
+0423:         for k in prange(X0, schedule='guided'):
                __pyx_t_12 = __pyx_v_X0;
                if ((1 == 0)) abort();
                {
                    __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_14 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_I0_pred) lastprivate(__pyx_v_W0_pred) lastprivate(__pyx_v_W_sum) lastprivate(__pyx_v_betta_x) lastprivate(__pyx_v_betta_y) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) lastprivate(__pyx_v_t) lastprivate(__pyx_v_var_x) lastprivate(__pyx_v_var_y) lastprivate(__pyx_v_w) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_13);
                                /* Initialize private variables to invalid values */
                                __pyx_v_I0_pred = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_W0_pred = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_W_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_betta_x = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_betta_y = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_i = ((int)0xbad0bad0);
                                __pyx_v_j = ((int)0xbad0bad0);
                                __pyx_v_t = ((int)0xbad0bad0);
                                __pyx_v_var_x = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_var_y = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_w = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
/* … */
                __pyx_t_12 = __pyx_v_X0;
                if ((1 == 0)) abort();
                {
                    __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_14 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_I0_pred) lastprivate(__pyx_v_W0_pred) lastprivate(__pyx_v_W_sum) lastprivate(__pyx_v_betta_x) lastprivate(__pyx_v_betta_y) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) lastprivate(__pyx_v_t) lastprivate(__pyx_v_var_x) lastprivate(__pyx_v_var_y) lastprivate(__pyx_v_w) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_13);
                                /* Initialize private variables to invalid values */
                                __pyx_v_I0_pred = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_W0_pred = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_W_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_betta_x = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_betta_y = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_i = ((int)0xbad0bad0);
                                __pyx_v_j = ((int)0xbad0bad0);
                                __pyx_v_t = ((int)0xbad0bad0);
                                __pyx_v_var_x = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_var_y = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_w = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
/* … */
                __pyx_t_12 = __pyx_v_X0;
                if ((1 == 0)) abort();
                {
                    __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_14 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_I0_pred) lastprivate(__pyx_v_W0_pred) lastprivate(__pyx_v_W_sum) lastprivate(__pyx_v_betta_x) lastprivate(__pyx_v_betta_y) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) lastprivate(__pyx_v_t) lastprivate(__pyx_v_var_x) lastprivate(__pyx_v_var_y) lastprivate(__pyx_v_w) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_13);
                                /* Initialize private variables to invalid values */
                                __pyx_v_I0_pred = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_W0_pred = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_W_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_betta_x = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_betta_y = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_i = ((int)0xbad0bad0);
                                __pyx_v_j = ((int)0xbad0bad0);
                                __pyx_v_t = ((int)0xbad0bad0);
                                __pyx_v_var_x = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_var_y = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                                __pyx_v_w = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
/* … */
                __pyx_t_12 = __pyx_v_X0;
                if ((1 == 0)) abort();
                {
                    __pyx_t_14 = (__pyx_t_12 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_14 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_I0_pred) lastprivate(__pyx_v_W0_pred) lastprivate(__pyx_v_W_sum) lastprivate(__pyx_v_betta_x) lastprivate(__pyx_v_betta_y) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) lastprivate(__pyx_v_t) lastprivate(__pyx_v_var_x) lastprivate(__pyx_v_var_y) lastprivate(__pyx_v_w) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_14; __pyx_t_13++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_13);
                                /* Initialize private variables to invalid values */
                                __pyx_v_I0_pred = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_W0_pred = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_W_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_betta_x = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_betta_y = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_i = ((int)0xbad0bad0);
                                __pyx_v_j = ((int)0xbad0bad0);
                                __pyx_v_t = ((int)0xbad0bad0);
                                __pyx_v_var_x = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_var_y = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                                __pyx_v_w = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
 0424: 
+0425:             for j in range(Y0):
                                __pyx_t_19 = __pyx_v_Y0;
                                __pyx_t_20 = __pyx_t_19;
                                for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
                                  __pyx_v_j = __pyx_t_21;
/* … */
                                __pyx_t_19 = __pyx_v_Y0;
                                __pyx_t_20 = __pyx_t_19;
                                for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
                                  __pyx_v_j = __pyx_t_21;
/* … */
                                __pyx_t_19 = __pyx_v_Y0;
                                __pyx_t_20 = __pyx_t_19;
                                for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
                                  __pyx_v_j = __pyx_t_21;
/* … */
                                __pyx_t_19 = __pyx_v_Y0;
                                __pyx_t_20 = __pyx_t_19;
                                for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
                                  __pyx_v_j = __pyx_t_21;
+0426:                 W_sum = 0.0
                                  __pyx_v_W_sum = 0.0;
/* … */
                                  __pyx_v_W_sum = 0.0;
/* … */
                                  __pyx_v_W_sum = 0.0;
/* … */
                                  __pyx_v_W_sum = 0.0;
+0427:                 memset(M_mat, 0, 4 * sizeof(float_t))
                                  (void)(memset(__pyx_v_M_mat, 0, (4 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                                  (void)(memset(__pyx_v_M_mat, 0, (4 * (sizeof(__pyx_t_5numpy_float32_t)))));
/* … */
                                  (void)(memset(__pyx_v_M_mat, 0, (4 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                                  (void)(memset(__pyx_v_M_mat, 0, (4 * (sizeof(__pyx_t_5numpy_float32_t)))));
+0428:                 memset(I0_mat, 0, 3 * sizeof(float_t))
                                  (void)(memset(__pyx_v_I0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                                  (void)(memset(__pyx_v_I0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float32_t)))));
/* … */
                                  (void)(memset(__pyx_v_I0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                                  (void)(memset(__pyx_v_I0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float32_t)))));
+0429:                 memset(W0_mat, 0, 3 * sizeof(float_t))
                                  (void)(memset(__pyx_v_W0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                                  (void)(memset(__pyx_v_W0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float32_t)))));
/* … */
                                  (void)(memset(__pyx_v_W0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float64_t)))));
/* … */
                                  (void)(memset(__pyx_v_W0_mat, 0, (3 * (sizeof(__pyx_t_5numpy_float32_t)))));
 0430: 
+0431:                 for i in range(<int>num_threads):
                                  __pyx_t_22 = ((int)__pyx_v_num_threads);
                                  __pyx_t_23 = __pyx_t_22;
                                  for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
                                    __pyx_v_i = __pyx_t_24;
/* … */
                                  __pyx_t_22 = ((int)__pyx_v_num_threads);
                                  __pyx_t_23 = __pyx_t_22;
                                  for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
                                    __pyx_v_i = __pyx_t_24;
/* … */
                                  __pyx_t_22 = ((int)__pyx_v_num_threads);
                                  __pyx_t_23 = __pyx_t_22;
                                  for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
                                    __pyx_v_i = __pyx_t_24;
/* … */
                                  __pyx_t_22 = ((int)__pyx_v_num_threads);
                                  __pyx_t_23 = __pyx_t_22;
                                  for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
                                    __pyx_v_i = __pyx_t_24;
+0432:                     if W_buf[i, j, k] > 0.0:
                                    __pyx_t_6 = __pyx_v_i;
                                    __pyx_t_5 = __pyx_v_j;
                                    __pyx_t_7 = __pyx_v_k;
                                    __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) > 0.0) != 0);
                                    if (__pyx_t_1) {
/* … */
                                    }
                                  }
/* … */
                                    __pyx_t_6 = __pyx_v_i;
                                    __pyx_t_5 = __pyx_v_j;
                                    __pyx_t_7 = __pyx_v_k;
                                    __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) > 0.0) != 0);
                                    if (__pyx_t_1) {
/* … */
                                    }
                                  }
/* … */
                                    __pyx_t_6 = __pyx_v_i;
                                    __pyx_t_5 = __pyx_v_j;
                                    __pyx_t_7 = __pyx_v_k;
                                    __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) > 0.0) != 0);
                                    if (__pyx_t_1) {
/* … */
                                    }
                                  }
/* … */
                                    __pyx_t_6 = __pyx_v_i;
                                    __pyx_t_5 = __pyx_v_j;
                                    __pyx_t_7 = __pyx_v_k;
                                    __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) > 0.0) != 0);
                                    if (__pyx_t_1) {
/* … */
                                    }
                                  }
+0433:                         W_sum = W_sum + W_buf[i, j, k]
                                      __pyx_t_7 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_6 = __pyx_v_k;
                                      __pyx_v_W_sum = (__pyx_v_W_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_7 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_6)) ))));
/* … */
                                      __pyx_t_7 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_6 = __pyx_v_k;
                                      __pyx_v_W_sum = (__pyx_v_W_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_7 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_6)) ))));
/* … */
                                      __pyx_t_7 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_6 = __pyx_v_k;
                                      __pyx_v_W_sum = (__pyx_v_W_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_7 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_6)) ))));
/* … */
                                      __pyx_t_7 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_6 = __pyx_v_k;
                                      __pyx_v_W_sum = (__pyx_v_W_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_7 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_6)) ))));
+0434:                         w = W_buf[i, j, k] / W_sum
                                      __pyx_t_6 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_7 = __pyx_v_k;
                                      __pyx_v_w = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) / __pyx_v_W_sum);
/* … */
                                      __pyx_t_6 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_7 = __pyx_v_k;
                                      __pyx_v_w = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) / __pyx_v_W_sum);
/* … */
                                      __pyx_t_6 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_7 = __pyx_v_k;
                                      __pyx_v_w = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) / __pyx_v_W_sum);
/* … */
                                      __pyx_t_6 = __pyx_v_i;
                                      __pyx_t_5 = __pyx_v_j;
                                      __pyx_t_7 = __pyx_v_k;
                                      __pyx_v_w = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W_buf.data + __pyx_t_6 * __pyx_v_W_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W_buf.strides[1]) )) + __pyx_t_7)) ))) / __pyx_v_W_sum);
 0435: 
+0436:                         for t in range(4):
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 4; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
/* … */
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 4; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
/* … */
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 4; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
/* … */
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 4; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
+0437:                             M_mat[t] = M_mat[t] + w * (M_buf[i, j, k, t] - M_mat[t])
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_M_mat[__pyx_v_t]) = ((__pyx_v_M_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float64_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_buf.data + __pyx_t_7 * __pyx_v_M_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_M_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_M_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_M_mat[__pyx_v_t]))));
                                      }
/* … */
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_M_mat[__pyx_v_t]) = ((__pyx_v_M_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float32_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_buf.data + __pyx_t_7 * __pyx_v_M_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_M_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_M_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_M_mat[__pyx_v_t]))));
                                      }
/* … */
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_M_mat[__pyx_v_t]) = ((__pyx_v_M_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float64_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_buf.data + __pyx_t_7 * __pyx_v_M_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_M_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_M_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_M_mat[__pyx_v_t]))));
                                      }
/* … */
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_M_mat[__pyx_v_t]) = ((__pyx_v_M_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float32_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_M_buf.data + __pyx_t_7 * __pyx_v_M_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_M_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_M_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_M_mat[__pyx_v_t]))));
                                      }
 0438: 
+0439:                         for t in range(3):
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 3; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
/* … */
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 3; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
/* … */
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 3; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
/* … */
                                      for (__pyx_t_25 = 0; __pyx_t_25 < 3; __pyx_t_25+=1) {
                                        __pyx_v_t = __pyx_t_25;
+0440:                             I0_mat[t] = I0_mat[t] + w * (I0_buf[i, j, k, t] - I0_mat[t])
                                        __pyx_t_8 = __pyx_v_i;
                                        __pyx_t_6 = __pyx_v_j;
                                        __pyx_t_5 = __pyx_v_k;
                                        __pyx_t_7 = __pyx_v_t;
                                        (__pyx_v_I0_mat[__pyx_v_t]) = ((__pyx_v_I0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float64_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_8 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_6 * __pyx_v_I0_buf.strides[1]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[2]) )) + __pyx_t_7)) ))) - (__pyx_v_I0_mat[__pyx_v_t]))));
/* … */
                                        __pyx_t_8 = __pyx_v_i;
                                        __pyx_t_6 = __pyx_v_j;
                                        __pyx_t_5 = __pyx_v_k;
                                        __pyx_t_7 = __pyx_v_t;
                                        (__pyx_v_I0_mat[__pyx_v_t]) = ((__pyx_v_I0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float32_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_8 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_6 * __pyx_v_I0_buf.strides[1]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[2]) )) + __pyx_t_7)) ))) - (__pyx_v_I0_mat[__pyx_v_t]))));
/* … */
                                        __pyx_t_8 = __pyx_v_i;
                                        __pyx_t_6 = __pyx_v_j;
                                        __pyx_t_5 = __pyx_v_k;
                                        __pyx_t_7 = __pyx_v_t;
                                        (__pyx_v_I0_mat[__pyx_v_t]) = ((__pyx_v_I0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float64_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_8 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_6 * __pyx_v_I0_buf.strides[1]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[2]) )) + __pyx_t_7)) ))) - (__pyx_v_I0_mat[__pyx_v_t]))));
/* … */
                                        __pyx_t_8 = __pyx_v_i;
                                        __pyx_t_6 = __pyx_v_j;
                                        __pyx_t_5 = __pyx_v_k;
                                        __pyx_t_7 = __pyx_v_t;
                                        (__pyx_v_I0_mat[__pyx_v_t]) = ((__pyx_v_I0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float32_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I0_buf.data + __pyx_t_8 * __pyx_v_I0_buf.strides[0]) ) + __pyx_t_6 * __pyx_v_I0_buf.strides[1]) ) + __pyx_t_5 * __pyx_v_I0_buf.strides[2]) )) + __pyx_t_7)) ))) - (__pyx_v_I0_mat[__pyx_v_t]))));
+0441:                             W0_mat[t] = W0_mat[t] + w * (W0_buf[i, j, k, t] - W0_mat[t])
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_W0_mat[__pyx_v_t]) = ((__pyx_v_W0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float64_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_W0_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_W0_mat[__pyx_v_t]))));
                                      }
/* … */
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_W0_mat[__pyx_v_t]) = ((__pyx_v_W0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float32_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_W0_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_W0_mat[__pyx_v_t]))));
                                      }
/* … */
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_W0_mat[__pyx_v_t]) = ((__pyx_v_W0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float64_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_W0_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_W0_mat[__pyx_v_t]))));
                                      }
/* … */
                                        __pyx_t_7 = __pyx_v_i;
                                        __pyx_t_5 = __pyx_v_j;
                                        __pyx_t_6 = __pyx_v_k;
                                        __pyx_t_8 = __pyx_v_t;
                                        (__pyx_v_W0_mat[__pyx_v_t]) = ((__pyx_v_W0_mat[__pyx_v_t]) + (__pyx_v_w * ((*((__pyx_t_5numpy_float32_t *) ( /* dim=3 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_W0_buf.data + __pyx_t_7 * __pyx_v_W0_buf.strides[0]) ) + __pyx_t_5 * __pyx_v_W0_buf.strides[1]) ) + __pyx_t_6 * __pyx_v_W0_buf.strides[2]) )) + __pyx_t_8)) ))) - (__pyx_v_W0_mat[__pyx_v_t]))));
                                      }
 0442: 
+0443:                 var_y = M_mat[2] - M_mat[0] * M_mat[0]
                                  __pyx_v_var_y = ((__pyx_v_M_mat[2]) - ((__pyx_v_M_mat[0]) * (__pyx_v_M_mat[0])));
/* … */
                                  __pyx_v_var_y = ((__pyx_v_M_mat[2]) - ((__pyx_v_M_mat[0]) * (__pyx_v_M_mat[0])));
/* … */
                                  __pyx_v_var_y = ((__pyx_v_M_mat[2]) - ((__pyx_v_M_mat[0]) * (__pyx_v_M_mat[0])));
/* … */
                                  __pyx_v_var_y = ((__pyx_v_M_mat[2]) - ((__pyx_v_M_mat[0]) * (__pyx_v_M_mat[0])));
+0444:                 var_x = M_mat[3] - M_mat[1] * M_mat[1]
                                  __pyx_v_var_x = ((__pyx_v_M_mat[3]) - ((__pyx_v_M_mat[1]) * (__pyx_v_M_mat[1])));
/* … */
                                  __pyx_v_var_x = ((__pyx_v_M_mat[3]) - ((__pyx_v_M_mat[1]) * (__pyx_v_M_mat[1])));
/* … */
                                  __pyx_v_var_x = ((__pyx_v_M_mat[3]) - ((__pyx_v_M_mat[1]) * (__pyx_v_M_mat[1])));
/* … */
                                  __pyx_v_var_x = ((__pyx_v_M_mat[3]) - ((__pyx_v_M_mat[1]) * (__pyx_v_M_mat[1])));
 0445: 
+0446:                 betta_y = (I0_mat[1] - I0_mat[0] * M_mat[0]) / var_y if var_y > 0.0 else 0.0
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[1]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[1]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[1]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[1]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
+0447:                 betta_x = (I0_mat[2] - I0_mat[0] * M_mat[1]) / var_x if var_x > 0.0 else 0.0
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[2]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[2]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[2]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_I0_mat[2]) - ((__pyx_v_I0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
 0448: 
+0449:                 I0_pred = I0_mat[0] - betta_y * (ds_y * j - M_mat[0]) - betta_x * (ds_x * k - M_mat[1])
                                  __pyx_v_I0_pred = (((__pyx_v_I0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
/* … */
                                  __pyx_v_I0_pred = (((__pyx_v_I0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
/* … */
                                  __pyx_v_I0_pred = (((__pyx_v_I0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
/* … */
                                  __pyx_v_I0_pred = (((__pyx_v_I0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
 0450: 
+0451:                 betta_y = (W0_mat[1] - W0_mat[0] * M_mat[0]) / var_y if var_y > 0.0 else 0.0
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[1]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[1]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[1]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_y > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[1]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[0]))) / __pyx_v_var_y);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_y = __pyx_t_26;
+0452:                 betta_x = (W0_mat[2] - W0_mat[0] * M_mat[1]) / var_x if var_x > 0.0 else 0.0
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[2]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[2]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[2]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
/* … */
                                  if (((__pyx_v_var_x > 0.0) != 0)) {
                                    __pyx_t_26 = (((__pyx_v_W0_mat[2]) - ((__pyx_v_W0_mat[0]) * (__pyx_v_M_mat[1]))) / __pyx_v_var_x);
                                  } else {
                                    __pyx_t_26 = 0.0;
                                  }
                                  __pyx_v_betta_x = __pyx_t_26;
 0453: 
+0454:                 W0_pred = W0_mat[0] - betta_y * (ds_y * j - M_mat[0]) - betta_x * (ds_x * k - M_mat[1])
                                  __pyx_v_W0_pred = (((__pyx_v_W0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
/* … */
                                  __pyx_v_W0_pred = (((__pyx_v_W0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
/* … */
                                  __pyx_v_W0_pred = (((__pyx_v_W0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
/* … */
                                  __pyx_v_W0_pred = (((__pyx_v_W0_mat[0]) - (__pyx_v_betta_y * ((__pyx_v_ds_y * __pyx_v_j) - (__pyx_v_M_mat[0])))) - (__pyx_v_betta_x * ((__pyx_v_ds_x * __pyx_v_k) - (__pyx_v_M_mat[1]))));
 0455: 
+0456:                 _I0[j, k] = I0_pred / W0_pred if W0_pred > 0.0 else 1.0
                                  if (((__pyx_v_W0_pred > 0.0) != 0)) {
                                    __pyx_t_26 = (__pyx_v_I0_pred / __pyx_v_W0_pred);
                                  } else {
                                    __pyx_t_26 = 1.0;
                                  }
                                  __pyx_t_8 = __pyx_v_j;
                                  __pyx_t_6 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_8 * __pyx_v__I0.strides[0]) )) + __pyx_t_6)) )) = __pyx_t_26;
                                }
                            }
                        }
                    }
                }
/* … */
                                  if (((__pyx_v_W0_pred > 0.0) != 0)) {
                                    __pyx_t_26 = (__pyx_v_I0_pred / __pyx_v_W0_pred);
                                  } else {
                                    __pyx_t_26 = 1.0;
                                  }
                                  __pyx_t_8 = __pyx_v_j;
                                  __pyx_t_6 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_8 * __pyx_v__I0.strides[0]) )) + __pyx_t_6)) )) = __pyx_t_26;
                                }
                            }
                        }
                    }
                }
/* … */
                                  if (((__pyx_v_W0_pred > 0.0) != 0)) {
                                    __pyx_t_26 = (__pyx_v_I0_pred / __pyx_v_W0_pred);
                                  } else {
                                    __pyx_t_26 = 1.0;
                                  }
                                  __pyx_t_8 = __pyx_v_j;
                                  __pyx_t_6 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_8 * __pyx_v__I0.strides[0]) )) + __pyx_t_6)) )) = __pyx_t_26;
                                }
                            }
                        }
                    }
                }
/* … */
                                  if (((__pyx_v_W0_pred > 0.0) != 0)) {
                                    __pyx_t_26 = (__pyx_v_I0_pred / __pyx_v_W0_pred);
                                  } else {
                                    __pyx_t_26 = 1.0;
                                  }
                                  __pyx_t_8 = __pyx_v_j;
                                  __pyx_t_6 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__I0.data + __pyx_t_8 * __pyx_v__I0.strides[0]) )) + __pyx_t_6)) )) = __pyx_t_26;
                                }
                            }
                        }
                    }
                }
 0457: 
+0458:         free(M_mat); free(I0_mat); free(W0_mat)
                free(__pyx_v_M_mat);
                free(__pyx_v_I0_mat);
                free(__pyx_v_W0_mat);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                free(__pyx_v_M_mat);
                free(__pyx_v_I0_mat);
                free(__pyx_v_W0_mat);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                free(__pyx_v_M_mat);
                free(__pyx_v_I0_mat);
                free(__pyx_v_W0_mat);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                free(__pyx_v_M_mat);
                free(__pyx_v_I0_mat);
                free(__pyx_v_W0_mat);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 0459: 
+0460:     if return_nm0:
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_return_nm0 != 0);
  if (__pyx_t_1) {
/* … */
  }
+0461:         return I0, <int>n0, <int>m0
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_27 = PyTuple_New(3); if (unlikely(!__pyx_t_27)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_27);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_27, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_27, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_27, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_27;
    __pyx_t_27 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_27 = PyTuple_New(3); if (unlikely(!__pyx_t_27)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_27);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_27, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_27, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_27, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_27;
    __pyx_t_27 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_27 = PyTuple_New(3); if (unlikely(!__pyx_t_27)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_27);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_27, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_27, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_27, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_27;
    __pyx_t_27 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(((int)__pyx_v_n0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyInt_From_int(((int)__pyx_v_m0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_27 = PyTuple_New(3); if (unlikely(!__pyx_t_27)) __PYX_ERR(0, 461, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_27);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_I0));
    PyTuple_SET_ITEM(__pyx_t_27, 0, ((PyObject *)__pyx_v_I0));
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_27, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_27, 2, __pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_27;
    __pyx_t_27 = 0;
    goto __pyx_L0;
 0462:     else:
+0463:         return I0
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
/* … */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
/* … */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
/* … */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_I0));
    __pyx_r = ((PyObject *)__pyx_v_I0);
    goto __pyx_L0;
  }
 0464: 
+0465: cdef double FVU_interp(uint_t[:, :, ::1] I_n, float_t W, float_t[:, ::1] I0, float_t[::1] di, float_t[::1] dj, int j, int k,
static double __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__Pyx_memviewslice __pyx_v_I_n, __pyx_t_5numpy_float64_t __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, __pyx_t_5numpy_float64_t __pyx_v_ux, __pyx_t_5numpy_float64_t __pyx_v_uy, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static double __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__Pyx_memviewslice __pyx_v_I_n, __pyx_t_5numpy_float32_t __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, __pyx_t_5numpy_float32_t __pyx_v_ux, __pyx_t_5numpy_float32_t __pyx_v_uy, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static double __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__Pyx_memviewslice __pyx_v_I_n, __pyx_t_5numpy_float64_t __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, __pyx_t_5numpy_float64_t __pyx_v_ux, __pyx_t_5numpy_float64_t __pyx_v_uy, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static double __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__Pyx_memviewslice __pyx_v_I_n, __pyx_t_5numpy_float32_t __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, __pyx_t_5numpy_float32_t __pyx_v_ux, __pyx_t_5numpy_float32_t __pyx_v_uy, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0466:                        float_t ux, float_t uy, double ds_y, double ds_x, double sigma, loss_func f) nogil:
 0467:     """Return fraction of variance unexplained between the validation set I and trained
 0468:     profile I0. Find the predicted values at the points (y, x) with bilinear interpolation.
 0469:     """
+0470:     cdef int N = I_n.shape[0], Y0 = I0.shape[0], X0 = I0.shape[1]
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
 0471:     cdef int i, y0, y1, x0, x1
+0472:     cdef double y, x, dy, dx, I0_bi, err = 0.0
  __pyx_v_err = 0.0;
/* … */
  __pyx_v_err = 0.0;
/* … */
  __pyx_v_err = 0.0;
/* … */
  __pyx_v_err = 0.0;
 0473: 
+0474:     for i in range(N):
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+0475:         y = (ux - di[i]) / ds_y
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_y = ((__pyx_v_ux - (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_4)) )))) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y));
/* … */
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_y = (((double)(__pyx_v_ux - (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_4)) ))))) / __pyx_v_ds_y);
/* … */
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_y = ((__pyx_v_ux - (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_4)) )))) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y));
/* … */
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_y = (((double)(__pyx_v_ux - (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_4)) ))))) / __pyx_v_ds_y);
+0476:         x = (uy - dj[i]) / ds_x
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_x = ((__pyx_v_uy - (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_4)) )))) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x));
/* … */
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_x = (((double)(__pyx_v_uy - (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_4)) ))))) / __pyx_v_ds_x);
/* … */
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_x = ((__pyx_v_uy - (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_4)) )))) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x));
/* … */
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_x = (((double)(__pyx_v_uy - (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_4)) ))))) / __pyx_v_ds_x);
 0477: 
+0478:         if y <= 0.0:
    __pyx_t_5 = ((__pyx_v_y <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_y <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_y <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_y <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
+0479:             dy = 0.0; y0 = 0; y1 = 0
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = 0;
      __pyx_v_y1 = 0;
/* … */
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = 0;
      __pyx_v_y1 = 0;
/* … */
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = 0;
      __pyx_v_y1 = 0;
/* … */
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = 0;
      __pyx_v_y1 = 0;
+0480:         elif y >= Y0 - 1.0:
    __pyx_t_5 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
+0481:             dy = 0.0; y0 = Y0 - 1; y1 = Y0 - 1
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = (__pyx_v_Y0 - 1);
      __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = (__pyx_v_Y0 - 1);
      __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = (__pyx_v_Y0 - 1);
      __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
      __pyx_v_dy = 0.0;
      __pyx_v_y0 = (__pyx_v_Y0 - 1);
      __pyx_v_y1 = (__pyx_v_Y0 - 1);
 0482:         else:
+0483:             dy = y - floor(y)
    /*else*/ {
      __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
    /*else*/ {
      __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
    /*else*/ {
      __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
    /*else*/ {
      __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
+0484:             y0 = <int>floor(y); y1 = y0 + 1
      __pyx_v_y0 = ((int)floor(__pyx_v_y));
      __pyx_v_y1 = (__pyx_v_y0 + 1);
    }
    __pyx_L5:;
/* … */
      __pyx_v_y0 = ((int)floor(__pyx_v_y));
      __pyx_v_y1 = (__pyx_v_y0 + 1);
    }
    __pyx_L5:;
/* … */
      __pyx_v_y0 = ((int)floor(__pyx_v_y));
      __pyx_v_y1 = (__pyx_v_y0 + 1);
    }
    __pyx_L5:;
/* … */
      __pyx_v_y0 = ((int)floor(__pyx_v_y));
      __pyx_v_y1 = (__pyx_v_y0 + 1);
    }
    __pyx_L5:;
 0485: 
+0486:         if x <= 0.0:
    __pyx_t_5 = ((__pyx_v_x <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_x <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_x <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_x <= 0.0) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
+0487:             dx = 0.0; x0 = 0; x1 = 0
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = 0;
      __pyx_v_x1 = 0;
/* … */
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = 0;
      __pyx_v_x1 = 0;
/* … */
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = 0;
      __pyx_v_x1 = 0;
/* … */
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = 0;
      __pyx_v_x1 = 0;
+0488:         elif x >= X0 - 1.0:
    __pyx_t_5 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
/* … */
    __pyx_t_5 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L6;
    }
+0489:             dx = 0.0; x0 = X0 - 1; x1 = X0 - 1
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = (__pyx_v_X0 - 1);
      __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = (__pyx_v_X0 - 1);
      __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = (__pyx_v_X0 - 1);
      __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
      __pyx_v_dx = 0.0;
      __pyx_v_x0 = (__pyx_v_X0 - 1);
      __pyx_v_x1 = (__pyx_v_X0 - 1);
 0490:         else:
+0491:             dx = x - floor(x)
    /*else*/ {
      __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
    /*else*/ {
      __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
    /*else*/ {
      __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
    /*else*/ {
      __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
+0492:             x0 = <int>floor(x); x1 = x0 + 1
      __pyx_v_x0 = ((int)floor(__pyx_v_x));
      __pyx_v_x1 = (__pyx_v_x0 + 1);
    }
    __pyx_L6:;
/* … */
      __pyx_v_x0 = ((int)floor(__pyx_v_x));
      __pyx_v_x1 = (__pyx_v_x0 + 1);
    }
    __pyx_L6:;
/* … */
      __pyx_v_x0 = ((int)floor(__pyx_v_x));
      __pyx_v_x1 = (__pyx_v_x0 + 1);
    }
    __pyx_L6:;
/* … */
      __pyx_v_x0 = ((int)floor(__pyx_v_x));
      __pyx_v_x1 = (__pyx_v_x0 + 1);
    }
    __pyx_L6:;
 0493: 
+0494:         I0_bi = (1.0 - dy) * (1.0 - dx) * I0[y0, x0] + \
    __pyx_t_4 = __pyx_v_y0;
    __pyx_t_6 = __pyx_v_x0;
/* … */
    __pyx_t_4 = __pyx_v_y0;
    __pyx_t_6 = __pyx_v_x0;
/* … */
    __pyx_t_4 = __pyx_v_y0;
    __pyx_t_6 = __pyx_v_x0;
/* … */
    __pyx_t_4 = __pyx_v_y0;
    __pyx_t_6 = __pyx_v_x0;
+0495:                 (1.0 - dy) * dx * I0[y0, x1] + \
    __pyx_t_7 = __pyx_v_y0;
    __pyx_t_8 = __pyx_v_x1;
/* … */
    __pyx_t_7 = __pyx_v_y0;
    __pyx_t_8 = __pyx_v_x1;
/* … */
    __pyx_t_7 = __pyx_v_y0;
    __pyx_t_8 = __pyx_v_x1;
/* … */
    __pyx_t_7 = __pyx_v_y0;
    __pyx_t_8 = __pyx_v_x1;
+0496:                 dy * (1.0 - dx) * I0[y1, x0] + \
    __pyx_t_9 = __pyx_v_y1;
    __pyx_t_10 = __pyx_v_x0;
/* … */
    __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_4 * __pyx_v_I0.strides[0]) )) + __pyx_t_6)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_10)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )))));
/* … */
    __pyx_t_9 = __pyx_v_y1;
    __pyx_t_10 = __pyx_v_x0;
/* … */
    __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_4 * __pyx_v_I0.strides[0]) )) + __pyx_t_6)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_10)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )))));
/* … */
    __pyx_t_9 = __pyx_v_y1;
    __pyx_t_10 = __pyx_v_x0;
/* … */
    __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_4 * __pyx_v_I0.strides[0]) )) + __pyx_t_6)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_10)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )))));
/* … */
    __pyx_t_9 = __pyx_v_y1;
    __pyx_t_10 = __pyx_v_x0;
/* … */
    __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_4 * __pyx_v_I0.strides[0]) )) + __pyx_t_6)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_10)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_12)) )))));
+0497:                 dy * dx * I0[y1, x1]
    __pyx_t_11 = __pyx_v_y1;
    __pyx_t_12 = __pyx_v_x1;
/* … */
    __pyx_t_11 = __pyx_v_y1;
    __pyx_t_12 = __pyx_v_x1;
/* … */
    __pyx_t_11 = __pyx_v_y1;
    __pyx_t_12 = __pyx_v_x1;
/* … */
    __pyx_t_11 = __pyx_v_y1;
    __pyx_t_12 = __pyx_v_x1;
+0498:         err += f((<double>I_n[i, j, k] - W * I0_bi) / sigma)
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_11 = __pyx_v_j;
    __pyx_t_10 = __pyx_v_k;
    __pyx_v_err = (__pyx_v_err + __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_12 * __pyx_v_I_n.strides[0]) ) + __pyx_t_11 * __pyx_v_I_n.strides[1]) )) + __pyx_t_10)) )))) - (__pyx_v_W * __pyx_v_I0_bi)) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma))));
  }
/* … */
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_11 = __pyx_v_j;
    __pyx_t_10 = __pyx_v_k;
    __pyx_v_err = (__pyx_v_err + __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_12 * __pyx_v_I_n.strides[0]) ) + __pyx_t_11 * __pyx_v_I_n.strides[1]) )) + __pyx_t_10)) )))) - (__pyx_v_W * __pyx_v_I0_bi)) / __pyx_v_sigma)));
  }
/* … */
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_11 = __pyx_v_j;
    __pyx_t_10 = __pyx_v_k;
    __pyx_v_err = (__pyx_v_err + __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_12 * __pyx_v_I_n.strides[0]) ) + __pyx_t_11 * __pyx_v_I_n.strides[1]) )) + __pyx_t_10)) )))) - (__pyx_v_W * __pyx_v_I0_bi)) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma))));
  }
/* … */
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_11 = __pyx_v_j;
    __pyx_t_10 = __pyx_v_k;
    __pyx_v_err = (__pyx_v_err + __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_12 * __pyx_v_I_n.strides[0]) ) + __pyx_t_11 * __pyx_v_I_n.strides[1]) )) + __pyx_t_10)) )))) - (__pyx_v_W * __pyx_v_I0_bi)) / __pyx_v_sigma)));
  }
 0499: 
+0500:     return err / N
  __pyx_r = (__pyx_v_err / ((double)__pyx_v_N));
  goto __pyx_L0;
/* … */
  __pyx_r = (__pyx_v_err / ((double)__pyx_v_N));
  goto __pyx_L0;
/* … */
  __pyx_r = (__pyx_v_err / ((double)__pyx_v_N));
  goto __pyx_L0;
/* … */
  __pyx_r = (__pyx_v_err / ((double)__pyx_v_N));
  goto __pyx_L0;
 0501: 
+0502: cdef double FVU_interp_tr(float_t[:, ::1] errors, uint_t[:, ::1] I_n, float_t[:, ::1] W,
static double __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di0, __pyx_t_5numpy_float64_t __pyx_v_dj0, CYTHON_UNUSED __pyx_t_5numpy_float64_t __pyx_v_di, CYTHON_UNUSED __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err0;
  double __pyx_v_err1;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static double __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di0, __pyx_t_5numpy_float64_t __pyx_v_dj0, CYTHON_UNUSED __pyx_t_5numpy_float64_t __pyx_v_di, CYTHON_UNUSED __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err0;
  double __pyx_v_err1;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static double __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di0, __pyx_t_5numpy_float32_t __pyx_v_dj0, CYTHON_UNUSED __pyx_t_5numpy_float32_t __pyx_v_di, CYTHON_UNUSED __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err0;
  double __pyx_v_err1;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

static double __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di0, __pyx_t_5numpy_float32_t __pyx_v_dj0, CYTHON_UNUSED __pyx_t_5numpy_float32_t __pyx_v_di, CYTHON_UNUSED __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_y0;
  int __pyx_v_y1;
  int __pyx_v_x0;
  int __pyx_v_x1;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_dy;
  double __pyx_v_dx;
  double __pyx_v_I0_bi;
  double __pyx_v_err0;
  double __pyx_v_err1;
  double __pyx_v_err;
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0503:                           float_t[:, ::1] I0, float_t[:, :, ::1] u, float_t di0, float_t dj0, float_t di,
 0504:                           float_t dj, double ds_y, double ds_x, double sigma, loss_func f) nogil:
 0505:     """Return fraction of variance unexplained between the validation set I and trained
 0506:     profile I0. Find the predicted values at the points (y, x) with bilinear interpolation.
 0507:     """
+0508:     cdef int Y = I_n.shape[0], X = I_n.shape[1], Y0 = I0.shape[0], X0 = I0.shape[1]
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
 0509:     cdef int j, k, y0, y1, x0, x1
+0510:     cdef double y, x, dy, dx, I0_bi, err0, err1, err = 0.0
  __pyx_v_err = 0.0;
/* … */
  __pyx_v_err = 0.0;
/* … */
  __pyx_v_err = 0.0;
/* … */
  __pyx_v_err = 0.0;
 0511: 
+0512:     for j in range(Y):
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+0513:         for k in range(X):
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
+0514:             y = (u[0, j, k] - di0) / ds_y
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y));
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y));
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di0)) / __pyx_v_ds_y);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di0)) / __pyx_v_ds_y);
+0515:             x = (u[1, j, k] - dj0) / ds_x
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x));
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x));
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj0)) / __pyx_v_ds_x);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj0)) / __pyx_v_ds_x);
 0516: 
+0517:             if y <= 0.0:
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
+0518:                 dy = 0.0; y0 = 0; y1 = 0
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
+0519:             elif y >= Y0 - 1.0:
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L7;
      }
+0520:                 dy = 0.0; y0 = Y0 - 1; y1 = Y0 - 1
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
 0521:             else:
+0522:                 dy = y - floor(y)
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
+0523:                 y0 = <int>floor(y); y1 = y0 + 1
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L7:;
/* … */
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L7:;
/* … */
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L7:;
/* … */
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L7:;
 0524: 
+0525:             if x <= 0.0:
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
+0526:                 dx = 0.0; x0 = 0; x1 = 0
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
+0527:             elif x >= X0 - 1.0:
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L8;
      }
+0528:                 dx = 0.0; x0 = X0 - 1; x1 = X0 - 1
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
 0529:             else:
+0530:                 dx = x - floor(x)
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
+0531:                 x0 = <int>floor(x); x1 = x0 + 1
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L8:;
/* … */
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L8:;
/* … */
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L8:;
/* … */
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L8:;
 0532: 
+0533:             I0_bi = (1.0 - dy) * (1.0 - dx) * I0[y0, x0] + \
      __pyx_t_7 = __pyx_v_y0;
      __pyx_t_8 = __pyx_v_x0;
/* … */
      __pyx_t_7 = __pyx_v_y0;
      __pyx_t_8 = __pyx_v_x0;
/* … */
      __pyx_t_7 = __pyx_v_y0;
      __pyx_t_8 = __pyx_v_x0;
/* … */
      __pyx_t_7 = __pyx_v_y0;
      __pyx_t_8 = __pyx_v_x0;
+0534:                     (1.0 - dy) * dx * I0[y0, x1] + \
      __pyx_t_9 = __pyx_v_y0;
      __pyx_t_11 = __pyx_v_x1;
/* … */
      __pyx_t_9 = __pyx_v_y0;
      __pyx_t_11 = __pyx_v_x1;
/* … */
      __pyx_t_9 = __pyx_v_y0;
      __pyx_t_11 = __pyx_v_x1;
/* … */
      __pyx_t_9 = __pyx_v_y0;
      __pyx_t_11 = __pyx_v_x1;
+0535:                     dy * (1.0 - dx) * I0[y1, x0] + \
      __pyx_t_12 = __pyx_v_y1;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_11)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) )))));
/* … */
      __pyx_t_12 = __pyx_v_y1;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_11)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) )))));
/* … */
      __pyx_t_12 = __pyx_v_y1;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_11)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) )))));
/* … */
      __pyx_t_12 = __pyx_v_y1;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_7 * __pyx_v_I0.strides[0]) )) + __pyx_t_8)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_9 * __pyx_v_I0.strides[0]) )) + __pyx_t_11)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) )))));
+0536:                     dy * dx * I0[y1, x1]
      __pyx_t_14 = __pyx_v_y1;
      __pyx_t_15 = __pyx_v_x1;
/* … */
      __pyx_t_14 = __pyx_v_y1;
      __pyx_t_15 = __pyx_v_x1;
/* … */
      __pyx_t_14 = __pyx_v_y1;
      __pyx_t_15 = __pyx_v_x1;
/* … */
      __pyx_t_14 = __pyx_v_y1;
      __pyx_t_15 = __pyx_v_x1;
+0537:             err0 = f((<double>I_n[j, k] - W[j, k] * I0_bi) / sigma)
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_err0 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_15 * __pyx_v_I_n.strides[0]) )) + __pyx_t_14)) )))) - ((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * __pyx_v_I0_bi)) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma)));
/* … */
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_err0 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_15 * __pyx_v_I_n.strides[0]) )) + __pyx_t_14)) )))) - ((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * __pyx_v_I0_bi)) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma)));
/* … */
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_err0 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_15 * __pyx_v_I_n.strides[0]) )) + __pyx_t_14)) )))) - ((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * __pyx_v_I0_bi)) / __pyx_v_sigma));
/* … */
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_err0 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_15 * __pyx_v_I_n.strides[0]) )) + __pyx_t_14)) )))) - ((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) * __pyx_v_I0_bi)) / __pyx_v_sigma));
 0538: 
+0539:             y = (u[0, j, k] - di0) / ds_y
      __pyx_t_12 = 0;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_v_y = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_12 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_14)) ))) - __pyx_v_di0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y));
/* … */
      __pyx_t_12 = 0;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_v_y = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_12 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_14)) ))) - __pyx_v_di0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_y));
/* … */
      __pyx_t_12 = 0;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_v_y = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_12 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_14)) ))) - __pyx_v_di0)) / __pyx_v_ds_y);
/* … */
      __pyx_t_12 = 0;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_k;
      __pyx_v_y = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_12 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_14)) ))) - __pyx_v_di0)) / __pyx_v_ds_y);
+0540:             x = (u[1, j, k] - dj0) / ds_x
      __pyx_t_14 = 1;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_x = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_12)) ))) - __pyx_v_dj0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x));
/* … */
      __pyx_t_14 = 1;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_x = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_12)) ))) - __pyx_v_dj0) / ((__pyx_t_5numpy_float64_t)__pyx_v_ds_x));
/* … */
      __pyx_t_14 = 1;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_x = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_12)) ))) - __pyx_v_dj0)) / __pyx_v_ds_x);
/* … */
      __pyx_t_14 = 1;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_12 = __pyx_v_k;
      __pyx_v_x = (((double)((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_13 * __pyx_v_u.strides[1]) )) + __pyx_t_12)) ))) - __pyx_v_dj0)) / __pyx_v_ds_x);
 0541: 
+0542:             if y <= 0.0:
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
+0543:                 dy = 0.0; y0 = 0; y1 = 0
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = 0;
        __pyx_v_y1 = 0;
+0544:             elif y >= Y0 - 1.0:
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_y >= (__pyx_v_Y0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L9;
      }
+0545:                 dy = 0.0; y0 = Y0 - 1; y1 = Y0 - 1
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
/* … */
        __pyx_v_dy = 0.0;
        __pyx_v_y0 = (__pyx_v_Y0 - 1);
        __pyx_v_y1 = (__pyx_v_Y0 - 1);
 0546:             else:
+0547:                 dy = y - floor(y)
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
/* … */
      /*else*/ {
        __pyx_v_dy = (__pyx_v_y - floor(__pyx_v_y));
+0548:                 y0 = <int>floor(y); y1 = y0 + 1
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L9:;
/* … */
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L9:;
/* … */
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L9:;
/* … */
        __pyx_v_y0 = ((int)floor(__pyx_v_y));
        __pyx_v_y1 = (__pyx_v_y0 + 1);
      }
      __pyx_L9:;
 0549: 
+0550:             if x <= 0.0:
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x <= 0.0) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
+0551:                 dx = 0.0; x0 = 0; x1 = 0
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = 0;
        __pyx_v_x1 = 0;
+0552:             elif x >= X0 - 1.0:
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_10 = ((__pyx_v_x >= (__pyx_v_X0 - 1.0)) != 0);
      if (__pyx_t_10) {
/* … */
        goto __pyx_L10;
      }
+0553:                 dx = 0.0; x0 = X0 - 1; x1 = X0 - 1
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
/* … */
        __pyx_v_dx = 0.0;
        __pyx_v_x0 = (__pyx_v_X0 - 1);
        __pyx_v_x1 = (__pyx_v_X0 - 1);
 0554:             else:
+0555:                 dx = x - floor(x)
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
/* … */
      /*else*/ {
        __pyx_v_dx = (__pyx_v_x - floor(__pyx_v_x));
+0556:                 x0 = <int>floor(x); x1 = x0 + 1
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L10:;
/* … */
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L10:;
/* … */
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L10:;
/* … */
        __pyx_v_x0 = ((int)floor(__pyx_v_x));
        __pyx_v_x1 = (__pyx_v_x0 + 1);
      }
      __pyx_L10:;
 0557: 
+0558:             I0_bi = (1.0 - dy) * (1.0 - dx) * I0[y0, x0] + \
      __pyx_t_12 = __pyx_v_y0;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_t_12 = __pyx_v_y0;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_t_12 = __pyx_v_y0;
      __pyx_t_13 = __pyx_v_x0;
/* … */
      __pyx_t_12 = __pyx_v_y0;
      __pyx_t_13 = __pyx_v_x0;
+0559:                     (1.0 - dy) * dx * I0[y0, x1] + \
      __pyx_t_14 = __pyx_v_y0;
      __pyx_t_15 = __pyx_v_x1;
/* … */
      __pyx_t_14 = __pyx_v_y0;
      __pyx_t_15 = __pyx_v_x1;
/* … */
      __pyx_t_14 = __pyx_v_y0;
      __pyx_t_15 = __pyx_v_x1;
/* … */
      __pyx_t_14 = __pyx_v_y0;
      __pyx_t_15 = __pyx_v_x1;
+0560:                     dy * (1.0 - dx) * I0[y1, x0] + \
      __pyx_t_11 = __pyx_v_y1;
      __pyx_t_9 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_9)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_8 * __pyx_v_I0.strides[0]) )) + __pyx_t_7)) )))));
/* … */
      __pyx_t_11 = __pyx_v_y1;
      __pyx_t_9 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_9)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_8 * __pyx_v_I0.strides[0]) )) + __pyx_t_7)) )))));
/* … */
      __pyx_t_11 = __pyx_v_y1;
      __pyx_t_9 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_9)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_8 * __pyx_v_I0.strides[0]) )) + __pyx_t_7)) )))));
/* … */
      __pyx_t_11 = __pyx_v_y1;
      __pyx_t_9 = __pyx_v_x0;
/* … */
      __pyx_v_I0_bi = ((((((1.0 - __pyx_v_dy) * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_12 * __pyx_v_I0.strides[0]) )) + __pyx_t_13)) )))) + (((1.0 - __pyx_v_dy) * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_14 * __pyx_v_I0.strides[0]) )) + __pyx_t_15)) ))))) + ((__pyx_v_dy * (1.0 - __pyx_v_dx)) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_11 * __pyx_v_I0.strides[0]) )) + __pyx_t_9)) ))))) + ((__pyx_v_dy * __pyx_v_dx) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_8 * __pyx_v_I0.strides[0]) )) + __pyx_t_7)) )))));
+0561:                     dy * dx * I0[y1, x1]
      __pyx_t_8 = __pyx_v_y1;
      __pyx_t_7 = __pyx_v_x1;
/* … */
      __pyx_t_8 = __pyx_v_y1;
      __pyx_t_7 = __pyx_v_x1;
/* … */
      __pyx_t_8 = __pyx_v_y1;
      __pyx_t_7 = __pyx_v_x1;
/* … */
      __pyx_t_8 = __pyx_v_y1;
      __pyx_t_7 = __pyx_v_x1;
+0562:             err1 = f((<double>I_n[j, k] - W[j, k] * I0_bi) / sigma)
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
      __pyx_t_9 = __pyx_v_j;
      __pyx_t_11 = __pyx_v_k;
      __pyx_v_err1 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))) * __pyx_v_I0_bi)) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma)));
/* … */
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
      __pyx_t_9 = __pyx_v_j;
      __pyx_t_11 = __pyx_v_k;
      __pyx_v_err1 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))) * __pyx_v_I0_bi)) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma)));
/* … */
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
      __pyx_t_9 = __pyx_v_j;
      __pyx_t_11 = __pyx_v_k;
      __pyx_v_err1 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))) * __pyx_v_I0_bi)) / __pyx_v_sigma));
/* … */
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
      __pyx_t_9 = __pyx_v_j;
      __pyx_t_11 = __pyx_v_k;
      __pyx_v_err1 = __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))) * __pyx_v_I0_bi)) / __pyx_v_sigma));
 0563: 
+0564:             err += (errors[j, k] - err0 + err1)
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_err = (__pyx_v_err + (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_11 * __pyx_v_errors.strides[0]) )) + __pyx_t_9)) ))) - __pyx_v_err0) + __pyx_v_err1));
    }
  }
/* … */
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_err = (__pyx_v_err + (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_11 * __pyx_v_errors.strides[0]) )) + __pyx_t_9)) ))) - __pyx_v_err0) + __pyx_v_err1));
    }
  }
/* … */
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_err = (__pyx_v_err + (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_11 * __pyx_v_errors.strides[0]) )) + __pyx_t_9)) ))) - __pyx_v_err0) + __pyx_v_err1));
    }
  }
/* … */
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_err = (__pyx_v_err + (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_11 * __pyx_v_errors.strides[0]) )) + __pyx_t_9)) ))) - __pyx_v_err0) + __pyx_v_err1));
    }
  }
 0565: 
+0566:     return err / (Y * X)
  __pyx_r = (__pyx_v_err / ((double)(__pyx_v_Y * __pyx_v_X)));
  goto __pyx_L0;
/* … */
  __pyx_r = (__pyx_v_err / ((double)(__pyx_v_Y * __pyx_v_X)));
  goto __pyx_L0;
/* … */
  __pyx_r = (__pyx_v_err / ((double)(__pyx_v_Y * __pyx_v_X)));
  goto __pyx_L0;
/* … */
  __pyx_r = (__pyx_v_err / ((double)(__pyx_v_Y * __pyx_v_X)));
  goto __pyx_L0;
 0567: 
+0568: cdef void pm_gsearcher(uint_t[:, :, ::1] I_n, float_t[:, ::1] W, float_t[:, ::1] I0, float_t[:, :, ::1] u,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_err_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_err_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_err_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_err_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
/* … */
  /* function exit code */
}
 0569:                        float_t[:, ::1] derrs, float_t[::1] di, float_t[::1] dj, int j, int k, double sw_y, double sw_x,
 0570:                        unsigned wsize, double ds_y, double ds_x, double sigma, loss_func f) nogil:
+0571:     cdef double err, err0, uy_min = 0.0, ux_min = 0.0, err_min=FLOAT_MAX, ux, uy
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
+0572:     cdef double dsw_y = 2.0 * sw_y / (wsize - 1), dsw_x = 2.0 * sw_x / (wsize - 1)
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
/* … */
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
/* … */
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
/* … */
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
 0573:     cdef int ii, jj
 0574: 
+0575:     err0 = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k],
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0576:                       u[1, j, k], ds_y, ds_x, sigma, f)
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
 0577: 
+0578:     for ii in range(<int>wsize if dsw_y > 0.0 else 1):
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_9 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_9 = 1;
  }
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_9 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_9 = 1;
  }
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_9 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_9 = 1;
  }
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_9 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_9 = 1;
  }
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
+0579:         uy = dsw_y * (ii - 0.5 * (wsize - 1))
    __pyx_v_uy = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
/* … */
    __pyx_v_uy = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
/* … */
    __pyx_v_uy = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
/* … */
    __pyx_v_uy = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
+0580:         for jj in range(<int>wsize if dsw_x > 0.0 else 1):
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_12 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_12 = 1;
    }
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_jj = __pyx_t_14;
/* … */
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_12 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_12 = 1;
    }
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_jj = __pyx_t_14;
/* … */
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_12 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_12 = 1;
    }
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_jj = __pyx_t_14;
/* … */
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_12 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_12 = 1;
    }
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_jj = __pyx_t_14;
+0581:             ux = dsw_x * (jj - 0.5 * (wsize - 1))
      __pyx_v_ux = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
/* … */
      __pyx_v_ux = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
/* … */
      __pyx_v_ux = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
/* … */
      __pyx_v_ux = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
+0582:             err = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k] + uy,
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_j;
      __pyx_t_4 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_j;
      __pyx_t_4 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_j;
      __pyx_t_4 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_t_6 = 0;
      __pyx_t_5 = __pyx_v_j;
      __pyx_t_4 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0583:                              u[1, j, k] + ux, ds_y, ds_x, sigma, f)
      __pyx_t_3 = 1;
      __pyx_t_2 = __pyx_v_j;
      __pyx_t_1 = __pyx_v_k;
/* … */
      __pyx_t_3 = 1;
      __pyx_t_2 = __pyx_v_j;
      __pyx_t_1 = __pyx_v_k;
/* … */
      __pyx_t_3 = 1;
      __pyx_t_2 = __pyx_v_j;
      __pyx_t_1 = __pyx_v_k;
/* … */
      __pyx_t_3 = 1;
      __pyx_t_2 = __pyx_v_j;
      __pyx_t_1 = __pyx_v_k;
 0584: 
+0585:             if err < err_min:
      __pyx_t_15 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_15) {
/* … */
      }
    }
  }
/* … */
      __pyx_t_15 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_15) {
/* … */
      }
    }
  }
/* … */
      __pyx_t_15 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_15) {
/* … */
      }
    }
  }
/* … */
      __pyx_t_15 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_15) {
/* … */
      }
    }
  }
+0586:                 uy_min = uy; ux_min = ux; err_min = err
        __pyx_v_uy_min = __pyx_v_uy;
        __pyx_v_ux_min = __pyx_v_ux;
        __pyx_v_err_min = __pyx_v_err;
/* … */
        __pyx_v_uy_min = __pyx_v_uy;
        __pyx_v_ux_min = __pyx_v_ux;
        __pyx_v_err_min = __pyx_v_err;
/* … */
        __pyx_v_uy_min = __pyx_v_uy;
        __pyx_v_ux_min = __pyx_v_ux;
        __pyx_v_err_min = __pyx_v_err;
/* … */
        __pyx_v_uy_min = __pyx_v_uy;
        __pyx_v_ux_min = __pyx_v_ux;
        __pyx_v_err_min = __pyx_v_err;
 0587: 
+0588:     u[0, j, k] += uy_min; u[1, j, k] += ux_min
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
/* … */
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
/* … */
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
/* … */
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
+0589:     derrs[j, k] = err0 - err_min if err_min < err0 else 0.0
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_16 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_16 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_16;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_16 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_16 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_16;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_16 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_16 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_16;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_16 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_16 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_16;
 0590: 
+0591: def pm_gsearch(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_5pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_4pm_gsearch[] = "Update the pixel mapping by minimizing mean-squared-error\n    (MSE). Perform a grid search within the search window of `sw_y`,\n    `sw_x` size along the vertical and fast axes accordingly in order to\n    minimize the MSE at each point of the detector grid separately.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Initial sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray) : Initial sample's translations along the horizontal\n            detector axis in pixels.\n        sw_y (float) : Search window size in pixels along the vertical detector\n            axis.\n        sw_x (float) : Search window size in pixels along the horizontal detector\n            axis.\n        grid_size (int) :  Grid size along one of the detector axes. The grid\n            shape is then (grid_size, grid_size).\n        ds_y (float) : Sampling interval of reference image in pixels along the\n            vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along the\n            horizontal axis.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str) : Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n\n        num_threads (int) : Number of threads.\n\n    Returns:\n        Tuple[numpy.ndarray, numpy.ndarray] : A tuple of two elements ('u', 'derr').\n        The elements are the following:\n\n        * 'u' : Updated pixel mapping array.\n        * 'derr' : Error decrease for each pixel i""n the detector grid.\n\n    Notes:\n        The error metric as a function of pixel mapping displacements\n        is given by:\n\n        .. math::\n\n            \\varepsilon_{pm}[i, j, i^{\\prime}, j^{\\prime}] = \\frac{1}{N}\n            \\sum_{n = 0}^N f\\left( \\frac{I[n, i, j] - W[i, j]\n            I_{ref}[u[0, i, j] + i^{\\prime} - di[n],\n            u[1, i, j] + j^{\\prime} - dj[n]]}{\\sigma} \\right)\n\n        where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_5pm_gsearch = {"pm_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_5pm_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_4pm_gsearch};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_5pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 591, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 591, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 591, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_4pm_gsearch(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_4pm_gsearch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_gsearch", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_12);
    __Pyx_GIVEREF(__pyx_int_12);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_12);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_12);
    __Pyx_GIVEREF(__pyx_int_12);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_12);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 591, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 591, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 591, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 591, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 591, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_168__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_43pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_43pm_gsearch = {"__pyx_fuse_0_0pm_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_43pm_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_4pm_gsearch};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_43pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults20 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_gsearch") < 0)) __PYX_ERR(0, 591, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 594, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 591, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 594, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_42pm_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_42pm_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0pm_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_170__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_45pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_45pm_gsearch = {"__pyx_fuse_0_1pm_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_45pm_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_4pm_gsearch};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_45pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults21 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_gsearch") < 0)) __PYX_ERR(0, 591, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 594, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 591, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 594, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_44pm_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_44pm_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1pm_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_172__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_47pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_47pm_gsearch = {"__pyx_fuse_1_0pm_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_47pm_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_4pm_gsearch};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_47pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults22 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_gsearch") < 0)) __PYX_ERR(0, 591, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 594, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 591, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 594, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_46pm_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_46pm_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0pm_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_174__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_49pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_49pm_gsearch = {"__pyx_fuse_1_1pm_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_49pm_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_4pm_gsearch};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_49pm_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults23 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 591, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_gsearch") < 0)) __PYX_ERR(0, 591, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 591, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 592, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 593, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 594, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 591, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 591, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 592, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 594, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_48pm_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_48pm_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1pm_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_tuple__37 = PyTuple_Pack(25, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u0, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_sw_y, __pyx_n_s_sw_x, __pyx_n_s_grid_size, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_u_shape, __pyx_n_s_u, __pyx_n_s_derr, __pyx_n_s_u_2, __pyx_n_s_derr_2); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);
  __pyx_t_1 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_43pm_gsearch, 0, __pyx_n_s_pm_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults20), 1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults20, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_168__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_45pm_gsearch, 0, __pyx_n_s_pm_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults21), 1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults21, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_170__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float32_t, __pyx_t_2) < 0) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_47pm_gsearch, 0, __pyx_n_s_pm_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults22), 1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults22, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_172__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_49pm_gsearch, 0, __pyx_n_s_pm_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults23), 1)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults23, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_174__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float32_t, __pyx_t_2) < 0) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_5pm_gsearch, 0, __pyx_n_s_pm_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  ((__pyx_FusedFunctionObject *) __pyx_t_2)->__signatures__ = __pyx_t_1;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pm_gsearch, __pyx_t_2) < 0) __PYX_ERR(0, 591, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(14, 0, 25, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_pm_gsearch, 591, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(0, 591, __pyx_L1_error)
 0592:                float_t[:, :, ::1] u0 not None, float_t[::1] di not None, float_t[::1] dj not None,
 0593:                double sw_y, double sw_x, unsigned grid_size, double ds_y, double ds_x, double sigma,
+0594:                str loss='Huber', unsigned num_threads=1):
  __pyx_t_1 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 594, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
 0595:     r"""Update the pixel mapping by minimizing mean-squared-error
 0596:     (MSE). Perform a grid search within the search window of `sw_y`,
 0597:     `sw_x` size along the vertical and fast axes accordingly in order to
 0598:     minimize the MSE at each point of the detector grid separately.
 0599: 
 0600:     Args:
 0601:         I_n (numpy.ndarray) : Measured intensity frames.
 0602:         W (numpy.ndarray) : Measured frames' whitefield.
 0603:         I0 (numpy.ndarray) : Reference image of the sample.
 0604:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 0605:             plane to the reference image.
 0606:         di (numpy.ndarray) : Initial sample's translations along the vertical
 0607:             detector axis in pixels.
 0608:         dj (numpy.ndarray) : Initial sample's translations along the horizontal
 0609:             detector axis in pixels.
 0610:         sw_y (float) : Search window size in pixels along the vertical detector
 0611:             axis.
 0612:         sw_x (float) : Search window size in pixels along the horizontal detector
 0613:             axis.
 0614:         grid_size (int) :  Grid size along one of the detector axes. The grid
 0615:             shape is then (grid_size, grid_size).
 0616:         ds_y (float) : Sampling interval of reference image in pixels along the
 0617:             vertical axis.
 0618:         ds_x (float) : Sampling interval of reference image in pixels along the
 0619:             horizontal axis.
 0620:         sigma (float) : The standard deviation of `I_n`.
 0621:         loss (str) : Choose between the following loss functions:
 0622: 
 0623:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 0624:             * 'Huber' : Huber loss function (k = 1.345)
 0625:             * 'L1' : L1 norm loss function.
 0626:             * 'L2' : L2 norm loss function.
 0627: 
 0628:         num_threads (int) : Number of threads.
 0629: 
 0630:     Returns:
 0631:         Tuple[numpy.ndarray, numpy.ndarray] : A tuple of two elements ('u', 'derr').
 0632:         The elements are the following:
 0633: 
 0634:         * 'u' : Updated pixel mapping array.
 0635:         * 'derr' : Error decrease for each pixel in the detector grid.
 0636: 
 0637:     Notes:
 0638:         The error metric as a function of pixel mapping displacements
 0639:         is given by:
 0640: 
 0641:         .. math::
 0642: 
 0643:             \varepsilon_{pm}[i, j, i^{\prime}, j^{\prime}] = \frac{1}{N}
 0644:             \sum_{n = 0}^N f\left( \frac{I[n, i, j] - W[i, j]
 0645:             I_{ref}[u[0, i, j] + i^{\prime} - di[n],
 0646:             u[1, i, j] + j^{\prime} - dj[n]]}{\sigma} \right)
 0647: 
 0648:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.
 0649:     """
+0650:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0651:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 651, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 651, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 651, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 651, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 651, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 651, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 651, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 651, __pyx_L1_error)
 0652: 
+0653:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 0654: 
+0655:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 655, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 655, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 655, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 655, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0656:     cdef int Y = I_n.shape[1], X = I_n.shape[2], j, k
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 0657: 
+0658:     cdef np.npy_intp *u_shape = [2, Y, X]
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
+0659:     cdef np.ndarray u = np.PyArray_SimpleNew(3, u_shape, type_num)
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 659, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 659, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 659, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 659, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 659, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 659, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 659, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 659, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+0660:     cdef np.ndarray derr = np.PyArray_ZEROS(2, u_shape + 1, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 660, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 660, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 660, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 660, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 660, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 660, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 660, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 660, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+0661:     cdef float_t[:, :, ::1] _u = u
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 661, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 661, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 661, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 661, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+0662:     cdef float_t[:, ::1] _derr = derr
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 662, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 662, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 662, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 662, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 0663: 
+0664:     for k in prange(X, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+0665:         for j in range(Y):
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
/* … */
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
/* … */
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
/* … */
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
+0666:             _u[0, j, k] = u0[0, j, k]; _u[1, j, k] = u0[1, j, k]
                              __pyx_t_14 = 0;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_16 = __pyx_v_k;
                              __pyx_t_17 = 0;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_19 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                              __pyx_t_16 = 1;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_14 = __pyx_v_k;
                              __pyx_t_19 = 1;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_17 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                              __pyx_t_14 = 0;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_16 = __pyx_v_k;
                              __pyx_t_17 = 0;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_19 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                              __pyx_t_16 = 1;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_14 = __pyx_v_k;
                              __pyx_t_19 = 1;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_17 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                              __pyx_t_14 = 0;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_16 = __pyx_v_k;
                              __pyx_t_17 = 0;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_19 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                              __pyx_t_16 = 1;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_14 = __pyx_v_k;
                              __pyx_t_19 = 1;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_17 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                              __pyx_t_14 = 0;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_16 = __pyx_v_k;
                              __pyx_t_17 = 0;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_19 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                              __pyx_t_16 = 1;
                              __pyx_t_15 = __pyx_v_j;
                              __pyx_t_14 = __pyx_v_k;
                              __pyx_t_19 = 1;
                              __pyx_t_18 = __pyx_v_j;
                              __pyx_t_17 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
+0667:             if W[j, k] > 0.0:
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
+0668:                 pm_gsearcher(I_n, W, I0, _u, _derr, di, dj, j, k, sw_y, sw_x,
                                __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_pm_gsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
 0669:                              grid_size, ds_y, ds_x, sigma, f)
 0670: 
+0671:     return u, derr
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 0672: 
+0673: cdef void pm_rsearcher(uint_t[:, :, ::1] I_n, float_t[:, ::1] W, float_t[:, ::1] I0, gsl_rng *r, float_t[:, :, ::1] u,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_N, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_err_min;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  CYTHON_UNUSED int __pyx_v_ii;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_N, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_err_min;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  CYTHON_UNUSED int __pyx_v_ii;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_N, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_err_min;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  CYTHON_UNUSED int __pyx_v_ii;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_N, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err;
  double __pyx_v_err0;
  double __pyx_v_err_min;
  double __pyx_v_uy_min;
  double __pyx_v_ux_min;
  double __pyx_v_ux;
  double __pyx_v_uy;
  CYTHON_UNUSED int __pyx_v_ii;
/* … */
  /* function exit code */
}
 0674:                        float_t[:, ::1] derrs, float_t[::1] di, float_t[::1] dj, int j, int k, double sw_y, double sw_x,
 0675:                        unsigned N, double ds_y, double ds_x, double sigma, loss_func f) nogil:
+0676:     cdef double err, err0, err_min=FLOAT_MAX, uy_min = 0.0, ux_min = 0.0, ux, uy
  __pyx_v_err_min = 1.7976931348623157e+308;
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
/* … */
  __pyx_v_err_min = 1.7976931348623157e+308;
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
/* … */
  __pyx_v_err_min = 1.7976931348623157e+308;
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
/* … */
  __pyx_v_err_min = 1.7976931348623157e+308;
  __pyx_v_uy_min = 0.0;
  __pyx_v_ux_min = 0.0;
 0677:     cdef int ii
 0678: 
+0679:     err0 = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k],
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0680:                       u[1, j, k], ds_y, ds_x, sigma, f)
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
 0681: 
+0682:     for ii in range(<int>N):
  __pyx_t_9 = ((int)__pyx_v_N);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_N);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_N);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_N);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
+0683:         uy = 2.0 * sw_y * (gsl_rng_uniform(r) - 0.5)
    __pyx_v_uy = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    __pyx_v_uy = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    __pyx_v_uy = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    __pyx_v_uy = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
+0684:         ux = 2.0 * sw_x * (gsl_rng_uniform(r) - 0.5)
    __pyx_v_ux = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    __pyx_v_ux = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    __pyx_v_ux = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    __pyx_v_ux = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
 0685: 
+0686:         err = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k] + uy,
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    __pyx_v_err = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    __pyx_v_err = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    __pyx_v_err = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    __pyx_v_err = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + __pyx_v_uy), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + __pyx_v_ux), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0687:                          u[1, j, k] + ux, ds_y, ds_x, sigma, f)
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
/* … */
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
/* … */
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
/* … */
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
+0688:         if err < err_min:
    __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
/* … */
    __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
/* … */
    __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
/* … */
    __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
+0689:             uy_min = uy; ux_min = ux; err_min = err
      __pyx_v_uy_min = __pyx_v_uy;
      __pyx_v_ux_min = __pyx_v_ux;
      __pyx_v_err_min = __pyx_v_err;
/* … */
      __pyx_v_uy_min = __pyx_v_uy;
      __pyx_v_ux_min = __pyx_v_ux;
      __pyx_v_err_min = __pyx_v_err;
/* … */
      __pyx_v_uy_min = __pyx_v_uy;
      __pyx_v_ux_min = __pyx_v_ux;
      __pyx_v_err_min = __pyx_v_err;
/* … */
      __pyx_v_uy_min = __pyx_v_uy;
      __pyx_v_ux_min = __pyx_v_ux;
      __pyx_v_err_min = __pyx_v_err;
 0690: 
+0691:     u[0, j, k] += uy_min; u[1, j, k] += ux_min
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
/* … */
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
/* … */
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
/* … */
  __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_3 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_1 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_3)) )) += __pyx_v_uy_min;
  __pyx_t_3 = 1;
  __pyx_t_2 = __pyx_v_j;
  __pyx_t_1 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) )) += __pyx_v_ux_min;
+0692:     derrs[j, k] = err0 - err_min if err_min < err0 else 0.0
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_13 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_13 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_13;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_13 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_13 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_13;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_13 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_13 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_13;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_13 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_13 = 0.0;
  }
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_1 * __pyx_v_derrs.strides[0]) )) + __pyx_t_2)) )) = __pyx_t_13;
 0693: 
+0694: def pm_rsearch(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_7pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_6pm_rsearch[] = "Update the pixel mapping by minimizing mean-squared-error (MSE).\n    Perform a random search within the search window of `sw_y`, `sw_x` size\n    along the vertical and fast axes accordingly in order to minimize the MSE\n    at each point of the detector grid separately.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Initial sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray) : Initial sample's translations along the horizontal\n            detector axis in pixels.\n        sw_y (float) : Search window size in pixels along the vertical detector\n            axis.\n        sw_x (float) : Search window size in pixels along the horizontal detector\n            axis.\n        n_trials (int) : Number of points generated at each pixel of the detector grid.\n        seed (int) : Specify seed for the random number generation.\n        ds_y (float) : Sampling interval of reference image in pixels along the\n            vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along the\n            horizontal axis.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str) : Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n\n        num_threads (int) : Number of threads.\n\n    Returns:\n        Tuple[numpy.ndarray, numpy.ndarray] : A tuple of two elements ('u', 'derr').\n        The elements are the following:\n\n        * 'u' : Updated pixel mapping array.\n        * 'derr' : E""rror decrease for each pixel in the detector grid.\n\n    Notes:\n        The error metric as a function of pixel mapping displacements\n        is given by:\n\n        .. math::\n\n            \\varepsilon_{pm}[i, j, i^{\\prime}, j^{\\prime}] = \\frac{1}{N}\n            \\sum_{n = 0}^N f\\left( \\frac{I[n, i, j] - W[i, j]\n            I_{ref}[u[0, i, j] + i^{\\prime} - di[n],\n            u[1, i, j] + j^{\\prime} - dj[n]]}{\\sigma} \\right)\n\n        where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_7pm_rsearch = {"pm_rsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_7pm_rsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_6pm_rsearch};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_7pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 694, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 694, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 694, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_6pm_rsearch(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_6pm_rsearch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_rsearch", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_13);
    __Pyx_GIVEREF(__pyx_int_13);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_13);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_13);
    __Pyx_GIVEREF(__pyx_int_13);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_13);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 694, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 694, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 694, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 694, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_184__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_53pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_53pm_rsearch = {"__pyx_fuse_0_0pm_rsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_53pm_rsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_6pm_rsearch};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_53pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_n_trials;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_rsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_n_trials,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults28 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_self);
    values[13] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 1); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 2); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 3); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 4); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 5); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 6); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 7); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_trials)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 8); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 9); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 10); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 11); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 12); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[13] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[14] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_rsearch") < 0)) __PYX_ERR(0, 694, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_n_trials = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_n_trials == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[9]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[13]);
    if (values[14]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[14]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 697, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 694, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 697, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_52pm_rsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_52pm_rsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_n_trials, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0pm_rsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_186__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_55pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_55pm_rsearch = {"__pyx_fuse_0_1pm_rsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_55pm_rsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_6pm_rsearch};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_55pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_n_trials;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_rsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_n_trials,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults29 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_self);
    values[13] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 1); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 2); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 3); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 4); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 5); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 6); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 7); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_trials)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 8); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 9); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 10); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 11); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 12); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[13] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[14] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_rsearch") < 0)) __PYX_ERR(0, 694, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_n_trials = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_n_trials == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[9]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[13]);
    if (values[14]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[14]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 697, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 694, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 697, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_54pm_rsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_54pm_rsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_n_trials, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1pm_rsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_188__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_57pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_57pm_rsearch = {"__pyx_fuse_1_0pm_rsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_57pm_rsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_6pm_rsearch};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_57pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_n_trials;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_rsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_n_trials,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults30 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_self);
    values[13] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 1); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 2); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 3); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 4); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 5); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 6); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 7); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_trials)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 8); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 9); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 10); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 11); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 12); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[13] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[14] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_rsearch") < 0)) __PYX_ERR(0, 694, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_n_trials = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_n_trials == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[9]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[13]);
    if (values[14]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[14]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 697, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 694, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 697, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_56pm_rsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_56pm_rsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_n_trials, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0pm_rsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_190__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_59pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_59pm_rsearch = {"__pyx_fuse_1_1pm_rsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_59pm_rsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_6pm_rsearch};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_59pm_rsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_n_trials;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_rsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_n_trials,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults31 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_self);
    values[13] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 1); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 2); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 3); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 4); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 5); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 6); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 7); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_trials)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 8); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 9); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 10); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 11); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, 12); __PYX_ERR(0, 694, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[13] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[14] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_rsearch") < 0)) __PYX_ERR(0, 694, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 694, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 695, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_n_trials = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_n_trials == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[9]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 696, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[13]);
    if (values[14]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[14]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 697, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_rsearch", 0, 13, 15, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 694, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 694, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 695, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 697, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_58pm_rsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_58pm_rsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_n_trials, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1pm_rsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_rsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_tuple__39 = PyTuple_Pack(29, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u0, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_sw_y, __pyx_n_s_sw_x, __pyx_n_s_n_trials, __pyx_n_s_seed, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_u_shape, __pyx_n_s_u, __pyx_n_s_derr, __pyx_n_s_u_2, __pyx_n_s_derr_2, __pyx_n_s_r_master, __pyx_n_s_thread_seed, __pyx_n_s_r); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_53pm_rsearch, 0, __pyx_n_s_pm_rsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults28), 1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults28, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_2);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_184__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint64_t_float64_t, __pyx_t_1) < 0) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_55pm_rsearch, 0, __pyx_n_s_pm_rsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults29), 1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults29, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_2);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_186__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint64_t_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_57pm_rsearch, 0, __pyx_n_s_pm_rsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults30), 1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults30, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_2);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_188__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint32_t_float64_t, __pyx_t_1) < 0) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_59pm_rsearch, 0, __pyx_n_s_pm_rsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults31), 1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults31, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_2);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_190__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint32_t_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_7pm_rsearch, 0, __pyx_n_s_pm_rsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__40)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_2);
  ((__pyx_FusedFunctionObject *) __pyx_t_1)->__signatures__ = __pyx_t_4;
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pm_rsearch, __pyx_t_1) < 0) __PYX_ERR(0, 694, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(15, 0, 29, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_pm_rsearch, 694, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 694, __pyx_L1_error)
 0695:                float_t[:, :, ::1] u0 not None, float_t[::1] di not None, float_t[::1] dj not None,
 0696:                double sw_y, double sw_x, unsigned n_trials, unsigned long seed, double ds_y, double ds_x, double sigma,
+0697:                str loss='Huber', unsigned num_threads=1):
  __pyx_t_4 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
 0698:     r"""Update the pixel mapping by minimizing mean-squared-error (MSE).
 0699:     Perform a random search within the search window of `sw_y`, `sw_x` size
 0700:     along the vertical and fast axes accordingly in order to minimize the MSE
 0701:     at each point of the detector grid separately.
 0702: 
 0703:     Args:
 0704:         I_n (numpy.ndarray) : Measured intensity frames.
 0705:         W (numpy.ndarray) : Measured frames' whitefield.
 0706:         I0 (numpy.ndarray) : Reference image of the sample.
 0707:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 0708:             plane to the reference image.
 0709:         di (numpy.ndarray) : Initial sample's translations along the vertical
 0710:             detector axis in pixels.
 0711:         dj (numpy.ndarray) : Initial sample's translations along the horizontal
 0712:             detector axis in pixels.
 0713:         sw_y (float) : Search window size in pixels along the vertical detector
 0714:             axis.
 0715:         sw_x (float) : Search window size in pixels along the horizontal detector
 0716:             axis.
 0717:         n_trials (int) : Number of points generated at each pixel of the detector grid.
 0718:         seed (int) : Specify seed for the random number generation.
 0719:         ds_y (float) : Sampling interval of reference image in pixels along the
 0720:             vertical axis.
 0721:         ds_x (float) : Sampling interval of reference image in pixels along the
 0722:             horizontal axis.
 0723:         sigma (float) : The standard deviation of `I_n`.
 0724:         loss (str) : Choose between the following loss functions:
 0725: 
 0726:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 0727:             * 'Huber' : Huber loss function (k = 1.345)
 0728:             * 'L1' : L1 norm loss function.
 0729:             * 'L2' : L2 norm loss function.
 0730: 
 0731:         num_threads (int) : Number of threads.
 0732: 
 0733:     Returns:
 0734:         Tuple[numpy.ndarray, numpy.ndarray] : A tuple of two elements ('u', 'derr').
 0735:         The elements are the following:
 0736: 
 0737:         * 'u' : Updated pixel mapping array.
 0738:         * 'derr' : Error decrease for each pixel in the detector grid.
 0739: 
 0740:     Notes:
 0741:         The error metric as a function of pixel mapping displacements
 0742:         is given by:
 0743: 
 0744:         .. math::
 0745: 
 0746:             \varepsilon_{pm}[i, j, i^{\prime}, j^{\prime}] = \frac{1}{N}
 0747:             \sum_{n = 0}^N f\left( \frac{I[n, i, j] - W[i, j]
 0748:             I_{ref}[u[0, i, j] + i^{\prime} - di[n],
 0749:             u[1, i, j] + j^{\prime} - dj[n]]}{\sigma} \right)
 0750: 
 0751:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.
 0752:     """
+0753:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0754:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 754, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 754, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 754, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 754, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 754, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 754, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 754, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 754, __pyx_L1_error)
 0755: 
+0756:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 0757: 
+0758:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 758, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 758, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 758, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 758, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0759:     cdef int Y = I_n.shape[1], X = I_n.shape[2], j, k
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 0760: 
+0761:     cdef np.npy_intp *u_shape = [2, Y, X]
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
+0762:     cdef np.ndarray u = np.PyArray_SimpleNew(3, u_shape, type_num)
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 762, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 762, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 762, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 762, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 762, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 762, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 762, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 762, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+0763:     cdef np.ndarray derr = np.PyArray_ZEROS(2, u_shape + 1, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 763, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 763, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 763, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 763, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 763, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 763, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 763, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 763, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+0764:     cdef float_t[:, :, ::1] _u = u
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 764, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 764, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 764, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 764, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+0765:     cdef float_t[:, ::1] _derr = derr
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 765, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 765, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 765, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 765, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 0766: 
+0767:     cdef gsl_rng *r_master = gsl_rng_alloc(gsl_rng_mt19937)
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
+0768:     gsl_rng_set(r_master, seed)
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
/* … */
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
/* … */
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
/* … */
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
 0769:     cdef unsigned long thread_seed
 0770:     cdef gsl_rng *r
 0771: 
+0772:     with nogil, parallel(num_threads=num_threads):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+0773:         r = gsl_rng_alloc(gsl_rng_mt19937)
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
+0774:         thread_seed = gsl_rng_get(r_master)
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
/* … */
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
/* … */
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
/* … */
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
+0775:         gsl_rng_set(r, thread_seed)
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
/* … */
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
/* … */
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
/* … */
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
 0776: 
+0777:         for k in prange(X, schedule='guided'):
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
/* … */
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
/* … */
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
/* … */
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
+0778:             for j in range(Y):
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
/* … */
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
/* … */
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
/* … */
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
+0779:                 _u[0, j, k] = u0[0, j, k]; _u[1, j, k] = u0[1, j, k]
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
+0780:                 if W[j, k] > 0.0:
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
/* … */
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
/* … */
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
/* … */
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
+0781:                     pm_rsearcher(I_n, W, I0, r, _u, _derr, di, dj, j, k, sw_y, sw_x,
                                    __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                    __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                    __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                    __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_pm_rsearcher(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_n_trials, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
 0782:                                  n_trials, ds_y, ds_x, sigma, f)
 0783: 
+0784:         gsl_rng_free(r)
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 0785: 
+0786:     gsl_rng_free(r_master)
  gsl_rng_free(__pyx_v_r_master);
/* … */
  gsl_rng_free(__pyx_v_r_master);
/* … */
  gsl_rng_free(__pyx_v_r_master);
/* … */
  gsl_rng_free(__pyx_v_r_master);
 0787: 
+0788:     return u, derr
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 788, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 788, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 788, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 788, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 0789: 
+0790: cdef void pm_devolver(uint_t[:, :, ::1] I_n, float_t[:, ::1] W, float_t[:, ::1] I0, gsl_rng *r, float_t[:, :, ::1] u,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_NP, unsigned int __pyx_v_n_iter, double __pyx_v_CR, double __pyx_v_F, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err0;
  double __pyx_v_err;
  double __pyx_v_err_min;
  int __pyx_v_ii;
  int __pyx_v_jj;
  CYTHON_UNUSED int __pyx_v_n;
  int __pyx_v_a;
  int __pyx_v_b;
  double __pyx_v_u_min[2];
  double __pyx_v_sw[2];
  double *__pyx_v_pop;
  double *__pyx_v_cost;
  double *__pyx_v_new_pop;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_NP, unsigned int __pyx_v_n_iter, double __pyx_v_CR, double __pyx_v_F, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err0;
  double __pyx_v_err;
  double __pyx_v_err_min;
  int __pyx_v_ii;
  int __pyx_v_jj;
  CYTHON_UNUSED int __pyx_v_n;
  int __pyx_v_a;
  int __pyx_v_b;
  double __pyx_v_u_min[2];
  double __pyx_v_sw[2];
  double *__pyx_v_pop;
  double *__pyx_v_cost;
  double *__pyx_v_new_pop;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_NP, unsigned int __pyx_v_n_iter, double __pyx_v_CR, double __pyx_v_F, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err0;
  double __pyx_v_err;
  double __pyx_v_err_min;
  int __pyx_v_ii;
  int __pyx_v_jj;
  CYTHON_UNUSED int __pyx_v_n;
  int __pyx_v_a;
  int __pyx_v_b;
  double __pyx_v_u_min[2];
  double __pyx_v_sw[2];
  double *__pyx_v_pop;
  double *__pyx_v_cost;
  double *__pyx_v_new_pop;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, gsl_rng *__pyx_v_r, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_derrs, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, int __pyx_v_j, int __pyx_v_k, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_NP, unsigned int __pyx_v_n_iter, double __pyx_v_CR, double __pyx_v_F, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_err0;
  double __pyx_v_err;
  double __pyx_v_err_min;
  int __pyx_v_ii;
  int __pyx_v_jj;
  CYTHON_UNUSED int __pyx_v_n;
  int __pyx_v_a;
  int __pyx_v_b;
  double __pyx_v_u_min[2];
  double __pyx_v_sw[2];
  double *__pyx_v_pop;
  double *__pyx_v_cost;
  double *__pyx_v_new_pop;
/* … */
  /* function exit code */
}
 0791:                       float_t[:, ::1] derrs, float_t[::1] di, float_t[::1] dj, int j, int k, double sw_y, double sw_x,
 0792:                       unsigned NP, unsigned n_iter, double CR, double F, double ds_y, double ds_x, double sigma, loss_func f) nogil:
+0793:     cdef double err0, err, err_min = FLOAT_MAX
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_err_min = 1.7976931348623157e+308;
 0794:     cdef int ii, jj, n, a, b
 0795:     cdef double u_min[2]
 0796:     cdef double sw[2]
+0797:     cdef double *pop = <double *>malloc(2 * NP * sizeof(double))
  __pyx_v_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
/* … */
  __pyx_v_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
/* … */
  __pyx_v_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
/* … */
  __pyx_v_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
+0798:     cdef double *cost = <double *>malloc(NP * sizeof(double))
  __pyx_v_cost = ((double *)malloc((__pyx_v_NP * (sizeof(double)))));
/* … */
  __pyx_v_cost = ((double *)malloc((__pyx_v_NP * (sizeof(double)))));
/* … */
  __pyx_v_cost = ((double *)malloc((__pyx_v_NP * (sizeof(double)))));
/* … */
  __pyx_v_cost = ((double *)malloc((__pyx_v_NP * (sizeof(double)))));
+0799:     cdef double *new_pop = <double *>malloc(2 * NP * sizeof(double))
  __pyx_v_new_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
/* … */
  __pyx_v_new_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
/* … */
  __pyx_v_new_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
/* … */
  __pyx_v_new_pop = ((double *)malloc(((2 * __pyx_v_NP) * (sizeof(double)))));
 0800: 
+0801:     sw[0] = sw_y; sw[1] = sw_x
  (__pyx_v_sw[0]) = __pyx_v_sw_y;
  (__pyx_v_sw[1]) = __pyx_v_sw_x;
/* … */
  (__pyx_v_sw[0]) = __pyx_v_sw_y;
  (__pyx_v_sw[1]) = __pyx_v_sw_x;
/* … */
  (__pyx_v_sw[0]) = __pyx_v_sw_y;
  (__pyx_v_sw[1]) = __pyx_v_sw_x;
/* … */
  (__pyx_v_sw[0]) = __pyx_v_sw_y;
  (__pyx_v_sw[1]) = __pyx_v_sw_x;
+0802:     err0 = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k],
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
  __pyx_t_1 = __pyx_v_j;
  __pyx_t_2 = __pyx_v_k;
  __pyx_t_3 = 0;
  __pyx_t_4 = __pyx_v_j;
  __pyx_t_5 = __pyx_v_k;
/* … */
  __pyx_v_err0 = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0803:                       u[1, j, k], ds_y, ds_x, sigma, f)
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
/* … */
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
 0804: 
+0805:     for ii in range(<int>NP):
  __pyx_t_9 = ((int)__pyx_v_NP);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_NP);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_NP);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_NP);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_ii = __pyx_t_11;
+0806:         pop[2 * ii] = 2.0 * sw_y * (gsl_rng_uniform(r) - 0.5)
    (__pyx_v_pop[(2 * __pyx_v_ii)]) = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    (__pyx_v_pop[(2 * __pyx_v_ii)]) = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    (__pyx_v_pop[(2 * __pyx_v_ii)]) = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    (__pyx_v_pop[(2 * __pyx_v_ii)]) = ((2.0 * __pyx_v_sw_y) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
+0807:         pop[2 * ii + 1] = 2.0 * sw_x * (gsl_rng_uniform(r) - 0.5)
    (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]) = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]) = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]) = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
/* … */
    (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]) = ((2.0 * __pyx_v_sw_x) * (gsl_rng_uniform(__pyx_v_r) - 0.5));
 0808: 
+0809:         cost[ii] = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k] + pop[2 * ii],
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    (__pyx_v_cost[__pyx_v_ii]) = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + (__pyx_v_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + (__pyx_v_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    (__pyx_v_cost[__pyx_v_ii]) = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + (__pyx_v_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + (__pyx_v_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    (__pyx_v_cost[__pyx_v_ii]) = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + (__pyx_v_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + (__pyx_v_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
    __pyx_t_8 = __pyx_v_j;
    __pyx_t_7 = __pyx_v_k;
    __pyx_t_6 = 0;
    __pyx_t_5 = __pyx_v_j;
    __pyx_t_4 = __pyx_v_k;
/* … */
    (__pyx_v_cost[__pyx_v_ii]) = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_8 * __pyx_v_W.strides[0]) )) + __pyx_t_7)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_5 * __pyx_v_u.strides[1]) )) + __pyx_t_4)) ))) + (__pyx_v_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_2 * __pyx_v_u.strides[1]) )) + __pyx_t_1)) ))) + (__pyx_v_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0810:                              u[1, j, k] + pop[2 * ii + 1], ds_y, ds_x, sigma, f)
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
/* … */
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
/* … */
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
/* … */
    __pyx_t_3 = 1;
    __pyx_t_2 = __pyx_v_j;
    __pyx_t_1 = __pyx_v_k;
 0811: 
+0812:         if cost[ii] < err_min:
    __pyx_t_12 = (((__pyx_v_cost[__pyx_v_ii]) < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
/* … */
    __pyx_t_12 = (((__pyx_v_cost[__pyx_v_ii]) < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
/* … */
    __pyx_t_12 = (((__pyx_v_cost[__pyx_v_ii]) < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
/* … */
    __pyx_t_12 = (((__pyx_v_cost[__pyx_v_ii]) < __pyx_v_err_min) != 0);
    if (__pyx_t_12) {
/* … */
    }
  }
+0813:             u_min[0] = pop[2 * ii]; u_min[1] = pop[2 * ii + 1]; err_min = cost[ii]
      (__pyx_v_u_min[0]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
      (__pyx_v_u_min[1]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      __pyx_v_err_min = (__pyx_v_cost[__pyx_v_ii]);
/* … */
      (__pyx_v_u_min[0]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
      (__pyx_v_u_min[1]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      __pyx_v_err_min = (__pyx_v_cost[__pyx_v_ii]);
/* … */
      (__pyx_v_u_min[0]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
      (__pyx_v_u_min[1]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      __pyx_v_err_min = (__pyx_v_cost[__pyx_v_ii]);
/* … */
      (__pyx_v_u_min[0]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
      (__pyx_v_u_min[1]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      __pyx_v_err_min = (__pyx_v_cost[__pyx_v_ii]);
 0814: 
+0815:     for n in range(<int>n_iter):
  __pyx_t_9 = ((int)__pyx_v_n_iter);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_n = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_n_iter);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_n = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_n_iter);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_n = __pyx_t_11;
/* … */
  __pyx_t_9 = ((int)__pyx_v_n_iter);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_n = __pyx_t_11;
+0816:         for ii in range(<int>NP):
    __pyx_t_13 = ((int)__pyx_v_NP);
    __pyx_t_14 = __pyx_t_13;
    for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
      __pyx_v_ii = __pyx_t_15;
/* … */
    __pyx_t_13 = ((int)__pyx_v_NP);
    __pyx_t_14 = __pyx_t_13;
    for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
      __pyx_v_ii = __pyx_t_15;
/* … */
    __pyx_t_13 = ((int)__pyx_v_NP);
    __pyx_t_14 = __pyx_t_13;
    for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
      __pyx_v_ii = __pyx_t_15;
/* … */
    __pyx_t_13 = ((int)__pyx_v_NP);
    __pyx_t_14 = __pyx_t_13;
    for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
      __pyx_v_ii = __pyx_t_15;
+0817:             a = gsl_rng_uniform_int(r, NP)
      __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
/* … */
      __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
/* … */
      __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
/* … */
      __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
+0818:             while a == ii:
      while (1) {
        __pyx_t_12 = ((__pyx_v_a == __pyx_v_ii) != 0);
        if (!__pyx_t_12) break;
/* … */
      while (1) {
        __pyx_t_12 = ((__pyx_v_a == __pyx_v_ii) != 0);
        if (!__pyx_t_12) break;
/* … */
      while (1) {
        __pyx_t_12 = ((__pyx_v_a == __pyx_v_ii) != 0);
        if (!__pyx_t_12) break;
/* … */
      while (1) {
        __pyx_t_12 = ((__pyx_v_a == __pyx_v_ii) != 0);
        if (!__pyx_t_12) break;
+0819:                 a = gsl_rng_uniform_int(r, NP)
        __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
/* … */
        __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
/* … */
        __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
/* … */
        __pyx_v_a = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
 0820: 
+0821:             b = gsl_rng_uniform_int(r, NP)
      __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
/* … */
      __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
/* … */
      __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
/* … */
      __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
+0822:             while b == ii or b == a:
      while (1) {
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_ii) != 0);
        if (!__pyx_t_16) {
        } else {
          __pyx_t_12 = __pyx_t_16;
          goto __pyx_L14_bool_binop_done;
        }
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_a) != 0);
        __pyx_t_12 = __pyx_t_16;
        __pyx_L14_bool_binop_done:;
        if (!__pyx_t_12) break;
/* … */
      while (1) {
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_ii) != 0);
        if (!__pyx_t_16) {
        } else {
          __pyx_t_12 = __pyx_t_16;
          goto __pyx_L14_bool_binop_done;
        }
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_a) != 0);
        __pyx_t_12 = __pyx_t_16;
        __pyx_L14_bool_binop_done:;
        if (!__pyx_t_12) break;
/* … */
      while (1) {
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_ii) != 0);
        if (!__pyx_t_16) {
        } else {
          __pyx_t_12 = __pyx_t_16;
          goto __pyx_L14_bool_binop_done;
        }
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_a) != 0);
        __pyx_t_12 = __pyx_t_16;
        __pyx_L14_bool_binop_done:;
        if (!__pyx_t_12) break;
/* … */
      while (1) {
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_ii) != 0);
        if (!__pyx_t_16) {
        } else {
          __pyx_t_12 = __pyx_t_16;
          goto __pyx_L14_bool_binop_done;
        }
        __pyx_t_16 = ((__pyx_v_b == __pyx_v_a) != 0);
        __pyx_t_12 = __pyx_t_16;
        __pyx_L14_bool_binop_done:;
        if (!__pyx_t_12) break;
+0823:                 b = gsl_rng_uniform_int(r, NP)
        __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
/* … */
        __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
/* … */
        __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
/* … */
        __pyx_v_b = gsl_rng_uniform_int(__pyx_v_r, __pyx_v_NP);
      }
 0824: 
+0825:             jj = gsl_rng_uniform_int(r, 2)
      __pyx_v_jj = gsl_rng_uniform_int(__pyx_v_r, 2);
/* … */
      __pyx_v_jj = gsl_rng_uniform_int(__pyx_v_r, 2);
/* … */
      __pyx_v_jj = gsl_rng_uniform_int(__pyx_v_r, 2);
/* … */
      __pyx_v_jj = gsl_rng_uniform_int(__pyx_v_r, 2);
+0826:             if gsl_rng_uniform(r) < CR:
      __pyx_t_12 = ((gsl_rng_uniform(__pyx_v_r) < __pyx_v_CR) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L16;
      }
/* … */
      __pyx_t_12 = ((gsl_rng_uniform(__pyx_v_r) < __pyx_v_CR) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L16;
      }
/* … */
      __pyx_t_12 = ((gsl_rng_uniform(__pyx_v_r) < __pyx_v_CR) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L16;
      }
/* … */
      __pyx_t_12 = ((gsl_rng_uniform(__pyx_v_r) < __pyx_v_CR) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L16;
      }
+0827:                 new_pop[2 * ii + jj] = u_min[jj] + F * (pop[2 * a + jj] - pop[2 * b + jj])
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
/* … */
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
/* … */
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
/* … */
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
+0828:                 if new_pop[2 * ii + jj] > sw[jj]: new_pop[2 * ii + jj] = sw[jj]
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
        }
/* … */
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
        }
/* … */
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
        }
/* … */
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
        }
+0829:                 if new_pop[2 * ii + jj] < -sw[jj]: new_pop[2 * ii + jj] = -sw[jj]
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
        }
/* … */
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
        }
/* … */
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
        }
/* … */
        __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
        if (__pyx_t_12) {
          (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
        }
 0830:             else:
+0831:                 new_pop[2 * ii + jj] = pop[2 * ii + jj]
      /*else*/ {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]);
      }
      __pyx_L16:;
/* … */
      /*else*/ {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]);
      }
      __pyx_L16:;
/* … */
      /*else*/ {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]);
      }
      __pyx_L16:;
/* … */
      /*else*/ {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]);
      }
      __pyx_L16:;
+0832:             jj = (jj + 1) % 2
      __pyx_v_jj = ((__pyx_v_jj + 1) % 2);
/* … */
      __pyx_v_jj = ((__pyx_v_jj + 1) % 2);
/* … */
      __pyx_v_jj = ((__pyx_v_jj + 1) % 2);
/* … */
      __pyx_v_jj = ((__pyx_v_jj + 1) % 2);
+0833:             new_pop[2 * ii + jj] = u_min[jj] + F * (pop[2 * a + jj] - pop[2 * b + jj])
      (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
/* … */
      (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
/* … */
      (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
/* … */
      (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = ((__pyx_v_u_min[__pyx_v_jj]) + (__pyx_v_F * ((__pyx_v_pop[((2 * __pyx_v_a) + __pyx_v_jj)]) - (__pyx_v_pop[((2 * __pyx_v_b) + __pyx_v_jj)]))));
+0834:             if new_pop[2 * ii + jj] > sw[jj]: new_pop[2 * ii + jj] = sw[jj]
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
      }
/* … */
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
      }
/* … */
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
      }
/* … */
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) > (__pyx_v_sw[__pyx_v_jj])) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (__pyx_v_sw[__pyx_v_jj]);
      }
+0835:             if new_pop[2 * ii + jj] < -sw[jj]: new_pop[2 * ii + jj] = -sw[jj]
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
      }
/* … */
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
      }
/* … */
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
      }
/* … */
      __pyx_t_12 = (((__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) < (-(__pyx_v_sw[__pyx_v_jj]))) != 0);
      if (__pyx_t_12) {
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + __pyx_v_jj)]) = (-(__pyx_v_sw[__pyx_v_jj]));
      }
 0836: 
+0837:             err = FVU_interp(I_n, W[j, k], I0, di, dj, j, k, u[0, j, k] + new_pop[2 * ii],
      __pyx_t_1 = __pyx_v_j;
      __pyx_t_2 = __pyx_v_k;
      __pyx_t_3 = 0;
      __pyx_t_4 = __pyx_v_j;
      __pyx_t_5 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))) + (__pyx_v_new_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))) + (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_t_1 = __pyx_v_j;
      __pyx_t_2 = __pyx_v_k;
      __pyx_t_3 = 0;
      __pyx_t_4 = __pyx_v_j;
      __pyx_t_5 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))) + (__pyx_v_new_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))) + (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_t_1 = __pyx_v_j;
      __pyx_t_2 = __pyx_v_k;
      __pyx_t_3 = 0;
      __pyx_t_4 = __pyx_v_j;
      __pyx_t_5 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))) + (__pyx_v_new_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))) + (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_t_1 = __pyx_v_j;
      __pyx_t_2 = __pyx_v_k;
      __pyx_t_3 = 0;
      __pyx_t_4 = __pyx_v_j;
      __pyx_t_5 = __pyx_v_k;
/* … */
      __pyx_v_err = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_1 * __pyx_v_W.strides[0]) )) + __pyx_t_2)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_3 * __pyx_v_u.strides[0]) ) + __pyx_t_4 * __pyx_v_u.strides[1]) )) + __pyx_t_5)) ))) + (__pyx_v_new_pop[(2 * __pyx_v_ii)])), ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) ))) + (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)])), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+0838:                              u[1, j, k] + new_pop[2 * ii + 1], ds_y, ds_x, sigma, f)
      __pyx_t_6 = 1;
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
/* … */
      __pyx_t_6 = 1;
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
/* … */
      __pyx_t_6 = 1;
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
/* … */
      __pyx_t_6 = 1;
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_8 = __pyx_v_k;
 0839: 
+0840:             if err < cost[ii]:
      __pyx_t_12 = ((__pyx_v_err < (__pyx_v_cost[__pyx_v_ii])) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L21;
      }
/* … */
      __pyx_t_12 = ((__pyx_v_err < (__pyx_v_cost[__pyx_v_ii])) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L21;
      }
/* … */
      __pyx_t_12 = ((__pyx_v_err < (__pyx_v_cost[__pyx_v_ii])) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L21;
      }
/* … */
      __pyx_t_12 = ((__pyx_v_err < (__pyx_v_cost[__pyx_v_ii])) != 0);
      if (__pyx_t_12) {
/* … */
        goto __pyx_L21;
      }
+0841:                 cost[ii] = err
        (__pyx_v_cost[__pyx_v_ii]) = __pyx_v_err;
/* … */
        (__pyx_v_cost[__pyx_v_ii]) = __pyx_v_err;
/* … */
        (__pyx_v_cost[__pyx_v_ii]) = __pyx_v_err;
/* … */
        (__pyx_v_cost[__pyx_v_ii]) = __pyx_v_err;
+0842:                 if err < err_min:
        __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
        if (__pyx_t_12) {
/* … */
        }
/* … */
        __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
        if (__pyx_t_12) {
/* … */
        }
/* … */
        __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
        if (__pyx_t_12) {
/* … */
        }
/* … */
        __pyx_t_12 = ((__pyx_v_err < __pyx_v_err_min) != 0);
        if (__pyx_t_12) {
/* … */
        }
+0843:                     u_min[0] = new_pop[2 * ii]; u_min[1] = new_pop[2 * ii + 1]; err_min = err
          (__pyx_v_u_min[0]) = (__pyx_v_new_pop[(2 * __pyx_v_ii)]);
          (__pyx_v_u_min[1]) = (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]);
          __pyx_v_err_min = __pyx_v_err;
/* … */
          (__pyx_v_u_min[0]) = (__pyx_v_new_pop[(2 * __pyx_v_ii)]);
          (__pyx_v_u_min[1]) = (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]);
          __pyx_v_err_min = __pyx_v_err;
/* … */
          (__pyx_v_u_min[0]) = (__pyx_v_new_pop[(2 * __pyx_v_ii)]);
          (__pyx_v_u_min[1]) = (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]);
          __pyx_v_err_min = __pyx_v_err;
/* … */
          (__pyx_v_u_min[0]) = (__pyx_v_new_pop[(2 * __pyx_v_ii)]);
          (__pyx_v_u_min[1]) = (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]);
          __pyx_v_err_min = __pyx_v_err;
 0844:             else:
+0845:                 new_pop[2 * ii] = pop[2 * ii]; new_pop[2 * ii + 1] = pop[2 * ii + 1]
      /*else*/ {
        (__pyx_v_new_pop[(2 * __pyx_v_ii)]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      }
      __pyx_L21:;
    }
/* … */
      /*else*/ {
        (__pyx_v_new_pop[(2 * __pyx_v_ii)]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      }
      __pyx_L21:;
    }
/* … */
      /*else*/ {
        (__pyx_v_new_pop[(2 * __pyx_v_ii)]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      }
      __pyx_L21:;
    }
/* … */
      /*else*/ {
        (__pyx_v_new_pop[(2 * __pyx_v_ii)]) = (__pyx_v_pop[(2 * __pyx_v_ii)]);
        (__pyx_v_new_pop[((2 * __pyx_v_ii) + 1)]) = (__pyx_v_pop[((2 * __pyx_v_ii) + 1)]);
      }
      __pyx_L21:;
    }
 0846: 
+0847:         for ii in range(2 * <int>NP):
    __pyx_t_17 = (2 * ((int)__pyx_v_NP));
    __pyx_t_18 = __pyx_t_17;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_18; __pyx_t_13+=1) {
      __pyx_v_ii = __pyx_t_13;
/* … */
    __pyx_t_17 = (2 * ((int)__pyx_v_NP));
    __pyx_t_18 = __pyx_t_17;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_18; __pyx_t_13+=1) {
      __pyx_v_ii = __pyx_t_13;
/* … */
    __pyx_t_17 = (2 * ((int)__pyx_v_NP));
    __pyx_t_18 = __pyx_t_17;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_18; __pyx_t_13+=1) {
      __pyx_v_ii = __pyx_t_13;
/* … */
    __pyx_t_17 = (2 * ((int)__pyx_v_NP));
    __pyx_t_18 = __pyx_t_17;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_18; __pyx_t_13+=1) {
      __pyx_v_ii = __pyx_t_13;
+0848:             pop[ii] = new_pop[ii]
      (__pyx_v_pop[__pyx_v_ii]) = (__pyx_v_new_pop[__pyx_v_ii]);
    }
  }
/* … */
      (__pyx_v_pop[__pyx_v_ii]) = (__pyx_v_new_pop[__pyx_v_ii]);
    }
  }
/* … */
      (__pyx_v_pop[__pyx_v_ii]) = (__pyx_v_new_pop[__pyx_v_ii]);
    }
  }
/* … */
      (__pyx_v_pop[__pyx_v_ii]) = (__pyx_v_new_pop[__pyx_v_ii]);
    }
  }
 0849: 
+0850:     free(pop); free(new_pop); free(cost)
  free(__pyx_v_pop);
  free(__pyx_v_new_pop);
  free(__pyx_v_cost);
/* … */
  free(__pyx_v_pop);
  free(__pyx_v_new_pop);
  free(__pyx_v_cost);
/* … */
  free(__pyx_v_pop);
  free(__pyx_v_new_pop);
  free(__pyx_v_cost);
/* … */
  free(__pyx_v_pop);
  free(__pyx_v_new_pop);
  free(__pyx_v_cost);
 0851: 
+0852:     u[0, j, k] += u_min[0]; u[1, j, k] += u_min[1]
  __pyx_t_8 = 0;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_6 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )) += (__pyx_v_u_min[0]);
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) )) += (__pyx_v_u_min[1]);
/* … */
  __pyx_t_8 = 0;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_6 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )) += (__pyx_v_u_min[0]);
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) )) += (__pyx_v_u_min[1]);
/* … */
  __pyx_t_8 = 0;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_6 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )) += (__pyx_v_u_min[0]);
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) )) += (__pyx_v_u_min[1]);
/* … */
  __pyx_t_8 = 0;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_6 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_8 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_6)) )) += (__pyx_v_u_min[0]);
  __pyx_t_6 = 1;
  __pyx_t_7 = __pyx_v_j;
  __pyx_t_8 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_6 * __pyx_v_u.strides[0]) ) + __pyx_t_7 * __pyx_v_u.strides[1]) )) + __pyx_t_8)) )) += (__pyx_v_u_min[1]);
+0853:     derrs[j, k] = err0 - err_min if err_min < err0 else 0.0
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_19 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_19 = 0.0;
  }
  __pyx_t_8 = __pyx_v_j;
  __pyx_t_7 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_8 * __pyx_v_derrs.strides[0]) )) + __pyx_t_7)) )) = __pyx_t_19;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_19 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_19 = 0.0;
  }
  __pyx_t_8 = __pyx_v_j;
  __pyx_t_7 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_8 * __pyx_v_derrs.strides[0]) )) + __pyx_t_7)) )) = __pyx_t_19;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_19 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_19 = 0.0;
  }
  __pyx_t_8 = __pyx_v_j;
  __pyx_t_7 = __pyx_v_k;
  *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_8 * __pyx_v_derrs.strides[0]) )) + __pyx_t_7)) )) = __pyx_t_19;
/* … */
  if (((__pyx_v_err_min < __pyx_v_err0) != 0)) {
    __pyx_t_19 = (__pyx_v_err0 - __pyx_v_err_min);
  } else {
    __pyx_t_19 = 0.0;
  }
  __pyx_t_8 = __pyx_v_j;
  __pyx_t_7 = __pyx_v_k;
  *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_derrs.data + __pyx_t_8 * __pyx_v_derrs.strides[0]) )) + __pyx_t_7)) )) = __pyx_t_19;
 0854: 
+0855: def pm_devolution(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_9pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_8pm_devolution[] = "Update the pixel mapping by minimizing mean-squared-error (MSE). Perform\n    a differential evolution within the search window of `sw_y`, `sw_x` size along\n    the vertical and fast axes accordingly in order to minimize the MSE at each\n    point of the detector grid separately.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Initial sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray) : Initial sample's translations along the horizontal\n            detector axis in pixels.\n        sw_y (float) : Search window size in pixels along the vertical detector\n            axis.\n        sw_x (float) : Search window size in pixels along the horizontal detector\n            axis.\n        pop_size (int) : The total population size. Must be greater or equal to 4.\n        n_iter (int) : The maximum number of generations over which the entire\n            population is evolved.\n        seed (int) : Specify seed for the random number generation.\n        ds_y (float) : Sampling interval of reference image in pixels along the\n            vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along the\n            horizontal axis.\n        sigma (float) : The standard deviation of `I_n`.\n        F (float) : The mutation constant. In the literature this is also known as\n            differential weight. If specified as a float it should be in the\n            range [0, 2].\n        CR (float) : The recombination constant, should be in the range [0, 1]. In\n            the literature this is also known as the crossover probability.\n        loss (str) : Choose between the following loss functions:\n""\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n\n        num_threads (int) : Number of threads.\n\n    Returns:\n        Tuple[numpy.ndarray, numpy.ndarray] : A tuple of two elements ('u', 'derr').\n        The elements are the following:\n\n        * 'u' : Updated pixel mapping array.\n        * 'derr' : Error decrease for each pixel in the detector grid.\n\n    Notes:\n        The error metric as a function of pixel mapping displacements\n        is given by:\n\n        .. math::\n\n            \\varepsilon_{pm}[i, j, i^{\\prime}, j^{\\prime}] = \\frac{1}{N}\n            \\sum_{n = 0}^N f\\left( \\frac{I[n, i, j] - W[i, j]\n            I_{ref}[u[0, i, j] + i^{\\prime} - di[n],\n            u[1, i, j] + j^{\\prime} - dj[n]]}{\\sigma} \\right)\n\n        where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_9pm_devolution = {"pm_devolution", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_9pm_devolution, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_8pm_devolution};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_9pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 855, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 855, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 855, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_8pm_devolution(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_8pm_devolution(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_devolution", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_14);
    __Pyx_GIVEREF(__pyx_int_14);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_14);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_14);
    __Pyx_GIVEREF(__pyx_int_14);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_14);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 855, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 855, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 855, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 855, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 855, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_200__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self)->__pyx_arg_F); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self)->__pyx_arg_CR); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_4, 2, __Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_3, 1, Py_None);
  __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_63pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_63pm_devolution = {"__pyx_fuse_0_0pm_devolution", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_63pm_devolution, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_8pm_devolution};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_63pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_pop_size;
  unsigned int __pyx_v_n_iter;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  double __pyx_v_F;
  double __pyx_v_CR;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_devolution (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_pop_size,&__pyx_n_s_n_iter,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_F,&__pyx_n_s_CR,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults36 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_self);
    values[16] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 1); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 2); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 3); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 4); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 5); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 6); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 7); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pop_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 8); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_iter)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 9); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 10); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 11); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 12); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (likely((values[13] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 13); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_F);
          if (value) { values[14] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 15:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_CR);
          if (value) { values[15] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 16:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[16] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 17:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[17] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_devolution") < 0)) __PYX_ERR(0, 855, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_pop_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_pop_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_n_iter = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_n_iter == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[10]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    if (values[14]) {
      __pyx_v_F = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_F == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_F = __pyx_dynamic_args->__pyx_arg_F;
    }
    if (values[15]) {
      __pyx_v_CR = __pyx_PyFloat_AsDouble(values[15]); if (unlikely((__pyx_v_CR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_CR = __pyx_dynamic_args->__pyx_arg_CR;
    }
    __pyx_v_loss = ((PyObject*)values[16]);
    if (values[17]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[17]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 859, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 855, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 858, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_62pm_devolution(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_F, __pyx_v_CR, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_62pm_devolution(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_pop_size, unsigned int __pyx_v_n_iter, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, double __pyx_v_F, double __pyx_v_CR, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0pm_devolution", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_202__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self)->__pyx_arg_F); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self)->__pyx_arg_CR); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_4, 2, __Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_3, 1, Py_None);
  __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_65pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_65pm_devolution = {"__pyx_fuse_0_1pm_devolution", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_65pm_devolution, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_8pm_devolution};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_65pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_pop_size;
  unsigned int __pyx_v_n_iter;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  double __pyx_v_F;
  double __pyx_v_CR;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_devolution (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_pop_size,&__pyx_n_s_n_iter,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_F,&__pyx_n_s_CR,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults37 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_self);
    values[16] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 1); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 2); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 3); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 4); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 5); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 6); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 7); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pop_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 8); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_iter)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 9); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 10); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 11); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 12); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (likely((values[13] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 13); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_F);
          if (value) { values[14] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 15:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_CR);
          if (value) { values[15] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 16:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[16] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 17:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[17] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_devolution") < 0)) __PYX_ERR(0, 855, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_pop_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_pop_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_n_iter = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_n_iter == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[10]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    if (values[14]) {
      __pyx_v_F = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_F == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_F = __pyx_dynamic_args->__pyx_arg_F;
    }
    if (values[15]) {
      __pyx_v_CR = __pyx_PyFloat_AsDouble(values[15]); if (unlikely((__pyx_v_CR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_CR = __pyx_dynamic_args->__pyx_arg_CR;
    }
    __pyx_v_loss = ((PyObject*)values[16]);
    if (values[17]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[17]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 859, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 855, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 858, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_64pm_devolution(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_F, __pyx_v_CR, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_64pm_devolution(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_pop_size, unsigned int __pyx_v_n_iter, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, double __pyx_v_F, double __pyx_v_CR, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1pm_devolution", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_204__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self)->__pyx_arg_F); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self)->__pyx_arg_CR); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_4, 2, __Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_3, 1, Py_None);
  __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_67pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_67pm_devolution = {"__pyx_fuse_1_0pm_devolution", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_67pm_devolution, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_8pm_devolution};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_67pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_pop_size;
  unsigned int __pyx_v_n_iter;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  double __pyx_v_F;
  double __pyx_v_CR;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_devolution (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_pop_size,&__pyx_n_s_n_iter,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_F,&__pyx_n_s_CR,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults38 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_self);
    values[16] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 1); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 2); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 3); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 4); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 5); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 6); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 7); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pop_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 8); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_iter)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 9); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 10); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 11); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 12); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (likely((values[13] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 13); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_F);
          if (value) { values[14] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 15:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_CR);
          if (value) { values[15] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 16:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[16] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 17:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[17] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_devolution") < 0)) __PYX_ERR(0, 855, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_pop_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_pop_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_n_iter = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_n_iter == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[10]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    if (values[14]) {
      __pyx_v_F = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_F == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_F = __pyx_dynamic_args->__pyx_arg_F;
    }
    if (values[15]) {
      __pyx_v_CR = __pyx_PyFloat_AsDouble(values[15]); if (unlikely((__pyx_v_CR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_CR = __pyx_dynamic_args->__pyx_arg_CR;
    }
    __pyx_v_loss = ((PyObject*)values[16]);
    if (values[17]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[17]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 859, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 855, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 858, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_66pm_devolution(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_F, __pyx_v_CR, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_66pm_devolution(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_pop_size, unsigned int __pyx_v_n_iter, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, double __pyx_v_F, double __pyx_v_CR, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0pm_devolution", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_206__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self)->__pyx_arg_F); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyFloat_FromDouble(__Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self)->__pyx_arg_CR); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_4, 2, __Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_3, 1, Py_None);
  __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_69pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_69pm_devolution = {"__pyx_fuse_1_1pm_devolution", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_69pm_devolution, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_8pm_devolution};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_69pm_devolution(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_pop_size;
  unsigned int __pyx_v_n_iter;
  unsigned long __pyx_v_seed;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  double __pyx_v_F;
  double __pyx_v_CR;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_devolution (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u0,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_pop_size,&__pyx_n_s_n_iter,&__pyx_n_s_seed,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_F,&__pyx_n_s_CR,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults39 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_self);
    values[16] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 1); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 2); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 3); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 4); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 5); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 6); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 7); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pop_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 8); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n_iter)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 9); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_seed)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 10); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 11); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 12); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (likely((values[13] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, 13); __PYX_ERR(0, 855, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 14:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_F);
          if (value) { values[14] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 15:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_CR);
          if (value) { values[15] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 16:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[16] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 17:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[17] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_devolution") < 0)) __PYX_ERR(0, 855, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
        CYTHON_FALLTHROUGH;
        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
        CYTHON_FALLTHROUGH;
        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
        CYTHON_FALLTHROUGH;
        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
        CYTHON_FALLTHROUGH;
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 855, __pyx_L3_error)
    __pyx_v_u0 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u0.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_pop_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_pop_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_n_iter = __Pyx_PyInt_As_unsigned_int(values[9]); if (unlikely((__pyx_v_n_iter == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_long(values[10]); if (unlikely((__pyx_v_seed == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[12]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    if (values[14]) {
      __pyx_v_F = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_F == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_F = __pyx_dynamic_args->__pyx_arg_F;
    }
    if (values[15]) {
      __pyx_v_CR = __pyx_PyFloat_AsDouble(values[15]); if (unlikely((__pyx_v_CR == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 858, __pyx_L3_error)
    } else {
      __pyx_v_CR = __pyx_dynamic_args->__pyx_arg_CR;
    }
    __pyx_v_loss = ((PyObject*)values[16]);
    if (values[17]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[17]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 859, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_devolution", 0, 14, 18, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 855, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 855, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u0"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 856, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 858, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_68pm_devolution(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u0, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_seed, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_F, __pyx_v_CR, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_68pm_devolution(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u0, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_pop_size, unsigned int __pyx_v_n_iter, unsigned long __pyx_v_seed, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, double __pyx_v_F, double __pyx_v_CR, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_u_shape;
  PyArrayObject *__pyx_v_u = 0;
  PyArrayObject *__pyx_v_derr = 0;
  __Pyx_memviewslice __pyx_v__u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v__derr = { 0, 0, { 0 }, { 0 }, { 0 } };
  gsl_rng *__pyx_v_r_master;
  unsigned long __pyx_v_thread_seed;
  gsl_rng *__pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1pm_devolution", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_devolution", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_u);
  __Pyx_XDECREF((PyObject *)__pyx_v_derr);
  __PYX_XDEC_MEMVIEW(&__pyx_v__u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v__derr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
  __pyx_t_4 = 0;
/* … */
  __pyx_tuple__41 = PyTuple_Pack(32, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u0, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_sw_y, __pyx_n_s_sw_x, __pyx_n_s_pop_size, __pyx_n_s_n_iter, __pyx_n_s_seed, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_sigma, __pyx_n_s_F, __pyx_n_s_CR, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_u_shape, __pyx_n_s_u, __pyx_n_s_derr, __pyx_n_s_u_2, __pyx_n_s_derr_2, __pyx_n_s_r_master, __pyx_n_s_thread_seed, __pyx_n_s_r); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__41);
  __Pyx_GIVEREF(__pyx_tuple__41);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_63pm_devolution, 0, __pyx_n_s_pm_devolution, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults36), 1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_t_1)->__pyx_arg_F = 0.75;
  __Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_t_1)->__pyx_arg_CR = 0.7;
  __Pyx_CyFunction_Defaults(__pyx_defaults36, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_200__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint64_t_float64_t, __pyx_t_1) < 0) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_65pm_devolution, 0, __pyx_n_s_pm_devolution, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults37), 1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_t_1)->__pyx_arg_F = 0.75;
  __Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_t_1)->__pyx_arg_CR = 0.7;
  __Pyx_CyFunction_Defaults(__pyx_defaults37, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_202__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint64_t_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_67pm_devolution, 0, __pyx_n_s_pm_devolution, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults38), 1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_t_1)->__pyx_arg_F = 0.75;
  __Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_t_1)->__pyx_arg_CR = 0.7;
  __Pyx_CyFunction_Defaults(__pyx_defaults38, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_204__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint32_t_float64_t, __pyx_t_1) < 0) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_69pm_devolution, 0, __pyx_n_s_pm_devolution, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults39), 1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_t_1)->__pyx_arg_F = 0.75;
  __Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_t_1)->__pyx_arg_CR = 0.7;
  __Pyx_CyFunction_Defaults(__pyx_defaults39, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_206__defaults__);
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint32_t_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_9pm_devolution, 0, __pyx_n_s_pm_devolution, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  ((__pyx_FusedFunctionObject *) __pyx_t_1)->__signatures__ = __pyx_t_4;
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pm_devolution, __pyx_t_1) < 0) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(18, 0, 32, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_pm_devolution, 855, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 855, __pyx_L1_error)
 0856:                   float_t[:, :, ::1] u0 not None, float_t[::1] di not None, float_t[::1] dj not None,
 0857:                   double sw_y, double sw_x, unsigned pop_size, unsigned n_iter, unsigned long seed,
+0858:                   double ds_y, double ds_x, double sigma, double F=0.75, double CR=0.7, str loss='Huber',
  __pyx_t_2 = PyFloat_FromDouble(0.75); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 858, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyFloat_FromDouble(0.7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 858, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
+0859:                   unsigned num_threads=1):
  __pyx_t_4 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 859, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
 0860:     r"""Update the pixel mapping by minimizing mean-squared-error (MSE). Perform
 0861:     a differential evolution within the search window of `sw_y`, `sw_x` size along
 0862:     the vertical and fast axes accordingly in order to minimize the MSE at each
 0863:     point of the detector grid separately.
 0864: 
 0865:     Args:
 0866:         I_n (numpy.ndarray) : Measured intensity frames.
 0867:         W (numpy.ndarray) : Measured frames' whitefield.
 0868:         I0 (numpy.ndarray) : Reference image of the sample.
 0869:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 0870:             plane to the reference image.
 0871:         di (numpy.ndarray) : Initial sample's translations along the vertical
 0872:             detector axis in pixels.
 0873:         dj (numpy.ndarray) : Initial sample's translations along the horizontal
 0874:             detector axis in pixels.
 0875:         sw_y (float) : Search window size in pixels along the vertical detector
 0876:             axis.
 0877:         sw_x (float) : Search window size in pixels along the horizontal detector
 0878:             axis.
 0879:         pop_size (int) : The total population size. Must be greater or equal to 4.
 0880:         n_iter (int) : The maximum number of generations over which the entire
 0881:             population is evolved.
 0882:         seed (int) : Specify seed for the random number generation.
 0883:         ds_y (float) : Sampling interval of reference image in pixels along the
 0884:             vertical axis.
 0885:         ds_x (float) : Sampling interval of reference image in pixels along the
 0886:             horizontal axis.
 0887:         sigma (float) : The standard deviation of `I_n`.
 0888:         F (float) : The mutation constant. In the literature this is also known as
 0889:             differential weight. If specified as a float it should be in the
 0890:             range [0, 2].
 0891:         CR (float) : The recombination constant, should be in the range [0, 1]. In
 0892:             the literature this is also known as the crossover probability.
 0893:         loss (str) : Choose between the following loss functions:
 0894: 
 0895:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 0896:             * 'Huber' : Huber loss function (k = 1.345)
 0897:             * 'L1' : L1 norm loss function.
 0898:             * 'L2' : L2 norm loss function.
 0899: 
 0900:         num_threads (int) : Number of threads.
 0901: 
 0902:     Returns:
 0903:         Tuple[numpy.ndarray, numpy.ndarray] : A tuple of two elements ('u', 'derr').
 0904:         The elements are the following:
 0905: 
 0906:         * 'u' : Updated pixel mapping array.
 0907:         * 'derr' : Error decrease for each pixel in the detector grid.
 0908: 
 0909:     Notes:
 0910:         The error metric as a function of pixel mapping displacements
 0911:         is given by:
 0912: 
 0913:         .. math::
 0914: 
 0915:             \varepsilon_{pm}[i, j, i^{\prime}, j^{\prime}] = \frac{1}{N}
 0916:             \sum_{n = 0}^N f\left( \frac{I[n, i, j] - W[i, j]
 0917:             I_{ref}[u[0, i, j] + i^{\prime} - di[n],
 0918:             u[1, i, j] + j^{\prime} - dj[n]]}{\sigma} \right)
 0919: 
 0920:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.
 0921:     """
+0922:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0923:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 923, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 923, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 923, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 923, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 923, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 923, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 923, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 923, __pyx_L1_error)
+0924:     if pop_size < 4:
  __pyx_t_1 = ((__pyx_v_pop_size < 4) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_1 = ((__pyx_v_pop_size < 4) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_1 = ((__pyx_v_pop_size < 4) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_1 = ((__pyx_v_pop_size < 4) != 0);
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0925:         raise ValueError('Population size must be greater or equal to 4.')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 925, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 925, __pyx_L1_error)
/* … */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_Population_size_must_be_greater); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 925, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 925, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 925, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 925, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 925, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 925, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 925, __pyx_L1_error)
+0926:     if F < 0.0 or F > 2.0:
  __pyx_t_2 = ((__pyx_v_F < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L8_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_F > 2.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L8_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_F < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L8_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_F > 2.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L8_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_F < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L8_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_F > 2.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L8_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_F < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L8_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_F > 2.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L8_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0927:         raise ValueError('The mutation constant F must be in the interval [0.0, 2.0].')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 927, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 927, __pyx_L1_error)
/* … */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_The_mutation_constant_F_must_be); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 927, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 927, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 927, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 927, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 927, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 927, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 927, __pyx_L1_error)
+0928:     if CR < 0.0 or CR > 1.0:
  __pyx_t_2 = ((__pyx_v_CR < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_CR > 1.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L11_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_CR < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_CR > 1.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L11_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_CR < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_CR > 1.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L11_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_CR < 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_CR > 1.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L11_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+0929:         raise ValueError('The recombination constant CR must be in the interval [0.0, 1.0].')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 929, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 929, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 929, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 929, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 929, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 929, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 929, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 929, __pyx_L1_error)
/* … */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_The_recombination_constant_CR_mu); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 929, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
 0930: 
+0931:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 0932: 
+0933:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 933, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 933, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 933, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 933, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0934:     cdef int Y = I_n.shape[1], X = I_n.shape[2], j, k
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 0935: 
+0936:     cdef np.npy_intp *u_shape = [2, Y, X]
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = 2;
  __pyx_t_5[1] = __pyx_v_Y;
  __pyx_t_5[2] = __pyx_v_X;
  __pyx_v_u_shape = __pyx_t_5;
+0937:     cdef np.ndarray u = np.PyArray_SimpleNew(3, u_shape, type_num)
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 937, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 937, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 937, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 937, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 937, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 937, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(3, __pyx_v_u_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 937, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 937, __pyx_L1_error)
  __pyx_v_u = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+0938:     cdef np.ndarray derr = np.PyArray_ZEROS(2, u_shape + 1, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 938, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 938, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 938, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_ZEROS(2, (__pyx_v_u_shape + 1), __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 938, __pyx_L1_error)
  __pyx_v_derr = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+0939:     cdef float_t[:, :, ::1] _u = u
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 939, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 939, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 939, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_u), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 939, __pyx_L1_error)
  __pyx_v__u = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+0940:     cdef float_t[:, ::1] _derr = derr
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 940, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 940, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 940, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
/* … */
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_derr), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 940, __pyx_L1_error)
  __pyx_v__derr = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 0941: 
+0942:     cdef gsl_rng *r_master = gsl_rng_alloc(gsl_rng_mt19937)
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
  __pyx_v_r_master = gsl_rng_alloc(gsl_rng_mt19937);
+0943:     gsl_rng_set(r_master, seed)
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
/* … */
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
/* … */
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
/* … */
  gsl_rng_set(__pyx_v_r_master, __pyx_v_seed);
 0944:     cdef unsigned long thread_seed
 0945:     cdef gsl_rng *r
 0946: 
+0947:     with nogil, parallel(num_threads=num_threads):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L15;
        }
        __pyx_L15:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L15;
        }
        __pyx_L15:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L15;
        }
        __pyx_L15:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed)        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            #ifdef _OPENMP
            #pragma omp parallel private(__pyx_v_r, __pyx_v_thread_seed) num_threads(__pyx_v_num_threads)
            #endif /* _OPENMP */
            {
                /* Initialize private variables to invalid values */
                __pyx_v_r = ((gsl_rng *)1);
                __pyx_v_thread_seed = ((unsigned long)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L15;
        }
        __pyx_L15:;
      }
  }
+0948:         r = gsl_rng_alloc(gsl_rng_mt19937)
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
/* … */
                __pyx_v_r = gsl_rng_alloc(gsl_rng_mt19937);
+0949:         thread_seed = gsl_rng_get(r_master)
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
/* … */
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
/* … */
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
/* … */
                __pyx_v_thread_seed = gsl_rng_get(__pyx_v_r_master);
+0950:         gsl_rng_set(r, thread_seed)
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
/* … */
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
/* … */
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
/* … */
                gsl_rng_set(__pyx_v_r, __pyx_v_thread_seed);
 0951: 
+0952:         for k in prange(X, schedule='guided'):
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
/* … */
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
/* … */
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
/* … */
                __pyx_t_8 = __pyx_v_X;
                if ((1 == 0)) abort();
                {
                    __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
                    if (__pyx_t_10 > 0)
                    {
                        #ifdef _OPENMP
                        #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)
                        #endif /* _OPENMP */
                        for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                            {
                                __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                                /* Initialize private variables to invalid values */
                                __pyx_v_j = ((int)0xbad0bad0);
+0953:             for j in range(Y):
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
/* … */
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
/* … */
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
/* … */
                                __pyx_t_11 = __pyx_v_Y;
                                __pyx_t_12 = __pyx_t_11;
                                for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                                  __pyx_v_j = __pyx_t_13;
+0954:                 _u[0, j, k] = u0[0, j, k]; _u[1, j, k] = u0[1, j, k]
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
/* … */
                                  __pyx_t_14 = 0;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_16 = __pyx_v_k;
                                  __pyx_t_17 = 0;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_19 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_17 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_14 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_16)) )));
                                  __pyx_t_16 = 1;
                                  __pyx_t_15 = __pyx_v_j;
                                  __pyx_t_14 = __pyx_v_k;
                                  __pyx_t_19 = 1;
                                  __pyx_t_18 = __pyx_v_j;
                                  __pyx_t_17 = __pyx_v_k;
                                  *((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v__u.data + __pyx_t_19 * __pyx_v__u.strides[0]) ) + __pyx_t_18 * __pyx_v__u.strides[1]) )) + __pyx_t_17)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u0.data + __pyx_t_16 * __pyx_v_u0.strides[0]) ) + __pyx_t_15 * __pyx_v_u0.strides[1]) )) + __pyx_t_14)) )));
+0955:                 if W[j, k] > 0.0:
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
/* … */
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
/* … */
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
/* … */
                                  __pyx_t_14 = __pyx_v_j;
                                  __pyx_t_15 = __pyx_v_k;
                                  __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                                  if (__pyx_t_1) {
/* … */
                                  }
                                }
                            }
                        }
                    }
                }
+0956:                     pm_devolver(I_n, W, I0, r, _u, _derr, di, dj, j, k, sw_y, sw_x,
                                    __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_CR, __pyx_v_F, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                    __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_CR, __pyx_v_F, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                    __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_CR, __pyx_v_F, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                    __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_pm_devolver(__pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_r, __pyx_v__u, __pyx_v__derr, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_pop_size, __pyx_v_n_iter, __pyx_v_CR, __pyx_v_F, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
 0957:                                 pop_size, n_iter, CR, F, ds_y, ds_x, sigma, f)
 0958: 
+0959:         gsl_rng_free(r)
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                gsl_rng_free(__pyx_v_r);
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 0960: 
+0961:     gsl_rng_free(r_master)
  gsl_rng_free(__pyx_v_r_master);
/* … */
  gsl_rng_free(__pyx_v_r_master);
/* … */
  gsl_rng_free(__pyx_v_r_master);
/* … */
  gsl_rng_free(__pyx_v_r_master);
 0962: 
+0963:     return u, derr
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_u));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_u));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_u));
  __Pyx_INCREF(((PyObject *)__pyx_v_derr));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_derr));
  PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_derr));
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 0964: 
+0965: cdef void tr_updater(float_t[:, ::1] errors, uint_t[:, ::1] I_n, float_t[:, ::1] W, float_t[:, ::1] I0,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t *__pyx_v_di, __pyx_t_5numpy_float64_t *__pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_di_min;
  double __pyx_v_dj_min;
  double __pyx_v_err_min;
  double __pyx_v_dii;
  double __pyx_v_djj;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
  double __pyx_v_err;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t *__pyx_v_di, __pyx_t_5numpy_float64_t *__pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_di_min;
  double __pyx_v_dj_min;
  double __pyx_v_err_min;
  double __pyx_v_dii;
  double __pyx_v_djj;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
  double __pyx_v_err;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t *__pyx_v_di, __pyx_t_5numpy_float32_t *__pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_di_min;
  double __pyx_v_dj_min;
  double __pyx_v_err_min;
  double __pyx_v_dii;
  double __pyx_v_djj;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
  double __pyx_v_err;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t *__pyx_v_di, __pyx_t_5numpy_float32_t *__pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_wsize, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  double __pyx_v_di_min;
  double __pyx_v_dj_min;
  double __pyx_v_err_min;
  double __pyx_v_dii;
  double __pyx_v_djj;
  double __pyx_v_dsw_y;
  double __pyx_v_dsw_x;
  int __pyx_v_ii;
  int __pyx_v_jj;
  double __pyx_v_err;
/* … */
  /* function exit code */
}
 0966:                      float_t[:, :, ::1] u, float_t *di, float_t *dj, double sw_y, double sw_x,
 0967:                      unsigned wsize, double ds_y, double ds_x, double sigma, loss_func f) nogil:
+0968:     cdef double di_min = 0.0, dj_min = 0.0, err_min=FLOAT_MAX, dii, djj
  __pyx_v_di_min = 0.0;
  __pyx_v_dj_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_di_min = 0.0;
  __pyx_v_dj_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_di_min = 0.0;
  __pyx_v_dj_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
/* … */
  __pyx_v_di_min = 0.0;
  __pyx_v_dj_min = 0.0;
  __pyx_v_err_min = 1.7976931348623157e+308;
+0969:     cdef double dsw_y = 2.0 * sw_y / (wsize - 1), dsw_x = 2.0 * sw_x / (wsize - 1)
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
/* … */
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
/* … */
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
/* … */
  __pyx_v_dsw_y = ((2.0 * __pyx_v_sw_y) / ((double)(__pyx_v_wsize - 1)));
  __pyx_v_dsw_x = ((2.0 * __pyx_v_sw_x) / ((double)(__pyx_v_wsize - 1)));
 0970:     cdef int ii, jj
 0971: 
+0972:     for ii in range(<int>wsize if dsw_y > 0.0 else 1):
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_1 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_1 = 1;
  }
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ii = __pyx_t_3;
/* … */
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_1 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_1 = 1;
  }
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ii = __pyx_t_3;
/* … */
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_1 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_1 = 1;
  }
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ii = __pyx_t_3;
/* … */
  if (((__pyx_v_dsw_y > 0.0) != 0)) {
    __pyx_t_1 = ((int)__pyx_v_wsize);
  } else {
    __pyx_t_1 = 1;
  }
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_ii = __pyx_t_3;
+0973:         dii = dsw_y * (ii - 0.5 * (wsize - 1))
    __pyx_v_dii = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
/* … */
    __pyx_v_dii = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
/* … */
    __pyx_v_dii = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
/* … */
    __pyx_v_dii = (__pyx_v_dsw_y * (__pyx_v_ii - (0.5 * (__pyx_v_wsize - 1))));
+0974:         for jj in range(<int>wsize if dsw_x > 0.0 else 1):
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_4 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_4 = 1;
    }
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_jj = __pyx_t_6;
/* … */
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_4 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_4 = 1;
    }
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_jj = __pyx_t_6;
/* … */
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_4 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_4 = 1;
    }
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_jj = __pyx_t_6;
/* … */
    if (((__pyx_v_dsw_x > 0.0) != 0)) {
      __pyx_t_4 = ((int)__pyx_v_wsize);
    } else {
      __pyx_t_4 = 1;
    }
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_jj = __pyx_t_6;
+0975:             djj = dsw_x * (jj - 0.5 * (wsize - 1))
      __pyx_v_djj = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
/* … */
      __pyx_v_djj = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
/* … */
      __pyx_v_djj = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
/* … */
      __pyx_v_djj = (__pyx_v_dsw_x * (__pyx_v_jj - (0.5 * (__pyx_v_wsize - 1))));
+0976:             err = FVU_interp_tr(errors, I_n, W, I0, u, di[0], dj[0],
      __pyx_v_err = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__pyx_v_errors, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (__pyx_v_di[0]), (__pyx_v_dj[0]), ((__pyx_v_di[0]) + __pyx_v_dii), ((__pyx_v_dj[0]) + __pyx_v_djj), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_v_err = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__pyx_v_errors, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (__pyx_v_di[0]), (__pyx_v_dj[0]), ((__pyx_v_di[0]) + __pyx_v_dii), ((__pyx_v_dj[0]) + __pyx_v_djj), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_v_err = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__pyx_v_errors, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (__pyx_v_di[0]), (__pyx_v_dj[0]), ((__pyx_v_di[0]) + __pyx_v_dii), ((__pyx_v_dj[0]) + __pyx_v_djj), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
      __pyx_v_err = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp_tr(__pyx_v_errors, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (__pyx_v_di[0]), (__pyx_v_dj[0]), ((__pyx_v_di[0]) + __pyx_v_dii), ((__pyx_v_dj[0]) + __pyx_v_djj), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
 0977:                                 di[0] + dii, dj[0] + djj, ds_y, ds_x, sigma, f)
 0978: 
+0979:             if err < err_min:
      __pyx_t_7 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_7) {
/* … */
      }
    }
  }
/* … */
      __pyx_t_7 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_7) {
/* … */
      }
    }
  }
/* … */
      __pyx_t_7 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_7) {
/* … */
      }
    }
  }
/* … */
      __pyx_t_7 = ((__pyx_v_err < __pyx_v_err_min) != 0);
      if (__pyx_t_7) {
/* … */
      }
    }
  }
+0980:                 di_min = dii; dj_min = djj; err_min = err
        __pyx_v_di_min = __pyx_v_dii;
        __pyx_v_dj_min = __pyx_v_djj;
        __pyx_v_err_min = __pyx_v_err;
/* … */
        __pyx_v_di_min = __pyx_v_dii;
        __pyx_v_dj_min = __pyx_v_djj;
        __pyx_v_err_min = __pyx_v_err;
/* … */
        __pyx_v_di_min = __pyx_v_dii;
        __pyx_v_dj_min = __pyx_v_djj;
        __pyx_v_err_min = __pyx_v_err;
/* … */
        __pyx_v_di_min = __pyx_v_dii;
        __pyx_v_dj_min = __pyx_v_djj;
        __pyx_v_err_min = __pyx_v_err;
 0981: 
+0982:     di[0] += di_min; dj[0] += dj_min
  __pyx_t_1 = 0;
  (__pyx_v_di[__pyx_t_1]) = ((__pyx_v_di[__pyx_t_1]) + __pyx_v_di_min);
  __pyx_t_1 = 0;
  (__pyx_v_dj[__pyx_t_1]) = ((__pyx_v_dj[__pyx_t_1]) + __pyx_v_dj_min);
/* … */
  __pyx_t_1 = 0;
  (__pyx_v_di[__pyx_t_1]) = ((__pyx_v_di[__pyx_t_1]) + __pyx_v_di_min);
  __pyx_t_1 = 0;
  (__pyx_v_dj[__pyx_t_1]) = ((__pyx_v_dj[__pyx_t_1]) + __pyx_v_dj_min);
/* … */
  __pyx_t_1 = 0;
  (__pyx_v_di[__pyx_t_1]) = ((__pyx_v_di[__pyx_t_1]) + __pyx_v_di_min);
  __pyx_t_1 = 0;
  (__pyx_v_dj[__pyx_t_1]) = ((__pyx_v_dj[__pyx_t_1]) + __pyx_v_dj_min);
/* … */
  __pyx_t_1 = 0;
  (__pyx_v_di[__pyx_t_1]) = ((__pyx_v_di[__pyx_t_1]) + __pyx_v_di_min);
  __pyx_t_1 = 0;
  (__pyx_v_dj[__pyx_t_1]) = ((__pyx_v_dj[__pyx_t_1]) + __pyx_v_dj_min);
 0983: 
+0984: def tr_gsearch(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_11tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_10tr_gsearch[] = "Update the sample pixel translations by minimizing total mean-squared-error\n    (:math:$MSE_{total}$). Perform a grid search within the search window of\n    `sw_y` size in pixels for sample translations along the vertical axis, and\n    of `sw_x` size in pixels for sample translations along the horizontal axis in\n    order to minimize the total MSE.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Initial sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray) : Initial sample's translations along the horizontal\n            detector axis in pixels.\n        sw_y (float) : Search window size in pixels along the vertical detector\n            axis.\n        sw_x (float) : Search window size in pixels along the horizontal detector\n            axis.\n        grid_size (int) : Grid size along one of the detector axes. The grid shape\n            is then (grid_size, grid_size).\n        ds_y (float) : Sampling interval of reference image in pixels along the\n            vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along the\n            horizontal axis.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str) : Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n\n        num_threads (int) : Number of threads.\n\n    Returns:\n        numpy.ndarray : Updated sample pixel translations.\n\n    Notes:\n        The error metric as a function of sample shifts is given by:""\n\n        .. math::\n\n            \\varepsilon_{tr}[n, di^{\\prime}, dj^{\\prime}] = \\frac{1}{Y X}\n            \\sum_{i = 0}^Y \\sum_{j = 0}^Y f\\left( \\frac{I[n, i, j] - W[i, j]\n            I_{ref}[u[0, i, j] - di[n] - di^{\\prime},\n            u[1, i, j] - dj[n] - dj^{\\prime}]}{\\sigma} \\right)\n\n        where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_11tr_gsearch = {"tr_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_11tr_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_10tr_gsearch};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_11tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 984, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 984, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 984, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_10tr_gsearch(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_10tr_gsearch(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tr_gsearch", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_12);
    __Pyx_GIVEREF(__pyx_int_12);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_12);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_12);
    __Pyx_GIVEREF(__pyx_int_12);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_12);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 984, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 984, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 984, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 984, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_216__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_73tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_73tr_gsearch = {"__pyx_fuse_0_0tr_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_73tr_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_10tr_gsearch};
static PyArrayObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_73tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tr_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults44 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tr_gsearch") < 0)) __PYX_ERR(0, 984, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 987, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 984, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 987, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_72tr_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_72tr_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_buf_shape;
  __Pyx_memviewslice __pyx_v_errors = { 0, 0, { 0 }, { 0 }, { 0 } };
  npy_intp *__pyx_v_dij_shape;
  PyArrayObject *__pyx_v_dij = 0;
  __Pyx_memviewslice __pyx_v__dij = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0tr_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_24, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_errors, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_dij);
  __PYX_XDEC_MEMVIEW(&__pyx_v__dij, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_218__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_75tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_75tr_gsearch = {"__pyx_fuse_0_1tr_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_75tr_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_10tr_gsearch};
static PyArrayObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_75tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tr_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults45 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tr_gsearch") < 0)) __PYX_ERR(0, 984, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 987, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 984, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 987, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_74tr_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_74tr_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_buf_shape;
  __Pyx_memviewslice __pyx_v_errors = { 0, 0, { 0 }, { 0 }, { 0 } };
  npy_intp *__pyx_v_dij_shape;
  PyArrayObject *__pyx_v_dij = 0;
  __Pyx_memviewslice __pyx_v__dij = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1tr_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_24, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_errors, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_dij);
  __PYX_XDEC_MEMVIEW(&__pyx_v__dij, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_220__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_77tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_77tr_gsearch = {"__pyx_fuse_1_0tr_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_77tr_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_10tr_gsearch};
static PyArrayObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_77tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tr_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults46 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tr_gsearch") < 0)) __PYX_ERR(0, 984, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 987, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 984, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 987, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_76tr_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_76tr_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_buf_shape;
  __Pyx_memviewslice __pyx_v_errors = { 0, 0, { 0 }, { 0 }, { 0 } };
  npy_intp *__pyx_v_dij_shape;
  PyArrayObject *__pyx_v_dij = 0;
  __Pyx_memviewslice __pyx_v__dij = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0tr_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_24, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_errors, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_dij);
  __PYX_XDEC_MEMVIEW(&__pyx_v__dij, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_222__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_79tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_79tr_gsearch = {"__pyx_fuse_1_1tr_gsearch", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_79tr_gsearch, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_10tr_gsearch};
static PyArrayObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_79tr_gsearch(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_sw_y;
  double __pyx_v_sw_x;
  unsigned int __pyx_v_grid_size;
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tr_gsearch (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_sw_y,&__pyx_n_s_sw_x,&__pyx_n_s_grid_size,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults47 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_self);
    values[12] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 1); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 2); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 3); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 4); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 5); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 6); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sw_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 7); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_grid_size)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 8); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 9); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 10); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, 11); __PYX_ERR(0, 984, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 12:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[12] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 13:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[13] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tr_gsearch") < 0)) __PYX_ERR(0, 984, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
        CYTHON_FALLTHROUGH;
        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
        CYTHON_FALLTHROUGH;
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 984, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 985, __pyx_L3_error)
    __pyx_v_sw_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sw_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sw_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_sw_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_grid_size = __Pyx_PyInt_As_unsigned_int(values[8]); if (unlikely((__pyx_v_grid_size == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[11]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 986, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[12]);
    if (values[13]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[13]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 987, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tr_gsearch", 0, 12, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 984, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 984, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 985, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 987, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_78tr_gsearch(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_78tr_gsearch(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_sw_y, double __pyx_v_sw_x, unsigned int __pyx_v_grid_size, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_N;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  npy_intp *__pyx_v_buf_shape;
  __Pyx_memviewslice __pyx_v_errors = { 0, 0, { 0 }, { 0 }, { 0 } };
  npy_intp *__pyx_v_dij_shape;
  PyArrayObject *__pyx_v_dij = 0;
  __Pyx_memviewslice __pyx_v__dij = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1tr_gsearch", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_24, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.tr_gsearch", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_errors, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_dij);
  __PYX_XDEC_MEMVIEW(&__pyx_v__dij, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_5);
  __pyx_t_5 = 0;
/* … */
  __pyx_tuple__43 = PyTuple_Pack(27, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_sw_y, __pyx_n_s_sw_x, __pyx_n_s_grid_size, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_N, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_buf_shape, __pyx_n_s_errors, __pyx_n_s_dij_shape, __pyx_n_s_dij, __pyx_n_s_dij_2); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__43);
  __Pyx_GIVEREF(__pyx_tuple__43);
  __pyx_t_5 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_73tr_gsearch, 0, __pyx_n_s_tr_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults44), 1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults44, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_216__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint64_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_75tr_gsearch, 0, __pyx_n_s_tr_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults45), 1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_t_4)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults45, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_218__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_4, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint64_t_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_77tr_gsearch, 0, __pyx_n_s_tr_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults46), 1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults46, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_220__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint32_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_79tr_gsearch, 0, __pyx_n_s_tr_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults47), 1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_t_4)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults47, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_222__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_4, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint32_t_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_11tr_gsearch, 0, __pyx_n_s_tr_gsearch, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_5;
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_tr_gsearch, __pyx_t_4) < 0) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(14, 0, 27, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__43, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_tr_gsearch, 984, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(0, 984, __pyx_L1_error)
 0985:                float_t[:, :, ::1] u not None, float_t[::1] di not None, float_t[::1] dj not None,
 0986:                double sw_y, double sw_x, unsigned grid_size, double ds_y, double ds_x, double sigma,
+0987:                str loss='Huber', unsigned num_threads=1) -> np.ndarray:
  __pyx_t_5 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
 0988:     r"""Update the sample pixel translations by minimizing total mean-squared-error
 0989:     (:math:$MSE_{total}$). Perform a grid search within the search window of
 0990:     `sw_y` size in pixels for sample translations along the vertical axis, and
 0991:     of `sw_x` size in pixels for sample translations along the horizontal axis in
 0992:     order to minimize the total MSE.
 0993: 
 0994:     Args:
 0995:         I_n (numpy.ndarray) : Measured intensity frames.
 0996:         W (numpy.ndarray) : Measured frames' whitefield.
 0997:         I0 (numpy.ndarray) : Reference image of the sample.
 0998:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 0999:             plane to the reference image.
 1000:         di (numpy.ndarray) : Initial sample's translations along the vertical
 1001:             detector axis in pixels.
 1002:         dj (numpy.ndarray) : Initial sample's translations along the horizontal
 1003:             detector axis in pixels.
 1004:         sw_y (float) : Search window size in pixels along the vertical detector
 1005:             axis.
 1006:         sw_x (float) : Search window size in pixels along the horizontal detector
 1007:             axis.
 1008:         grid_size (int) : Grid size along one of the detector axes. The grid shape
 1009:             is then (grid_size, grid_size).
 1010:         ds_y (float) : Sampling interval of reference image in pixels along the
 1011:             vertical axis.
 1012:         ds_x (float) : Sampling interval of reference image in pixels along the
 1013:             horizontal axis.
 1014:         sigma (float) : The standard deviation of `I_n`.
 1015:         loss (str) : Choose between the following loss functions:
 1016: 
 1017:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 1018:             * 'Huber' : Huber loss function (k = 1.345)
 1019:             * 'L1' : L1 norm loss function.
 1020:             * 'L2' : L2 norm loss function.
 1021: 
 1022:         num_threads (int) : Number of threads.
 1023: 
 1024:     Returns:
 1025:         numpy.ndarray : Updated sample pixel translations.
 1026: 
 1027:     Notes:
 1028:         The error metric as a function of sample shifts is given by:
 1029: 
 1030:         .. math::
 1031: 
 1032:             \varepsilon_{tr}[n, di^{\prime}, dj^{\prime}] = \frac{1}{Y X}
 1033:             \sum_{i = 0}^Y \sum_{j = 0}^Y f\left( \frac{I[n, i, j] - W[i, j]
 1034:             I_{ref}[u[0, i, j] - di[n] - di^{\prime},
 1035:             u[1, i, j] - dj[n] - dj^{\prime}]}{\sigma} \right)
 1036: 
 1037:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.
 1038:     """
+1039:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+1040:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1040, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1040, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1040, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1040, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1040, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1040, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1040, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1040, __pyx_L1_error)
 1041: 
+1042:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 1043: 
+1044:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1044, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1044, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1044, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1044, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1044, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+1045:     cdef int N = I_n.shape[0], Y = I_n.shape[1], X = I_n.shape[2], i, j, k
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 1046: 
+1047:     cdef np.npy_intp *buf_shape = [Y, X]
  __pyx_t_5[0] = __pyx_v_Y;
  __pyx_t_5[1] = __pyx_v_X;
  __pyx_v_buf_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_Y;
  __pyx_t_5[1] = __pyx_v_X;
  __pyx_v_buf_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_Y;
  __pyx_t_5[1] = __pyx_v_X;
  __pyx_v_buf_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_Y;
  __pyx_t_5[1] = __pyx_v_X;
  __pyx_v_buf_shape = __pyx_t_5;
+1048:     cdef float_t[:, ::1] errors = np.PyArray_SimpleNew(2, buf_shape, type_num)
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_buf_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_errors = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_buf_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_errors = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_buf_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_errors = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_buf_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1048, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_errors = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 1049: 
+1050:     cdef np.npy_intp *dij_shape = [N, 2]
  __pyx_t_7[0] = __pyx_v_N;
  __pyx_t_7[1] = 2;
  __pyx_v_dij_shape = __pyx_t_7;
/* … */
  __pyx_t_7[0] = __pyx_v_N;
  __pyx_t_7[1] = 2;
  __pyx_v_dij_shape = __pyx_t_7;
/* … */
  __pyx_t_7[0] = __pyx_v_N;
  __pyx_t_7[1] = 2;
  __pyx_v_dij_shape = __pyx_t_7;
/* … */
  __pyx_t_7[0] = __pyx_v_N;
  __pyx_t_7[1] = 2;
  __pyx_v_dij_shape = __pyx_t_7;
+1051:     cdef np.ndarray dij = np.PyArray_SimpleNew(2, dij_shape, type_num)
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_dij_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1051, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1051, __pyx_L1_error)
  __pyx_v_dij = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_dij_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1051, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1051, __pyx_L1_error)
  __pyx_v_dij = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_dij_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1051, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1051, __pyx_L1_error)
  __pyx_v_dij = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, __pyx_v_dij_shape, __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1051, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1051, __pyx_L1_error)
  __pyx_v_dij = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+1052:     cdef float_t[:, ::1] _dij = dij
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_dij), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1052, __pyx_L1_error)
  __pyx_v__dij = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_dij), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1052, __pyx_L1_error)
  __pyx_v__dij = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_dij), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1052, __pyx_L1_error)
  __pyx_v__dij = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_dij), PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1052, __pyx_L1_error)
  __pyx_v__dij = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 1053: 
+1054:     for k in prange(X, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_8 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_10 = (__pyx_t_8 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_10 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_10; __pyx_t_9++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_9);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+1055:         for j in range(Y):
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
/* … */
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
/* … */
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
/* … */
                            __pyx_t_11 = __pyx_v_Y;
                            __pyx_t_12 = __pyx_t_11;
                            for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
                              __pyx_v_j = __pyx_t_13;
+1056:             if W[j, k] > 0.0:
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
/* … */
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
/* … */
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
/* … */
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_15 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_14 * __pyx_v_W.strides[0]) )) + __pyx_t_15)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
+1057:                 errors[j, k] = FVU_interp(I_n, W[j, k], I0, di, dj, j, k,
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
/* … */
                                __pyx_t_22 = __pyx_v_j;
                                __pyx_t_23 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_22 * __pyx_v_errors.strides[0]) )) + __pyx_t_23)) )) = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_15 * __pyx_v_W.strides[0]) )) + __pyx_t_14)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_19 * __pyx_v_u.strides[0]) ) + __pyx_t_20 * __pyx_v_u.strides[1]) )) + __pyx_t_21)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
/* … */
                                __pyx_t_22 = __pyx_v_j;
                                __pyx_t_23 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_22 * __pyx_v_errors.strides[0]) )) + __pyx_t_23)) )) = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_15 * __pyx_v_W.strides[0]) )) + __pyx_t_14)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_19 * __pyx_v_u.strides[0]) ) + __pyx_t_20 * __pyx_v_u.strides[1]) )) + __pyx_t_21)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
/* … */
                                __pyx_t_22 = __pyx_v_j;
                                __pyx_t_23 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_22 * __pyx_v_errors.strides[0]) )) + __pyx_t_23)) )) = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_15 * __pyx_v_W.strides[0]) )) + __pyx_t_14)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_19 * __pyx_v_u.strides[0]) ) + __pyx_t_20 * __pyx_v_u.strides[1]) )) + __pyx_t_21)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
/* … */
                                __pyx_t_22 = __pyx_v_j;
                                __pyx_t_23 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_22 * __pyx_v_errors.strides[0]) )) + __pyx_t_23)) )) = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_15 * __pyx_v_W.strides[0]) )) + __pyx_t_14)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_19 * __pyx_v_u.strides[0]) ) + __pyx_t_20 * __pyx_v_u.strides[1]) )) + __pyx_t_21)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+1058:                                           u[0, j, k], u[1, j, k], ds_y, ds_x, sigma, f)
                                __pyx_t_16 = 0;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                __pyx_t_19 = 1;
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
/* … */
                                __pyx_t_16 = 0;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                __pyx_t_19 = 1;
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
/* … */
                                __pyx_t_16 = 0;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                __pyx_t_19 = 1;
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
/* … */
                                __pyx_t_16 = 0;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                __pyx_t_19 = 1;
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
 1059:             else:
+1060:                 errors[j, k] = 0.0
                              /*else*/ {
                                __pyx_t_21 = __pyx_v_j;
                                __pyx_t_20 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_21 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              /*else*/ {
                                __pyx_t_21 = __pyx_v_j;
                                __pyx_t_20 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_21 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              /*else*/ {
                                __pyx_t_21 = __pyx_v_j;
                                __pyx_t_20 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_21 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              /*else*/ {
                                __pyx_t_21 = __pyx_v_j;
                                __pyx_t_20 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_21 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 1061: 
+1062:     for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided)        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_9);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L20;
        }
        __pyx_L20:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided)        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_9);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L20;
        }
        __pyx_L20:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided)        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_9);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L20;
        }
        __pyx_L20:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided)        __pyx_t_10 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_10 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_9);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L20;
        }
        __pyx_L20:;
      }
  }
+1063:         _dij[i, 0] = di[i]; _dij[i, 1] = dj[i]
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = __pyx_v_i;
                            __pyx_t_19 = 0;
                            *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_21 * __pyx_v__dij.strides[0]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_20)) )));
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_21 = 1;
                            *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_20)) )));
/* … */
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = __pyx_v_i;
                            __pyx_t_19 = 0;
                            *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_21 * __pyx_v__dij.strides[0]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_20)) )));
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_21 = 1;
                            *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_20)) )));
/* … */
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = __pyx_v_i;
                            __pyx_t_19 = 0;
                            *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_21 * __pyx_v__dij.strides[0]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_20)) )));
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_21 = 1;
                            *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )) = (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_20)) )));
/* … */
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = __pyx_v_i;
                            __pyx_t_19 = 0;
                            *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_21 * __pyx_v__dij.strides[0]) )) + __pyx_t_19)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_20)) )));
                            __pyx_t_20 = __pyx_v_i;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_21 = 1;
                            *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )) = (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_20)) )));
+1064:         tr_updater(errors, I_n[i], W, I0, u, &_dij[i, 0], &_dij[i, 1],
                            __pyx_t_24.data = __pyx_v_I_n.data;
                            __pyx_t_24.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_24, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_24.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_24.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_24.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_24.suboffsets[0] = -1;

__pyx_t_24.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_24.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_24.suboffsets[1] = -1;

__pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = 0;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_18 = 1;
/* … */
                            __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__pyx_v_errors, __pyx_t_24, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (&(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_20 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )))), (&(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_18)) )))), __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_24, 0);
                            __pyx_t_24.memview = NULL;
                            __pyx_t_24.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_24.data = __pyx_v_I_n.data;
                            __pyx_t_24.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_24, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_24.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_24.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_24.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_24.suboffsets[0] = -1;

__pyx_t_24.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_24.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_24.suboffsets[1] = -1;

__pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = 0;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_18 = 1;
/* … */
                            __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__pyx_v_errors, __pyx_t_24, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (&(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_20 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )))), (&(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_18)) )))), __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_24, 0);
                            __pyx_t_24.memview = NULL;
                            __pyx_t_24.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_24.data = __pyx_v_I_n.data;
                            __pyx_t_24.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_24, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_24.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_24.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_24.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_24.suboffsets[0] = -1;

__pyx_t_24.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_24.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_24.suboffsets[1] = -1;

__pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = 0;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_18 = 1;
/* … */
                            __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__pyx_v_errors, __pyx_t_24, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (&(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_20 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )))), (&(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_18)) )))), __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_24, 0);
                            __pyx_t_24.memview = NULL;
                            __pyx_t_24.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_24.data = __pyx_v_I_n.data;
                            __pyx_t_24.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_24, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_24.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_24.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_24.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_24.suboffsets[0] = -1;

__pyx_t_24.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_24.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_24.suboffsets[1] = -1;

__pyx_t_20 = __pyx_v_i;
                            __pyx_t_21 = 0;
                            __pyx_t_19 = __pyx_v_i;
                            __pyx_t_18 = 1;
/* … */
                            __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_tr_updater(__pyx_v_errors, __pyx_t_24, __pyx_v_W, __pyx_v_I0, __pyx_v_u, (&(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_20 * __pyx_v__dij.strides[0]) )) + __pyx_t_21)) )))), (&(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__dij.data + __pyx_t_19 * __pyx_v__dij.strides[0]) )) + __pyx_t_18)) )))), __pyx_v_sw_y, __pyx_v_sw_x, __pyx_v_grid_size, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_24, 0);
                            __pyx_t_24.memview = NULL;
                            __pyx_t_24.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 1065:                    sw_y, sw_x, grid_size, ds_y, ds_x, sigma, f)
 1066: 
+1067:     return dij
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_dij));
  __pyx_r = __pyx_v_dij;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_dij));
  __pyx_r = __pyx_v_dij;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_dij));
  __pyx_r = __pyx_v_dij;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_dij));
  __pyx_r = __pyx_v_dij;
  goto __pyx_L0;
 1068: 
+1069: def pm_errors(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_13pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_12pm_errors[] = "Return the residuals for the pixel mapping fit.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Sample's translations along the vertical detector\n            axis in pixels.\n        dj (numpy.ndarray) : Sample's translations along the fast detector\n            axis in pixels.\n        ds_y (float) : Sampling interval of reference image in pixels along\n            the vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along\n            the horizontal axis.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str): Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n        num_threads (int): Number of threads.\n\n    Returns:\n        numpy.ndarray : Residual profile of the pixel mapping fit.\n\n    See Also:\n        :func:`pyrost.bin.pm_gsearch` : Description of error metric which\n        is being minimized.\n\n    Notes:\n        The error metric is given by:\n\n        .. math::\n\n            \\varepsilon_{pm}[i, j] = \\frac{1}{N}\n            \\sum_{n = 0}^N f\\left( \\frac{I[n, i, j] - W[i, j]\n            I_{ref}[u[0, i, j] - di[n], u[1, i, j] - dj[n]]}{\\sigma}\n            \\right)\n\n        where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_13pm_errors = {"pm_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_13pm_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_12pm_errors};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_13pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 1069, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1069, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_12pm_errors(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_12pm_errors(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_errors", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_9);
    __Pyx_GIVEREF(__pyx_int_9);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_9);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_9);
    __Pyx_GIVEREF(__pyx_int_9);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_9);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1069, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 1069, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1069, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_232__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_83pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_83pm_errors = {"__pyx_fuse_0_0pm_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_83pm_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_12pm_errors};
static PyArrayObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_83pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults52 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 1); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 2); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 3); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 4); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 5); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 6); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 7); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 8); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_errors") < 0)) __PYX_ERR(0, 1069, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1069, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1071, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_82pm_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_82pm_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  CYTHON_UNUSED int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  PyArrayObject *__pyx_v_errs = 0;
  __Pyx_memviewslice __pyx_v__errs = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0pm_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_errs);
  __PYX_XDEC_MEMVIEW(&__pyx_v__errs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_234__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_85pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_85pm_errors = {"__pyx_fuse_0_1pm_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_85pm_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_12pm_errors};
static PyArrayObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_85pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults53 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 1); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 2); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 3); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 4); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 5); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 6); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 7); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 8); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_errors") < 0)) __PYX_ERR(0, 1069, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1069, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1071, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_84pm_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_84pm_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  CYTHON_UNUSED int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  PyArrayObject *__pyx_v_errs = 0;
  __Pyx_memviewslice __pyx_v__errs = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1pm_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_errs);
  __PYX_XDEC_MEMVIEW(&__pyx_v__errs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_236__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_87pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_87pm_errors = {"__pyx_fuse_1_0pm_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_87pm_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_12pm_errors};
static PyArrayObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_87pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults54 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 1); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 2); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 3); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 4); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 5); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 6); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 7); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 8); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_errors") < 0)) __PYX_ERR(0, 1069, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1069, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1071, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_86pm_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_86pm_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  CYTHON_UNUSED int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  PyArrayObject *__pyx_v_errs = 0;
  __Pyx_memviewslice __pyx_v__errs = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0pm_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_errs);
  __PYX_XDEC_MEMVIEW(&__pyx_v__errs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_238__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_89pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_89pm_errors = {"__pyx_fuse_1_1pm_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_89pm_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_12pm_errors};
static PyArrayObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_89pm_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults55 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 1); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 2); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 3); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 4); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 5); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 6); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 7); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, 8); __PYX_ERR(0, 1069, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_errors") < 0)) __PYX_ERR(0, 1069, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1069, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1070, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1071, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_errors", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1069, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1069, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1070, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1071, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_88pm_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_88pm_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  int __pyx_v_Y;
  CYTHON_UNUSED int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  PyArrayObject *__pyx_v_errs = 0;
  __Pyx_memviewslice __pyx_v__errs = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1pm_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_errs);
  __PYX_XDEC_MEMVIEW(&__pyx_v__errs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_tuple__45 = PyTuple_Pack(19, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_errs, __pyx_n_s_errs_2); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__45);
  __Pyx_GIVEREF(__pyx_tuple__45);
  __pyx_t_1 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_83pm_errors, 0, __pyx_n_s_pm_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults52), 1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults52, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_232__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_85pm_errors, 0, __pyx_n_s_pm_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_5, sizeof(__pyx_defaults53), 1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_t_5)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults53, __pyx_t_5)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_5, __pyx_pf_6pyrost_3bin_6pyrost_234__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_5, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float32_t, __pyx_t_5) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_87pm_errors, 0, __pyx_n_s_pm_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults54), 1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults54, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_236__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_89pm_errors, 0, __pyx_n_s_pm_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_5, sizeof(__pyx_defaults55), 1)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_t_5)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults55, __pyx_t_5)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_5, __pyx_pf_6pyrost_3bin_6pyrost_238__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_5, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float32_t, __pyx_t_5) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_13pm_errors, 0, __pyx_n_s_pm_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  ((__pyx_FusedFunctionObject *) __pyx_t_5)->__signatures__ = __pyx_t_1;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pm_errors, __pyx_t_5) < 0) __PYX_ERR(0, 1069, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(11, 0, 19, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_pm_errors, 1069, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(0, 1069, __pyx_L1_error)
 1070:               float_t[:, :, ::1] u not None, float_t[::1] di not None, float_t[::1] dj not None,
+1071:               double ds_y, double ds_x, double sigma, str loss='Huber', unsigned num_threads=1) -> np.ndarray:
  __pyx_t_1 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1071, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
 1072:     r"""Return the residuals for the pixel mapping fit.
 1073: 
 1074:     Args:
 1075:         I_n (numpy.ndarray) : Measured intensity frames.
 1076:         W (numpy.ndarray) : Measured frames' whitefield.
 1077:         I0 (numpy.ndarray) : Reference image of the sample.
 1078:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 1079:             plane to the reference image.
 1080:         di (numpy.ndarray) : Sample's translations along the vertical detector
 1081:             axis in pixels.
 1082:         dj (numpy.ndarray) : Sample's translations along the fast detector
 1083:             axis in pixels.
 1084:         ds_y (float) : Sampling interval of reference image in pixels along
 1085:             the vertical axis.
 1086:         ds_x (float) : Sampling interval of reference image in pixels along
 1087:             the horizontal axis.
 1088:         sigma (float) : The standard deviation of `I_n`.
 1089:         loss (str): Choose between the following loss functions:
 1090: 
 1091:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 1092:             * 'Huber' : Huber loss function (k = 1.345)
 1093:             * 'L1' : L1 norm loss function.
 1094:             * 'L2' : L2 norm loss function.
 1095:         num_threads (int): Number of threads.
 1096: 
 1097:     Returns:
 1098:         numpy.ndarray : Residual profile of the pixel mapping fit.
 1099: 
 1100:     See Also:
 1101:         :func:`pyrost.bin.pm_gsearch` : Description of error metric which
 1102:         is being minimized.
 1103: 
 1104:     Notes:
 1105:         The error metric is given by:
 1106: 
 1107:         .. math::
 1108: 
 1109:             \varepsilon_{pm}[i, j] = \frac{1}{N}
 1110:             \sum_{n = 0}^N f\left( \frac{I[n, i, j] - W[i, j]
 1111:             I_{ref}[u[0, i, j] - di[n], u[1, i, j] - dj[n]]}{\sigma}
 1112:             \right)
 1113: 
 1114:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.
 1115:     """
+1116:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+1117:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1117, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1117, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1117, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1117, __pyx_L1_error)
 1118: 
+1119:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 1120: 
+1121:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1121, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1121, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1121, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1121, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+1122:     cdef int Y = I_n.shape[1], X = I_n.shape[2], j, k
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 1123: 
+1124:     cdef np.ndarray errs = np.PyArray_SimpleNew(2, <np.npy_intp *>I_n.shape + 1, type_num)
  __pyx_t_4 = PyArray_SimpleNew(2, (((npy_intp *)__pyx_v_I_n.shape) + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1124, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1124, __pyx_L1_error)
  __pyx_v_errs = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (((npy_intp *)__pyx_v_I_n.shape) + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1124, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1124, __pyx_L1_error)
  __pyx_v_errs = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (((npy_intp *)__pyx_v_I_n.shape) + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1124, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1124, __pyx_L1_error)
  __pyx_v_errs = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (((npy_intp *)__pyx_v_I_n.shape) + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1124, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1124, __pyx_L1_error)
  __pyx_v_errs = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
+1125:     cdef float_t[:, ::1] _errs = errs
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_errs), PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 1125, __pyx_L1_error)
  __pyx_v__errs = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
/* … */
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_errs), PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 1125, __pyx_L1_error)
  __pyx_v__errs = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
/* … */
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_errs), PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 1125, __pyx_L1_error)
  __pyx_v__errs = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
/* … */
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_errs), PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 1125, __pyx_L1_error)
  __pyx_v__errs = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 1126: 
+1127:     for k in prange(X, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_8; __pyx_t_7++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_7);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_8; __pyx_t_7++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_7);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_8; __pyx_t_7++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_7);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_6 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_8 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_8 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_8; __pyx_t_7++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_7);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+1128:         for j in range(Y):
                            __pyx_t_9 = __pyx_v_Y;
                            __pyx_t_10 = __pyx_t_9;
                            for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
                              __pyx_v_j = __pyx_t_11;
/* … */
                            __pyx_t_9 = __pyx_v_Y;
                            __pyx_t_10 = __pyx_t_9;
                            for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
                              __pyx_v_j = __pyx_t_11;
/* … */
                            __pyx_t_9 = __pyx_v_Y;
                            __pyx_t_10 = __pyx_t_9;
                            for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
                              __pyx_v_j = __pyx_t_11;
/* … */
                            __pyx_t_9 = __pyx_v_Y;
                            __pyx_t_10 = __pyx_t_9;
                            for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
                              __pyx_v_j = __pyx_t_11;
+1129:             if W[j, k] > 0.0:
                              __pyx_t_12 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_13)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
/* … */
                              __pyx_t_12 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_13)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
/* … */
                              __pyx_t_12 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_13)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
/* … */
                              __pyx_t_12 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_13)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                                goto __pyx_L15;
                              }
+1130:                 _errs[j, k] = FVU_interp(I_n, W[j, k], I0, di, dj, j, k,
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_12 = __pyx_v_k;
/* … */
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_20 * __pyx_v__errs.strides[0]) )) + __pyx_t_21)) )) = __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_15 * __pyx_v_u.strides[1]) )) + __pyx_t_16)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_17 * __pyx_v_u.strides[0]) ) + __pyx_t_18 * __pyx_v_u.strides[1]) )) + __pyx_t_19)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_12 = __pyx_v_k;
/* … */
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_20 * __pyx_v__errs.strides[0]) )) + __pyx_t_21)) )) = __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_15 * __pyx_v_u.strides[1]) )) + __pyx_t_16)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_17 * __pyx_v_u.strides[0]) ) + __pyx_t_18 * __pyx_v_u.strides[1]) )) + __pyx_t_19)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_12 = __pyx_v_k;
/* … */
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_20 * __pyx_v__errs.strides[0]) )) + __pyx_t_21)) )) = __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_15 * __pyx_v_u.strides[1]) )) + __pyx_t_16)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_17 * __pyx_v_u.strides[0]) ) + __pyx_t_18 * __pyx_v_u.strides[1]) )) + __pyx_t_19)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
/* … */
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_12 = __pyx_v_k;
/* … */
                                __pyx_t_20 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_20 * __pyx_v__errs.strides[0]) )) + __pyx_t_21)) )) = __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_13 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_14 * __pyx_v_u.strides[0]) ) + __pyx_t_15 * __pyx_v_u.strides[1]) )) + __pyx_t_16)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_17 * __pyx_v_u.strides[0]) ) + __pyx_t_18 * __pyx_v_u.strides[1]) )) + __pyx_t_19)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f);
+1131:                                          u[0, j, k], u[1, j, k], ds_y, ds_x, sigma, f)
                                __pyx_t_14 = 0;
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_16 = __pyx_v_k;
                                __pyx_t_17 = 1;
                                __pyx_t_18 = __pyx_v_j;
                                __pyx_t_19 = __pyx_v_k;
/* … */
                                __pyx_t_14 = 0;
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_16 = __pyx_v_k;
                                __pyx_t_17 = 1;
                                __pyx_t_18 = __pyx_v_j;
                                __pyx_t_19 = __pyx_v_k;
/* … */
                                __pyx_t_14 = 0;
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_16 = __pyx_v_k;
                                __pyx_t_17 = 1;
                                __pyx_t_18 = __pyx_v_j;
                                __pyx_t_19 = __pyx_v_k;
/* … */
                                __pyx_t_14 = 0;
                                __pyx_t_15 = __pyx_v_j;
                                __pyx_t_16 = __pyx_v_k;
                                __pyx_t_17 = 1;
                                __pyx_t_18 = __pyx_v_j;
                                __pyx_t_19 = __pyx_v_k;
 1132:             else:
+1133:                 _errs[j, k] = 0.0
                              /*else*/ {
                                __pyx_t_19 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_19 * __pyx_v__errs.strides[0]) )) + __pyx_t_18)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              /*else*/ {
                                __pyx_t_19 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_19 * __pyx_v__errs.strides[0]) )) + __pyx_t_18)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              /*else*/ {
                                __pyx_t_19 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_19 * __pyx_v__errs.strides[0]) )) + __pyx_t_18)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              /*else*/ {
                                __pyx_t_19 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
                                *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__errs.data + __pyx_t_19 * __pyx_v__errs.strides[0]) )) + __pyx_t_18)) )) = 0.0;
                              }
                              __pyx_L15:;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 1134: 
+1135:     return errs
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_errs));
  __pyx_r = __pyx_v_errs;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_errs));
  __pyx_r = __pyx_v_errs;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_errs));
  __pyx_r = __pyx_v_errs;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_errs));
  __pyx_r = __pyx_v_errs;
  goto __pyx_L0;
 1136: 
+1137: def pm_total_error(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_15pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_14pm_total_error[] = "Return the mean residual for the pixel mapping fit.\n\n    Args:\n        I_n (numpy.ndarray) : Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Sample's translations along the vertical detector\n            axis in pixels.\n        dj (numpy.ndarray) : Sample's translations along the fast detector\n            axis in pixels.\n        ds_y (float) : Sampling interval of reference image in pixels along\n            the vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along\n            the horizontal axis.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str): Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n        num_threads (int): Number of threads.\n\n    Returns:\n        float : Mean residual value of the pixel mapping fit.\n\n    See Also:\n        :func:`pyrost.bin.pm_gsearch` : Description of error metric which\n        is being minimized.\n\n    Notes:\n        The error metric is given by:\n\n        .. math::\n\n            \\varepsilon_{pm}[i, j] = \\frac{1}{N}\n            \\sum_{n = 0}^N f\\left( \\frac{I[n, i, j] - W[i, j]\n            I_{ref}[u[0, i, j] - di[n], u[1, i, j] - dj[n]]}{\\sigma}\n            \\right)\n\n        where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_15pm_total_error = {"pm_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_15pm_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_14pm_total_error};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_15pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 1137, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1137, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_14pm_total_error(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_14pm_total_error(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_total_error", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_9);
    __Pyx_GIVEREF(__pyx_int_9);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_9);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_9);
    __Pyx_GIVEREF(__pyx_int_9);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_9);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1137, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 1137, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1137, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_248__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_93pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_93pm_total_error = {"__pyx_fuse_0_0pm_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_93pm_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_14pm_total_error};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_93pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults60 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 1); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 2); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 3); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 4); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 5); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 6); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 7); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 8); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_total_error") < 0)) __PYX_ERR(0, 1137, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1137, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1139, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_92pm_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_92pm_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  CYTHON_UNUSED int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  double __pyx_v_err;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0pm_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_250__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_95pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_95pm_total_error = {"__pyx_fuse_0_1pm_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_95pm_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_14pm_total_error};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_95pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults61 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 1); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 2); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 3); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 4); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 5); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 6); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 7); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 8); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_total_error") < 0)) __PYX_ERR(0, 1137, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1137, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1139, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_94pm_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_94pm_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  CYTHON_UNUSED int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  double __pyx_v_err;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1pm_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_252__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_97pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_97pm_total_error = {"__pyx_fuse_1_0pm_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_97pm_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_14pm_total_error};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_97pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults62 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 1); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 2); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 3); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 4); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 5); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 6); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 7); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 8); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_total_error") < 0)) __PYX_ERR(0, 1137, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1137, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1139, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_96pm_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_96pm_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  CYTHON_UNUSED int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  double __pyx_v_err;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0pm_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_254__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_99pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_99pm_total_error = {"__pyx_fuse_1_1pm_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_99pm_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_14pm_total_error};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_99pm_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  CYTHON_UNUSED unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pm_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults63 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_self);
    values[9] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 1); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 2); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 3); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 4); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 5); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 6); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 7); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, 8); __PYX_ERR(0, 1137, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[10] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "pm_total_error") < 0)) __PYX_ERR(0, 1137, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1137, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1138, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[9]);
    if (values[10]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[10]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1139, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pm_total_error", 0, 9, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1137, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1137, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1138, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1139, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_98pm_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_98pm_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_sigma, PyObject *__pyx_v_loss, CYTHON_UNUSED unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  CYTHON_UNUSED int __pyx_v_type_num;
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  double __pyx_v_err;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1pm_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pyrost.bin.pyrost.pm_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_tuple__47 = PyTuple_Pack(18, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_Y, __pyx_n_s_X, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_err); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__47);
  __Pyx_GIVEREF(__pyx_tuple__47);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_return, __pyx_n_u_double) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_93pm_total_error, 0, __pyx_n_s_pm_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults60), 1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults60, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_248__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint64_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_double) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_95pm_total_error, 0, __pyx_n_s_pm_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults61), 1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults61, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_250__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_1, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint64_t_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_return, __pyx_n_u_double) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_97pm_total_error, 0, __pyx_n_s_pm_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults62), 1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults62, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_252__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint32_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_double) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_99pm_total_error, 0, __pyx_n_s_pm_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults63), 1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_t_1)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults63, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_254__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_1, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_kp_s_uint32_t_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_15pm_total_error, 0, __pyx_n_s_pm_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  ((__pyx_FusedFunctionObject *) __pyx_t_1)->__signatures__ = __pyx_t_4;
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pm_total_error, __pyx_t_1) < 0) __PYX_ERR(0, 1137, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(11, 0, 18, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_pm_total_error, 1137, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(0, 1137, __pyx_L1_error)
 1138:                    float_t[:, :, ::1] u not None, float_t[::1] di not None, float_t[::1] dj not None,
+1139:                    double ds_y, double ds_x, double sigma, str loss='Huber', unsigned num_threads=1) -> double:
  __pyx_t_4 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1139, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
 1140:     r"""Return the mean residual for the pixel mapping fit.
 1141: 
 1142:     Args:
 1143:         I_n (numpy.ndarray) : Measured intensity frames.
 1144:         W (numpy.ndarray) : Measured frames' whitefield.
 1145:         I0 (numpy.ndarray) : Reference image of the sample.
 1146:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 1147:             plane to the reference image.
 1148:         di (numpy.ndarray) : Sample's translations along the vertical detector
 1149:             axis in pixels.
 1150:         dj (numpy.ndarray) : Sample's translations along the fast detector
 1151:             axis in pixels.
 1152:         ds_y (float) : Sampling interval of reference image in pixels along
 1153:             the vertical axis.
 1154:         ds_x (float) : Sampling interval of reference image in pixels along
 1155:             the horizontal axis.
 1156:         sigma (float) : The standard deviation of `I_n`.
 1157:         loss (str): Choose between the following loss functions:
 1158: 
 1159:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 1160:             * 'Huber' : Huber loss function (k = 1.345)
 1161:             * 'L1' : L1 norm loss function.
 1162:             * 'L2' : L2 norm loss function.
 1163:         num_threads (int): Number of threads.
 1164: 
 1165:     Returns:
 1166:         float : Mean residual value of the pixel mapping fit.
 1167: 
 1168:     See Also:
 1169:         :func:`pyrost.bin.pm_gsearch` : Description of error metric which
 1170:         is being minimized.
 1171: 
 1172:     Notes:
 1173:         The error metric is given by:
 1174: 
 1175:         .. math::
 1176: 
 1177:             \varepsilon_{pm}[i, j] = \frac{1}{N}
 1178:             \sum_{n = 0}^N f\left( \frac{I[n, i, j] - W[i, j]
 1179:             I_{ref}[u[0, i, j] - di[n], u[1, i, j] - dj[n]]}{\sigma}
 1180:             \right)
 1181: 
 1182:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function.
 1183:     """
+1184:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+1185:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1185, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1185, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1185, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1185, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1185, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1185, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1185, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1185, __pyx_L1_error)
 1186: 
+1187:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 1188: 
+1189:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1189, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1189, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1189, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1189, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+1190:     cdef int Y = I_n.shape[1], X = I_n.shape[2], j, k
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[1]);
  __pyx_v_X = (__pyx_v_I_n.shape[2]);
 1191:     cdef double err
 1192: 
+1193:     for k in prange(X, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_7; __pyx_t_6++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_6);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_7; __pyx_t_6++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_6);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_7; __pyx_t_6++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_6);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_5 = __pyx_v_X;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_5 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for reduction(+:__pyx_v_err) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_7; __pyx_t_6++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_6);
                            /* Initialize private variables to invalid values */
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+1194:         for j in range(Y):
                            __pyx_t_8 = __pyx_v_Y;
                            __pyx_t_9 = __pyx_t_8;
                            for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
                              __pyx_v_j = __pyx_t_10;
/* … */
                            __pyx_t_8 = __pyx_v_Y;
                            __pyx_t_9 = __pyx_t_8;
                            for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
                              __pyx_v_j = __pyx_t_10;
/* … */
                            __pyx_t_8 = __pyx_v_Y;
                            __pyx_t_9 = __pyx_t_8;
                            for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
                              __pyx_v_j = __pyx_t_10;
/* … */
                            __pyx_t_8 = __pyx_v_Y;
                            __pyx_t_9 = __pyx_t_8;
                            for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
                              __pyx_v_j = __pyx_t_10;
+1195:             if W[j, k] > 0.0:
                              __pyx_t_11 = __pyx_v_j;
                              __pyx_t_12 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_11 = __pyx_v_j;
                              __pyx_t_12 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_11 = __pyx_v_j;
                              __pyx_t_12 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_11 = __pyx_v_j;
                              __pyx_t_12 = __pyx_v_k;
                              __pyx_t_1 = (((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_11 * __pyx_v_W.strides[0]) )) + __pyx_t_12)) ))) > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
+1196:                 err += FVU_interp(I_n, W[j, k], I0, di, dj, j, k,
                                __pyx_t_12 = __pyx_v_j;
                                __pyx_t_11 = __pyx_v_k;
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_13 * __pyx_v_u.strides[0]) ) + __pyx_t_14 * __pyx_v_u.strides[1]) )) + __pyx_t_15)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f));
/* … */
                                __pyx_t_12 = __pyx_v_j;
                                __pyx_t_11 = __pyx_v_k;
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_13 * __pyx_v_u.strides[0]) ) + __pyx_t_14 * __pyx_v_u.strides[1]) )) + __pyx_t_15)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f));
/* … */
                                __pyx_t_12 = __pyx_v_j;
                                __pyx_t_11 = __pyx_v_k;
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_13 * __pyx_v_u.strides[0]) ) + __pyx_t_14 * __pyx_v_u.strides[1]) )) + __pyx_t_15)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f));
/* … */
                                __pyx_t_12 = __pyx_v_j;
                                __pyx_t_11 = __pyx_v_k;
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_interp(__pyx_v_I_n, (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_12 * __pyx_v_W.strides[0]) )) + __pyx_t_11)) ))), __pyx_v_I0, __pyx_v_di, __pyx_v_dj, __pyx_v_j, __pyx_v_k, (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_13 * __pyx_v_u.strides[0]) ) + __pyx_t_14 * __pyx_v_u.strides[1]) )) + __pyx_t_15)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_16 * __pyx_v_u.strides[0]) ) + __pyx_t_17 * __pyx_v_u.strides[1]) )) + __pyx_t_18)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_sigma, __pyx_v_f));
+1197:                                   u[0, j, k], u[1, j, k], ds_y, ds_x, sigma, f)
                                __pyx_t_13 = 0;
                                __pyx_t_14 = __pyx_v_j;
                                __pyx_t_15 = __pyx_v_k;
                                __pyx_t_16 = 1;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
/* … */
                                __pyx_t_13 = 0;
                                __pyx_t_14 = __pyx_v_j;
                                __pyx_t_15 = __pyx_v_k;
                                __pyx_t_16 = 1;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
/* … */
                                __pyx_t_13 = 0;
                                __pyx_t_14 = __pyx_v_j;
                                __pyx_t_15 = __pyx_v_k;
                                __pyx_t_16 = 1;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
/* … */
                                __pyx_t_13 = 0;
                                __pyx_t_14 = __pyx_v_j;
                                __pyx_t_15 = __pyx_v_k;
                                __pyx_t_16 = 1;
                                __pyx_t_17 = __pyx_v_j;
                                __pyx_t_18 = __pyx_v_k;
 1198: 
+1199:     return err / (X * Y)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble((__pyx_v_err / ((double)(__pyx_v_X * __pyx_v_Y)))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble((__pyx_v_err / ((double)(__pyx_v_X * __pyx_v_Y)))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble((__pyx_v_err / ((double)(__pyx_v_X * __pyx_v_Y)))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble((__pyx_v_err / ((double)(__pyx_v_X * __pyx_v_Y)))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 1200: 
+1201: cdef void FVU_frame(float_t[:, ::1] errors, float_t[:, ::1] R, float_t[:, ::1] I0,
static void __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_R, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_R, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float64_t __pyx_v_di, __pyx_t_5numpy_float64_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_R, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}

static void __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__Pyx_memviewslice __pyx_v_errors, __Pyx_memviewslice __pyx_v_R, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_u, __pyx_t_5numpy_float32_t __pyx_v_di, __pyx_t_5numpy_float32_t __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f) {
  int __pyx_v_Y;
  int __pyx_v_X;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_jj;
  int __pyx_v_kk;
  int __pyx_v_j0;
  int __pyx_v_k0;
  int __pyx_v_jj0;
  int __pyx_v_jj1;
  int __pyx_v_kk0;
  int __pyx_v_kk1;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_dn_y;
  int __pyx_v_dn_x;
  double __pyx_v_y;
  double __pyx_v_x;
  double __pyx_v_r;
/* … */
  /* function exit code */
}
 1202:                     uint_t[:, ::1] I_n, float_t[:, ::1] W, float_t[:, :, ::1] u, float_t di, float_t dj,
 1203:                     double ds_y, double ds_x, double h, double sigma, loss_func f) nogil:
+1204:     cdef int Y = I_n.shape[0], X = I_n.shape[1]
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
/* … */
  __pyx_v_Y = (__pyx_v_I_n.shape[0]);
  __pyx_v_X = (__pyx_v_I_n.shape[1]);
 1205:     cdef int j, k, jj, kk, j0, k0, jj0, jj1, kk0, kk1
+1206:     cdef int Y0 = I0.shape[0], X0 = I0.shape[1]
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
+1207:     cdef int dn_y = <int>ceil((4.0 * h) / ds_y), dn_x = <int>ceil((4.0 * h) / ds_x)
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
/* … */
  __pyx_v_dn_y = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_y)));
  __pyx_v_dn_x = ((int)ceil(((4.0 * __pyx_v_h) / __pyx_v_ds_x)));
 1208:     cdef double y, x, r, I
 1209: 
+1210:     for j in range(Y):
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
/* … */
  __pyx_t_1 = __pyx_v_Y;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+1211:         for k in range(X):
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
/* … */
    __pyx_t_4 = __pyx_v_X;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_k = __pyx_t_6;
+1212:             y = u[0, j, k] - di
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
/* … */
      __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_k;
      __pyx_v_y = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_7 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_9)) ))) - __pyx_v_di);
+1213:             x = u[1, j, k] - dj
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
/* … */
      __pyx_t_9 = 1;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_k;
      __pyx_v_x = ((*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_u.data + __pyx_t_9 * __pyx_v_u.strides[0]) ) + __pyx_t_8 * __pyx_v_u.strides[1]) )) + __pyx_t_7)) ))) - __pyx_v_dj);
 1214: 
+1215:             j0 = <int>(y / ds_y) + 1
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
/* … */
      __pyx_v_j0 = (((int)(__pyx_v_y / __pyx_v_ds_y)) + 1);
+1216:             k0 = <int>(x / ds_x) + 1
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
/* … */
      __pyx_v_k0 = (((int)(__pyx_v_x / __pyx_v_ds_x)) + 1);
 1217: 
+1218:             jj0 = j0 - dn_y if j0 - dn_y > 0 else 0
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 - __pyx_v_dn_y) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 - __pyx_v_dn_y);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_jj0 = __pyx_t_10;
+1219:             jj1 = j0 + dn_y if j0 + dn_y < Y0 else Y0
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_j0 + __pyx_v_dn_y) < __pyx_v_Y0) != 0)) {
        __pyx_t_10 = (__pyx_v_j0 + __pyx_v_dn_y);
      } else {
        __pyx_t_10 = __pyx_v_Y0;
      }
      __pyx_v_jj1 = __pyx_t_10;
+1220:             kk0 = k0 - dn_x if k0 - dn_x > 0 else 0
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 - __pyx_v_dn_x) > 0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 - __pyx_v_dn_x);
      } else {
        __pyx_t_10 = 0;
      }
      __pyx_v_kk0 = __pyx_t_10;
+1221:             kk1 = k0 + dn_x if k0 + dn_x < X0 else X0
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
/* … */
      if ((((__pyx_v_k0 + __pyx_v_dn_x) < __pyx_v_X0) != 0)) {
        __pyx_t_10 = (__pyx_v_k0 + __pyx_v_dn_x);
      } else {
        __pyx_t_10 = __pyx_v_X0;
      }
      __pyx_v_kk1 = __pyx_t_10;
 1222: 
+1223:             for jj in range(jj0, jj1):
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
/* … */
      __pyx_t_10 = __pyx_v_jj1;
      __pyx_t_11 = __pyx_t_10;
      for (__pyx_t_12 = __pyx_v_jj0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
        __pyx_v_jj = __pyx_t_12;
+1224:                 for kk in range(kk0, kk1):
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
/* … */
        __pyx_t_13 = __pyx_v_kk1;
        __pyx_t_14 = __pyx_t_13;
        for (__pyx_t_15 = __pyx_v_kk0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_kk = __pyx_t_15;
+1225:                     r = rbf((ds_y * jj - y) * (ds_y * jj - y) + (ds_x * kk - x) * (ds_x * kk - x), h)
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
/* … */
          __pyx_v_r = __pyx_f_6pyrost_3bin_6pyrost_rbf(((((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y) * ((__pyx_v_ds_y * __pyx_v_jj) - __pyx_v_y)) + (((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x) * ((__pyx_v_ds_x * __pyx_v_kk) - __pyx_v_x))), __pyx_v_h);
+1226:                     errors[jj, kk] += r * f((<double>I_n[j, k] - W[j, k] * I0[jj, kk]) / sigma)
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = __pyx_v_jj;
          __pyx_t_20 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_19 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) += (__pyx_v_r * __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) ))))) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = __pyx_v_jj;
          __pyx_t_20 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_19 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) += (__pyx_v_r * __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) ))) * (*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) ))))) / ((__pyx_t_5numpy_float64_t)__pyx_v_sigma))));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = __pyx_v_jj;
          __pyx_t_20 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_19 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) += (__pyx_v_r * __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint64_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) ))))) / __pyx_v_sigma)));
/* … */
          __pyx_t_7 = __pyx_v_j;
          __pyx_t_8 = __pyx_v_k;
          __pyx_t_9 = __pyx_v_j;
          __pyx_t_16 = __pyx_v_k;
          __pyx_t_17 = __pyx_v_jj;
          __pyx_t_18 = __pyx_v_kk;
          __pyx_t_19 = __pyx_v_jj;
          __pyx_t_20 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_errors.data + __pyx_t_19 * __pyx_v_errors.strides[0]) )) + __pyx_t_20)) )) += (__pyx_v_r * __pyx_v_f(((((double)(*((__pyx_t_5numpy_uint32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_uint32_t *) ( /* dim=0 */ (__pyx_v_I_n.data + __pyx_t_7 * __pyx_v_I_n.strides[0]) )) + __pyx_t_8)) )))) - ((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_W.data + __pyx_t_9 * __pyx_v_W.strides[0]) )) + __pyx_t_16)) ))) * (*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_I0.data + __pyx_t_17 * __pyx_v_I0.strides[0]) )) + __pyx_t_18)) ))))) / __pyx_v_sigma)));
+1227:                     R[jj, kk] += r
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_R.data + __pyx_t_18 * __pyx_v_R.strides[0]) )) + __pyx_t_17)) )) += __pyx_v_r;
        }
      }
    }
  }
/* … */
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_R.data + __pyx_t_18 * __pyx_v_R.strides[0]) )) + __pyx_t_17)) )) += __pyx_v_r;
        }
      }
    }
  }
/* … */
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_R.data + __pyx_t_18 * __pyx_v_R.strides[0]) )) + __pyx_t_17)) )) += __pyx_v_r;
        }
      }
    }
  }
/* … */
          __pyx_t_18 = __pyx_v_jj;
          __pyx_t_17 = __pyx_v_kk;
          *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_R.data + __pyx_t_18 * __pyx_v_R.strides[0]) )) + __pyx_t_17)) )) += __pyx_v_r;
        }
      }
    }
  }
 1228: 
+1229: def ref_errors(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_17ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_16ref_errors[] = "Return the residuals for the reference image regression.\n\n    Args:\n        I_n (numpy.ndarray) :  Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray): Sample's translations along the fast detector\n            axis in pixels.\n        ds_y (float) : Sampling interval of reference image in pixels along\n            the vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along\n            the horizontal axis.\n        h (float) : Kernel bandwidth in pixels.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str) : Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n\n        num_threads (int) : Number of threads.\n\n    Returns:\n        numpy.ndarray : Residuals array of the reference image regression.\n\n    Notes:\n        The pixel mapping `u` maps the intensity measurements from the\n        detector plane to the reference plane as follows:\n\n        .. math::\n            i_{ref}[n, i, j] = u[0, i, j] + di[n], \\; j_{ref}[n, i, j] = u[1, i, j] + dj[n]\n\n        The error metric is given by:\n\n        .. math::\n\n            \\varepsilon_{ref}[i, j] = \\sum_{n, i^{\\prime}, j^{\\prime}}\n            K[i - i_{ref}[n, i^{\\prime}, j^{\\prime}], \n            j - j_{ref}[n, i^{\\prime}, j^{\\prime}], h] \\;\n            f\\left( \\frac{I_n[n, i^{\\prime}, j^{\\prime}] -\n            W[i^{\\prime}, j^{\\prime}] I_{ref}[i, j]}{\\sigma} \\right)\n\n        ""where :math:`f(x)` is L1 norm, L2 norm or Huber loss function\n        and :math:`K[i, j, h] = \\frac{1}{\\sqrt{2 \\pi}} \\exp(-\\frac{i^2 + j^2}{h})`\n        is the Gaussian kernel.\n\n    See Also:\n        :func:`pyrost.bin.KR_reference` : Description of the reference image\n        estimator.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_17ref_errors = {"ref_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_17ref_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_16ref_errors};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_17ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 1229, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1229, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_16ref_errors(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_16ref_errors(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_errors", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_10);
    __Pyx_GIVEREF(__pyx_int_10);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_10);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_10);
    __Pyx_GIVEREF(__pyx_int_10);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_10);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1229, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 1229, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1229, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_264__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_103ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_103ref_errors = {"__pyx_fuse_0_0ref_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_103ref_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_16ref_errors};
static PyArrayObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_103ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults68 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 1); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 2); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 3); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 4); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 5); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 6); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 7); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 8); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 9); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_errors") < 0)) __PYX_ERR(0, 1229, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1229, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1231, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_102ref_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_102ref_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_t;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_err = 0;
  __Pyx_memviewslice __pyx_v__err = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float64_t __pyx_v_err_sum;
  __pyx_t_5numpy_float64_t __pyx_v_R_sum;
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0ref_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_err);
  __PYX_XDEC_MEMVIEW(&__pyx_v__err, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_266__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_105ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_105ref_errors = {"__pyx_fuse_0_1ref_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_105ref_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_16ref_errors};
static PyArrayObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_105ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults69 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 1); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 2); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 3); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 4); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 5); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 6); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 7); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 8); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 9); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_errors") < 0)) __PYX_ERR(0, 1229, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1229, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1231, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_104ref_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_104ref_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_t;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_err = 0;
  __Pyx_memviewslice __pyx_v__err = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float32_t __pyx_v_err_sum;
  __pyx_t_5numpy_float32_t __pyx_v_R_sum;
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1ref_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_err);
  __PYX_XDEC_MEMVIEW(&__pyx_v__err, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_268__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_107ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_107ref_errors = {"__pyx_fuse_1_0ref_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_107ref_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_16ref_errors};
static PyArrayObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_107ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults70 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 1); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 2); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 3); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 4); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 5); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 6); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 7); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 8); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 9); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_errors") < 0)) __PYX_ERR(0, 1229, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1229, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1231, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_106ref_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_106ref_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_t;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_err = 0;
  __Pyx_memviewslice __pyx_v__err = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float64_t __pyx_v_err_sum;
  __pyx_t_5numpy_float64_t __pyx_v_R_sum;
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0ref_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_err);
  __PYX_XDEC_MEMVIEW(&__pyx_v__err, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_270__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_109ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_109ref_errors = {"__pyx_fuse_1_1ref_errors", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_109ref_errors, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_16ref_errors};
static PyArrayObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_109ref_errors(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_errors (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults71 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 1); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 2); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 3); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 4); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 5); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 6); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 7); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 8); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, 9); __PYX_ERR(0, 1229, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_errors") < 0)) __PYX_ERR(0, 1229, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1229, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1230, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1231, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_errors", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1229, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1229, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1230, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1231, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_108ref_errors(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_108ref_errors(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_t;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyArrayObject *__pyx_v_err = 0;
  __Pyx_memviewslice __pyx_v__err = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_5numpy_float32_t __pyx_v_err_sum;
  __pyx_t_5numpy_float32_t __pyx_v_R_sum;
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1ref_errors", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_errors", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __Pyx_XDECREF((PyObject *)__pyx_v_err);
  __PYX_XDEC_MEMVIEW(&__pyx_v__err, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_5);
  __pyx_t_5 = 0;
/* … */
  __pyx_tuple__49 = PyTuple_Pack(28, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_h, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_N, __pyx_n_s_Y0, __pyx_n_s_X0, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_t, __pyx_n_s_shape, __pyx_n_s_err_buf, __pyx_n_s_R_buf, __pyx_n_s_err, __pyx_n_s_err_2, __pyx_n_s_err_sum, __pyx_n_s_R_sum); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__49);
  __Pyx_GIVEREF(__pyx_tuple__49);
  __pyx_t_5 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_103ref_errors, 0, __pyx_n_s_ref_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults68), 1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults68, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_264__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint64_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_105ref_errors, 0, __pyx_n_s_ref_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults69), 1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_t_4)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults69, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_266__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_4, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint64_t_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_107ref_errors, 0, __pyx_n_s_ref_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults70), 1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_t_2)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults70, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_268__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_4);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint32_t_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_109ref_errors, 0, __pyx_n_s_ref_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_4, sizeof(__pyx_defaults71), 1)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_t_4)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults71, __pyx_t_4)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_4, __pyx_pf_6pyrost_3bin_6pyrost_270__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_4, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_5, __pyx_kp_s_uint32_t_float32_t, __pyx_t_4) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_17ref_errors, 0, __pyx_n_s_ref_errors, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_1);
  ((__pyx_FusedFunctionObject *) __pyx_t_4)->__signatures__ = __pyx_t_5;
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ref_errors, __pyx_t_4) < 0) __PYX_ERR(0, 1229, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(12, 0, 28, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_ref_errors, 1229, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(0, 1229, __pyx_L1_error)
 1230:                float_t[:, :, ::1] u not None, float_t[::1] di not None, float_t[::1] dj not None,
+1231:                double ds_y, double ds_x, double h, double sigma, str loss='Huber', unsigned num_threads=1) -> np.ndarray:
  __pyx_t_5 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1231, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
 1232:     r"""Return the residuals for the reference image regression.
 1233: 
 1234:     Args:
 1235:         I_n (numpy.ndarray) :  Measured intensity frames.
 1236:         W (numpy.ndarray) : Measured frames' whitefield.
 1237:         I0 (numpy.ndarray) : Reference image of the sample.
 1238:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 1239:             plane to the reference image.
 1240:         di (numpy.ndarray) : Sample's translations along the vertical
 1241:             detector axis in pixels.
 1242:         dj (numpy.ndarray): Sample's translations along the fast detector
 1243:             axis in pixels.
 1244:         ds_y (float) : Sampling interval of reference image in pixels along
 1245:             the vertical axis.
 1246:         ds_x (float) : Sampling interval of reference image in pixels along
 1247:             the horizontal axis.
 1248:         h (float) : Kernel bandwidth in pixels.
 1249:         sigma (float) : The standard deviation of `I_n`.
 1250:         loss (str) : Choose between the following loss functions:
 1251: 
 1252:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 1253:             * 'Huber' : Huber loss function (k = 1.345)
 1254:             * 'L1' : L1 norm loss function.
 1255:             * 'L2' : L2 norm loss function.
 1256: 
 1257:         num_threads (int) : Number of threads.
 1258: 
 1259:     Returns:
 1260:         numpy.ndarray : Residuals array of the reference image regression.
 1261: 
 1262:     Notes:
 1263:         The pixel mapping `u` maps the intensity measurements from the
 1264:         detector plane to the reference plane as follows:
 1265: 
 1266:         .. math::
 1267:             i_{ref}[n, i, j] = u[0, i, j] + di[n], \; j_{ref}[n, i, j] = u[1, i, j] + dj[n]
 1268: 
 1269:         The error metric is given by:
 1270: 
 1271:         .. math::
 1272: 
 1273:             \varepsilon_{ref}[i, j] = \sum_{n, i^{\prime}, j^{\prime}}
 1274:             K[i - i_{ref}[n, i^{\prime}, j^{\prime}], 
 1275:             j - j_{ref}[n, i^{\prime}, j^{\prime}], h] \;
 1276:             f\left( \frac{I_n[n, i^{\prime}, j^{\prime}] -
 1277:             W[i^{\prime}, j^{\prime}] I_{ref}[i, j]}{\sigma} \right)
 1278: 
 1279:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function
 1280:         and :math:`K[i, j, h] = \frac{1}{\sqrt{2 \pi}} \exp(-\frac{i^2 + j^2}{h})`
 1281:         is the Gaussian kernel.
 1282: 
 1283:     See Also:
 1284:         :func:`pyrost.bin.KR_reference` : Description of the reference image
 1285:         estimator.
 1286:     """
+1287:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+1288:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1288, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1288, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1288, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1288, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1288, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1288, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1288, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1288, __pyx_L1_error)
 1289: 
+1290:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 1291: 
+1292:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1292, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1292, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1292, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1292, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+1293:     cdef int N = I_n.shape[0], Y0 = I0.shape[0], X0 = I0.shape[1]
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
 1294:     cdef int i, j, k, t
 1295: 
+1296:     cdef np.npy_intp *shape = [num_threads, Y0, X0]
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
+1297:     cdef float_t[:, :, ::1] err_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1297, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+1298:     cdef float_t[:, :, ::1] R_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1298, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+1299:     cdef np.ndarray err = np.PyArray_SimpleNew(2, shape + 1, type_num)
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1299, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1299, __pyx_L1_error)
  __pyx_v_err = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1299, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1299, __pyx_L1_error)
  __pyx_v_err = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1299, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1299, __pyx_L1_error)
  __pyx_v_err = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyArray_SimpleNew(2, (__pyx_v_shape + 1), __pyx_v_type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1299, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1299, __pyx_L1_error)
  __pyx_v_err = ((PyArrayObject *)__pyx_t_4);
  __pyx_t_4 = 0;
 1300: 
+1301:     for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+1302:         t = openmp.omp_get_thread_num()
                            __pyx_v_t = omp_get_thread_num();
/* … */
                            __pyx_v_t = omp_get_thread_num();
/* … */
                            __pyx_v_t = omp_get_thread_num();
/* … */
                            __pyx_v_t = omp_get_thread_num();
+1303:         FVU_frame(err_buf[t], R_buf[t], I0, I_n[i], W, u, di[i], dj[i],
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 1304:                   ds_y, ds_x, h, sigma, f)
 1305: 
+1306:     cdef float_t[:, ::1] _err = err
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_err), PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 1306, __pyx_L1_error)
  __pyx_v__err = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_err), PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 1306, __pyx_L1_error)
  __pyx_v__err = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(((PyObject *)__pyx_v_err), PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 1306, __pyx_L1_error)
  __pyx_v__err = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
/* … */
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(((PyObject *)__pyx_v_err), PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 1306, __pyx_L1_error)
  __pyx_v__err = __pyx_t_11;
  __pyx_t_11.memview = NULL;
  __pyx_t_11.data = NULL;
 1307:     cdef float_t err_sum, R_sum
+1308:     for k in prange(X0, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_err_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_err_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_err_sum = ((__pyx_t_5numpy_float64_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_err_sum = ((__pyx_t_5numpy_float32_t)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
+1309:         for j in range(Y0):
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
/* … */
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
/* … */
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
/* … */
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
+1310:             err_sum = 0.0; R_sum = 0.0
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
/* … */
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
/* … */
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
/* … */
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
+1311:             for i in range(<int>num_threads):
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
/* … */
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
/* … */
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
/* … */
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
+1312:                 err_sum = err_sum + err_buf[i, j, k]
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
/* … */
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
/* … */
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
/* … */
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
+1313:                 R_sum = R_sum + R_buf[i, j, k]
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
/* … */
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
/* … */
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
/* … */
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
 1314: 
+1315:             _err[j, k] = err_sum / R_sum if R_sum > 0.0 else 0.0
                              if (((__pyx_v_R_sum > 0.0) != 0)) {
                                __pyx_t_22 = (__pyx_v_err_sum / __pyx_v_R_sum);
                              } else {
                                __pyx_t_22 = 0.0;
                              }
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__err.data + __pyx_t_14 * __pyx_v__err.strides[0]) )) + __pyx_t_13)) )) = __pyx_t_22;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              if (((__pyx_v_R_sum > 0.0) != 0)) {
                                __pyx_t_22 = (__pyx_v_err_sum / __pyx_v_R_sum);
                              } else {
                                __pyx_t_22 = 0.0;
                              }
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__err.data + __pyx_t_14 * __pyx_v__err.strides[0]) )) + __pyx_t_13)) )) = __pyx_t_22;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              if (((__pyx_v_R_sum > 0.0) != 0)) {
                                __pyx_t_22 = (__pyx_v_err_sum / __pyx_v_R_sum);
                              } else {
                                __pyx_t_22 = 0.0;
                              }
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              *((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v__err.data + __pyx_t_14 * __pyx_v__err.strides[0]) )) + __pyx_t_13)) )) = __pyx_t_22;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              if (((__pyx_v_R_sum > 0.0) != 0)) {
                                __pyx_t_22 = (__pyx_v_err_sum / __pyx_v_R_sum);
                              } else {
                                __pyx_t_22 = 0.0;
                              }
                              __pyx_t_14 = __pyx_v_j;
                              __pyx_t_13 = __pyx_v_k;
                              *((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v__err.data + __pyx_t_14 * __pyx_v__err.strides[0]) )) + __pyx_t_13)) )) = __pyx_t_22;
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 1316: 
+1317:     return err
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_err));
  __pyx_r = __pyx_v_err;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_err));
  __pyx_r = __pyx_v_err;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_err));
  __pyx_r = __pyx_v_err;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_err));
  __pyx_r = __pyx_v_err;
  goto __pyx_L0;
 1318: 
+1319: def ref_total_error(uint_t[:, :, ::1] I_n not None, float_t[:, ::1] W not None, float_t[:, ::1] I0 not None,
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_19ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_18ref_total_error[] = "Return the mean residual for the reference image regression.\n\n    Args:\n        I_n (numpy.ndarray) :  Measured intensity frames.\n        W (numpy.ndarray) : Measured frames' whitefield.\n        I0 (numpy.ndarray) : Reference image of the sample.\n        u (numpy.ndarray) : The discrete geometrical mapping of the detector\n            plane to the reference image.\n        di (numpy.ndarray) : Sample's translations along the vertical\n            detector axis in pixels.\n        dj (numpy.ndarray): Sample's translations along the fast detector\n            axis in pixels.\n        ds_y (float) : Sampling interval of reference image in pixels along\n            the vertical axis.\n        ds_x (float) : Sampling interval of reference image in pixels along\n            the horizontal axis.\n        h (float) : Kernel bandwidth in pixels.\n        sigma (float) : The standard deviation of `I_n`.\n        loss (str) : Choose between the following loss functions:\n\n            * 'Epsilon': Epsilon loss function (epsilon = 0.5)\n            * 'Huber' : Huber loss function (k = 1.345)\n            * 'L1' : L1 norm loss function.\n            * 'L2' : L2 norm loss function.\n\n        num_threads (int) : Number of threads.\n\n    Returns:\n        float : Mean residual value.\n\n    Notes:\n        The pixel mapping `u` maps the intensity measurements from the\n        detector plane to the reference plane as follows:\n\n        .. math::\n            i_{ref}[n, i, j] = u[0, i, j] + di[n], \\; j_{ref}[n, i, j] = u[1, i, j] + dj[n]\n\n        The error metric is given by:\n\n        .. math::\n\n            \\varepsilon_{ref}[i, j] = \\sum_{n, i^{\\prime}, j^{\\prime}}\n            K[i - i_{ref}[n, i^{\\prime}, j^{\\prime}], \n            j - j_{ref}[n, i^{\\prime}, j^{\\prime}], h] \\;\n            f\\left( \\frac{I_n[n, i^{\\prime}, j^{\\prime}] -\n            W[i^{\\prime}, j^{\\prime}] I_{ref}[i, j]}{\\sigma} \\right)\n\n        where :math:`f(x)` is L1 norm, L2 ""norm or Huber loss function\n        and :math:`K[i, j, h] = \\frac{1}{\\sqrt{2 \\pi}} \\exp(-\\frac{i^2 + j^2}{h})`\n        is the Gaussian kernel.\n\n    See Also:\n        :func:`pyrost.bin.KR_reference` : Description of the reference image\n        estimator.\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_19ref_total_error = {"ref_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_19ref_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_18ref_total_error};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_19ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,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  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 2); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 1319, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1319, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_18ref_total_error(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_18ref_total_error(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  int __pyx_v____pyx_uint64_t_is_signed;
  int __pyx_v____pyx_uint32_t_is_signed;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_total_error", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1 * 2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 2; __pyx_temp++) {
      __Pyx_INCREF(Py_None);
      __Pyx_GIVEREF(Py_None);
      PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None);
    }
  }
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  __pyx_v____pyx_uint64_t_is_signed = (!((((__pyx_t_5numpy_uint64_t)-1L) > 0) != 0));
  __pyx_v____pyx_uint32_t_is_signed = (!((((__pyx_t_5numpy_uint32_t)-1L) > 0) != 0));
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_I_n, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_I_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_10);
    __Pyx_GIVEREF(__pyx_int_10);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_10);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint64_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_uint32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 3) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_2 = ((!((__pyx_v____pyx_uint32_t_is_signed ^ __pyx_v_dtype_signed) != 0)) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'f':
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L24_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L24_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L28_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_uint32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L28_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_uint32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
  __pyx_t_3 = ((1 < __pyx_t_5) != 0);
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_6 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 1);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  __pyx_t_2 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_2 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L32_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_W, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_2;
  __pyx_L32_bool_binop_done:;
  if (__pyx_t_3) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF_SET(__pyx_v_arg, __pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L31;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_int_10);
    __Pyx_GIVEREF(__pyx_int_10);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_10);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_L31:;
  while (1) {
    __pyx_t_3 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_2 = (__pyx_t_3 != 0);
    if (__pyx_t_2) {
      __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
        __pyx_t_1 = 0;
        goto __pyx_L37;
      }
      __pyx_t_3 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_XDECREF_SET(__pyx_v_arg_base, __pyx_t_1);
        __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_3 = (__pyx_t_2 != 0);
        if (__pyx_t_3) {
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_1);
          __pyx_t_1 = 0;
          goto __pyx_L38;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
        }
        __pyx_L38:;
        goto __pyx_L37;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __Pyx_XDECREF_SET(__pyx_v_dtype, Py_None);
      }
      __pyx_L37:;
      __pyx_v_itemsize = -1L;
      __pyx_t_3 = (__pyx_v_dtype != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_1); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L41_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L41_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          __pyx_t_3 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_2 = __pyx_t_3;
            goto __pyx_L44_bool_binop_done;
          }
          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1319, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_3 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_2 = __pyx_t_3;
          __pyx_L44_bool_binop_done:;
          if (__pyx_t_2) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
            goto __pyx_L35_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L47_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L47_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_3 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L51_bool_binop_done;
    }
    __pyx_t_3 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L51_bool_binop_done:;
    if (__pyx_t_2) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_2 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_2) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
        goto __pyx_L35_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 1, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
    goto __pyx_L35_break;
  }
  __pyx_L35_break:;
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_candidates = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_6;
  __pyx_t_6 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_9, &__pyx_t_5, &__pyx_t_6, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = (__pyx_v_dst_type != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_6, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 1319, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_3) {
          __pyx_v_match_found = 1;
          goto __pyx_L59;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L57_break;
        }
        __pyx_L59:;
      }
    }
    __pyx_L57_break:;
    __pyx_t_3 = (__pyx_v_match_found != 0);
    if (__pyx_t_3) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1319, __pyx_L1_error)
  __pyx_t_2 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1319, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_280__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_113ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_113ref_total_error = {"__pyx_fuse_0_0ref_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_113ref_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_18ref_total_error};
static PyObject *__pyx_fuse_0_0__pyx_pw_6pyrost_3bin_6pyrost_113ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults76 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 1); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 2); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 3); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 4); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 5); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 6); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 7); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 8); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 9); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_total_error") < 0)) __PYX_ERR(0, 1319, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1319, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1321, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_112ref_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_112ref_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_err;
  double __pyx_v_err2;
  double __pyx_v_err_sum;
  double __pyx_v_R_sum;
  double __pyx_v_err_jk;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0ref_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_XDECREF(__pyx_t_22);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_282__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_115ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_115ref_total_error = {"__pyx_fuse_0_1ref_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_115ref_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_18ref_total_error};
static PyObject *__pyx_fuse_0_1__pyx_pw_6pyrost_3bin_6pyrost_115ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults77 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 1); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 2); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 3); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 4); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 5); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 6); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 7); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 8); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 9); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_total_error") < 0)) __PYX_ERR(0, 1319, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1319, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1321, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_114ref_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_114ref_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_err;
  double __pyx_v_err2;
  double __pyx_v_err_sum;
  double __pyx_v_R_sum;
  double __pyx_v_err_jk;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1ref_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_XDECREF(__pyx_t_22);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_284__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_117ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_117ref_total_error = {"__pyx_fuse_1_0ref_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_117ref_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_18ref_total_error};
static PyObject *__pyx_fuse_1_0__pyx_pw_6pyrost_3bin_6pyrost_117ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults78 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 1); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 2); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 3); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 4); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 5); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 6); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 7); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 8); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 9); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_total_error") < 0)) __PYX_ERR(0, 1319, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float64_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1319, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1321, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_116ref_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_116ref_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_err;
  double __pyx_v_err2;
  double __pyx_v_err_sum;
  double __pyx_v_R_sum;
  double __pyx_v_err_jk;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0ref_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_XDECREF(__pyx_t_22);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_286__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_self)->__pyx_arg_loss);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_self)->__pyx_arg_loss);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __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_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_119ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_119ref_total_error = {"__pyx_fuse_1_1ref_total_error", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_119ref_total_error, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_18ref_total_error};
static PyObject *__pyx_fuse_1_1__pyx_pw_6pyrost_3bin_6pyrost_119ref_total_error(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_I_n = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_W = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_I0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_u = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_di = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_dj = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_ds_y;
  double __pyx_v_ds_x;
  double __pyx_v_h;
  double __pyx_v_sigma;
  PyObject *__pyx_v_loss = 0;
  unsigned int __pyx_v_num_threads;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ref_total_error (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_I_n,&__pyx_n_s_W,&__pyx_n_s_I0,&__pyx_n_s_u,&__pyx_n_s_di,&__pyx_n_s_dj,&__pyx_n_s_ds_y,&__pyx_n_s_ds_x,&__pyx_n_s_h,&__pyx_n_s_sigma,&__pyx_n_s_loss,&__pyx_n_s_num_threads,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    __pyx_defaults79 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_self);
    values[10] = __pyx_dynamic_args->__pyx_arg_loss;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I_n)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_W)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 1); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_I0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 2); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_u)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 3); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_di)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 4); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dj)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 5); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 6); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ds_x)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 7); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 8); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sigma)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, 9); __PYX_ERR(0, 1319, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loss);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ref_total_error") < 0)) __PYX_ERR(0, 1319, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_I_n = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_uint32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I_n.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_W.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_I0 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_I0.memview)) __PYX_ERR(0, 1319, __pyx_L3_error)
    __pyx_v_u = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_u.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_di = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_di.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_dj = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5numpy_float32_t(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_dj.memview)) __PYX_ERR(0, 1320, __pyx_L3_error)
    __pyx_v_ds_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_ds_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_ds_x = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_ds_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_h = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_h == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_sigma = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    __pyx_v_loss = ((PyObject*)values[10]);
    if (values[11]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_unsigned_int(values[11]); if (unlikely((__pyx_v_num_threads == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1321, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ref_total_error", 0, 10, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1319, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_I_n.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I_n"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_W.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "W"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_I0.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "I0"); __PYX_ERR(0, 1319, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_u.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "u"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_di.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "di"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_dj.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "dj"); __PYX_ERR(0, 1320, __pyx_L1_error)
  }
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), (&PyUnicode_Type), 1, "loss", 1))) __PYX_ERR(0, 1321, __pyx_L1_error)
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_118ref_total_error(__pyx_self, __pyx_v_I_n, __pyx_v_W, __pyx_v_I0, __pyx_v_u, __pyx_v_di, __pyx_v_dj, __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_loss, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_118ref_total_error(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_I_n, __Pyx_memviewslice __pyx_v_W, __Pyx_memviewslice __pyx_v_I0, __Pyx_memviewslice __pyx_v_u, __Pyx_memviewslice __pyx_v_di, __Pyx_memviewslice __pyx_v_dj, double __pyx_v_ds_y, double __pyx_v_ds_x, double __pyx_v_h, double __pyx_v_sigma, PyObject *__pyx_v_loss, unsigned int __pyx_v_num_threads) {
  __pyx_t_6pyrost_3bin_6pyrost_loss_func __pyx_v_f;
  int __pyx_v_type_num;
  CYTHON_UNUSED int __pyx_v_N;
  int __pyx_v_Y0;
  int __pyx_v_X0;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_t;
  int __pyx_v_k;
  npy_intp *__pyx_v_shape;
  __Pyx_memviewslice __pyx_v_err_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_R_buf = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_err;
  double __pyx_v_err2;
  double __pyx_v_err_sum;
  double __pyx_v_R_sum;
  double __pyx_v_err_jk;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1ref_total_error", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_XDECREF(__pyx_t_22);
  __Pyx_AddTraceback("pyrost.bin.pyrost.ref_total_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_err_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_R_buf, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I_n, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_W, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_I0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_u, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_di, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_dj, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_n_u_Huber);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_tuple__51 = PyTuple_Pack(29, __pyx_n_s_I_n, __pyx_n_s_W, __pyx_n_s_I0, __pyx_n_s_u, __pyx_n_s_di, __pyx_n_s_dj, __pyx_n_s_ds_y, __pyx_n_s_ds_x, __pyx_n_s_h, __pyx_n_s_sigma, __pyx_n_s_loss, __pyx_n_s_num_threads, __pyx_n_s_f, __pyx_n_s_type_num, __pyx_n_s_N, __pyx_n_s_Y0, __pyx_n_s_X0, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_t, __pyx_n_s_k, __pyx_n_s_shape, __pyx_n_s_err_buf, __pyx_n_s_R_buf, __pyx_n_s_err, __pyx_n_s_err2, __pyx_n_s_err_sum, __pyx_n_s_R_sum, __pyx_n_s_err_jk); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__51);
  __Pyx_GIVEREF(__pyx_tuple__51);
  __pyx_t_1 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_fuse_0_0__pyx_mdef_6pyrost_3bin_6pyrost_113ref_total_error, 0, __pyx_n_s_ref_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_5, sizeof(__pyx_defaults76), 1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_t_5)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults76, __pyx_t_5)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_5, __pyx_pf_6pyrost_3bin_6pyrost_280__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float64_t, __pyx_t_5) < 0) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_fuse_0_1__pyx_mdef_6pyrost_3bin_6pyrost_115ref_total_error, 0, __pyx_n_s_ref_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_5, sizeof(__pyx_defaults77), 1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_t_5)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults77, __pyx_t_5)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_5, __pyx_pf_6pyrost_3bin_6pyrost_282__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint64_t_float32_t, __pyx_t_5) < 0) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_fuse_1_0__pyx_mdef_6pyrost_3bin_6pyrost_117ref_total_error, 0, __pyx_n_s_ref_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_5, sizeof(__pyx_defaults78), 1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_t_5)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults78, __pyx_t_5)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_5, __pyx_pf_6pyrost_3bin_6pyrost_284__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float64_t, __pyx_t_5) < 0) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_fuse_1_1__pyx_mdef_6pyrost_3bin_6pyrost_119ref_total_error, 0, __pyx_n_s_ref_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_5, sizeof(__pyx_defaults79), 1)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_INCREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_t_5)->__pyx_arg_loss = __pyx_n_u_Huber;
  __Pyx_GIVEREF(__pyx_n_u_Huber);
  __Pyx_CyFunction_Defaults(__pyx_defaults79, __pyx_t_5)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_5, __pyx_pf_6pyrost_3bin_6pyrost_286__defaults__);
  if (PyDict_SetItem(__pyx_t_1, __pyx_kp_s_uint32_t_float32_t, __pyx_t_5) < 0) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_19ref_total_error, 0, __pyx_n_s_ref_total_error, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_5, __pyx_t_4);
  ((__pyx_FusedFunctionObject *) __pyx_t_5)->__signatures__ = __pyx_t_1;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ref_total_error, __pyx_t_5) < 0) __PYX_ERR(0, 1319, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(12, 0, 29, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__51, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_ref_total_error, 1319, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(0, 1319, __pyx_L1_error)
 1320:                     float_t[:, :, ::1] u not None, float_t[::1] di not None, float_t[::1] dj not None,
+1321:                     double ds_y, double ds_x, double h, double sigma, str loss='Huber', unsigned num_threads=1):
  __pyx_t_1 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1321, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
 1322:     r"""Return the mean residual for the reference image regression.
 1323: 
 1324:     Args:
 1325:         I_n (numpy.ndarray) :  Measured intensity frames.
 1326:         W (numpy.ndarray) : Measured frames' whitefield.
 1327:         I0 (numpy.ndarray) : Reference image of the sample.
 1328:         u (numpy.ndarray) : The discrete geometrical mapping of the detector
 1329:             plane to the reference image.
 1330:         di (numpy.ndarray) : Sample's translations along the vertical
 1331:             detector axis in pixels.
 1332:         dj (numpy.ndarray): Sample's translations along the fast detector
 1333:             axis in pixels.
 1334:         ds_y (float) : Sampling interval of reference image in pixels along
 1335:             the vertical axis.
 1336:         ds_x (float) : Sampling interval of reference image in pixels along
 1337:             the horizontal axis.
 1338:         h (float) : Kernel bandwidth in pixels.
 1339:         sigma (float) : The standard deviation of `I_n`.
 1340:         loss (str) : Choose between the following loss functions:
 1341: 
 1342:             * 'Epsilon': Epsilon loss function (epsilon = 0.5)
 1343:             * 'Huber' : Huber loss function (k = 1.345)
 1344:             * 'L1' : L1 norm loss function.
 1345:             * 'L2' : L2 norm loss function.
 1346: 
 1347:         num_threads (int) : Number of threads.
 1348: 
 1349:     Returns:
 1350:         float : Mean residual value.
 1351: 
 1352:     Notes:
 1353:         The pixel mapping `u` maps the intensity measurements from the
 1354:         detector plane to the reference plane as follows:
 1355: 
 1356:         .. math::
 1357:             i_{ref}[n, i, j] = u[0, i, j] + di[n], \; j_{ref}[n, i, j] = u[1, i, j] + dj[n]
 1358: 
 1359:         The error metric is given by:
 1360: 
 1361:         .. math::
 1362: 
 1363:             \varepsilon_{ref}[i, j] = \sum_{n, i^{\prime}, j^{\prime}}
 1364:             K[i - i_{ref}[n, i^{\prime}, j^{\prime}], 
 1365:             j - j_{ref}[n, i^{\prime}, j^{\prime}], h] \;
 1366:             f\left( \frac{I_n[n, i^{\prime}, j^{\prime}] -
 1367:             W[i^{\prime}, j^{\prime}] I_{ref}[i, j]}{\sigma} \right)
 1368: 
 1369:         where :math:`f(x)` is L1 norm, L2 norm or Huber loss function
 1370:         and :math:`K[i, j, h] = \frac{1}{\sqrt{2 \pi}} \exp(-\frac{i^2 + j^2}{h})`
 1371:         is the Gaussian kernel.
 1372: 
 1373:     See Also:
 1374:         :func:`pyrost.bin.KR_reference` : Description of the reference image
 1375:         estimator.
 1376:     """
+1377:     if ds_y <= 0.0 or ds_x <= 0.0:
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
/* … */
  __pyx_t_2 = ((__pyx_v_ds_y <= 0.0) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_ds_x <= 0.0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (unlikely(__pyx_t_1)) {
/* … */
  }
+1378:         raise ValueError('Sampling intervals must be positive')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1378, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1378, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1378, __pyx_L1_error)
/* … */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 1378, __pyx_L1_error)
 1379: 
+1380:     cdef loss_func f = choose_loss(loss)
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
/* … */
  __pyx_v_f = __pyx_f_6pyrost_3bin_6pyrost_choose_loss(__pyx_v_loss);
 1381: 
+1382:     cdef int type_num = np.PyArray_TYPE(W.base)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1382, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1382, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1382, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_W, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_base); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1382, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1382, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_4));
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+1383:     cdef int N = I_n.shape[0], Y0 = I0.shape[0], X0 = I0.shape[1]
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
/* … */
  __pyx_v_N = (__pyx_v_I_n.shape[0]);
  __pyx_v_Y0 = (__pyx_v_I0.shape[0]);
  __pyx_v_X0 = (__pyx_v_I0.shape[1]);
 1384:     cdef int i, j, t, k
 1385: 
+1386:     cdef np.npy_intp *shape = [num_threads, Y0, X0]
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
/* … */
  __pyx_t_5[0] = __pyx_v_num_threads;
  __pyx_t_5[1] = __pyx_v_Y0;
  __pyx_t_5[2] = __pyx_v_X0;
  __pyx_v_shape = __pyx_t_5;
+1387:     cdef float_t[:, :, ::1] err_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_err_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+1388:     cdef float_t[:, :, ::1] R_buf = np.PyArray_ZEROS(3, shape, type_num, 0)
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
/* … */
  __pyx_t_4 = PyArray_ZEROS(3, __pyx_v_shape, __pyx_v_type_num, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_d_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 1388, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_R_buf = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 1389: 
+1390:     for i in prange(N, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided)        __pyx_t_7 = __pyx_v_N;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_9 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_t) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){
                        {
                            __pyx_v_i = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L8;
        }
        __pyx_L8:;
      }
  }
+1391:         t = openmp.omp_get_thread_num()
                            __pyx_v_t = omp_get_thread_num();
/* … */
                            __pyx_v_t = omp_get_thread_num();
/* … */
                            __pyx_v_t = omp_get_thread_num();
/* … */
                            __pyx_v_t = omp_get_thread_num();
+1392:         FVU_frame(err_buf[t], R_buf[t], I0, I_n[i], W, u, di[i], dj[i],
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_0_0__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_1_0__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_0_1__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float64_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                            __pyx_t_10.data = __pyx_v_err_buf.data;
                            __pyx_t_10.memview = __pyx_v_err_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_10, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_err_buf.strides[0];
        __pyx_t_10.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_10.shape[0] = __pyx_v_err_buf.shape[1];
__pyx_t_10.strides[0] = __pyx_v_err_buf.strides[1];
    __pyx_t_10.suboffsets[0] = -1;

__pyx_t_10.shape[1] = __pyx_v_err_buf.shape[2];
__pyx_t_10.strides[1] = __pyx_v_err_buf.strides[2];
    __pyx_t_10.suboffsets[1] = -1;

__pyx_t_11.data = __pyx_v_R_buf.data;
                            __pyx_t_11.memview = __pyx_v_R_buf.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_11, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_t;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_R_buf.strides[0];
        __pyx_t_11.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_11.shape[0] = __pyx_v_R_buf.shape[1];
__pyx_t_11.strides[0] = __pyx_v_R_buf.strides[1];
    __pyx_t_11.suboffsets[0] = -1;

__pyx_t_11.shape[1] = __pyx_v_R_buf.shape[2];
__pyx_t_11.strides[1] = __pyx_v_R_buf.strides[2];
    __pyx_t_11.suboffsets[1] = -1;

__pyx_t_12.data = __pyx_v_I_n.data;
                            __pyx_t_12.memview = __pyx_v_I_n.memview;
                            __PYX_INC_MEMVIEW(&__pyx_t_12, 0);
                            {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_I_n.strides[0];
        __pyx_t_12.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_12.shape[0] = __pyx_v_I_n.shape[1];
__pyx_t_12.strides[0] = __pyx_v_I_n.strides[1];
    __pyx_t_12.suboffsets[0] = -1;

__pyx_t_12.shape[1] = __pyx_v_I_n.shape[2];
__pyx_t_12.strides[1] = __pyx_v_I_n.strides[2];
    __pyx_t_12.suboffsets[1] = -1;

__pyx_t_13 = __pyx_v_i;
                            __pyx_t_14 = __pyx_v_i;
/* … */
                            __pyx_fuse_1_1__pyx_f_6pyrost_3bin_6pyrost_FVU_frame(__pyx_t_10, __pyx_t_11, __pyx_v_I0, __pyx_t_12, __pyx_v_W, __pyx_v_u, (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_di.data) + __pyx_t_13)) ))), (*((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ ((char *) (((__pyx_t_5numpy_float32_t *) __pyx_v_dj.data) + __pyx_t_14)) ))), __pyx_v_ds_y, __pyx_v_ds_x, __pyx_v_h, __pyx_v_sigma, __pyx_v_f);
                            __PYX_XDEC_MEMVIEW(&__pyx_t_10, 0);
                            __pyx_t_10.memview = NULL;
                            __pyx_t_10.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_11, 0);
                            __pyx_t_11.memview = NULL;
                            __pyx_t_11.data = NULL;
                            __PYX_XDEC_MEMVIEW(&__pyx_t_12, 0);
                            __pyx_t_12.memview = NULL;
                            __pyx_t_12.data = NULL;
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 1393:                   ds_y, ds_x, h, sigma, f)
 1394: 
+1395:     cdef double err = 0.0, err2 = 0.0
  __pyx_v_err = 0.0;
  __pyx_v_err2 = 0.0;
/* … */
  __pyx_v_err = 0.0;
  __pyx_v_err2 = 0.0;
/* … */
  __pyx_v_err = 0.0;
  __pyx_v_err2 = 0.0;
/* … */
  __pyx_v_err = 0.0;
  __pyx_v_err2 = 0.0;
 1396:     cdef double err_sum, R_sum, err_jk
+1397:     for k in prange(X0, schedule='guided', num_threads=num_threads, nogil=True):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((double)__PYX_NAN());
                            __pyx_v_err_jk = ((double)__PYX_NAN());
                            __pyx_v_err_sum = ((double)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((double)__PYX_NAN());
                            __pyx_v_err_jk = ((double)__PYX_NAN());
                            __pyx_v_err_sum = ((double)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((double)__PYX_NAN());
                            __pyx_v_err_jk = ((double)__PYX_NAN());
                            __pyx_v_err_sum = ((double)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
/* … */
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided)        __pyx_t_9 = __pyx_v_X0;
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_7 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_7 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_R_sum) reduction(+:__pyx_v_err) reduction(+:__pyx_v_err2) lastprivate(__pyx_v_err_jk) lastprivate(__pyx_v_err_sum) lastprivate(__pyx_v_i) lastprivate(__pyx_v_j) firstprivate(__pyx_v_k) lastprivate(__pyx_v_k) schedule(guided) num_threads(__pyx_v_num_threads)
                    #endif /* _OPENMP */
                    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8++){
                        {
                            __pyx_v_k = (int)(0 + 1 * __pyx_t_8);
                            /* Initialize private variables to invalid values */
                            __pyx_v_R_sum = ((double)__PYX_NAN());
                            __pyx_v_err_jk = ((double)__PYX_NAN());
                            __pyx_v_err_sum = ((double)__PYX_NAN());
                            __pyx_v_i = ((int)0xbad0bad0);
                            __pyx_v_j = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L17;
        }
        __pyx_L17:;
      }
  }
+1398:         for j in range(Y0):
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
/* … */
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
/* … */
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
/* … */
                            __pyx_t_15 = __pyx_v_Y0;
                            __pyx_t_16 = __pyx_t_15;
                            for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
                              __pyx_v_j = __pyx_t_17;
+1399:             err_sum = 0.0; R_sum = 0.0
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
/* … */
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
/* … */
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
/* … */
                              __pyx_v_err_sum = 0.0;
                              __pyx_v_R_sum = 0.0;
+1400:             for i in range(<int>num_threads):
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
/* … */
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
/* … */
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
/* … */
                              __pyx_t_18 = ((int)__pyx_v_num_threads);
                              __pyx_t_19 = __pyx_t_18;
                              for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
                                __pyx_v_i = __pyx_t_20;
+1401:                 err_sum = err_sum + err_buf[i, j, k]
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
/* … */
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
/* … */
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
/* … */
                                __pyx_t_14 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_21 = __pyx_v_k;
                                __pyx_v_err_sum = (__pyx_v_err_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_err_buf.data + __pyx_t_14 * __pyx_v_err_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_err_buf.strides[1]) )) + __pyx_t_21)) ))));
+1402:                 R_sum = R_sum + R_buf[i, j, k]
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
/* … */
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
/* … */
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float64_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
/* … */
                                __pyx_t_21 = __pyx_v_i;
                                __pyx_t_13 = __pyx_v_j;
                                __pyx_t_14 = __pyx_v_k;
                                __pyx_v_R_sum = (__pyx_v_R_sum + (*((__pyx_t_5numpy_float32_t *) ( /* dim=2 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_R_buf.data + __pyx_t_21 * __pyx_v_R_buf.strides[0]) ) + __pyx_t_13 * __pyx_v_R_buf.strides[1]) )) + __pyx_t_14)) ))));
                              }
 1403: 
+1404:             if R_sum > 0.0:
                              __pyx_t_1 = ((__pyx_v_R_sum > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_1 = ((__pyx_v_R_sum > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_1 = ((__pyx_v_R_sum > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
/* … */
                              __pyx_t_1 = ((__pyx_v_R_sum > 0.0) != 0);
                              if (__pyx_t_1) {
/* … */
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
+1405:                 err_jk = err_sum / R_sum
                                __pyx_v_err_jk = (__pyx_v_err_sum / __pyx_v_R_sum);
/* … */
                                __pyx_v_err_jk = (__pyx_v_err_sum / __pyx_v_R_sum);
/* … */
                                __pyx_v_err_jk = (__pyx_v_err_sum / __pyx_v_R_sum);
/* … */
                                __pyx_v_err_jk = (__pyx_v_err_sum / __pyx_v_R_sum);
+1406:                 err += err_jk
                                __pyx_v_err = (__pyx_v_err + __pyx_v_err_jk);
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_v_err_jk);
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_v_err_jk);
/* … */
                                __pyx_v_err = (__pyx_v_err + __pyx_v_err_jk);
+1407:                 err2 += err_jk * err_jk
                                __pyx_v_err2 = (__pyx_v_err2 + (__pyx_v_err_jk * __pyx_v_err_jk));
/* … */
                                __pyx_v_err2 = (__pyx_v_err2 + (__pyx_v_err_jk * __pyx_v_err_jk));
/* … */
                                __pyx_v_err2 = (__pyx_v_err2 + (__pyx_v_err_jk * __pyx_v_err_jk));
/* … */
                                __pyx_v_err2 = (__pyx_v_err2 + (__pyx_v_err_jk * __pyx_v_err_jk));
 1408: 
+1409:     err /= (X0 * Y0)
  __pyx_v_err = (__pyx_v_err / (__pyx_v_X0 * __pyx_v_Y0));
/* … */
  __pyx_v_err = (__pyx_v_err / (__pyx_v_X0 * __pyx_v_Y0));
/* … */
  __pyx_v_err = (__pyx_v_err / (__pyx_v_X0 * __pyx_v_Y0));
/* … */
  __pyx_v_err = (__pyx_v_err / (__pyx_v_X0 * __pyx_v_Y0));
+1410:     err2 /= (X0 * Y0)
  __pyx_v_err2 = (__pyx_v_err2 / (__pyx_v_X0 * __pyx_v_Y0));
/* … */
  __pyx_v_err2 = (__pyx_v_err2 / (__pyx_v_X0 * __pyx_v_Y0));
/* … */
  __pyx_v_err2 = (__pyx_v_err2 / (__pyx_v_X0 * __pyx_v_Y0));
/* … */
  __pyx_v_err2 = (__pyx_v_err2 / (__pyx_v_X0 * __pyx_v_Y0));
 1411: 
+1412:     return err, sqrt(err2 - err * err)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_err); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyFloat_FromDouble(sqrt((__pyx_v_err2 - (__pyx_v_err * __pyx_v_err)))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_22 = PyTuple_New(2); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_22);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_22, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_22, 1, __pyx_t_3);
  __pyx_t_4 = 0;
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_22;
  __pyx_t_22 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_err); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyFloat_FromDouble(sqrt((__pyx_v_err2 - (__pyx_v_err * __pyx_v_err)))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_22 = PyTuple_New(2); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_22);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_22, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_22, 1, __pyx_t_3);
  __pyx_t_4 = 0;
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_22;
  __pyx_t_22 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_err); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyFloat_FromDouble(sqrt((__pyx_v_err2 - (__pyx_v_err * __pyx_v_err)))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_22 = PyTuple_New(2); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_22);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_22, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_22, 1, __pyx_t_3);
  __pyx_t_4 = 0;
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_22;
  __pyx_t_22 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_err); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyFloat_FromDouble(sqrt((__pyx_v_err2 - (__pyx_v_err * __pyx_v_err)))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_22 = PyTuple_New(2); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 1412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_22);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_22, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_22, 1, __pyx_t_3);
  __pyx_t_4 = 0;
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_22;
  __pyx_t_22 = 0;
  goto __pyx_L0;
 1413: 
+1414: def ct_integrate(float_t[:, ::1] sy_arr not None, float_t[:, ::1] sx_arr not None, int num_threads=1) -> np.ndarray:
/* Python wrapper */
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_21ct_integrate(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6pyrost_3bin_6pyrost_20ct_integrate[] = "Perform the Fourier Transform wavefront reconstruction [FTI]_ with\n    antisymmetric derivative integration [ASDI]_.\n\n    Args:\n        sx_arr (numpy.ndarray) :  of gradient values along the horizontal axis.\n        sy_arr (numpy.ndarray) : Array of gradient values along the vertical axis.\n        num_threads (int) : Number of threads.\n\n    Returns:\n        numpy.ndarray : Reconstructed wavefront.\n\n    References:\n        .. [FTI] C. Kottler, C. David, F. Pfeiffer, and O. Bunk,\n                \"A two-directional approach for grating based\n                differential phase contrast imaging using hard x-rays,\"\n                Opt. Express 15, 1175-1181 (2007).\n        .. [ASDI] Pierre Bon, Serge Monneret, and Benoit Wattellier,\n                \"Noniterative boundary-artifact-free wavefront\n                reconstruction from its derivatives,\" Appl. Opt. 51,\n                5698-5704 (2012).\n    ";
static PyMethodDef __pyx_mdef_6pyrost_3bin_6pyrost_21ct_integrate = {"ct_integrate", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6pyrost_3bin_6pyrost_21ct_integrate, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_20ct_integrate};
static PyObject *__pyx_pw_6pyrost_3bin_6pyrost_21ct_integrate(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_signatures = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fused_cpdef (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};
    PyObject* values[4] = {0,0,0,0};
    values[2] = __pyx_k__10;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 1); __PYX_ERR(0, 1414, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_kwargs);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, 3); __PYX_ERR(0, 1414, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_fused_cpdef") < 0)) __PYX_ERR(0, 1414, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_signatures = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
    __pyx_v_defaults = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__pyx_fused_cpdef", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1414, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_20ct_integrate(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_20ct_integrate(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {
  PyObject *__pyx_v_dest_sig = NULL;
  Py_ssize_t __pyx_v_i;
  PyTypeObject *__pyx_v_ndarray = 0;
  __Pyx_memviewslice __pyx_v_memslice;
  Py_ssize_t __pyx_v_itemsize;
  CYTHON_UNUSED int __pyx_v_dtype_signed;
  char __pyx_v_kind;
  PyObject *__pyx_v_arg = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_arg_base = NULL;
  PyObject *__pyx_v_candidates = NULL;
  PyObject *__pyx_v_sig = NULL;
  int __pyx_v_match_found;
  PyObject *__pyx_v_src_sig = NULL;
  PyObject *__pyx_v_dst_type = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ct_integrate", 0);
  __Pyx_INCREF(__pyx_v_kwargs);
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyList_SET_ITEM(__pyx_t_1, 0, Py_None);
  __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_2) {
    __Pyx_INCREF(Py_None);
    __Pyx_DECREF_SET(__pyx_v_kwargs, Py_None);
  }
  __pyx_t_1 = ((PyObject *)__Pyx_ImportNumPyArrayTypeIfAvailable()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_v_itemsize = -1L;
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1414, __pyx_L1_error)
  __pyx_t_2 = ((0 < __pyx_t_5) != 0);
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1414, __pyx_L1_error)
    }
    __pyx_t_1 = PyTuple_GET_ITEM(((PyObject*)__pyx_v_args), 0);
    __Pyx_INCREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  __pyx_t_3 = (__pyx_v_kwargs != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_t_4 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_sy_arr, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1414, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_kwargs), __pyx_n_s_sy_arr); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_arg = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L6;
  }
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 1414, __pyx_L1_error)
    }
    __pyx_t_5 = PyTuple_GET_SIZE(((PyObject*)__pyx_v_args)); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1414, __pyx_L1_error)
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_int_2);
    __Pyx_GIVEREF(__pyx_int_2);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_2);
    __Pyx_INCREF(__pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_n_s_s);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_n_s_s);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_L6:;
  while (1) {
    __pyx_t_2 = (__pyx_v_ndarray != ((PyTypeObject*)Py_None));
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (__pyx_t_3) {
      __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg, __pyx_v_ndarray); 
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_dtype = __pyx_t_6;
        __pyx_t_6 = 0;
        goto __pyx_L12;
      }
      __pyx_t_2 = __pyx_memoryview_check(__pyx_v_arg); 
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_base); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_v_arg_base = __pyx_t_6;
        __pyx_t_6 = 0;
        __pyx_t_3 = __Pyx_TypeCheck(__pyx_v_arg_base, __pyx_v_ndarray); 
        __pyx_t_2 = (__pyx_t_3 != 0);
        if (__pyx_t_2) {
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg_base, __pyx_n_s_dtype); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_v_dtype = __pyx_t_6;
          __pyx_t_6 = 0;
          goto __pyx_L13;
        }
        /*else*/ {
          __Pyx_INCREF(Py_None);
          __pyx_v_dtype = Py_None;
        }
        __pyx_L13:;
        goto __pyx_L12;
      }
      /*else*/ {
        __Pyx_INCREF(Py_None);
        __pyx_v_dtype = Py_None;
      }
      __pyx_L12:;
      __pyx_v_itemsize = -1L;
      __pyx_t_2 = (__pyx_v_dtype != Py_None);
      __pyx_t_3 = (__pyx_t_2 != 0);
      if (__pyx_t_3) {
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_itemsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_itemsize = __pyx_t_5;
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_dtype, __pyx_n_s_kind); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_Ord(__pyx_t_6); if (unlikely(__pyx_t_7 == ((long)(long)(Py_UCS4)-1))) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_v_kind = __pyx_t_7;
        __pyx_v_dtype_signed = (__pyx_v_kind == 'i');
        switch (__pyx_v_kind) {
          case 'i':
          case 'u':
          break;
          case 'f':
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_float64_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1414, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L16_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          __pyx_t_2 = (((sizeof(__pyx_t_5numpy_float32_t)) == __pyx_v_itemsize) != 0);
          if (__pyx_t_2) {
          } else {
            __pyx_t_3 = __pyx_t_2;
            goto __pyx_L19_bool_binop_done;
          }
          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_arg, __pyx_n_s_ndim); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 1414, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_2 = ((((Py_ssize_t)__pyx_t_5) == 2) != 0);
          __pyx_t_3 = __pyx_t_2;
          __pyx_L19_bool_binop_done:;
          if (__pyx_t_3) {
            if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
            goto __pyx_L10_break;
          }
          break;
          case 'c':
          break;
          case 'O':
          break;
          default: break;
        }
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L22_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float64_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L22_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float64_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    __pyx_t_2 = ((__pyx_v_itemsize == -1L) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_3 = __pyx_t_2;
      goto __pyx_L26_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_itemsize == (sizeof(__pyx_t_5numpy_float32_t))) != 0);
    __pyx_t_3 = __pyx_t_2;
    __pyx_L26_bool_binop_done:;
    if (__pyx_t_3) {
      __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(__pyx_v_arg, 0); 
      __pyx_v_memslice = __pyx_t_8;
      __pyx_t_3 = (__pyx_v_memslice.memview != 0);
      if (__pyx_t_3) {
        __PYX_XDEC_MEMVIEW((&__pyx_v_memslice), 1); 
        if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, __pyx_n_s_float32_t, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
        goto __pyx_L10_break;
      }
      /*else*/ {
        PyErr_Clear(); 
      }
    }
    if (unlikely(__Pyx_SetItemInt(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
    goto __pyx_L10_break;
  }
  __pyx_L10_break:;
  __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_v_candidates = ((PyObject*)__pyx_t_6);
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_signatures == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_9), (&__pyx_t_10)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __pyx_t_6 = __pyx_t_1;
  __pyx_t_1 = 0;
  while (1) {
    __pyx_t_11 = __Pyx_dict_iter_next(__pyx_t_6, __pyx_t_9, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_10);
    if (unlikely(__pyx_t_11 == 0)) break;
    if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_XDECREF_SET(__pyx_v_sig, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_v_match_found = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_sig, __pyx_n_s_strip); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_14 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_14)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_14);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_12 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_14, __pyx_kp_s__2) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__2);
    __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_split); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __pyx_t_12 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_13))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_13);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_13, function);
      }
    }
    __pyx_t_1 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_13, __pyx_t_12, __pyx_kp_s__3) : __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_kp_s__3);
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF_SET(__pyx_v_src_sig, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_15 = PyList_GET_SIZE(__pyx_v_dest_sig); if (unlikely(__pyx_t_15 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1414, __pyx_L1_error)
    __pyx_t_16 = __pyx_t_15;
    for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
      __pyx_v_i = __pyx_t_17;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_v_dest_sig, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_XDECREF_SET(__pyx_v_dst_type, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_t_3 = (__pyx_v_dst_type != Py_None);
      __pyx_t_2 = (__pyx_t_3 != 0);
      if (__pyx_t_2) {
        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_13 = PyObject_RichCompare(__pyx_t_1, __pyx_v_dst_type, Py_EQ); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        if (__pyx_t_2) {
          __pyx_v_match_found = 1;
          goto __pyx_L34;
        }
        /*else*/ {
          __pyx_v_match_found = 0;
          goto __pyx_L32_break;
        }
        __pyx_L34:;
      }
    }
    __pyx_L32_break:;
    __pyx_t_2 = (__pyx_v_match_found != 0);
    if (__pyx_t_2) {
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_candidates, __pyx_v_sig); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 1414, __pyx_L1_error)
    }
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_2 = (PyList_GET_SIZE(__pyx_v_candidates) != 0);
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_t_9 = PyList_GET_SIZE(__pyx_v_candidates); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 1414, __pyx_L1_error)
  __pyx_t_3 = ((__pyx_t_9 > 1) != 0);
  if (__pyx_t_3) {
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_Raise(__pyx_t_6, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_signatures == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 1414, __pyx_L1_error)
    }
    __pyx_t_6 = __Pyx_PyDict_GetItem(((PyObject*)__pyx_v_signatures), PyList_GET_ITEM(__pyx_v_candidates, 0)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1414, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_r = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__pyx_fused_cpdef", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dest_sig);
  __Pyx_XDECREF(__pyx_v_ndarray);
  __Pyx_XDECREF(__pyx_v_arg);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_arg_base);
  __Pyx_XDECREF(__pyx_v_candidates);
  __Pyx_XDECREF(__pyx_v_sig);
  __Pyx_XDECREF(__pyx_v_src_sig);
  __Pyx_XDECREF(__pyx_v_dst_type);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_292__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_int(__Pyx_CyFunction_Defaults(__pyx_defaults82, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_0__pyx_pw_6pyrost_3bin_6pyrost_123ct_integrate(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_0__pyx_mdef_6pyrost_3bin_6pyrost_123ct_integrate = {"__pyx_fuse_0ct_integrate", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_0__pyx_pw_6pyrost_3bin_6pyrost_123ct_integrate, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_20ct_integrate};
static PyArrayObject *__pyx_fuse_0__pyx_pw_6pyrost_3bin_6pyrost_123ct_integrate(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_sy_arr = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_sx_arr = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ct_integrate (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_sy_arr,&__pyx_n_s_sx_arr,&__pyx_n_s_num_threads,0};
    PyObject* values[3] = {0,0,0};
    __pyx_defaults82 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults82, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sy_arr)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sx_arr)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ct_integrate", 0, 2, 3, 1); __PYX_ERR(0, 1414, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ct_integrate") < 0)) __PYX_ERR(0, 1414, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_sy_arr = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_sy_arr.memview)) __PYX_ERR(0, 1414, __pyx_L3_error)
    __pyx_v_sx_arr = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_sx_arr.memview)) __PYX_ERR(0, 1414, __pyx_L3_error)
    if (values[2]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1414, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ct_integrate", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1414, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ct_integrate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_sy_arr.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "sy_arr"); __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_sx_arr.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "sx_arr"); __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_122ct_integrate(__pyx_self, __pyx_v_sy_arr, __pyx_v_sx_arr, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_122ct_integrate(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_sy_arr, __Pyx_memviewslice __pyx_v_sx_arr, int __pyx_v_num_threads) {
  CYTHON_UNUSED int __pyx_v_type_num;
  npy_intp __pyx_v_a;
  npy_intp __pyx_v_b;
  int __pyx_v_i;
  int __pyx_v_j;
  npy_intp *__pyx_v_asdi_shape;
  PyArrayObject *__pyx_v_sfy_asdi = 0;
  struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *__pyx_v_fftw_obj = 0;
  PyArrayObject *__pyx_v_sfx_asdi = 0;
  struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *__pyx_v_ifftw_obj = 0;
  double __pyx_v_xf;
  double __pyx_v_yf;
  double __pyx_v_norm;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_sfx_asdi;
  __Pyx_Buffer __pyx_pybuffer_sfx_asdi;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_sfy_asdi;
  __Pyx_Buffer __pyx_pybuffer_sfy_asdi;
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0ct_integrate", 0);
  __pyx_pybuffer_sfy_asdi.pybuffer.buf = NULL;
  __pyx_pybuffer_sfy_asdi.refcount = 0;
  __pyx_pybuffernd_sfy_asdi.data = NULL;
  __pyx_pybuffernd_sfy_asdi.rcbuffer = &__pyx_pybuffer_sfy_asdi;
  __pyx_pybuffer_sfx_asdi.pybuffer.buf = NULL;
  __pyx_pybuffer_sfx_asdi.refcount = 0;
  __pyx_pybuffernd_sfx_asdi.data = NULL;
  __pyx_pybuffernd_sfx_asdi.rcbuffer = &__pyx_pybuffer_sfx_asdi;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_23);
  __Pyx_XDECREF(__pyx_t_24);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("pyrost.bin.pyrost.ct_integrate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XDECREF((PyObject *)__pyx_v_sfy_asdi);
  __Pyx_XDECREF((PyObject *)__pyx_v_fftw_obj);
  __Pyx_XDECREF((PyObject *)__pyx_v_sfx_asdi);
  __Pyx_XDECREF((PyObject *)__pyx_v_ifftw_obj);
  __PYX_XDEC_MEMVIEW(&__pyx_v_sy_arr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_sx_arr, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6pyrost_3bin_6pyrost_294__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_int(__Pyx_CyFunction_Defaults(__pyx_defaults83, __pyx_self)->__pyx_arg_num_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pyrost.bin.pyrost.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyArrayObject *__pyx_fuse_1__pyx_pw_6pyrost_3bin_6pyrost_125ct_integrate(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_fuse_1__pyx_mdef_6pyrost_3bin_6pyrost_125ct_integrate = {"__pyx_fuse_1ct_integrate", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_fuse_1__pyx_pw_6pyrost_3bin_6pyrost_125ct_integrate, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6pyrost_3bin_6pyrost_20ct_integrate};
static PyArrayObject *__pyx_fuse_1__pyx_pw_6pyrost_3bin_6pyrost_125ct_integrate(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_sy_arr = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_sx_arr = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_num_threads;
  PyArrayObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ct_integrate (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_sy_arr,&__pyx_n_s_sx_arr,&__pyx_n_s_num_threads,0};
    PyObject* values[3] = {0,0,0};
    __pyx_defaults83 *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults83, __pyx_self);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sy_arr)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sx_arr)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ct_integrate", 0, 2, 3, 1); __PYX_ERR(0, 1414, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_num_threads);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ct_integrate") < 0)) __PYX_ERR(0, 1414, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_sy_arr = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_sy_arr.memview)) __PYX_ERR(0, 1414, __pyx_L3_error)
    __pyx_v_sx_arr = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_5numpy_float32_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_sx_arr.memview)) __PYX_ERR(0, 1414, __pyx_L3_error)
    if (values[2]) {
      __pyx_v_num_threads = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1414, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = __pyx_dynamic_args->__pyx_arg_num_threads;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ct_integrate", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 1414, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("pyrost.bin.pyrost.ct_integrate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(((PyObject *)__pyx_v_sy_arr.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "sy_arr"); __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  if (unlikely(((PyObject *)__pyx_v_sx_arr.memview) == Py_None)) {
    PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "sx_arr"); __PYX_ERR(0, 1414, __pyx_L1_error)
  }
  __pyx_r = __pyx_pf_6pyrost_3bin_6pyrost_124ct_integrate(__pyx_self, __pyx_v_sy_arr, __pyx_v_sx_arr, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyArrayObject *__pyx_pf_6pyrost_3bin_6pyrost_124ct_integrate(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_sy_arr, __Pyx_memviewslice __pyx_v_sx_arr, int __pyx_v_num_threads) {
  CYTHON_UNUSED int __pyx_v_type_num;
  npy_intp __pyx_v_a;
  npy_intp __pyx_v_b;
  int __pyx_v_i;
  int __pyx_v_j;
  npy_intp *__pyx_v_asdi_shape;
  PyArrayObject *__pyx_v_sfy_asdi = 0;
  struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *__pyx_v_fftw_obj = 0;
  PyArrayObject *__pyx_v_sfx_asdi = 0;
  struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *__pyx_v_ifftw_obj = 0;
  double __pyx_v_xf;
  double __pyx_v_yf;
  double __pyx_v_norm;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_sfx_asdi;
  __Pyx_Buffer __pyx_pybuffer_sfx_asdi;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_sfy_asdi;
  __Pyx_Buffer __pyx_pybuffer_sfy_asdi;
  PyArrayObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1ct_integrate", 0);
  __pyx_pybuffer_sfy_asdi.pybuffer.buf = NULL;
  __pyx_pybuffer_sfy_asdi.refcount = 0;
  __pyx_pybuffernd_sfy_asdi.data = NULL;
  __pyx_pybuffernd_sfy_asdi.rcbuffer = &__pyx_pybuffer_sfy_asdi;
  __pyx_pybuffer_sfx_asdi.pybuffer.buf = NULL;
  __pyx_pybuffer_sfx_asdi.refcount = 0;
  __pyx_pybuffernd_sfx_asdi.data = NULL;
  __pyx_pybuffernd_sfx_asdi.rcbuffer = &__pyx_pybuffer_sfx_asdi;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_23);
  __Pyx_XDECREF(__pyx_t_24);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("pyrost.bin.pyrost.ct_integrate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XDECREF((PyObject *)__pyx_v_sfy_asdi);
  __Pyx_XDECREF((PyObject *)__pyx_v_fftw_obj);
  __Pyx_XDECREF((PyObject *)__pyx_v_sfx_asdi);
  __Pyx_XDECREF((PyObject *)__pyx_v_ifftw_obj);
  __PYX_XDEC_MEMVIEW(&__pyx_v_sy_arr, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_sx_arr, 1);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
  __pyx_t_4 = 0;
/* … */
  __pyx_tuple__53 = PyTuple_Pack(18, __pyx_n_s_sy_arr, __pyx_n_s_sx_arr, __pyx_n_s_num_threads, __pyx_n_s_type_num, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_ii, __pyx_n_s_jj, __pyx_n_s_asdi_shape, __pyx_n_s_sfy_asdi, __pyx_n_s_fftw_obj, __pyx_n_s_sfx_asdi, __pyx_n_s_ifftw_obj, __pyx_n_s_xf, __pyx_n_s_yf, __pyx_n_s_norm); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__53);
  __Pyx_GIVEREF(__pyx_tuple__53);
  __pyx_t_4 = __Pyx_PyInt_From_long(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_k__10 = __pyx_t_4;
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1414, __pyx_L1_error)
  __pyx_t_2 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_6pyrost_3bin_6pyrost_123ct_integrate, 0, __pyx_n_s_ct_integrate, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults82), 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults82, __pyx_t_2)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_6pyrost_3bin_6pyrost_292__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float64_t, __pyx_t_2) < 0) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_u_ndarray) < 0) __PYX_ERR(0, 1414, __pyx_L1_error)
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_6pyrost_3bin_6pyrost_125ct_integrate, 0, __pyx_n_s_ct_integrate, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_1, sizeof(__pyx_defaults83), 0)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_CyFunction_Defaults(__pyx_defaults83, __pyx_t_1)->__pyx_arg_num_threads = 1;
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_1, __pyx_pf_6pyrost_3bin_6pyrost_294__defaults__);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_1, __pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_float32_t, __pyx_t_1) < 0) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_mdef_6pyrost_3bin_6pyrost_21ct_integrate, 0, __pyx_n_s_ct_integrate, NULL, __pyx_n_s_pyrost_bin_pyrost, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_1, __pyx_t_5);
  ((__pyx_FusedFunctionObject *) __pyx_t_1)->__signatures__ = __pyx_t_4;
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ct_integrate, __pyx_t_1) < 0) __PYX_ERR(0, 1414, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(3, 0, 18, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__53, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pyrost_bin_pyrost_pyx, __pyx_n_s_ct_integrate, 1414, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(0, 1414, __pyx_L1_error)
 1415:     """Perform the Fourier Transform wavefront reconstruction [FTI]_ with
 1416:     antisymmetric derivative integration [ASDI]_.
 1417: 
 1418:     Args:
 1419:         sx_arr (numpy.ndarray) :  of gradient values along the horizontal axis.
 1420:         sy_arr (numpy.ndarray) : Array of gradient values along the vertical axis.
 1421:         num_threads (int) : Number of threads.
 1422: 
 1423:     Returns:
 1424:         numpy.ndarray : Reconstructed wavefront.
 1425: 
 1426:     References:
 1427:         .. [FTI] C. Kottler, C. David, F. Pfeiffer, and O. Bunk,
 1428:                 "A two-directional approach for grating based
 1429:                 differential phase contrast imaging using hard x-rays,"
 1430:                 Opt. Express 15, 1175-1181 (2007).
 1431:         .. [ASDI] Pierre Bon, Serge Monneret, and Benoit Wattellier,
 1432:                 "Noniterative boundary-artifact-free wavefront
 1433:                 reconstruction from its derivatives," Appl. Opt. 51,
 1434:                 5698-5704 (2012).
 1435:     """
+1436:     cdef int type_num = np.PyArray_TYPE(sx_arr.base)
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_sx_arr, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1436, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1436, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1436, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_2));
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_sx_arr, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1436, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1436, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1436, __pyx_L1_error)
  __pyx_v_type_num = PyArray_TYPE(((PyArrayObject *)__pyx_t_2));
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+1437:     cdef np.npy_intp a = sx_arr.shape[0], b = sx_arr.shape[1]
  __pyx_v_a = (__pyx_v_sx_arr.shape[0]);
  __pyx_v_b = (__pyx_v_sx_arr.shape[1]);
/* … */
  __pyx_v_a = (__pyx_v_sx_arr.shape[0]);
  __pyx_v_b = (__pyx_v_sx_arr.shape[1]);
 1438:     cdef int i, j, ii, jj
+1439:     cdef np.npy_intp *asdi_shape = [2 * a, 2 * b]
  __pyx_t_3[0] = (2 * __pyx_v_a);
  __pyx_t_3[1] = (2 * __pyx_v_b);
  __pyx_v_asdi_shape = __pyx_t_3;
/* … */
  __pyx_t_3[0] = (2 * __pyx_v_a);
  __pyx_t_3[1] = (2 * __pyx_v_b);
  __pyx_v_asdi_shape = __pyx_t_3;
 1440: 
+1441:     cdef np.ndarray[np.complex128_t, ndim=2] sfy_asdi = np.PyArray_SimpleNew(2, asdi_shape, np.NPY_COMPLEX128)
  __pyx_t_2 = PyArray_SimpleNew(2, __pyx_v_asdi_shape, NPY_COMPLEX128); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1441, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1441, __pyx_L1_error)
  __pyx_t_4 = ((PyArrayObject *)__pyx_t_2);
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo___pyx_t_double_complex, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {
      __pyx_v_sfy_asdi = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf = NULL;
      __PYX_ERR(0, 1441, __pyx_L1_error)
    } else {__pyx_pybuffernd_sfy_asdi.diminfo[0].strides = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sfy_asdi.diminfo[0].shape = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_sfy_asdi.diminfo[1].strides = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_sfy_asdi.diminfo[1].shape = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.shape[1];
    }
  }
  __pyx_t_4 = 0;
  __pyx_v_sfy_asdi = ((PyArrayObject *)__pyx_t_2);
  __pyx_t_2 = 0;
/* … */
  __pyx_t_2 = PyArray_SimpleNew(2, __pyx_v_asdi_shape, NPY_COMPLEX128); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1441, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1441, __pyx_L1_error)
  __pyx_t_4 = ((PyArrayObject *)__pyx_t_2);
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo___pyx_t_double_complex, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {
      __pyx_v_sfy_asdi = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf = NULL;
      __PYX_ERR(0, 1441, __pyx_L1_error)
    } else {__pyx_pybuffernd_sfy_asdi.diminfo[0].strides = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sfy_asdi.diminfo[0].shape = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_sfy_asdi.diminfo[1].strides = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_sfy_asdi.diminfo[1].shape = __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.shape[1];
    }
  }
  __pyx_t_4 = 0;
  __pyx_v_sfy_asdi = ((PyArrayObject *)__pyx_t_2);
  __pyx_t_2 = 0;
+1442:     cdef pyfftw.FFTW fftw_obj = pyfftw.FFTW(sfy_asdi, sfy_asdi, axes=(0, 1), threads=num_threads)
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_v_sfy_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfy_asdi));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_sfy_asdi));
  __Pyx_INCREF(((PyObject *)__pyx_v_sfy_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfy_asdi));
  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_sfy_asdi));
  __pyx_t_1 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_axes, __pyx_tuple__11) < 0) __PYX_ERR(0, 1442, __pyx_L1_error)
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_num_threads); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_threads, __pyx_t_5) < 0) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_6pyrost_3bin_6pyfftw_FFTW), __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_fftw_obj = ((struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *)__pyx_t_5);
  __pyx_t_5 = 0;
/* … */
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_v_sfy_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfy_asdi));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_sfy_asdi));
  __Pyx_INCREF(((PyObject *)__pyx_v_sfy_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfy_asdi));
  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_sfy_asdi));
  __pyx_t_1 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_axes, __pyx_tuple__11) < 0) __PYX_ERR(0, 1442, __pyx_L1_error)
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_num_threads); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_threads, __pyx_t_5) < 0) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_6pyrost_3bin_6pyfftw_FFTW), __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_fftw_obj = ((struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *)__pyx_t_5);
  __pyx_t_5 = 0;
/* … */
  __pyx_tuple__11 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 1442, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
+1443:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1444:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1445:             sfy_asdi[i, j] = -sy_arr[a - i - 1, b - j - 1]
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_12 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_13)) )))), 0);
    }
  }
/* … */
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_12 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_13)) )))), 0);
    }
  }
+1446:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1447:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1448:             sfy_asdi[i + a, j] = sy_arr[i, b - j - 1]
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_13 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_12)) ))), 0);
    }
  }
/* … */
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_13 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_12)) ))), 0);
    }
  }
+1449:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1450:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1451:             sfy_asdi[i, j + b] = -sy_arr[a - i - 1, j]
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_12 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_13)) )))), 0);
    }
  }
/* … */
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_12 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_13)) )))), 0);
    }
  }
+1452:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1453:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1454:             sfy_asdi[i + a, j + b] = sy_arr[i, j]
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = __pyx_v_j;
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_13 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_12)) ))), 0);
    }
  }
/* … */
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = __pyx_v_j;
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sy_arr.data + __pyx_t_13 * __pyx_v_sy_arr.strides[0]) )) + __pyx_t_12)) ))), 0);
    }
  }
+1455:     fftw_obj._execute()
  __pyx_t_5 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__execute(__pyx_v_fftw_obj); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1455, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
  __pyx_t_5 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__execute(__pyx_v_fftw_obj); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1455, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 1456: 
+1457:     cdef np.ndarray[np.complex128_t, ndim=2] sfx_asdi = np.PyArray_SimpleNew(2, asdi_shape, np.NPY_COMPLEX128)
  __pyx_t_5 = PyArray_SimpleNew(2, __pyx_v_asdi_shape, NPY_COMPLEX128); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1457, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1457, __pyx_L1_error)
  __pyx_t_16 = ((PyArrayObject *)__pyx_t_5);
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo___pyx_t_double_complex, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {
      __pyx_v_sfx_asdi = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf = NULL;
      __PYX_ERR(0, 1457, __pyx_L1_error)
    } else {__pyx_pybuffernd_sfx_asdi.diminfo[0].strides = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sfx_asdi.diminfo[0].shape = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_sfx_asdi.diminfo[1].strides = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_sfx_asdi.diminfo[1].shape = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.shape[1];
    }
  }
  __pyx_t_16 = 0;
  __pyx_v_sfx_asdi = ((PyArrayObject *)__pyx_t_5);
  __pyx_t_5 = 0;
/* … */
  __pyx_t_5 = PyArray_SimpleNew(2, __pyx_v_asdi_shape, NPY_COMPLEX128); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1457, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1457, __pyx_L1_error)
  __pyx_t_16 = ((PyArrayObject *)__pyx_t_5);
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo___pyx_t_double_complex, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {
      __pyx_v_sfx_asdi = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf = NULL;
      __PYX_ERR(0, 1457, __pyx_L1_error)
    } else {__pyx_pybuffernd_sfx_asdi.diminfo[0].strides = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sfx_asdi.diminfo[0].shape = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_sfx_asdi.diminfo[1].strides = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_sfx_asdi.diminfo[1].shape = __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.shape[1];
    }
  }
  __pyx_t_16 = 0;
  __pyx_v_sfx_asdi = ((PyArrayObject *)__pyx_t_5);
  __pyx_t_5 = 0;
+1458:     fftw_obj._update_arrays(sfx_asdi, sfx_asdi)
  __pyx_t_5 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__update_arrays(__pyx_v_fftw_obj, ((PyArrayObject *)__pyx_v_sfx_asdi), ((PyArrayObject *)__pyx_v_sfx_asdi)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1458, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
  __pyx_t_5 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__update_arrays(__pyx_v_fftw_obj, ((PyArrayObject *)__pyx_v_sfx_asdi), ((PyArrayObject *)__pyx_v_sfx_asdi)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1458, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+1459:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1460:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1461:             sfx_asdi[i, j] = -sx_arr[a - i - 1, b - j - 1]
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_12 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_13)) )))), 0);
    }
  }
/* … */
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_12 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_13)) )))), 0);
    }
  }
+1462:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1463:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1464:             sfx_asdi[i + a, j] = -sx_arr[i, b - j - 1]
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_13 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_12)) )))), 0);
    }
  }
/* … */
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = ((__pyx_v_b - __pyx_v_j) - 1);
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((-(*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_13 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_12)) )))), 0);
    }
  }
+1465:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1466:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1467:             sfx_asdi[i, j + b] = sx_arr[a - i - 1, j]
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_12 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_13)) ))), 0);
    }
  }
/* … */
      __pyx_t_12 = ((__pyx_v_a - __pyx_v_i) - 1);
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_12 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_13)) ))), 0);
    }
  }
+1468:     for i in range(a):
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_6 = __pyx_v_a;
  __pyx_t_7 = __pyx_t_6;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1469:         for j in range(b):
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_9 = __pyx_v_b;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1470:             sfx_asdi[i + a, j + b] = sx_arr[i, j]
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = __pyx_v_j;
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float64_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_13 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_12)) ))), 0);
    }
  }
/* … */
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_12 = __pyx_v_j;
      __pyx_t_15 = (__pyx_v_i + __pyx_v_a);
      __pyx_t_14 = (__pyx_v_j + __pyx_v_b);
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __pyx_t_double_complex_from_parts((*((__pyx_t_5numpy_float32_t *) ( /* dim=1 */ ((char *) (((__pyx_t_5numpy_float32_t *) ( /* dim=0 */ (__pyx_v_sx_arr.data + __pyx_t_13 * __pyx_v_sx_arr.strides[0]) )) + __pyx_t_12)) ))), 0);
    }
  }
+1471:     fftw_obj._execute()
  __pyx_t_5 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__execute(__pyx_v_fftw_obj); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1471, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
  __pyx_t_5 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__execute(__pyx_v_fftw_obj); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1471, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 1472: 
+1473:     cdef pyfftw.FFTW ifftw_obj = pyfftw.FFTW(sfx_asdi, sfx_asdi, direction='FFTW_BACKWARD', axes=(0, 1), threads=num_threads)
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(((PyObject *)__pyx_v_sfx_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfx_asdi));
  PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_sfx_asdi));
  __Pyx_INCREF(((PyObject *)__pyx_v_sfx_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfx_asdi));
  PyTuple_SET_ITEM(__pyx_t_5, 1, ((PyObject *)__pyx_v_sfx_asdi));
  __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_direction, __pyx_n_u_FFTW_BACKWARD) < 0) __PYX_ERR(0, 1473, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_axes, __pyx_tuple__11) < 0) __PYX_ERR(0, 1473, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_threads, __pyx_t_2) < 0) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_6pyrost_3bin_6pyfftw_FFTW), __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_ifftw_obj = ((struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *)__pyx_t_2);
  __pyx_t_2 = 0;
/* … */
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(((PyObject *)__pyx_v_sfx_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfx_asdi));
  PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_sfx_asdi));
  __Pyx_INCREF(((PyObject *)__pyx_v_sfx_asdi));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_sfx_asdi));
  PyTuple_SET_ITEM(__pyx_t_5, 1, ((PyObject *)__pyx_v_sfx_asdi));
  __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_direction, __pyx_n_u_FFTW_BACKWARD) < 0) __PYX_ERR(0, 1473, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_axes, __pyx_tuple__11) < 0) __PYX_ERR(0, 1473, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_num_threads); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_threads, __pyx_t_2) < 0) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_6pyrost_3bin_6pyfftw_FFTW), __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1473, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_ifftw_obj = ((struct __pyx_obj_6pyrost_3bin_6pyfftw_FFTW *)__pyx_t_2);
  __pyx_t_2 = 0;
+1474:     cdef double xf, yf, norm = 1.0 / <double>np.PyArray_SIZE(sfx_asdi)
  __pyx_v_norm = (1.0 / ((double)PyArray_SIZE(((PyArrayObject *)__pyx_v_sfx_asdi))));
/* … */
  __pyx_v_norm = (1.0 / ((double)PyArray_SIZE(((PyArrayObject *)__pyx_v_sfx_asdi))));
+1475:     for i in range(2 * a):
  __pyx_t_17 = (2 * __pyx_v_a);
  __pyx_t_18 = __pyx_t_17;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_18; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
/* … */
  __pyx_t_17 = (2 * __pyx_v_a);
  __pyx_t_18 = __pyx_t_17;
  for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_18; __pyx_t_8+=1) {
    __pyx_v_i = __pyx_t_8;
+1476:         yf = 0.5 * <double>i / a - i // a
    __pyx_v_yf = (((0.5 * ((double)__pyx_v_i)) / ((double)__pyx_v_a)) - (__pyx_v_i / __pyx_v_a));
/* … */
    __pyx_v_yf = (((0.5 * ((double)__pyx_v_i)) / ((double)__pyx_v_a)) - (__pyx_v_i / __pyx_v_a));
+1477:         for j in range(2 * b):
    __pyx_t_19 = (2 * __pyx_v_b);
    __pyx_t_20 = __pyx_t_19;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_20; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
/* … */
    __pyx_t_19 = (2 * __pyx_v_b);
    __pyx_t_20 = __pyx_t_19;
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_20; __pyx_t_11+=1) {
      __pyx_v_j = __pyx_t_11;
+1478:             xf = 0.5 * <double>j / b - j // b
      __pyx_v_xf = (((0.5 * ((double)__pyx_v_j)) / ((double)__pyx_v_b)) - (__pyx_v_j / __pyx_v_b));
/* … */
      __pyx_v_xf = (((0.5 * ((double)__pyx_v_j)) / ((double)__pyx_v_b)) - (__pyx_v_j / __pyx_v_b));
+1479:             sfx_asdi[i, j] = norm * (sfy_asdi[i, j] * yf + sfx_asdi[i, j] * xf) / (2j * pi * (xf * xf + yf * yf))
      __pyx_t_12 = __pyx_v_i;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_21 = __pyx_v_i;
      __pyx_t_22 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __Pyx_c_quot_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(__pyx_v_norm, 0), __Pyx_c_sum_double(__Pyx_c_prod_double((*__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides)), __pyx_t_double_complex_from_parts(__pyx_v_yf, 0)), __Pyx_c_prod_double((*__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides)), __pyx_t_double_complex_from_parts(__pyx_v_xf, 0)))), __Pyx_c_prod_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(0, 2.0), __pyx_t_double_complex_from_parts(M_PI, 0)), __pyx_t_double_complex_from_parts(((__pyx_v_xf * __pyx_v_xf) + (__pyx_v_yf * __pyx_v_yf)), 0)));
    }
  }
/* … */
      __pyx_t_12 = __pyx_v_i;
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_21 = __pyx_v_i;
      __pyx_t_22 = __pyx_v_j;
      *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __Pyx_c_quot_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(__pyx_v_norm, 0), __Pyx_c_sum_double(__Pyx_c_prod_double((*__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfy_asdi.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_sfy_asdi.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_sfy_asdi.diminfo[1].strides)), __pyx_t_double_complex_from_parts(__pyx_v_yf, 0)), __Pyx_c_prod_double((*__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides)), __pyx_t_double_complex_from_parts(__pyx_v_xf, 0)))), __Pyx_c_prod_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(0, 2.0), __pyx_t_double_complex_from_parts(M_PI, 0)), __pyx_t_double_complex_from_parts(((__pyx_v_xf * __pyx_v_xf) + (__pyx_v_yf * __pyx_v_yf)), 0)));
    }
  }
+1480:     sfx_asdi[0, 0] = 0.0 + 0.0j
  __pyx_t_15 = 0;
  __pyx_t_14 = 0;
  *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __Pyx_c_sum_double(__pyx_t_double_complex_from_parts(0.0, 0), __pyx_t_double_complex_from_parts(0, 0.0));
/* … */
  __pyx_t_15 = 0;
  __pyx_t_14 = 0;
  *__Pyx_BufPtrStrided2d(__pyx_t_double_complex *, __pyx_pybuffernd_sfx_asdi.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_sfx_asdi.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_sfx_asdi.diminfo[1].strides) = __Pyx_c_sum_double(__pyx_t_double_complex_from_parts(0.0, 0), __pyx_t_double_complex_from_parts(0, 0.0));
+1481:     ifftw_obj._execute()
  __pyx_t_2 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__execute(__pyx_v_ifftw_obj); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1481, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_t_2 = __pyx_f_6pyrost_3bin_6pyfftw_4FFTW__execute(__pyx_v_ifftw_obj); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1481, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 1482: 
+1483:     return np.asarray(sfx_asdi.real[a:, b:], dtype=sx_arr.base.dtype)
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_sfx_asdi), __pyx_n_s_real); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_a); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_23 = PySlice_New(__pyx_t_5, Py_None, Py_None); if (unlikely(!__pyx_t_23)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_23);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_b); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_24 = PySlice_New(__pyx_t_5, Py_None, Py_None); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_24);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_23);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_23);
  __Pyx_GIVEREF(__pyx_t_24);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_24);
  __pyx_t_23 = 0;
  __pyx_t_24 = 0;
  __pyx_t_24 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_24);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_24);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_24);
  __pyx_t_24 = 0;
  __pyx_t_24 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_24);
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_sx_arr, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float64_t, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_base); if (unlikely(!__pyx_t_23)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_23);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_23, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_23); __pyx_t_23 = 0;
  if (PyDict_SetItem(__pyx_t_24, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, __pyx_t_24); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1483, __pyx_L1_error)
  __pyx_r = ((PyArrayObject *)__pyx_t_2);
  __pyx_t_2 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_sfx_asdi), __pyx_n_s_real); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_a); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_23 = PySlice_New(__pyx_t_5, Py_None, Py_None); if (unlikely(!__pyx_t_23)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_23);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyInt_From_Py_intptr_t(__pyx_v_b); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_24 = PySlice_New(__pyx_t_5, Py_None, Py_None); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_24);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_23);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_23);
  __Pyx_GIVEREF(__pyx_t_24);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_24);
  __pyx_t_23 = 0;
  __pyx_t_24 = 0;
  __pyx_t_24 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_24);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_24);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_24);
  __pyx_t_24 = 0;
  __pyx_t_24 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_24);
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_sx_arr, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float32_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_float32_t, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_base); if (unlikely(!__pyx_t_23)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_23);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_23, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_23); __pyx_t_23 = 0;
  if (PyDict_SetItem(__pyx_t_24, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, __pyx_t_24); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1483, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 1483, __pyx_L1_error)
  __pyx_r = ((PyArrayObject *)__pyx_t_2);
  __pyx_t_2 = 0;
  goto __pyx_L0;