Generated by Cython 3.2.8

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: mega_crank_fast.c

+0001: ## ...........................................................................
  __pyx_t_4 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_test, __pyx_t_4) < (0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 0002: ##
 0003: ## PIMMS (Polymer Interactions in Multicomponent Mixtures)
 0004: ##
 0005: ## pimms/mega_crank_fast.pyx
 0006: ##
 0007: ## Drop-in optimized replacement for pimms.mega_crank.mega_crank().
 0008: ##
 0009: ## GOAL
 0010: ## ----
 0011: ## The reference kernel (pimms/mega_crank.pyx) is correct but allocates several
 0012: ## numpy arrays *inside* the per-substep hot loop:
 0013: ##
 0014: ##   * crank_it / update_position / single_bead_crank each `np.zeros([3])`
 0015: ##   * get_angle_energy_change allocates 4 arrays (a, b, angle_positions,
 0016: ##     intcode_lookup) on EVERY call
 0017: ##
 0018: ## With CRANKSHAFT_SUBSTEPS ~ 10^4 and thousands of megamoves this is hundreds
 0019: ## of millions of heap allocations routed through the Python/numpy layer - which
 0020: ## profiling showed to be ~85% of total runtime.
 0021: ##
 0022: ## This module performs the IDENTICAL algorithm with IDENTICAL random-number
 0023: ## call ordering, but every transient buffer is a C stack array. Because the
 0024: ## RNG sequence is preserved bit-for-bit, given the same (grid, type_grid,
 0025: ## idx_to_bead, seed, ...) inputs this kernel returns the SAME (energy,
 0026: ## accepted_moves) and leaves the SAME mutated grid/type_grid/idx_to_bead as the
 0027: ## reference kernel. That makes it verifiable by exact comparison (see
 0028: ## pimms/fast_kernels/benchmark.py).
 0029: ##
 0030: ## The public signature matches pimms.mega_crank.mega_crank exactly, so it can
 0031: ## be swapped in at moves.py:184 with no other changes.
 0032: ## ...........................................................................
 0033: 
+0034: import numpy as np
  __pyx_t_1 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_numpy, 0, 0, NULL, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error)
  __pyx_t_4 = __pyx_t_1;
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_np, __pyx_t_4) < (0)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 0035: cimport numpy as cnp
+0036: cnp.import_array()
  __pyx_t_9 = __pyx_f_5numpy_import_array(); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 36, __pyx_L1_error)
 0037: 
 0038: cimport cython
 0039: from libc.math cimport exp
 0040: from libc.stdlib cimport malloc, free
 0041: from cython.parallel cimport prange
 0042: 
 0043: from pimms.cython_config cimport NUMPY_INT_TYPE
 0044: from pimms.cython_config cimport NUMPY_INT_TYPE_long
 0045: 
 0046: 
 0047: # ---- Monte-Carlo PRNG (splitmix64) --------------------------------------
 0048: # Replaces libc rand()/srand(). On macOS rand() is the weak Park-Miller MINSTD
 0049: # LCG (x -> 16807*x mod 2^31-1: short period ~2.1e9 and pronounced lattice
 0050: # structure) and is platform-dependent (glibc differs, Windows RAND_MAX=32767).
 0051: # splitmix64 has period 2^64, passes BigCrush, and is bit-identical on every
 0052: # platform. The serial kernels are single-threaded, so a module-global state is
 0053: # fine; the parallel checkerboard kernel keeps its own per-block PRNG.
 0054: cdef unsigned long long _RNG_STATE[1]   # module-global serial PRNG state (zero-init)
+0055: cdef int PRNG_MAX = 2147483647          # 2^31 - 1 (fixed, platform-independent)
  __pyx_v_5pimms_15mega_crank_fast_PRNG_MAX = 0x7FFFFFFF;
 0056: 
+0057: cdef inline void mc_seed(unsigned int seedval) noexcept nogil:
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast_mc_seed(unsigned int __pyx_v_seedval) {
/* … */
  /* function exit code */
}
+0058:     _RNG_STATE[0] = <unsigned long long>seedval
  (__pyx_v_5pimms_15mega_crank_fast__RNG_STATE[0]) = ((unsigned PY_LONG_LONG)__pyx_v_seedval);
 0059: 
+0060: cdef inline int mc_rand() noexcept nogil:
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_mc_rand(void) {
  unsigned PY_LONG_LONG __pyx_v_z;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0061:     # one splitmix64 step; return the top 31 bits -> [0, PRNG_MAX]
+0062:     _RNG_STATE[0] = _RNG_STATE[0] + <unsigned long long>0x9E3779B97F4A7C15
  (__pyx_v_5pimms_15mega_crank_fast__RNG_STATE[0]) = ((__pyx_v_5pimms_15mega_crank_fast__RNG_STATE[0]) + ((unsigned PY_LONG_LONG)0x9E3779B97F4A7C15));
+0063:     cdef unsigned long long z = _RNG_STATE[0]
  __pyx_v_z = (__pyx_v_5pimms_15mega_crank_fast__RNG_STATE[0]);
+0064:     z = (z ^ (z >> 30)) * <unsigned long long>0xBF58476D1CE4E5B9
  __pyx_v_z = ((__pyx_v_z ^ (__pyx_v_z >> 30)) * ((unsigned PY_LONG_LONG)0xBF58476D1CE4E5B9));
+0065:     z = (z ^ (z >> 27)) * <unsigned long long>0x94D049BB133111EB
  __pyx_v_z = ((__pyx_v_z ^ (__pyx_v_z >> 27)) * ((unsigned PY_LONG_LONG)0x94D049BB133111EB));
+0066:     z = z ^ (z >> 31)
  __pyx_v_z = (__pyx_v_z ^ (__pyx_v_z >> 31));
+0067:     return <int>(z >> 33)
  __pyx_r = ((int)(__pyx_v_z >> 33));
  goto __pyx_L0;
 0068: 
 0069: 
+0070: cdef inline int int_max(int a, int b) noexcept nogil: return a if a >= b else b
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_int_max(int __pyx_v_a, int __pyx_v_b) {
  int __pyx_r;
  __pyx_t_2 = (__pyx_v_a >= __pyx_v_b);
  if (__pyx_t_2) {
    __pyx_t_1 = __pyx_v_a;
  } else {
    __pyx_t_1 = __pyx_v_b;
  }
  __pyx_r = __pyx_t_1;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0071: cdef inline int int_min(int a, int b) noexcept nogil: return a if a <= b else b
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_int_min(int __pyx_v_a, int __pyx_v_b) {
  int __pyx_r;
  __pyx_t_2 = (__pyx_v_a <= __pyx_v_b);
  if (__pyx_t_2) {
    __pyx_t_1 = __pyx_v_a;
  } else {
    __pyx_t_1 = __pyx_v_b;
  }
  __pyx_r = __pyx_t_1;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0072: 
 0073: 
 0074: # -----------------------------------------------------------------
 0075: # Periodic boundary correction. Identical to the reference kernel:
 0076: # avoids the modulo on the common non-negative path.
+0077: @cython.cdivision(True)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_pbc_correction(int __pyx_v_value, int __pyx_v_DIM) {
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0078: cdef inline int pbc_correction(int value, int DIM) noexcept nogil:
+0079:     if value < 0:
  __pyx_t_1 = (__pyx_v_value < 0);
  if (__pyx_t_1) {
/* … */
  }
+0080:         return DIM + value
    __pyx_r = (__pyx_v_DIM + __pyx_v_value);
    goto __pyx_L0;
 0081:     else:
+0082:         return value % DIM
  /*else*/ {
    __pyx_r = (__pyx_v_value % __pyx_v_DIM);
    goto __pyx_L0;
  }
 0083: 
 0084: 
 0085: # -----------------------------------------------------------------
 0086: # Integer RNG. Byte-for-byte identical to pimms.mega_crank.randint so the
 0087: # random stream (and therefore every accept/reject decision) matches exactly.
+0088: cdef inline int randint(int start, int end) noexcept nogil:
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_randint(int __pyx_v_start, int __pyx_v_end) {
  int __pyx_v_r;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.randint", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
+0089:     if start == 0:
  __pyx_t_1 = (__pyx_v_start == 0);
  if (__pyx_t_1) {
/* … */
  }
+0090:         end = end + 1
    /* "pimms/mega_crank_fast.pyx":90
 * cdef inline int randint(int start, int end) noexcept nogil:
 *     if start == 0:
 *         end = end + 1             # <<<<<<<<<<<<<<
 *     # NOTE: must use double precision here. The reference kernel writes
 *     # float(rand()-1)/float(RAND_MAX), and Cython's float() is a C *double*
*/
    __pyx_v_end = (__pyx_v_end + 1);
 0091:     # NOTE: must use double precision here. The reference kernel writes
 0092:     # float(rand()-1)/float(RAND_MAX), and Cython's float() is a C *double*
 0093:     # (Python float). Using a 32-bit C float (<float>) rounds differently at
 0094:     # truncation boundaries and produces different draws for the same RNG state.
+0095:     cdef int r = start + <int>((<double>(mc_rand() - 1) / <double>PRNG_MAX) * (end))
  __pyx_t_2 = ((double)(__pyx_f_5pimms_15mega_crank_fast_mc_rand() - 1));
  if (unlikely(((double)__pyx_v_5pimms_15mega_crank_fast_PRNG_MAX) == 0)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
    __PYX_ERR(0, 95, __pyx_L1_error)
  }
  __pyx_v_r = (__pyx_v_start + ((int)((__pyx_t_2 / ((double)__pyx_v_5pimms_15mega_crank_fast_PRNG_MAX)) * __pyx_v_end)));
+0096:     return r
  __pyx_r = __pyx_v_r;
  goto __pyx_L0;
 0097: 
 0098: 
 0099: # -----------------------------------------------------------------
 0100: # Metropolis criterion. Identical to the reference: note rand() is consumed
 0101: # ONLY when new_energy > old_energy, which must be preserved to keep the
 0102: # stream aligned.
+0103: cdef inline int accept_or_reject(float invtemp, long old_energy, long new_energy) noexcept nogil:
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_accept_or_reject(float __pyx_v_invtemp, long __pyx_v_old_energy, long __pyx_v_new_energy) {
  float __pyx_v_expterm;
  float __pyx_v_randval;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.accept_or_reject", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 0104:     cdef float expterm
 0105:     cdef float randval
 0106: 
+0107:     if new_energy <= old_energy:
  __pyx_t_1 = (__pyx_v_new_energy <= __pyx_v_old_energy);
  if (__pyx_t_1) {
/* … */
  }
+0108:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
 0109: 
+0110:     expterm = exp(-(new_energy - old_energy) * invtemp)
  __pyx_v_expterm = exp(((-(__pyx_v_new_energy - __pyx_v_old_energy)) * __pyx_v_invtemp));
 0111:     # double-precision division to match the reference's float(rand())/float(RAND_MAX)
+0112:     randval = <double>mc_rand() / <double>PRNG_MAX
  __pyx_t_2 = ((double)__pyx_f_5pimms_15mega_crank_fast_mc_rand());
  if (unlikely(((double)__pyx_v_5pimms_15mega_crank_fast_PRNG_MAX) == 0)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
    __PYX_ERR(0, 112, __pyx_L1_error)
  }
  __pyx_v_randval = (__pyx_t_2 / ((double)__pyx_v_5pimms_15mega_crank_fast_PRNG_MAX));
 0113: 
+0114:     if randval < expterm:
  __pyx_t_1 = (__pyx_v_randval < __pyx_v_expterm);
  if (__pyx_t_1) {
/* … */
  }
+0115:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
 0116:     else:
+0117:         return 0
  /*else*/ {
    __pyx_r = 0;
    goto __pyx_L0;
  }
 0118: 
 0119: 
+0120: @cython.cdivision(True)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues(int __pyx_v_distance) {
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0121: cdef inline int fix_angle_pbc_issues(int distance) noexcept nogil:
+0122:     if distance < -1:
  __pyx_t_1 = (__pyx_v_distance < -1L);
  if (__pyx_t_1) {
/* … */
  }
+0123:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+0124:     elif distance > 1:
  __pyx_t_1 = (__pyx_v_distance > 1);
  if (__pyx_t_1) {
/* … */
  }
+0125:         return -1
    __pyx_r = -1;
    goto __pyx_L0;
 0126:     else:
+0127:         return distance
  /*else*/ {
    __pyx_r = __pyx_v_distance;
    goto __pyx_L0;
  }
 0128: 
 0129: 
 0130: # -----------------------------------------------------------------
 0131: # Straddle check between two lattice points (used for hardwall rejection).
 0132: # Mirrors do_positions_stradle_pbc_boundary's per-consecutive-pair test.
+0133: cdef inline int straddle_pair(int ax, int ay, int az,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_straddle_pair(int __pyx_v_ax, int __pyx_v_ay, int __pyx_v_az, int __pyx_v_bx, int __pyx_v_by, int __pyx_v_bz) {
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.straddle_pair", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 0134:                               int bx, int by, int bz) noexcept nogil:
+0135:     if abs(ax - bx) > 1:
  __pyx_t_1 = abs((__pyx_v_ax - __pyx_v_bx)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 135, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 1);
  if (__pyx_t_2) {
/* … */
  }
+0136:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+0137:     if abs(ay - by) > 1:
  __pyx_t_1 = abs((__pyx_v_ay - __pyx_v_by)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 137, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 1);
  if (__pyx_t_2) {
/* … */
  }
+0138:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+0139:     if abs(az - bz) > 1:
  __pyx_t_1 = abs((__pyx_v_az - __pyx_v_bz)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 1);
  if (__pyx_t_2) {
/* … */
  }
+0140:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+0141:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 0142: 
 0143: 
 0144: # -----------------------------------------------------------------
 0145: # Single-bead / terminal-bead proposal. Reproduces single_bead_crank ->
 0146: # update_position: three randint() draws (x, y, z order) then a hardsphere
 0147: # test. Writes the proposed position into out[3]; returns 1 on success, 0 if
 0148: # the target site is occupied (out[0] set to -1, matching the reference).
+0149: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_c(int __pyx_v_ox, int __pyx_v_oy, int __pyx_v_oz, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int *__pyx_v_out) {
  int __pyx_v_x_off;
  int __pyx_v_y_off;
  int __pyx_v_z_off;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_v_local_z;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0150: @cython.boundscheck(False)
 0151: cdef inline int single_bead_crank_c(int ox, int oy, int oz,
 0152:                                     NUMPY_INT_TYPE[:, :, :] grid,
 0153:                                     int XDIM, int YDIM, int ZDIM,
 0154:                                     int* out) noexcept nogil:
+0155:     cdef int x_off = randint(0, 2) - 1
  __pyx_v_x_off = (__pyx_f_5pimms_15mega_crank_fast_randint(0, 2) - 1);
+0156:     cdef int y_off = randint(0, 2) - 1
  __pyx_v_y_off = (__pyx_f_5pimms_15mega_crank_fast_randint(0, 2) - 1);
+0157:     cdef int z_off = randint(0, 2) - 1
  __pyx_v_z_off = (__pyx_f_5pimms_15mega_crank_fast_randint(0, 2) - 1);
 0158: 
+0159:     cdef int local_x = pbc_correction(ox + x_off, XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_ox + __pyx_v_x_off), __pyx_v_XDIM);
+0160:     cdef int local_y = pbc_correction(oy + y_off, YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_oy + __pyx_v_y_off), __pyx_v_YDIM);
+0161:     cdef int local_z = pbc_correction(oz + z_off, ZDIM)
  __pyx_v_local_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_oz + __pyx_v_z_off), __pyx_v_ZDIM);
 0162: 
+0163:     if grid[local_x, local_y, local_z] > 0:
  __pyx_t_1 = __pyx_v_local_x;
  __pyx_t_2 = __pyx_v_local_y;
  __pyx_t_3 = __pyx_v_local_z;
  __pyx_t_4 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_grid.strides[2]) ))) > 0);
  if (__pyx_t_4) {
/* … */
  }
+0164:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+0165:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+0166:         out[2] = 0
    (__pyx_v_out[2]) = 0;
+0167:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
 0168: 
+0169:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+0170:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+0171:     out[2] = local_z
  (__pyx_v_out[2]) = __pyx_v_local_z;
+0172:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 0173: 
 0174: 
 0175: # -----------------------------------------------------------------
 0176: # Internal-bead crankshaft proposal. Reproduces crank_it exactly: the
 0177: # de-periodisation of the N/C anchors, the constrained box, then three
 0178: # randint() draws (x, y, z order). Only the N-side (index 0) and C-side
 0179: # (index 2) of the triptic are needed - the moved bead itself is unused.
+0180: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_crank_it_c(int __pyx_v_N_side_x, int __pyx_v_N_side_y, int __pyx_v_N_side_z, int __pyx_v_C_side_x, int __pyx_v_C_side_y, int __pyx_v_C_side_z, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int *__pyx_v_out) {
  int __pyx_v_x_min;
  int __pyx_v_x_max;
  int __pyx_v_y_min;
  int __pyx_v_y_max;
  int __pyx_v_z_min;
  int __pyx_v_z_max;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_v_local_z;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.crank_it_c", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 0181: @cython.boundscheck(False)
 0182: cdef inline int crank_it_c(int N_side_x, int N_side_y, int N_side_z,
 0183:                            int C_side_x, int C_side_y, int C_side_z,
 0184:                            NUMPY_INT_TYPE[:, :, :] grid,
 0185:                            int XDIM, int YDIM, int ZDIM,
 0186:                            int* out) noexcept nogil:
 0187:     cdef int x_min, x_max, y_min, y_max, z_min, z_max
 0188:     cdef int local_x, local_y, local_z
 0189: 
 0190:     # de-periodise: if anchors are >2 apart in a dim they straddle the PBC,
 0191:     # so lift the smaller into the 'fake' extended space.
+0192:     if abs(N_side_x - C_side_x) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_x - __pyx_v_C_side_x)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 192, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+0193:         if N_side_x > C_side_x:
    __pyx_t_2 = (__pyx_v_N_side_x > __pyx_v_C_side_x);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L4;
    }
+0194:             C_side_x = C_side_x + XDIM
      __pyx_v_C_side_x = (__pyx_v_C_side_x + __pyx_v_XDIM);
 0195:         else:
+0196:             N_side_x = N_side_x + XDIM
    /*else*/ {
      __pyx_v_N_side_x = (__pyx_v_N_side_x + __pyx_v_XDIM);
    }
    __pyx_L4:;
 0197: 
+0198:     if abs(N_side_y - C_side_y) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_y - __pyx_v_C_side_y)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 198, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+0199:         if N_side_y > C_side_y:
    __pyx_t_2 = (__pyx_v_N_side_y > __pyx_v_C_side_y);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L6;
    }
+0200:             C_side_y = C_side_y + YDIM
      __pyx_v_C_side_y = (__pyx_v_C_side_y + __pyx_v_YDIM);
 0201:         else:
+0202:             N_side_y = N_side_y + YDIM
    /*else*/ {
      __pyx_v_N_side_y = (__pyx_v_N_side_y + __pyx_v_YDIM);
    }
    __pyx_L6:;
 0203: 
+0204:     if abs(N_side_z - C_side_z) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_z - __pyx_v_C_side_z)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 204, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+0205:         if N_side_z > C_side_z:
    __pyx_t_2 = (__pyx_v_N_side_z > __pyx_v_C_side_z);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L8;
    }
+0206:             C_side_z = C_side_z + ZDIM
      __pyx_v_C_side_z = (__pyx_v_C_side_z + __pyx_v_ZDIM);
 0207:         else:
+0208:             N_side_z = N_side_z + ZDIM
    /*else*/ {
      __pyx_v_N_side_z = (__pyx_v_N_side_z + __pyx_v_ZDIM);
    }
    __pyx_L8:;
 0209: 
+0210:     x_min = int_max(N_side_x - 1, C_side_x - 1)
  __pyx_v_x_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_x - 1), (__pyx_v_C_side_x - 1));
+0211:     x_max = int_min(N_side_x + 1, C_side_x + 1)
  __pyx_v_x_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_x + 1), (__pyx_v_C_side_x + 1));
+0212:     y_min = int_max(N_side_y - 1, C_side_y - 1)
  __pyx_v_y_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_y - 1), (__pyx_v_C_side_y - 1));
+0213:     y_max = int_min(N_side_y + 1, C_side_y + 1)
  __pyx_v_y_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_y + 1), (__pyx_v_C_side_y + 1));
+0214:     z_min = int_max(N_side_z - 1, C_side_z - 1)
  __pyx_v_z_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_z - 1), (__pyx_v_C_side_z - 1));
+0215:     z_max = int_min(N_side_z + 1, C_side_z + 1)
  __pyx_v_z_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_z + 1), (__pyx_v_C_side_z + 1));
 0216: 
+0217:     local_x = pbc_correction((x_min + randint(1, (x_max - x_min + 1)) - 1), XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_x_min + __pyx_f_5pimms_15mega_crank_fast_randint(1, ((__pyx_v_x_max - __pyx_v_x_min) + 1))) - 1), __pyx_v_XDIM);
+0218:     local_y = pbc_correction((y_min + randint(1, (y_max - y_min + 1)) - 1), YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_y_min + __pyx_f_5pimms_15mega_crank_fast_randint(1, ((__pyx_v_y_max - __pyx_v_y_min) + 1))) - 1), __pyx_v_YDIM);
+0219:     local_z = pbc_correction((z_min + randint(1, (z_max - z_min + 1)) - 1), ZDIM)
  __pyx_v_local_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_z_min + __pyx_f_5pimms_15mega_crank_fast_randint(1, ((__pyx_v_z_max - __pyx_v_z_min) + 1))) - 1), __pyx_v_ZDIM);
 0220: 
+0221:     if grid[local_x, local_y, local_z] > 0:
  __pyx_t_3 = __pyx_v_local_x;
  __pyx_t_4 = __pyx_v_local_y;
  __pyx_t_5 = __pyx_v_local_z;
  __pyx_t_2 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ) + __pyx_t_5 * __pyx_v_grid.strides[2]) ))) > 0);
  if (__pyx_t_2) {
/* … */
  }
+0222:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+0223:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+0224:         out[2] = 0
    (__pyx_v_out[2]) = 0;
+0225:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
 0226: 
+0227:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+0228:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+0229:     out[2] = local_z
  (__pyx_v_out[2]) = __pyx_v_local_z;
+0230:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 0231: 
 0232: 
 0233: # -----------------------------------------------------------------
 0234: # Angle-energy delta. Identical maths to get_angle_energy_change but with C
 0235: # stack arrays in place of the four per-call numpy allocations.
+0236: @cython.wraparound(False)
static long __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c(int __pyx_v_bead_index, __Pyx_memviewslice __pyx_v_idx_to_bead, int *__pyx_v_new_position, __Pyx_memviewslice __pyx_v_angle_lookup) {
  int __pyx_v_a0;
  int __pyx_v_a1;
  int __pyx_v_a2;
  int __pyx_v_b0;
  int __pyx_v_b1;
  int __pyx_v_b2;
  long __pyx_v_angle_penalty_new;
  long __pyx_v_angle_penalty_old;
  int __pyx_v_angle_positions[5][3];
  int __pyx_v_intcode_lookup[5];
  int __pyx_v_offset;
  int __pyx_v_offset_start;
  int __pyx_v_offset_end;
  int __pyx_v_i;
  int __pyx_v_pos;
  int __pyx_v_angle_idx;
  int __pyx_v_local_move_idx;
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0237: @cython.boundscheck(False)
 0238: cdef long get_angle_energy_change_c(int bead_index,
 0239:                                     NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 0240:                                     int* new_position,
 0241:                                     NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup) noexcept nogil:
 0242: 
+0243:     if idx_to_bead[bead_index, 3] == 1:
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 3;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) ))) == 1);
  if (__pyx_t_3) {
/* … */
  }
+0244:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
 0245: 
 0246:     cdef int a0, a1, a2, b0, b1, b2
+0247:     cdef long angle_penalty_new = 0
  __pyx_v_angle_penalty_new = 0;
+0248:     cdef long angle_penalty_old = 0
  __pyx_v_angle_penalty_old = 0;
 0249: 
 0250:     cdef int angle_positions[5][3]
 0251:     cdef int intcode_lookup[5]
 0252: 
 0253:     cdef int offset, offset_start, offset_end, i, pos
 0254:     cdef int angle_idx
+0255:     cdef int local_move_idx = -1
  __pyx_v_local_move_idx = -1;
 0256: 
+0257:     if idx_to_bead[bead_index, 0] == 1:
  __pyx_t_2 = __pyx_v_bead_index;
  __pyx_t_1 = 0;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))) == 1);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L4;
  }
+0258:         offset_start = 0
    __pyx_v_offset_start = 0;
+0259:         offset_end = 3
    __pyx_v_offset_end = 3;
+0260:     elif idx_to_bead[bead_index, 0] == 2:
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 0;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) ))) == 2);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L4;
  }
+0261:         offset_start = -2
    __pyx_v_offset_start = -2;
+0262:         offset_end = 3
    __pyx_v_offset_end = 3;
+0263:     elif idx_to_bead[bead_index, 0] == 4:
  __pyx_t_2 = __pyx_v_bead_index;
  __pyx_t_1 = 0;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))) == 4);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L4;
  }
+0264:         offset_start = -1
    __pyx_v_offset_start = -1;
+0265:         offset_end = 2
    __pyx_v_offset_end = 2;
+0266:     elif idx_to_bead[bead_index, 0] == 3:
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 0;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) ))) == 3);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L4;
  }
+0267:         offset_start = -2
    __pyx_v_offset_start = -2;
+0268:         offset_end = 1
    __pyx_v_offset_end = 1;
+0269:     elif idx_to_bead[bead_index, 0] == 5:
  __pyx_t_2 = __pyx_v_bead_index;
  __pyx_t_1 = 0;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))) == 5);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L4;
  }
+0270:         offset_start = -1
    __pyx_v_offset_start = -1;
+0271:         offset_end = 3
    __pyx_v_offset_end = 3;
+0272:     elif idx_to_bead[bead_index, 0] == 6:
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 0;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) ))) == 6);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L4;
  }
+0273:         offset_start = -2
    __pyx_v_offset_start = -2;
+0274:         offset_end = 2
    __pyx_v_offset_end = 2;
 0275:     else:
 0276:         # single bead (flag 0) never reaches here in the reference because the
 0277:         # skip-angle flag short-circuits; keep a safe default.
+0278:         offset_start = 0
  /*else*/ {
    __pyx_v_offset_start = 0;
+0279:         offset_end = 0
    __pyx_v_offset_end = 0;
  }
  __pyx_L4:;
 0280: 
+0281:     angle_idx = 0
  __pyx_v_angle_idx = 0;
+0282:     for offset in range(offset_start, offset_end):
  __pyx_t_4 = __pyx_v_offset_end;
  __pyx_t_5 = __pyx_t_4;
  for (__pyx_t_6 = __pyx_v_offset_start; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
    __pyx_v_offset = __pyx_t_6;
+0283:         pos = bead_index + offset
    __pyx_v_pos = (__pyx_v_bead_index + __pyx_v_offset);
+0284:         angle_positions[angle_idx][0] = idx_to_bead[pos, 5]
    __pyx_t_2 = __pyx_v_pos;
    __pyx_t_1 = 5;
    ((__pyx_v_angle_positions[__pyx_v_angle_idx])[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+0285:         angle_positions[angle_idx][1] = idx_to_bead[pos, 6]
    __pyx_t_1 = __pyx_v_pos;
    __pyx_t_2 = 6;
    ((__pyx_v_angle_positions[__pyx_v_angle_idx])[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) )));
+0286:         angle_positions[angle_idx][2] = idx_to_bead[pos, 7]
    __pyx_t_2 = __pyx_v_pos;
    __pyx_t_1 = 7;
    ((__pyx_v_angle_positions[__pyx_v_angle_idx])[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+0287:         intcode_lookup[angle_idx] = idx_to_bead[pos, 2]
    __pyx_t_1 = __pyx_v_pos;
    __pyx_t_2 = 2;
    (__pyx_v_intcode_lookup[__pyx_v_angle_idx]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) )));
+0288:         if pos == bead_index:
    __pyx_t_3 = (__pyx_v_pos == __pyx_v_bead_index);
    if (__pyx_t_3) {
/* … */
    }
+0289:             local_move_idx = angle_idx
      __pyx_v_local_move_idx = __pyx_v_angle_idx;
+0290:         angle_idx = angle_idx + 1
    __pyx_v_angle_idx = (__pyx_v_angle_idx + 1);
  }
 0291: 
 0292:     # old configuration
+0293:     for i in range(0, angle_idx - 2):
  __pyx_t_7 = (__pyx_v_angle_idx - 2);
  __pyx_t_8 = __pyx_t_7;
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_8; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;
+0294:         a0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i][0])
    __pyx_v_a0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[__pyx_v_i])[0])));
+0295:         a1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i][1])
    __pyx_v_a1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[__pyx_v_i])[1])));
+0296:         a2 = fix_angle_pbc_issues(angle_positions[i + 1][2] - angle_positions[i][2])
    __pyx_v_a2 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[2]) - ((__pyx_v_angle_positions[__pyx_v_i])[2])));
 0297: 
+0298:         b0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i + 2][0])
    __pyx_v_b0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[0])));
+0299:         b1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i + 2][1])
    __pyx_v_b1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[1])));
+0300:         b2 = fix_angle_pbc_issues(angle_positions[i + 1][2] - angle_positions[i + 2][2])
    __pyx_v_b2 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[2]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[2])));
 0301: 
+0302:         angle_penalty_old = angle_lookup[intcode_lookup[i + 1], a0 + 1, a1 + 1, a2 + 1, b0 + 1, b1 + 1, b2 + 1] + angle_penalty_old
    __pyx_t_2 = (__pyx_v_intcode_lookup[(__pyx_v_i + 1)]);
    __pyx_t_1 = (__pyx_v_a0 + 1);
    __pyx_t_9 = (__pyx_v_a1 + 1);
    __pyx_t_10 = (__pyx_v_a2 + 1);
    __pyx_t_11 = (__pyx_v_b0 + 1);
    __pyx_t_12 = (__pyx_v_b1 + 1);
    __pyx_t_13 = (__pyx_v_b2 + 1);
    __pyx_v_angle_penalty_old = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=6 */ (( /* dim=5 */ (( /* dim=4 */ (( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angle_lookup.data + __pyx_t_2 * __pyx_v_angle_lookup.strides[0]) ) + __pyx_t_1 * __pyx_v_angle_lookup.strides[1]) ) + __pyx_t_9 * __pyx_v_angle_lookup.strides[2]) ) + __pyx_t_10 * __pyx_v_angle_lookup.strides[3]) ) + __pyx_t_11 * __pyx_v_angle_lookup.strides[4]) ) + __pyx_t_12 * __pyx_v_angle_lookup.strides[5]) ) + __pyx_t_13 * __pyx_v_angle_lookup.strides[6]) ))) + __pyx_v_angle_penalty_old);
  }
 0303: 
 0304:     # move the central bead to the proposed position
+0305:     if local_move_idx >= 0:
  __pyx_t_3 = (__pyx_v_local_move_idx >= 0);
  if (__pyx_t_3) {
/* … */
  }
+0306:         angle_positions[local_move_idx][0] = new_position[0]
    ((__pyx_v_angle_positions[__pyx_v_local_move_idx])[0]) = (__pyx_v_new_position[0]);
+0307:         angle_positions[local_move_idx][1] = new_position[1]
    ((__pyx_v_angle_positions[__pyx_v_local_move_idx])[1]) = (__pyx_v_new_position[1]);
+0308:         angle_positions[local_move_idx][2] = new_position[2]
    ((__pyx_v_angle_positions[__pyx_v_local_move_idx])[2]) = (__pyx_v_new_position[2]);
 0309: 
 0310:     # new configuration
+0311:     for i in range(0, angle_idx - 2):
  __pyx_t_7 = (__pyx_v_angle_idx - 2);
  __pyx_t_8 = __pyx_t_7;
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_8; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;
+0312:         a0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i][0])
    __pyx_v_a0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[__pyx_v_i])[0])));
+0313:         a1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i][1])
    __pyx_v_a1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[__pyx_v_i])[1])));
+0314:         a2 = fix_angle_pbc_issues(angle_positions[i + 1][2] - angle_positions[i][2])
    __pyx_v_a2 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[2]) - ((__pyx_v_angle_positions[__pyx_v_i])[2])));
 0315: 
+0316:         b0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i + 2][0])
    __pyx_v_b0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[0])));
+0317:         b1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i + 2][1])
    __pyx_v_b1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[1])));
+0318:         b2 = fix_angle_pbc_issues(angle_positions[i + 1][2] - angle_positions[i + 2][2])
    __pyx_v_b2 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[2]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[2])));
 0319: 
+0320:         angle_penalty_new = angle_lookup[intcode_lookup[i + 1], a0 + 1, a1 + 1, a2 + 1, b0 + 1, b1 + 1, b2 + 1] + angle_penalty_new
    __pyx_t_13 = (__pyx_v_intcode_lookup[(__pyx_v_i + 1)]);
    __pyx_t_12 = (__pyx_v_a0 + 1);
    __pyx_t_11 = (__pyx_v_a1 + 1);
    __pyx_t_10 = (__pyx_v_a2 + 1);
    __pyx_t_9 = (__pyx_v_b0 + 1);
    __pyx_t_1 = (__pyx_v_b1 + 1);
    __pyx_t_2 = (__pyx_v_b2 + 1);
    __pyx_v_angle_penalty_new = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=6 */ (( /* dim=5 */ (( /* dim=4 */ (( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angle_lookup.data + __pyx_t_13 * __pyx_v_angle_lookup.strides[0]) ) + __pyx_t_12 * __pyx_v_angle_lookup.strides[1]) ) + __pyx_t_11 * __pyx_v_angle_lookup.strides[2]) ) + __pyx_t_10 * __pyx_v_angle_lookup.strides[3]) ) + __pyx_t_9 * __pyx_v_angle_lookup.strides[4]) ) + __pyx_t_1 * __pyx_v_angle_lookup.strides[5]) ) + __pyx_t_2 * __pyx_v_angle_lookup.strides[6]) ))) + __pyx_v_angle_penalty_new);
  }
 0321: 
+0322:     return angle_penalty_new - angle_penalty_old
  __pyx_r = (__pyx_v_angle_penalty_new - __pyx_v_angle_penalty_old);
  goto __pyx_L0;
 0323: 
 0324: 
 0325: # -----------------------------------------------------------------
 0326: # Short/long-range interaction-energy delta. Same logic as get_energy_change,
 0327: # operating on plain ints rather than numpy position arrays. type_grid is
 0328: # temporarily mutated and restored exactly as in the reference.
+0329: @cython.wraparound(False)
static long __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(CYTHON_UNUSED __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, int __pyx_v_old_x, int __pyx_v_old_y, int __pyx_v_old_z, int __pyx_v_new_x, int __pyx_v_new_y, int __pyx_v_new_z, int __pyx_v_LR_vs_SR, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int __pyx_v_hardwall) {
  long __pyx_v_energy_old;
  long __pyx_v_energy_old_empty;
  long __pyx_v_energy_new;
  long __pyx_v_energy_new_empty;
  int __pyx_v_tmp_x;
  int __pyx_v_tmp_y;
  int __pyx_v_tmp_z;
  int __pyx_v_x;
  int __pyx_v_y;
  int __pyx_v_z;
  unsigned int __pyx_v_site_bead_type;
  unsigned int __pyx_v_bead_type;
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.get_energy_change_c", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 0330: @cython.boundscheck(False)
 0331: cdef long get_energy_change_c(NUMPY_INT_TYPE[:, :, :] grid,
 0332:                               NUMPY_INT_TYPE[:, :, :] type_grid,
 0333:                               int old_x, int old_y, int old_z,
 0334:                               int new_x, int new_y, int new_z,
 0335:                               int LR_vs_SR,
 0336:                               NUMPY_INT_TYPE[:, :] interaction_table,
 0337:                               NUMPY_INT_TYPE[:, :] LR_interaction_table,
 0338:                               NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 0339:                               int XDIM, int YDIM, int ZDIM,
 0340:                               int hardwall) noexcept nogil:
 0341: 
+0342:     cdef long energy_old = 0
  __pyx_v_energy_old = 0;
+0343:     cdef long energy_old_empty = 0
  __pyx_v_energy_old_empty = 0;
+0344:     cdef long energy_new = 0
  __pyx_v_energy_new = 0;
+0345:     cdef long energy_new_empty = 0
  __pyx_v_energy_new_empty = 0;
 0346: 
 0347:     cdef int tmp_x, tmp_y, tmp_z
 0348:     cdef int x, y, z
 0349:     cdef unsigned int site_bead_type, bead_type
 0350: 
+0351:     bead_type = type_grid[old_x, old_y, old_z]
  __pyx_t_1 = __pyx_v_old_x;
  __pyx_t_2 = __pyx_v_old_y;
  __pyx_t_3 = __pyx_v_old_z;
  __pyx_v_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )));
 0352: 
+0353:     if LR_vs_SR == 1:
  __pyx_t_4 = (__pyx_v_LR_vs_SR == 1);
  if (__pyx_t_4) {
/* … */
    goto __pyx_L3;
  }
 0354:         # ---- old energy over the 7x7x7 neighbourhood ----
+0355:         for x in range(-3, 4):
    for (__pyx_t_5 = -3; __pyx_t_5 < 4; __pyx_t_5+=1) {
      __pyx_v_x = __pyx_t_5;
+0356:             for y in range(-3, 4):
      for (__pyx_t_6 = -3; __pyx_t_6 < 4; __pyx_t_6+=1) {
        __pyx_v_y = __pyx_t_6;
+0357:                 for z in range(-3, 4):
        for (__pyx_t_7 = -3; __pyx_t_7 < 4; __pyx_t_7+=1) {
          __pyx_v_z = __pyx_t_7;
+0358:                     tmp_x = pbc_correction(old_x + x, XDIM)
          __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_x + __pyx_v_x), __pyx_v_XDIM);
+0359:                     tmp_y = pbc_correction(old_y + y, YDIM)
          __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_y + __pyx_v_y), __pyx_v_YDIM);
+0360:                     tmp_z = pbc_correction(old_z + z, ZDIM)
          __pyx_v_tmp_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_z + __pyx_v_z), __pyx_v_ZDIM);
+0361:                     site_bead_type = type_grid[tmp_x, tmp_y, tmp_z]
          __pyx_t_3 = __pyx_v_tmp_x;
          __pyx_t_2 = __pyx_v_tmp_y;
          __pyx_t_1 = __pyx_v_tmp_z;
          __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_3 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )));
 0362: 
+0363:                     if abs(x) < 2 and abs(y) < 2 and abs(z) < 2:
          __pyx_t_8 = abs(__pyx_v_x); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 363, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 2);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L11_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_y); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 363, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 2);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L11_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_z); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 363, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 2);
          __pyx_t_4 = __pyx_t_9;
          __pyx_L11_bool_binop_done:;
          if (__pyx_t_4) {
/* … */
            goto __pyx_L10;
          }
+0364:                         if hardwall == 1:
            __pyx_t_4 = (__pyx_v_hardwall == 1);
            if (__pyx_t_4) {
/* … */
            }
+0365:                             if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3 or abs(tmp_z - old_z) > 3:
              __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 365, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L16_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 365, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L16_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_old_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 365, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              __pyx_t_4 = __pyx_t_9;
              __pyx_L16_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
+0366:                                 site_bead_type = 0
                __pyx_v_site_bead_type = 0;
+0367:                         energy_old = energy_old + interaction_table[bead_type, site_bead_type]
            __pyx_t_10 = __pyx_v_bead_type;
            __pyx_t_11 = __pyx_v_site_bead_type;
            __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_10 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_interaction_table.strides[1]) ))));
+0368:                         if site_bead_type > 0:
            __pyx_t_4 = (__pyx_v_site_bead_type > 0);
            if (__pyx_t_4) {
/* … */
            }
+0369:                             energy_old_empty = energy_old_empty + interaction_table[0, site_bead_type]
              __pyx_t_1 = 0;
              __pyx_t_11 = __pyx_v_site_bead_type;
              __pyx_v_energy_old_empty = (__pyx_v_energy_old_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_1 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_interaction_table.strides[1]) ))));
+0370:                     elif abs(x) < 3 and abs(y) < 3 and abs(z) < 3:
          __pyx_t_8 = abs(__pyx_v_x); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 370, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 3);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_y); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 370, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 3);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L20_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_z); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 370, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 3);
          __pyx_t_4 = __pyx_t_9;
          __pyx_L20_bool_binop_done:;
          if (__pyx_t_4) {
/* … */
            goto __pyx_L10;
          }
+0371:                         if hardwall == 1:
            __pyx_t_4 = (__pyx_v_hardwall == 1);
            if (__pyx_t_4) {
/* … */
            }
+0372:                             if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3 or abs(tmp_z - old_z) > 3:
              __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 372, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L25_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 372, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L25_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_old_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 372, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              __pyx_t_4 = __pyx_t_9;
              __pyx_L25_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
+0373:                                 continue
                goto __pyx_L8_continue;
+0374:                         energy_old = energy_old + LR_interaction_table[bead_type, site_bead_type]
            __pyx_t_11 = __pyx_v_bead_type;
            __pyx_t_10 = __pyx_v_site_bead_type;
            __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_LR_interaction_table.data + __pyx_t_11 * __pyx_v_LR_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_LR_interaction_table.strides[1]) ))));
 0375:                     else:
+0376:                         if hardwall == 1:
          /*else*/ {
            __pyx_t_4 = (__pyx_v_hardwall == 1);
            if (__pyx_t_4) {
/* … */
            }
+0377:                             if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3 or abs(tmp_z - old_z) > 3:
              __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 377, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L30_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 377, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L30_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_old_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 377, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              __pyx_t_4 = __pyx_t_9;
              __pyx_L30_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
+0378:                                 continue
                goto __pyx_L8_continue;
+0379:                         energy_old = energy_old + SLR_interaction_table[bead_type, site_bead_type]
            __pyx_t_10 = __pyx_v_bead_type;
            __pyx_t_11 = __pyx_v_site_bead_type;
            __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_SLR_interaction_table.data + __pyx_t_10 * __pyx_v_SLR_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_SLR_interaction_table.strides[1]) ))));
          }
          __pyx_L10:;
          __pyx_L8_continue:;
        }
      }
    }
 0380: 
+0381:         type_grid[new_x, new_y, new_z] = type_grid[old_x, old_y, old_z]
    __pyx_t_1 = __pyx_v_old_x;
    __pyx_t_2 = __pyx_v_old_y;
    __pyx_t_3 = __pyx_v_old_z;
    __pyx_t_12 = __pyx_v_new_x;
    __pyx_t_13 = __pyx_v_new_y;
    __pyx_t_14 = __pyx_v_new_z;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_12 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_13 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_14 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )));
+0382:         type_grid[old_x, old_y, old_z] = 0
    __pyx_t_3 = __pyx_v_old_x;
    __pyx_t_2 = __pyx_v_old_y;
    __pyx_t_1 = __pyx_v_old_z;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_3 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )) = 0;
 0383: 
 0384:         # ---- new energy ----
+0385:         for x in range(-3, 4):
    for (__pyx_t_5 = -3; __pyx_t_5 < 4; __pyx_t_5+=1) {
      __pyx_v_x = __pyx_t_5;
+0386:             for y in range(-3, 4):
      for (__pyx_t_6 = -3; __pyx_t_6 < 4; __pyx_t_6+=1) {
        __pyx_v_y = __pyx_t_6;
+0387:                 for z in range(-3, 4):
        for (__pyx_t_7 = -3; __pyx_t_7 < 4; __pyx_t_7+=1) {
          __pyx_v_z = __pyx_t_7;
+0388:                     tmp_x = pbc_correction(new_x + x, XDIM)
          __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_x + __pyx_v_x), __pyx_v_XDIM);
+0389:                     tmp_y = pbc_correction(new_y + y, YDIM)
          __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_y + __pyx_v_y), __pyx_v_YDIM);
+0390:                     tmp_z = pbc_correction(new_z + z, ZDIM)
          __pyx_v_tmp_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_z + __pyx_v_z), __pyx_v_ZDIM);
+0391:                     site_bead_type = type_grid[tmp_x, tmp_y, tmp_z]
          __pyx_t_1 = __pyx_v_tmp_x;
          __pyx_t_2 = __pyx_v_tmp_y;
          __pyx_t_3 = __pyx_v_tmp_z;
          __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )));
 0392: 
+0393:                     if abs(x) < 2 and abs(y) < 2 and abs(z) < 2:
          __pyx_t_8 = abs(__pyx_v_x); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 393, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 2);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L40_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_y); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 393, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 2);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L40_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_z); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 393, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 2);
          __pyx_t_4 = __pyx_t_9;
          __pyx_L40_bool_binop_done:;
          if (__pyx_t_4) {
/* … */
            goto __pyx_L39;
          }
+0394:                         if hardwall == 1:
            __pyx_t_4 = (__pyx_v_hardwall == 1);
            if (__pyx_t_4) {
/* … */
            }
+0395:                             if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3 or abs(tmp_z - new_z) > 3:
              __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 395, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L45_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 395, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L45_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_new_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 395, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              __pyx_t_4 = __pyx_t_9;
              __pyx_L45_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
+0396:                                 site_bead_type = 0
                __pyx_v_site_bead_type = 0;
+0397:                         energy_new = energy_new + interaction_table[bead_type, site_bead_type]
            __pyx_t_11 = __pyx_v_bead_type;
            __pyx_t_10 = __pyx_v_site_bead_type;
            __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_11 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_interaction_table.strides[1]) ))));
+0398:                         if site_bead_type > 0:
            __pyx_t_4 = (__pyx_v_site_bead_type > 0);
            if (__pyx_t_4) {
/* … */
            }
+0399:                             energy_new_empty = energy_new_empty + interaction_table[0, site_bead_type]
              __pyx_t_3 = 0;
              __pyx_t_10 = __pyx_v_site_bead_type;
              __pyx_v_energy_new_empty = (__pyx_v_energy_new_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_3 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_interaction_table.strides[1]) ))));
+0400:                     elif abs(x) < 3 and abs(y) < 3 and abs(z) < 3:
          __pyx_t_8 = abs(__pyx_v_x); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 400, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 3);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L49_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_y); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 400, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 3);
          if (__pyx_t_9) {
          } else {
            __pyx_t_4 = __pyx_t_9;
            goto __pyx_L49_bool_binop_done;
          }
          __pyx_t_8 = abs(__pyx_v_z); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 400, __pyx_L1_error)
          __pyx_t_9 = (__pyx_t_8 < 3);
          __pyx_t_4 = __pyx_t_9;
          __pyx_L49_bool_binop_done:;
          if (__pyx_t_4) {
/* … */
            goto __pyx_L39;
          }
+0401:                         if hardwall == 1:
            __pyx_t_4 = (__pyx_v_hardwall == 1);
            if (__pyx_t_4) {
/* … */
            }
+0402:                             if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3 or abs(tmp_z - new_z) > 3:
              __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 402, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L54_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 402, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L54_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_new_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 402, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              __pyx_t_4 = __pyx_t_9;
              __pyx_L54_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
+0403:                                 continue
                goto __pyx_L37_continue;
+0404:                         energy_new = energy_new + LR_interaction_table[bead_type, site_bead_type]
            __pyx_t_10 = __pyx_v_bead_type;
            __pyx_t_11 = __pyx_v_site_bead_type;
            __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_LR_interaction_table.data + __pyx_t_10 * __pyx_v_LR_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_LR_interaction_table.strides[1]) ))));
 0405:                     else:
+0406:                         if hardwall == 1:
          /*else*/ {
            __pyx_t_4 = (__pyx_v_hardwall == 1);
            if (__pyx_t_4) {
/* … */
            }
+0407:                             if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3 or abs(tmp_z - new_z) > 3:
              __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 407, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L59_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 407, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              if (!__pyx_t_9) {
              } else {
                __pyx_t_4 = __pyx_t_9;
                goto __pyx_L59_bool_binop_done;
              }
              __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_new_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 407, __pyx_L1_error)
              __pyx_t_9 = (__pyx_t_8 > 3);
              __pyx_t_4 = __pyx_t_9;
              __pyx_L59_bool_binop_done:;
              if (__pyx_t_4) {
/* … */
              }
+0408:                                 continue
                goto __pyx_L37_continue;
+0409:                         energy_new = energy_new + SLR_interaction_table[bead_type, site_bead_type]
            __pyx_t_11 = __pyx_v_bead_type;
            __pyx_t_10 = __pyx_v_site_bead_type;
            __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_SLR_interaction_table.data + __pyx_t_11 * __pyx_v_SLR_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_SLR_interaction_table.strides[1]) ))));
          }
          __pyx_L39:;
          __pyx_L37_continue:;
        }
      }
    }
 0410: 
 0411:     else:
 0412:         # ---- short-range only: 3x3x3 ----
+0413:         for x in range(-1, 2):
  /*else*/ {
    for (__pyx_t_5 = -1; __pyx_t_5 < 2; __pyx_t_5+=1) {
      __pyx_v_x = __pyx_t_5;
+0414:             for y in range(-1, 2):
      for (__pyx_t_6 = -1; __pyx_t_6 < 2; __pyx_t_6+=1) {
        __pyx_v_y = __pyx_t_6;
+0415:                 for z in range(-1, 2):
        for (__pyx_t_7 = -1; __pyx_t_7 < 2; __pyx_t_7+=1) {
          __pyx_v_z = __pyx_t_7;
+0416:                     tmp_x = pbc_correction(old_x + x, XDIM)
          __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_x + __pyx_v_x), __pyx_v_XDIM);
+0417:                     tmp_y = pbc_correction(old_y + y, YDIM)
          __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_y + __pyx_v_y), __pyx_v_YDIM);
+0418:                     tmp_z = pbc_correction(old_z + z, ZDIM)
          __pyx_v_tmp_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_z + __pyx_v_z), __pyx_v_ZDIM);
+0419:                     site_bead_type = type_grid[tmp_x, tmp_y, tmp_z]
          __pyx_t_3 = __pyx_v_tmp_x;
          __pyx_t_2 = __pyx_v_tmp_y;
          __pyx_t_1 = __pyx_v_tmp_z;
          __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_3 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )));
 0420: 
+0421:                     if hardwall == 1:
          __pyx_t_4 = (__pyx_v_hardwall == 1);
          if (__pyx_t_4) {
/* … */
          }
+0422:                         if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3 or abs(tmp_z - old_z) > 3:
            __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 422, __pyx_L1_error)
            __pyx_t_9 = (__pyx_t_8 > 3);
            if (!__pyx_t_9) {
            } else {
              __pyx_t_4 = __pyx_t_9;
              goto __pyx_L70_bool_binop_done;
            }
            __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 422, __pyx_L1_error)
            __pyx_t_9 = (__pyx_t_8 > 3);
            if (!__pyx_t_9) {
            } else {
              __pyx_t_4 = __pyx_t_9;
              goto __pyx_L70_bool_binop_done;
            }
            __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_old_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 422, __pyx_L1_error)
            __pyx_t_9 = (__pyx_t_8 > 3);
            __pyx_t_4 = __pyx_t_9;
            __pyx_L70_bool_binop_done:;
            if (__pyx_t_4) {
/* … */
            }
+0423:                             site_bead_type = 0
              __pyx_v_site_bead_type = 0;
 0424: 
+0425:                     energy_old = energy_old + interaction_table[bead_type, site_bead_type]
          __pyx_t_10 = __pyx_v_bead_type;
          __pyx_t_11 = __pyx_v_site_bead_type;
          __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_10 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_interaction_table.strides[1]) ))));
+0426:                     if site_bead_type > 0:
          __pyx_t_4 = (__pyx_v_site_bead_type > 0);
          if (__pyx_t_4) {
/* … */
          }
        }
      }
    }
+0427:                         energy_old_empty = energy_old_empty + interaction_table[0, site_bead_type]
            __pyx_t_1 = 0;
            __pyx_t_11 = __pyx_v_site_bead_type;
            __pyx_v_energy_old_empty = (__pyx_v_energy_old_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_1 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_interaction_table.strides[1]) ))));
 0428: 
+0429:         type_grid[new_x, new_y, new_z] = type_grid[old_x, old_y, old_z]
    __pyx_t_1 = __pyx_v_old_x;
    __pyx_t_2 = __pyx_v_old_y;
    __pyx_t_3 = __pyx_v_old_z;
    __pyx_t_14 = __pyx_v_new_x;
    __pyx_t_13 = __pyx_v_new_y;
    __pyx_t_12 = __pyx_v_new_z;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_14 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_13 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_12 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )));
+0430:         type_grid[old_x, old_y, old_z] = 0
    __pyx_t_3 = __pyx_v_old_x;
    __pyx_t_2 = __pyx_v_old_y;
    __pyx_t_1 = __pyx_v_old_z;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_3 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )) = 0;
 0431: 
+0432:         for x in range(-1, 2):
    for (__pyx_t_5 = -1; __pyx_t_5 < 2; __pyx_t_5+=1) {
      __pyx_v_x = __pyx_t_5;
+0433:             for y in range(-1, 2):
      for (__pyx_t_6 = -1; __pyx_t_6 < 2; __pyx_t_6+=1) {
        __pyx_v_y = __pyx_t_6;
+0434:                 for z in range(-1, 2):
        for (__pyx_t_7 = -1; __pyx_t_7 < 2; __pyx_t_7+=1) {
          __pyx_v_z = __pyx_t_7;
+0435:                     tmp_x = pbc_correction(new_x + x, XDIM)
          __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_x + __pyx_v_x), __pyx_v_XDIM);
+0436:                     tmp_y = pbc_correction(new_y + y, YDIM)
          __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_y + __pyx_v_y), __pyx_v_YDIM);
+0437:                     tmp_z = pbc_correction(new_z + z, ZDIM)
          __pyx_v_tmp_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_z + __pyx_v_z), __pyx_v_ZDIM);
+0438:                     site_bead_type = type_grid[tmp_x, tmp_y, tmp_z]
          __pyx_t_1 = __pyx_v_tmp_x;
          __pyx_t_2 = __pyx_v_tmp_y;
          __pyx_t_3 = __pyx_v_tmp_z;
          __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )));
+0439:                     if hardwall == 1:
          __pyx_t_4 = (__pyx_v_hardwall == 1);
          if (__pyx_t_4) {
/* … */
          }
+0440:                         if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3 or abs(tmp_z - new_z) > 3:
            __pyx_t_8 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 440, __pyx_L1_error)
            __pyx_t_9 = (__pyx_t_8 > 3);
            if (!__pyx_t_9) {
            } else {
              __pyx_t_4 = __pyx_t_9;
              goto __pyx_L82_bool_binop_done;
            }
            __pyx_t_8 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 440, __pyx_L1_error)
            __pyx_t_9 = (__pyx_t_8 > 3);
            if (!__pyx_t_9) {
            } else {
              __pyx_t_4 = __pyx_t_9;
              goto __pyx_L82_bool_binop_done;
            }
            __pyx_t_8 = abs((__pyx_v_tmp_z - __pyx_v_new_z)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 440, __pyx_L1_error)
            __pyx_t_9 = (__pyx_t_8 > 3);
            __pyx_t_4 = __pyx_t_9;
            __pyx_L82_bool_binop_done:;
            if (__pyx_t_4) {
/* … */
            }
+0441:                             site_bead_type = 0
              __pyx_v_site_bead_type = 0;
 0442: 
+0443:                     energy_new = energy_new + interaction_table[bead_type, site_bead_type]
          __pyx_t_11 = __pyx_v_bead_type;
          __pyx_t_10 = __pyx_v_site_bead_type;
          __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_11 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_interaction_table.strides[1]) ))));
+0444:                     if site_bead_type > 0:
          __pyx_t_4 = (__pyx_v_site_bead_type > 0);
          if (__pyx_t_4) {
/* … */
          }
        }
      }
    }
  }
  __pyx_L3:;
+0445:                         energy_new_empty = energy_new_empty + interaction_table[0, site_bead_type]
            __pyx_t_3 = 0;
            __pyx_t_10 = __pyx_v_site_bead_type;
            __pyx_v_energy_new_empty = (__pyx_v_energy_new_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_3 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_interaction_table.strides[1]) ))));
 0446: 
 0447:     # remove the self-interaction double counting at x==y==z==0
+0448:     energy_old_empty = energy_old_empty - interaction_table[0, bead_type]
  __pyx_t_3 = 0;
  __pyx_t_10 = __pyx_v_bead_type;
  __pyx_v_energy_old_empty = (__pyx_v_energy_old_empty - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_3 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_interaction_table.strides[1]) ))));
+0449:     energy_old = energy_old - interaction_table[bead_type, bead_type]
  __pyx_t_10 = __pyx_v_bead_type;
  __pyx_t_11 = __pyx_v_bead_type;
  __pyx_v_energy_old = (__pyx_v_energy_old - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_10 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_interaction_table.strides[1]) ))));
+0450:     energy_new_empty = energy_new_empty - interaction_table[0, bead_type]
  __pyx_t_3 = 0;
  __pyx_t_11 = __pyx_v_bead_type;
  __pyx_v_energy_new_empty = (__pyx_v_energy_new_empty - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_3 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_11 * __pyx_v_interaction_table.strides[1]) ))));
+0451:     energy_new = energy_new - interaction_table[bead_type, bead_type]
  __pyx_t_11 = __pyx_v_bead_type;
  __pyx_t_10 = __pyx_v_bead_type;
  __pyx_v_energy_new = (__pyx_v_energy_new - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_11 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_10 * __pyx_v_interaction_table.strides[1]) ))));
 0452: 
 0453:     # restore the type grid
+0454:     type_grid[old_x, old_y, old_z] = type_grid[new_x, new_y, new_z]
  __pyx_t_3 = __pyx_v_new_x;
  __pyx_t_2 = __pyx_v_new_y;
  __pyx_t_1 = __pyx_v_new_z;
  __pyx_t_12 = __pyx_v_old_x;
  __pyx_t_13 = __pyx_v_old_y;
  __pyx_t_14 = __pyx_v_old_z;
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_12 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_13 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_14 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_3 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )));
+0455:     type_grid[new_x, new_y, new_z] = 0
  __pyx_t_1 = __pyx_v_new_x;
  __pyx_t_2 = __pyx_v_new_y;
  __pyx_t_3 = __pyx_v_new_z;
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )) = 0;
 0456: 
+0457:     return (energy_new + energy_old_empty) - (energy_old + energy_new_empty)
  __pyx_r = ((__pyx_v_energy_new + __pyx_v_energy_old_empty) - (__pyx_v_energy_old + __pyx_v_energy_new_empty));
  goto __pyx_L0;
 0458: 
 0459: 
 0460: # -----------------------------------------------------------------
 0461: # Public entry point - signature identical to pimms.mega_crank.mega_crank.
+0462: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_1mega_crank(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_mega_crank, "\n    Optimized, allocation-free crankshaft Monte Carlo kernel.\n\n    Behaviourally identical (same RNG stream) to pimms.mega_crank.mega_crank;\n    see module docstring. Returns (energy, accepted_moves).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_1mega_crank = {"mega_crank", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_1mega_crank, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_mega_crank};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_1mega_crank(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_nsteps;
  __Pyx_memviewslice __pyx_v_bead_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_crank (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_nsteps,&__pyx_mstate_global->__pyx_n_u_bead_selector,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,0};
  PyObject* values[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 462, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 462, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_crank", 0) < (0)) __PYX_ERR(0, 462, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 13; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_crank", 1, 13, 13, i); __PYX_ERR(0, 462, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 13)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 462, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 462, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 464, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 465, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 466, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 467, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 468, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 469, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 470, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[7]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 471, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[8]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 472, __pyx_L3_error)
    __pyx_v_nsteps = __Pyx_PyLong_As_int(values[9]); if (unlikely((__pyx_v_nsteps == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 473, __pyx_L3_error)
    __pyx_v_bead_selector = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_bead_selector.memview)) __PYX_ERR(0, 474, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[11]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 475, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[12]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 476, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_crank", 1, 13, 13, __pyx_nargs); __PYX_ERR(0, 462, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_bead_selector, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_mega_crank(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_nsteps, __pyx_v_bead_selector, __pyx_v_passed_seed, __pyx_v_hardwall);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_bead_selector, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_mega_crank(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_nsteps, __Pyx_memviewslice __pyx_v_bead_selector, int __pyx_v_passed_seed, int __pyx_v_hardwall) {
  unsigned int __pyx_v_i;
  int __pyx_v_bead_index;
  int __pyx_v_accepted_moves;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  long __pyx_v_delta_energy;
  long __pyx_v_delta_angle_energy;
  int __pyx_v_beadflag;
  int __pyx_v_old_position[3];
  int __pyx_v_new_position[3];
  int __pyx_v_anchor_bead[3];
  int __pyx_v_Nx;
  int __pyx_v_Ny;
  int __pyx_v_Nz;
  int __pyx_v_Cx;
  int __pyx_v_Cy;
  int __pyx_v_Cz;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_1mega_crank, 0, __pyx_mstate_global->__pyx_n_u_mega_crank, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[6])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 462, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_crank, __pyx_t_4) < (0)) __PYX_ERR(0, 462, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 0463: @cython.boundscheck(False)
 0464: def mega_crank(NUMPY_INT_TYPE[:, :, :] grid,
 0465:                NUMPY_INT_TYPE[:, :, :] type_grid,
 0466:                NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 0467:                NUMPY_INT_TYPE[:, :] interaction_table,
 0468:                NUMPY_INT_TYPE[:, :] LR_interaction_table,
 0469:                NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 0470:                NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 0471:                long energy,
 0472:                float invtemp,
 0473:                int nsteps,
 0474:                NUMPY_INT_TYPE_long[:] bead_selector,
 0475:                int passed_seed,
 0476:                int hardwall):
 0477:     """
 0478:     Optimized, allocation-free crankshaft Monte Carlo kernel.
 0479: 
 0480:     Behaviourally identical (same RNG stream) to pimms.mega_crank.mega_crank;
 0481:     see module docstring. Returns (energy, accepted_moves).
 0482:     """
+0483:     mc_seed(passed_seed)
  __pyx_f_5pimms_15mega_crank_fast_mc_seed(__pyx_v_passed_seed);
 0484: 
 0485:     cdef unsigned int i
 0486:     cdef int bead_index
+0487:     cdef int accepted_moves = 0
  __pyx_v_accepted_moves = 0;
+0488:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+0489:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+0490:     cdef int ZDIM = grid.shape[2]
  __pyx_v_ZDIM = (__pyx_v_grid.shape[2]);
 0491:     cdef long delta_energy, delta_angle_energy
 0492:     cdef int beadflag
 0493:     cdef int ok
 0494: 
 0495:     # reusable C buffers (no per-substep heap allocation)
 0496:     cdef int old_position[3]
 0497:     cdef int new_position[3]
 0498:     cdef int anchor_bead[3]
 0499:     cdef int Nx, Ny, Nz, Cx, Cy, Cz
 0500: 
+0501:     for i in range(nsteps):
  __pyx_t_1 = __pyx_v_nsteps;
  __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;
+0502:         bead_index = bead_selector[i]
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_bead_index = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=0 */ (__pyx_v_bead_selector.data + __pyx_t_4 * __pyx_v_bead_selector.strides[0]) )));
 0503: 
+0504:         old_position[0] = idx_to_bead[bead_index, 5]
    __pyx_t_5 = __pyx_v_bead_index;
    __pyx_t_6 = 5;
    (__pyx_v_old_position[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0505:         old_position[1] = idx_to_bead[bead_index, 6]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_5 = 6;
    (__pyx_v_old_position[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0506:         old_position[2] = idx_to_bead[bead_index, 7]
    __pyx_t_5 = __pyx_v_bead_index;
    __pyx_t_6 = 7;
    (__pyx_v_old_position[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 0507: 
+0508:         beadflag = idx_to_bead[bead_index, 0]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_5 = 0;
    __pyx_v_beadflag = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
 0509: 
 0510:         # ---- single bead (flag 0) ----
+0511:         if beadflag == 0:
    switch (__pyx_v_beadflag) {
      case 0:
/* … */
      break;
      case 1:
+0512:             single_bead_crank_c(old_position[0], old_position[1], old_position[2],
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_c((__pyx_v_old_position[0]), (__pyx_v_old_position[1]), (__pyx_v_old_position[2]), __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_new_position));
 0513:                                 grid, XDIM, YDIM, ZDIM, new_position)
 0514: 
 0515:         # ---- N-terminal bead (flag 1) ----
+0516:         elif beadflag == 1:
      break;
      case 3:
+0517:             anchor_bead[0] = idx_to_bead[bead_index + 1, 5]
      __pyx_t_5 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 5;
      (__pyx_v_anchor_bead[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0518:             anchor_bead[1] = idx_to_bead[bead_index + 1, 6]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_5 = 6;
      (__pyx_v_anchor_bead[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0519:             anchor_bead[2] = idx_to_bead[bead_index + 1, 7]
      __pyx_t_5 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 7;
      (__pyx_v_anchor_bead[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 0520: 
+0521:             single_bead_crank_c(anchor_bead[0], anchor_bead[1], anchor_bead[2],
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_c((__pyx_v_anchor_bead[0]), (__pyx_v_anchor_bead[1]), (__pyx_v_anchor_bead[2]), __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_new_position));
 0522:                                 grid, XDIM, YDIM, ZDIM, new_position)
 0523: 
+0524:             if hardwall == 1:
      __pyx_t_7 = (__pyx_v_hardwall == 1);
      if (__pyx_t_7) {
/* … */
      }
+0525:                 if straddle_pair(new_position[0], new_position[1], new_position[2],
        if (__pyx_t_7) {
/* … */
        }
+0526:                                  anchor_bead[0], anchor_bead[1], anchor_bead[2]) == 1:
        __pyx_t_7 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2]), (__pyx_v_anchor_bead[0]), (__pyx_v_anchor_bead[1]), (__pyx_v_anchor_bead[2])) == 1);
+0527:                     continue
          goto __pyx_L3_continue;
 0528: 
 0529:         # ---- C-terminal bead (flag 3) ----
+0530:         elif beadflag == 3:
      break;
      default:
+0531:             anchor_bead[0] = idx_to_bead[bead_index - 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_5 = 5;
      (__pyx_v_anchor_bead[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0532:             anchor_bead[1] = idx_to_bead[bead_index - 1, 6]
      __pyx_t_5 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 6;
      (__pyx_v_anchor_bead[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0533:             anchor_bead[2] = idx_to_bead[bead_index - 1, 7]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_5 = 7;
      (__pyx_v_anchor_bead[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
 0534: 
+0535:             single_bead_crank_c(anchor_bead[0], anchor_bead[1], anchor_bead[2],
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_c((__pyx_v_anchor_bead[0]), (__pyx_v_anchor_bead[1]), (__pyx_v_anchor_bead[2]), __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_new_position));
 0536:                                 grid, XDIM, YDIM, ZDIM, new_position)
 0537: 
+0538:             if hardwall == 1:
      __pyx_t_7 = (__pyx_v_hardwall == 1);
      if (__pyx_t_7) {
/* … */
      }
+0539:                 if straddle_pair(anchor_bead[0], anchor_bead[1], anchor_bead[2],
        if (__pyx_t_7) {
/* … */
        }
+0540:                                  new_position[0], new_position[1], new_position[2]) == 1:
        __pyx_t_7 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_anchor_bead[0]), (__pyx_v_anchor_bead[1]), (__pyx_v_anchor_bead[2]), (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2])) == 1);
+0541:                     continue
          goto __pyx_L3_continue;
 0542: 
 0543:         # ---- internal bead (flags 2,4,5,6) ----
 0544:         else:
+0545:             Nx = idx_to_bead[bead_index - 1, 5]
      __pyx_t_5 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 5;
      __pyx_v_Nx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0546:             Ny = idx_to_bead[bead_index - 1, 6]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_5 = 6;
      __pyx_v_Ny = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0547:             Nz = idx_to_bead[bead_index - 1, 7]
      __pyx_t_5 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 7;
      __pyx_v_Nz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0548:             Cx = idx_to_bead[bead_index + 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_5 = 5;
      __pyx_v_Cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0549:             Cy = idx_to_bead[bead_index + 1, 6]
      __pyx_t_5 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 6;
      __pyx_v_Cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0550:             Cz = idx_to_bead[bead_index + 1, 7]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_5 = 7;
      __pyx_v_Cz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
 0551: 
+0552:             crank_it_c(Nx, Ny, Nz, Cx, Cy, Cz, grid, XDIM, YDIM, ZDIM, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_crank_it_c(__pyx_v_Nx, __pyx_v_Ny, __pyx_v_Nz, __pyx_v_Cx, __pyx_v_Cy, __pyx_v_Cz, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_new_position));
 0553: 
+0554:             if hardwall == 1:
      __pyx_t_7 = (__pyx_v_hardwall == 1);
      if (__pyx_t_7) {
/* … */
      }
      break;
    }
 0555:                 # three-position holder: [N, new, C]
+0556:                 if (straddle_pair(Nx, Ny, Nz,
        if (__pyx_t_7) {
/* … */
        }
+0557:                                   new_position[0], new_position[1], new_position[2]) == 1
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_Nx, __pyx_v_Ny, __pyx_v_Nz, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2])) == 1);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_7 = __pyx_t_8;
          goto __pyx_L11_bool_binop_done;
        }
 0558:                     or straddle_pair(new_position[0], new_position[1], new_position[2],
+0559:                                      Cx, Cy, Cz) == 1):
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2]), __pyx_v_Cx, __pyx_v_Cy, __pyx_v_Cz) == 1);
        __pyx_t_7 = __pyx_t_8;
        __pyx_L11_bool_binop_done:;
+0560:                     continue
          goto __pyx_L3_continue;
 0561: 
 0562:         # ---- accept/reject if the hardsphere proposal succeeded ----
+0563:         if not new_position[0] < 0:
    __pyx_t_7 = (!((__pyx_v_new_position[0]) < 0));
    if (__pyx_t_7) {
/* … */
    }
    __pyx_L3_continue:;
  }
+0564:             delta_energy = get_energy_change_c(grid, type_grid,
      __pyx_v_delta_energy = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_old_position[0]), (__pyx_v_old_position[1]), (__pyx_v_old_position[2]), (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
 0565:                                                old_position[0], old_position[1], old_position[2],
 0566:                                                new_position[0], new_position[1], new_position[2],
+0567:                                                idx_to_bead[bead_index, 1],
      __pyx_t_5 = __pyx_v_bead_index;
      __pyx_t_6 = 1;
 0568:                                                interaction_table, LR_interaction_table,
 0569:                                                SLR_interaction_table,
 0570:                                                XDIM, YDIM, ZDIM, hardwall)
+0571:             delta_angle_energy = get_angle_energy_change_c(bead_index, idx_to_bead,
      __pyx_v_delta_angle_energy = __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c(__pyx_v_bead_index, __pyx_v_idx_to_bead, __pyx_v_new_position, __pyx_v_angle_lookup);
 0572:                                                            new_position, angle_lookup)
 0573: 
+0574:             if accept_or_reject(invtemp, energy, energy + delta_energy + delta_angle_energy) == 1:
      __pyx_t_7 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, ((__pyx_v_energy + __pyx_v_delta_energy) + __pyx_v_delta_angle_energy)) == 1);
      if (__pyx_t_7) {
/* … */
      }
+0575:                 grid[old_position[0], old_position[1], old_position[2]] = 0
        __pyx_t_6 = (__pyx_v_old_position[0]);
        __pyx_t_5 = (__pyx_v_old_position[1]);
        __pyx_t_9 = (__pyx_v_old_position[2]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_grid.strides[1]) ) + __pyx_t_9 * __pyx_v_grid.strides[2]) )) = 0;
+0576:                 grid[new_position[0], new_position[1], new_position[2]] = idx_to_bead[bead_index, 4]
        __pyx_t_9 = __pyx_v_bead_index;
        __pyx_t_5 = 4;
        __pyx_t_6 = (__pyx_v_new_position[0]);
        __pyx_t_10 = (__pyx_v_new_position[1]);
        __pyx_t_11 = (__pyx_v_new_position[2]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
 0577: 
+0578:                 type_grid[new_position[0], new_position[1], new_position[2]] = type_grid[old_position[0], old_position[1], old_position[2]]
        __pyx_t_5 = (__pyx_v_old_position[0]);
        __pyx_t_9 = (__pyx_v_old_position[1]);
        __pyx_t_11 = (__pyx_v_old_position[2]);
        __pyx_t_10 = (__pyx_v_new_position[0]);
        __pyx_t_6 = (__pyx_v_new_position[1]);
        __pyx_t_12 = (__pyx_v_new_position[2]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_12 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_5 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_type_grid.strides[2]) )));
+0579:                 type_grid[old_position[0], old_position[1], old_position[2]] = 0
        __pyx_t_11 = (__pyx_v_old_position[0]);
        __pyx_t_9 = (__pyx_v_old_position[1]);
        __pyx_t_5 = (__pyx_v_old_position[2]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_11 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_5 * __pyx_v_type_grid.strides[2]) )) = 0;
 0580: 
+0581:                 idx_to_bead[bead_index, 5] = new_position[0]
        __pyx_t_5 = __pyx_v_bead_index;
        __pyx_t_9 = 5;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[0]);
+0582:                 idx_to_bead[bead_index, 6] = new_position[1]
        __pyx_t_9 = __pyx_v_bead_index;
        __pyx_t_5 = 6;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[1]);
+0583:                 idx_to_bead[bead_index, 7] = new_position[2]
        __pyx_t_5 = __pyx_v_bead_index;
        __pyx_t_9 = 7;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[2]);
 0584: 
+0585:                 energy = energy + delta_energy + delta_angle_energy
        __pyx_v_energy = ((__pyx_v_energy + __pyx_v_delta_energy) + __pyx_v_delta_angle_energy);
+0586:                 accepted_moves = accepted_moves + 1
        __pyx_v_accepted_moves = (__pyx_v_accepted_moves + 1);
 0587: 
+0588:     return (energy, accepted_moves)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_13 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 588, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyLong_From_int(__pyx_v_accepted_moves); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 588, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 588, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_15);
  __Pyx_GIVEREF(__pyx_t_13);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13) != (0)) __PYX_ERR(0, 588, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_14);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_14) != (0)) __PYX_ERR(0, 588, __pyx_L1_error);
  __pyx_t_13 = 0;
  __pyx_t_14 = 0;
  __pyx_r = __pyx_t_15;
  __pyx_t_15 = 0;
  goto __pyx_L0;
 0589: 
 0590: 
 0591: # =====================================================================
 0592: #
 0593: #   2D crankshaft kernel (allocation-free, bit-exact drop-in for
 0594: #   pimms.mega_crank_2D.mega_crank_2D)
 0595: #
 0596: #   The reference 2D kernel calls mega_crank.randint_ext /
 0597: #   accept_or_reject_ext and the Python-level (def) get_energy_change_2D on
 0598: #   every substep - each crossing the Python/C boundary - and allocates the
 0599: #   angle arrays per call. This version uses the same nogil C helpers as the 3D
 0600: #   fast kernel (randint / accept_or_reject - already double precision, matching
 0601: #   the reference) plus 2D C-array energy/angle/proposal functions, so it is bit
 0602: #   identical but avoids all that overhead.
 0603: # =====================================================================
 0604: 
 0605: # ---- 2D single-bead / terminal proposal ----
+0606: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_2D_c(int __pyx_v_ox, int __pyx_v_oy, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, int *__pyx_v_out) {
  int __pyx_v_x_off;
  int __pyx_v_y_off;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0607: @cython.boundscheck(False)
 0608: cdef inline int single_bead_crank_2D_c(int ox, int oy,
 0609:                                        NUMPY_INT_TYPE[:, :] grid,
 0610:                                        int XDIM, int YDIM,
 0611:                                        int* out) noexcept nogil:
+0612:     cdef int x_off = randint(0, 2) - 1
  __pyx_v_x_off = (__pyx_f_5pimms_15mega_crank_fast_randint(0, 2) - 1);
+0613:     cdef int y_off = randint(0, 2) - 1
  __pyx_v_y_off = (__pyx_f_5pimms_15mega_crank_fast_randint(0, 2) - 1);
+0614:     cdef int local_x = pbc_correction(ox + x_off, XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_ox + __pyx_v_x_off), __pyx_v_XDIM);
+0615:     cdef int local_y = pbc_correction(oy + y_off, YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_oy + __pyx_v_y_off), __pyx_v_YDIM);
+0616:     if grid[local_x, local_y] > 0:
  __pyx_t_1 = __pyx_v_local_x;
  __pyx_t_2 = __pyx_v_local_y;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) ))) > 0);
  if (__pyx_t_3) {
/* … */
  }
+0617:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+0618:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+0619:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+0620:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+0621:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+0622:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 0623: 
 0624: 
 0625: # ---- 2D internal-bead crankshaft proposal ----
+0626: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_crank_it_2D_c(int __pyx_v_N_side_x, int __pyx_v_N_side_y, int __pyx_v_C_side_x, int __pyx_v_C_side_y, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, int *__pyx_v_out) {
  int __pyx_v_x_min;
  int __pyx_v_x_max;
  int __pyx_v_y_min;
  int __pyx_v_y_max;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.crank_it_2D_c", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 0627: @cython.boundscheck(False)
 0628: cdef inline int crank_it_2D_c(int N_side_x, int N_side_y,
 0629:                               int C_side_x, int C_side_y,
 0630:                               NUMPY_INT_TYPE[:, :] grid,
 0631:                               int XDIM, int YDIM,
 0632:                               int* out) noexcept nogil:
 0633:     cdef int x_min, x_max, y_min, y_max, local_x, local_y
 0634: 
+0635:     if abs(N_side_x - C_side_x) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_x - __pyx_v_C_side_x)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 635, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+0636:         if N_side_x > C_side_x:
    __pyx_t_2 = (__pyx_v_N_side_x > __pyx_v_C_side_x);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L4;
    }
+0637:             C_side_x = C_side_x + XDIM
      __pyx_v_C_side_x = (__pyx_v_C_side_x + __pyx_v_XDIM);
 0638:         else:
+0639:             N_side_x = N_side_x + XDIM
    /*else*/ {
      __pyx_v_N_side_x = (__pyx_v_N_side_x + __pyx_v_XDIM);
    }
    __pyx_L4:;
+0640:     if abs(N_side_y - C_side_y) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_y - __pyx_v_C_side_y)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 640, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+0641:         if N_side_y > C_side_y:
    __pyx_t_2 = (__pyx_v_N_side_y > __pyx_v_C_side_y);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L6;
    }
+0642:             C_side_y = C_side_y + YDIM
      __pyx_v_C_side_y = (__pyx_v_C_side_y + __pyx_v_YDIM);
 0643:         else:
+0644:             N_side_y = N_side_y + YDIM
    /*else*/ {
      __pyx_v_N_side_y = (__pyx_v_N_side_y + __pyx_v_YDIM);
    }
    __pyx_L6:;
 0645: 
+0646:     x_min = int_max(N_side_x - 1, C_side_x - 1)
  __pyx_v_x_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_x - 1), (__pyx_v_C_side_x - 1));
+0647:     x_max = int_min(N_side_x + 1, C_side_x + 1)
  __pyx_v_x_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_x + 1), (__pyx_v_C_side_x + 1));
+0648:     y_min = int_max(N_side_y - 1, C_side_y - 1)
  __pyx_v_y_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_y - 1), (__pyx_v_C_side_y - 1));
+0649:     y_max = int_min(N_side_y + 1, C_side_y + 1)
  __pyx_v_y_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_y + 1), (__pyx_v_C_side_y + 1));
 0650: 
+0651:     local_x = pbc_correction((x_min + randint(1, (x_max - x_min + 1)) - 1), XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_x_min + __pyx_f_5pimms_15mega_crank_fast_randint(1, ((__pyx_v_x_max - __pyx_v_x_min) + 1))) - 1), __pyx_v_XDIM);
+0652:     local_y = pbc_correction((y_min + randint(1, (y_max - y_min + 1)) - 1), YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_y_min + __pyx_f_5pimms_15mega_crank_fast_randint(1, ((__pyx_v_y_max - __pyx_v_y_min) + 1))) - 1), __pyx_v_YDIM);
 0653: 
+0654:     if grid[local_x, local_y] > 0:
  __pyx_t_3 = __pyx_v_local_x;
  __pyx_t_4 = __pyx_v_local_y;
  __pyx_t_2 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ))) > 0);
  if (__pyx_t_2) {
/* … */
  }
+0655:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+0656:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+0657:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+0658:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+0659:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+0660:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 0661: 
 0662: 
 0663: # ---- 2D angle-energy delta (angle_lookup is 5D in 2D) ----
+0664: @cython.wraparound(False)
static long __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c(int __pyx_v_bead_index, __Pyx_memviewslice __pyx_v_idx_to_bead, int *__pyx_v_new_position, __Pyx_memviewslice __pyx_v_angle_lookup) {
  int __pyx_v_a0;
  int __pyx_v_a1;
  int __pyx_v_b0;
  int __pyx_v_b1;
  long __pyx_v_angle_penalty_new;
  long __pyx_v_angle_penalty_old;
  int __pyx_v_angle_positions[5][2];
  int __pyx_v_intcode_lookup[5];
  int __pyx_v_offset;
  int __pyx_v_offset_start;
  int __pyx_v_offset_end;
  int __pyx_v_i;
  int __pyx_v_pos;
  int __pyx_v_angle_idx;
  int __pyx_v_local_move_idx;
  int __pyx_v_bead_flag;
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 0665: @cython.boundscheck(False)
 0666: cdef long get_angle_energy_change_2D_c(int bead_index,
 0667:                                        NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 0668:                                        int* new_position,
 0669:                                        NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup) noexcept nogil:
 0670: 
+0671:     if idx_to_bead[bead_index, 3] == 1:
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 3;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) ))) == 1);
  if (__pyx_t_3) {
/* … */
  }
+0672:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
 0673: 
 0674:     cdef int a0, a1, b0, b1
+0675:     cdef long angle_penalty_new = 0
  __pyx_v_angle_penalty_new = 0;
+0676:     cdef long angle_penalty_old = 0
  __pyx_v_angle_penalty_old = 0;
 0677: 
 0678:     cdef int angle_positions[5][2]
 0679:     cdef int intcode_lookup[5]
 0680:     cdef int offset, offset_start, offset_end, i, pos
 0681:     cdef int angle_idx
+0682:     cdef int local_move_idx = -1
  __pyx_v_local_move_idx = -1;
+0683:     cdef int bead_flag = idx_to_bead[bead_index, 0]
  __pyx_t_2 = __pyx_v_bead_index;
  __pyx_t_1 = 0;
  __pyx_v_bead_flag = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
 0684: 
+0685:     offset_start = 0
  __pyx_v_offset_start = 0;
+0686:     offset_end = 0
  __pyx_v_offset_end = 0;
+0687:     if bead_flag == 1:
  switch (__pyx_v_bead_flag) {
    case 1:
/* … */
    break;
    case 2:
+0688:         offset_start = 0
    __pyx_v_offset_start = 0;
+0689:         offset_end = 3
    __pyx_v_offset_end = 3;
+0690:     elif bead_flag == 2:
    break;
    case 4:
+0691:         offset_start = -2
    __pyx_v_offset_start = -2;
+0692:         offset_end = 3
    __pyx_v_offset_end = 3;
+0693:     elif bead_flag == 4:
    break;
    case 3:
+0694:         offset_start = -1
    __pyx_v_offset_start = -1;
+0695:         offset_end = 2
    __pyx_v_offset_end = 2;
+0696:     elif bead_flag == 3:
    break;
    case 5:
+0697:         offset_start = -2
    __pyx_v_offset_start = -2;
+0698:         offset_end = 1
    __pyx_v_offset_end = 1;
+0699:     elif bead_flag == 5:
    break;
    case 6:
+0700:         offset_start = -1
    __pyx_v_offset_start = -1;
+0701:         offset_end = 3
    __pyx_v_offset_end = 3;
+0702:     elif bead_flag == 6:
    break;
    default: break;
  }
+0703:         offset_start = -2
    __pyx_v_offset_start = -2;
+0704:         offset_end = 2
    __pyx_v_offset_end = 2;
 0705: 
+0706:     angle_idx = 0
  __pyx_v_angle_idx = 0;
+0707:     for offset in range(offset_start, offset_end):
  __pyx_t_4 = __pyx_v_offset_end;
  __pyx_t_5 = __pyx_t_4;
  for (__pyx_t_6 = __pyx_v_offset_start; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
    __pyx_v_offset = __pyx_t_6;
+0708:         pos = bead_index + offset
    __pyx_v_pos = (__pyx_v_bead_index + __pyx_v_offset);
+0709:         angle_positions[angle_idx][0] = idx_to_bead[pos, 5]
    __pyx_t_1 = __pyx_v_pos;
    __pyx_t_2 = 5;
    ((__pyx_v_angle_positions[__pyx_v_angle_idx])[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) )));
+0710:         angle_positions[angle_idx][1] = idx_to_bead[pos, 6]
    __pyx_t_2 = __pyx_v_pos;
    __pyx_t_1 = 6;
    ((__pyx_v_angle_positions[__pyx_v_angle_idx])[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_2 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+0711:         intcode_lookup[angle_idx] = idx_to_bead[pos, 2]
    __pyx_t_1 = __pyx_v_pos;
    __pyx_t_2 = 2;
    (__pyx_v_intcode_lookup[__pyx_v_angle_idx]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_2 * __pyx_v_idx_to_bead.strides[1]) )));
+0712:         if pos == bead_index:
    __pyx_t_3 = (__pyx_v_pos == __pyx_v_bead_index);
    if (__pyx_t_3) {
/* … */
    }
+0713:             local_move_idx = angle_idx
      __pyx_v_local_move_idx = __pyx_v_angle_idx;
+0714:         angle_idx = angle_idx + 1
    __pyx_v_angle_idx = (__pyx_v_angle_idx + 1);
  }
 0715: 
+0716:     for i in range(0, angle_idx - 2):
  __pyx_t_7 = (__pyx_v_angle_idx - 2);
  __pyx_t_8 = __pyx_t_7;
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_8; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;
+0717:         a0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i][0])
    __pyx_v_a0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[__pyx_v_i])[0])));
+0718:         a1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i][1])
    __pyx_v_a1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[__pyx_v_i])[1])));
+0719:         b0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i + 2][0])
    __pyx_v_b0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[0])));
+0720:         b1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i + 2][1])
    __pyx_v_b1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[1])));
+0721:         angle_penalty_old = angle_lookup[intcode_lookup[i + 1], a0 + 1, a1 + 1, b0 + 1, b1 + 1] + angle_penalty_old
    __pyx_t_2 = (__pyx_v_intcode_lookup[(__pyx_v_i + 1)]);
    __pyx_t_1 = (__pyx_v_a0 + 1);
    __pyx_t_9 = (__pyx_v_a1 + 1);
    __pyx_t_10 = (__pyx_v_b0 + 1);
    __pyx_t_11 = (__pyx_v_b1 + 1);
    __pyx_v_angle_penalty_old = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=4 */ (( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angle_lookup.data + __pyx_t_2 * __pyx_v_angle_lookup.strides[0]) ) + __pyx_t_1 * __pyx_v_angle_lookup.strides[1]) ) + __pyx_t_9 * __pyx_v_angle_lookup.strides[2]) ) + __pyx_t_10 * __pyx_v_angle_lookup.strides[3]) ) + __pyx_t_11 * __pyx_v_angle_lookup.strides[4]) ))) + __pyx_v_angle_penalty_old);
  }
 0722: 
+0723:     if local_move_idx >= 0:
  __pyx_t_3 = (__pyx_v_local_move_idx >= 0);
  if (__pyx_t_3) {
/* … */
  }
+0724:         angle_positions[local_move_idx][0] = new_position[0]
    ((__pyx_v_angle_positions[__pyx_v_local_move_idx])[0]) = (__pyx_v_new_position[0]);
+0725:         angle_positions[local_move_idx][1] = new_position[1]
    ((__pyx_v_angle_positions[__pyx_v_local_move_idx])[1]) = (__pyx_v_new_position[1]);
 0726: 
+0727:     for i in range(0, angle_idx - 2):
  __pyx_t_7 = (__pyx_v_angle_idx - 2);
  __pyx_t_8 = __pyx_t_7;
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_8; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;
+0728:         a0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i][0])
    __pyx_v_a0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[__pyx_v_i])[0])));
+0729:         a1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i][1])
    __pyx_v_a1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[__pyx_v_i])[1])));
+0730:         b0 = fix_angle_pbc_issues(angle_positions[i + 1][0] - angle_positions[i + 2][0])
    __pyx_v_b0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[0]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[0])));
+0731:         b1 = fix_angle_pbc_issues(angle_positions[i + 1][1] - angle_positions[i + 2][1])
    __pyx_v_b1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((((__pyx_v_angle_positions[(__pyx_v_i + 1)])[1]) - ((__pyx_v_angle_positions[(__pyx_v_i + 2)])[1])));
+0732:         angle_penalty_new = angle_lookup[intcode_lookup[i + 1], a0 + 1, a1 + 1, b0 + 1, b1 + 1] + angle_penalty_new
    __pyx_t_11 = (__pyx_v_intcode_lookup[(__pyx_v_i + 1)]);
    __pyx_t_10 = (__pyx_v_a0 + 1);
    __pyx_t_9 = (__pyx_v_a1 + 1);
    __pyx_t_1 = (__pyx_v_b0 + 1);
    __pyx_t_2 = (__pyx_v_b1 + 1);
    __pyx_v_angle_penalty_new = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=4 */ (( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angle_lookup.data + __pyx_t_11 * __pyx_v_angle_lookup.strides[0]) ) + __pyx_t_10 * __pyx_v_angle_lookup.strides[1]) ) + __pyx_t_9 * __pyx_v_angle_lookup.strides[2]) ) + __pyx_t_1 * __pyx_v_angle_lookup.strides[3]) ) + __pyx_t_2 * __pyx_v_angle_lookup.strides[4]) ))) + __pyx_v_angle_penalty_new);
  }
 0733: 
+0734:     return angle_penalty_new - angle_penalty_old
  __pyx_r = (__pyx_v_angle_penalty_new - __pyx_v_angle_penalty_old);
  goto __pyx_L0;
 0735: 
 0736: 
 0737: # ---- 2D short/long-range interaction-energy delta ----
+0738: @cython.wraparound(False)
static long __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(CYTHON_UNUSED __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, int __pyx_v_old_x, int __pyx_v_old_y, int __pyx_v_new_x, int __pyx_v_new_y, int __pyx_v_LR_vs_SR, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_hardwall) {
  long __pyx_v_energy_old;
  long __pyx_v_energy_old_empty;
  long __pyx_v_energy_new;
  long __pyx_v_energy_new_empty;
  int __pyx_v_tmp_x;
  int __pyx_v_tmp_y;
  int __pyx_v_x;
  int __pyx_v_y;
  unsigned int __pyx_v_site_bead_type;
  unsigned int __pyx_v_bead_type;
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.get_energy_change_2D_c", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 0739: @cython.boundscheck(False)
 0740: cdef long get_energy_change_2D_c(NUMPY_INT_TYPE[:, :] grid,
 0741:                                  NUMPY_INT_TYPE[:, :] type_grid,
 0742:                                  int old_x, int old_y,
 0743:                                  int new_x, int new_y,
 0744:                                  int LR_vs_SR,
 0745:                                  NUMPY_INT_TYPE[:, :] interaction_table,
 0746:                                  NUMPY_INT_TYPE[:, :] LR_interaction_table,
 0747:                                  NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 0748:                                  int XDIM, int YDIM,
 0749:                                  int hardwall) noexcept nogil:
 0750: 
+0751:     cdef long energy_old = 0
  __pyx_v_energy_old = 0;
+0752:     cdef long energy_old_empty = 0
  __pyx_v_energy_old_empty = 0;
+0753:     cdef long energy_new = 0
  __pyx_v_energy_new = 0;
+0754:     cdef long energy_new_empty = 0
  __pyx_v_energy_new_empty = 0;
 0755: 
 0756:     cdef int tmp_x, tmp_y
 0757:     cdef int x, y
 0758:     cdef unsigned int site_bead_type, bead_type
 0759: 
+0760:     bead_type = type_grid[old_x, old_y]
  __pyx_t_1 = __pyx_v_old_x;
  __pyx_t_2 = __pyx_v_old_y;
  __pyx_v_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )));
 0761: 
+0762:     if LR_vs_SR == 1:
  __pyx_t_3 = (__pyx_v_LR_vs_SR == 1);
  if (__pyx_t_3) {
/* … */
    goto __pyx_L3;
  }
+0763:         for x in range(-3, 4):
    for (__pyx_t_4 = -3; __pyx_t_4 < 4; __pyx_t_4+=1) {
      __pyx_v_x = __pyx_t_4;
+0764:             for y in range(-3, 4):
      for (__pyx_t_5 = -3; __pyx_t_5 < 4; __pyx_t_5+=1) {
        __pyx_v_y = __pyx_t_5;
+0765:                 tmp_x = pbc_correction(old_x + x, XDIM)
        __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_x + __pyx_v_x), __pyx_v_XDIM);
+0766:                 tmp_y = pbc_correction(old_y + y, YDIM)
        __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_y + __pyx_v_y), __pyx_v_YDIM);
+0767:                 site_bead_type = type_grid[tmp_x, tmp_y]
        __pyx_t_2 = __pyx_v_tmp_x;
        __pyx_t_1 = __pyx_v_tmp_y;
        __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_2 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )));
 0768: 
+0769:                 if abs(x) < 2 and abs(y) < 2:
        __pyx_t_6 = abs(__pyx_v_x); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 769, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 2);
        if (__pyx_t_7) {
        } else {
          __pyx_t_3 = __pyx_t_7;
          goto __pyx_L9_bool_binop_done;
        }
        __pyx_t_6 = abs(__pyx_v_y); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 769, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 2);
        __pyx_t_3 = __pyx_t_7;
        __pyx_L9_bool_binop_done:;
        if (__pyx_t_3) {
/* … */
          goto __pyx_L8;
        }
+0770:                     if hardwall == 1:
          __pyx_t_3 = (__pyx_v_hardwall == 1);
          if (__pyx_t_3) {
/* … */
          }
+0771:                         if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3:
            __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 771, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            if (!__pyx_t_7) {
            } else {
              __pyx_t_3 = __pyx_t_7;
              goto __pyx_L13_bool_binop_done;
            }
            __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 771, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            __pyx_t_3 = __pyx_t_7;
            __pyx_L13_bool_binop_done:;
            if (__pyx_t_3) {
/* … */
            }
+0772:                             site_bead_type = 0
              __pyx_v_site_bead_type = 0;
+0773:                     energy_old = energy_old + interaction_table[bead_type, site_bead_type]
          __pyx_t_8 = __pyx_v_bead_type;
          __pyx_t_9 = __pyx_v_site_bead_type;
          __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_8 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_interaction_table.strides[1]) ))));
+0774:                     if site_bead_type > 0:
          __pyx_t_3 = (__pyx_v_site_bead_type > 0);
          if (__pyx_t_3) {
/* … */
          }
+0775:                         energy_old_empty = energy_old_empty + interaction_table[0, site_bead_type]
            __pyx_t_1 = 0;
            __pyx_t_9 = __pyx_v_site_bead_type;
            __pyx_v_energy_old_empty = (__pyx_v_energy_old_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_1 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_interaction_table.strides[1]) ))));
+0776:                 elif abs(x) < 3 and abs(y) < 3:
        __pyx_t_6 = abs(__pyx_v_x); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 776, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 3);
        if (__pyx_t_7) {
        } else {
          __pyx_t_3 = __pyx_t_7;
          goto __pyx_L16_bool_binop_done;
        }
        __pyx_t_6 = abs(__pyx_v_y); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 776, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 3);
        __pyx_t_3 = __pyx_t_7;
        __pyx_L16_bool_binop_done:;
        if (__pyx_t_3) {
/* … */
          goto __pyx_L8;
        }
+0777:                     if hardwall == 1:
          __pyx_t_3 = (__pyx_v_hardwall == 1);
          if (__pyx_t_3) {
/* … */
          }
+0778:                         if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3:
            __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 778, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            if (!__pyx_t_7) {
            } else {
              __pyx_t_3 = __pyx_t_7;
              goto __pyx_L20_bool_binop_done;
            }
            __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 778, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            __pyx_t_3 = __pyx_t_7;
            __pyx_L20_bool_binop_done:;
            if (__pyx_t_3) {
/* … */
            }
+0779:                             continue
              goto __pyx_L6_continue;
+0780:                     energy_old = energy_old + LR_interaction_table[bead_type, site_bead_type]
          __pyx_t_9 = __pyx_v_bead_type;
          __pyx_t_8 = __pyx_v_site_bead_type;
          __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_LR_interaction_table.data + __pyx_t_9 * __pyx_v_LR_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_LR_interaction_table.strides[1]) ))));
 0781:                 else:
+0782:                     if hardwall == 1:
        /*else*/ {
          __pyx_t_3 = (__pyx_v_hardwall == 1);
          if (__pyx_t_3) {
/* … */
          }
+0783:                         if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3:
            __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 783, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            if (!__pyx_t_7) {
            } else {
              __pyx_t_3 = __pyx_t_7;
              goto __pyx_L24_bool_binop_done;
            }
            __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 783, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            __pyx_t_3 = __pyx_t_7;
            __pyx_L24_bool_binop_done:;
            if (__pyx_t_3) {
/* … */
            }
+0784:                             continue
              goto __pyx_L6_continue;
+0785:                     energy_old = energy_old + SLR_interaction_table[bead_type, site_bead_type]
          __pyx_t_8 = __pyx_v_bead_type;
          __pyx_t_9 = __pyx_v_site_bead_type;
          __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_SLR_interaction_table.data + __pyx_t_8 * __pyx_v_SLR_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_SLR_interaction_table.strides[1]) ))));
        }
        __pyx_L8:;
        __pyx_L6_continue:;
      }
    }
 0786: 
+0787:         type_grid[new_x, new_y] = type_grid[old_x, old_y]
    __pyx_t_1 = __pyx_v_old_x;
    __pyx_t_2 = __pyx_v_old_y;
    __pyx_t_10 = __pyx_v_new_x;
    __pyx_t_11 = __pyx_v_new_y;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_11 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )));
+0788:         type_grid[old_x, old_y] = 0
    __pyx_t_2 = __pyx_v_old_x;
    __pyx_t_1 = __pyx_v_old_y;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_2 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )) = 0;
 0789: 
+0790:         for x in range(-3, 4):
    for (__pyx_t_4 = -3; __pyx_t_4 < 4; __pyx_t_4+=1) {
      __pyx_v_x = __pyx_t_4;
+0791:             for y in range(-3, 4):
      for (__pyx_t_5 = -3; __pyx_t_5 < 4; __pyx_t_5+=1) {
        __pyx_v_y = __pyx_t_5;
+0792:                 tmp_x = pbc_correction(new_x + x, XDIM)
        __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_x + __pyx_v_x), __pyx_v_XDIM);
+0793:                 tmp_y = pbc_correction(new_y + y, YDIM)
        __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_y + __pyx_v_y), __pyx_v_YDIM);
+0794:                 site_bead_type = type_grid[tmp_x, tmp_y]
        __pyx_t_1 = __pyx_v_tmp_x;
        __pyx_t_2 = __pyx_v_tmp_y;
        __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )));
 0795: 
+0796:                 if abs(x) < 2 and abs(y) < 2:
        __pyx_t_6 = abs(__pyx_v_x); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 796, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 2);
        if (__pyx_t_7) {
        } else {
          __pyx_t_3 = __pyx_t_7;
          goto __pyx_L31_bool_binop_done;
        }
        __pyx_t_6 = abs(__pyx_v_y); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 796, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 2);
        __pyx_t_3 = __pyx_t_7;
        __pyx_L31_bool_binop_done:;
        if (__pyx_t_3) {
/* … */
          goto __pyx_L30;
        }
+0797:                     if hardwall == 1:
          __pyx_t_3 = (__pyx_v_hardwall == 1);
          if (__pyx_t_3) {
/* … */
          }
+0798:                         if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3:
            __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 798, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            if (!__pyx_t_7) {
            } else {
              __pyx_t_3 = __pyx_t_7;
              goto __pyx_L35_bool_binop_done;
            }
            __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 798, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            __pyx_t_3 = __pyx_t_7;
            __pyx_L35_bool_binop_done:;
            if (__pyx_t_3) {
/* … */
            }
+0799:                             site_bead_type = 0
              __pyx_v_site_bead_type = 0;
+0800:                     energy_new = energy_new + interaction_table[bead_type, site_bead_type]
          __pyx_t_9 = __pyx_v_bead_type;
          __pyx_t_8 = __pyx_v_site_bead_type;
          __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_9 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_interaction_table.strides[1]) ))));
+0801:                     if site_bead_type > 0:
          __pyx_t_3 = (__pyx_v_site_bead_type > 0);
          if (__pyx_t_3) {
/* … */
          }
+0802:                         energy_new_empty = energy_new_empty + interaction_table[0, site_bead_type]
            __pyx_t_2 = 0;
            __pyx_t_8 = __pyx_v_site_bead_type;
            __pyx_v_energy_new_empty = (__pyx_v_energy_new_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_2 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_interaction_table.strides[1]) ))));
+0803:                 elif abs(x) < 3 and abs(y) < 3:
        __pyx_t_6 = abs(__pyx_v_x); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 803, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 3);
        if (__pyx_t_7) {
        } else {
          __pyx_t_3 = __pyx_t_7;
          goto __pyx_L38_bool_binop_done;
        }
        __pyx_t_6 = abs(__pyx_v_y); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 803, __pyx_L1_error)
        __pyx_t_7 = (__pyx_t_6 < 3);
        __pyx_t_3 = __pyx_t_7;
        __pyx_L38_bool_binop_done:;
        if (__pyx_t_3) {
/* … */
          goto __pyx_L30;
        }
+0804:                     if hardwall == 1:
          __pyx_t_3 = (__pyx_v_hardwall == 1);
          if (__pyx_t_3) {
/* … */
          }
+0805:                         if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3:
            __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 805, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            if (!__pyx_t_7) {
            } else {
              __pyx_t_3 = __pyx_t_7;
              goto __pyx_L42_bool_binop_done;
            }
            __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 805, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            __pyx_t_3 = __pyx_t_7;
            __pyx_L42_bool_binop_done:;
            if (__pyx_t_3) {
/* … */
            }
+0806:                             continue
              goto __pyx_L28_continue;
+0807:                     energy_new = energy_new + LR_interaction_table[bead_type, site_bead_type]
          __pyx_t_8 = __pyx_v_bead_type;
          __pyx_t_9 = __pyx_v_site_bead_type;
          __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_LR_interaction_table.data + __pyx_t_8 * __pyx_v_LR_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_LR_interaction_table.strides[1]) ))));
 0808:                 else:
+0809:                     if hardwall == 1:
        /*else*/ {
          __pyx_t_3 = (__pyx_v_hardwall == 1);
          if (__pyx_t_3) {
/* … */
          }
+0810:                         if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3:
            __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 810, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            if (!__pyx_t_7) {
            } else {
              __pyx_t_3 = __pyx_t_7;
              goto __pyx_L46_bool_binop_done;
            }
            __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 810, __pyx_L1_error)
            __pyx_t_7 = (__pyx_t_6 > 3);
            __pyx_t_3 = __pyx_t_7;
            __pyx_L46_bool_binop_done:;
            if (__pyx_t_3) {
/* … */
            }
+0811:                             continue
              goto __pyx_L28_continue;
+0812:                     energy_new = energy_new + SLR_interaction_table[bead_type, site_bead_type]
          __pyx_t_9 = __pyx_v_bead_type;
          __pyx_t_8 = __pyx_v_site_bead_type;
          __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_SLR_interaction_table.data + __pyx_t_9 * __pyx_v_SLR_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_SLR_interaction_table.strides[1]) ))));
        }
        __pyx_L30:;
        __pyx_L28_continue:;
      }
    }
 0813: 
 0814:     else:
+0815:         for x in range(-1, 2):
  /*else*/ {
    for (__pyx_t_4 = -1; __pyx_t_4 < 2; __pyx_t_4+=1) {
      __pyx_v_x = __pyx_t_4;
+0816:             for y in range(-1, 2):
      for (__pyx_t_5 = -1; __pyx_t_5 < 2; __pyx_t_5+=1) {
        __pyx_v_y = __pyx_t_5;
+0817:                 tmp_x = pbc_correction(old_x + x, XDIM)
        __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_x + __pyx_v_x), __pyx_v_XDIM);
+0818:                 tmp_y = pbc_correction(old_y + y, YDIM)
        __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_old_y + __pyx_v_y), __pyx_v_YDIM);
+0819:                 site_bead_type = type_grid[tmp_x, tmp_y]
        __pyx_t_2 = __pyx_v_tmp_x;
        __pyx_t_1 = __pyx_v_tmp_y;
        __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_2 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )));
+0820:                 if hardwall == 1:
        __pyx_t_3 = (__pyx_v_hardwall == 1);
        if (__pyx_t_3) {
/* … */
        }
+0821:                     if abs(tmp_x - old_x) > 3 or abs(tmp_y - old_y) > 3:
          __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_old_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 821, __pyx_L1_error)
          __pyx_t_7 = (__pyx_t_6 > 3);
          if (!__pyx_t_7) {
          } else {
            __pyx_t_3 = __pyx_t_7;
            goto __pyx_L54_bool_binop_done;
          }
          __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_old_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 821, __pyx_L1_error)
          __pyx_t_7 = (__pyx_t_6 > 3);
          __pyx_t_3 = __pyx_t_7;
          __pyx_L54_bool_binop_done:;
          if (__pyx_t_3) {
/* … */
          }
+0822:                         site_bead_type = 0
            __pyx_v_site_bead_type = 0;
+0823:                 energy_old = energy_old + interaction_table[bead_type, site_bead_type]
        __pyx_t_8 = __pyx_v_bead_type;
        __pyx_t_9 = __pyx_v_site_bead_type;
        __pyx_v_energy_old = (__pyx_v_energy_old + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_8 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_interaction_table.strides[1]) ))));
+0824:                 if site_bead_type > 0:
        __pyx_t_3 = (__pyx_v_site_bead_type > 0);
        if (__pyx_t_3) {
/* … */
        }
      }
    }
+0825:                     energy_old_empty = energy_old_empty + interaction_table[0, site_bead_type]
          __pyx_t_1 = 0;
          __pyx_t_9 = __pyx_v_site_bead_type;
          __pyx_v_energy_old_empty = (__pyx_v_energy_old_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_1 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_interaction_table.strides[1]) ))));
 0826: 
+0827:         type_grid[new_x, new_y] = type_grid[old_x, old_y]
    __pyx_t_1 = __pyx_v_old_x;
    __pyx_t_2 = __pyx_v_old_y;
    __pyx_t_11 = __pyx_v_new_x;
    __pyx_t_10 = __pyx_v_new_y;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_11 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )));
+0828:         type_grid[old_x, old_y] = 0
    __pyx_t_2 = __pyx_v_old_x;
    __pyx_t_1 = __pyx_v_old_y;
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_2 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )) = 0;
 0829: 
+0830:         for x in range(-1, 2):
    for (__pyx_t_4 = -1; __pyx_t_4 < 2; __pyx_t_4+=1) {
      __pyx_v_x = __pyx_t_4;
+0831:             for y in range(-1, 2):
      for (__pyx_t_5 = -1; __pyx_t_5 < 2; __pyx_t_5+=1) {
        __pyx_v_y = __pyx_t_5;
+0832:                 tmp_x = pbc_correction(new_x + x, XDIM)
        __pyx_v_tmp_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_x + __pyx_v_x), __pyx_v_XDIM);
+0833:                 tmp_y = pbc_correction(new_y + y, YDIM)
        __pyx_v_tmp_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_new_y + __pyx_v_y), __pyx_v_YDIM);
+0834:                 site_bead_type = type_grid[tmp_x, tmp_y]
        __pyx_t_1 = __pyx_v_tmp_x;
        __pyx_t_2 = __pyx_v_tmp_y;
        __pyx_v_site_bead_type = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )));
+0835:                 if hardwall == 1:
        __pyx_t_3 = (__pyx_v_hardwall == 1);
        if (__pyx_t_3) {
/* … */
        }
+0836:                     if abs(tmp_x - new_x) > 3 or abs(tmp_y - new_y) > 3:
          __pyx_t_6 = abs((__pyx_v_tmp_x - __pyx_v_new_x)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 836, __pyx_L1_error)
          __pyx_t_7 = (__pyx_t_6 > 3);
          if (!__pyx_t_7) {
          } else {
            __pyx_t_3 = __pyx_t_7;
            goto __pyx_L63_bool_binop_done;
          }
          __pyx_t_6 = abs((__pyx_v_tmp_y - __pyx_v_new_y)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 836, __pyx_L1_error)
          __pyx_t_7 = (__pyx_t_6 > 3);
          __pyx_t_3 = __pyx_t_7;
          __pyx_L63_bool_binop_done:;
          if (__pyx_t_3) {
/* … */
          }
+0837:                         site_bead_type = 0
            __pyx_v_site_bead_type = 0;
+0838:                 energy_new = energy_new + interaction_table[bead_type, site_bead_type]
        __pyx_t_9 = __pyx_v_bead_type;
        __pyx_t_8 = __pyx_v_site_bead_type;
        __pyx_v_energy_new = (__pyx_v_energy_new + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_9 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_interaction_table.strides[1]) ))));
+0839:                 if site_bead_type > 0:
        __pyx_t_3 = (__pyx_v_site_bead_type > 0);
        if (__pyx_t_3) {
/* … */
        }
      }
    }
  }
  __pyx_L3:;
+0840:                     energy_new_empty = energy_new_empty + interaction_table[0, site_bead_type]
          __pyx_t_2 = 0;
          __pyx_t_8 = __pyx_v_site_bead_type;
          __pyx_v_energy_new_empty = (__pyx_v_energy_new_empty + (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_2 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_interaction_table.strides[1]) ))));
 0841: 
+0842:     energy_old_empty = energy_old_empty - interaction_table[0, bead_type]
  __pyx_t_2 = 0;
  __pyx_t_8 = __pyx_v_bead_type;
  __pyx_v_energy_old_empty = (__pyx_v_energy_old_empty - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_2 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_interaction_table.strides[1]) ))));
+0843:     energy_old = energy_old - interaction_table[bead_type, bead_type]
  __pyx_t_8 = __pyx_v_bead_type;
  __pyx_t_9 = __pyx_v_bead_type;
  __pyx_v_energy_old = (__pyx_v_energy_old - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_8 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_interaction_table.strides[1]) ))));
+0844:     energy_new_empty = energy_new_empty - interaction_table[0, bead_type]
  __pyx_t_2 = 0;
  __pyx_t_9 = __pyx_v_bead_type;
  __pyx_v_energy_new_empty = (__pyx_v_energy_new_empty - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_2 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_9 * __pyx_v_interaction_table.strides[1]) ))));
+0845:     energy_new = energy_new - interaction_table[bead_type, bead_type]
  __pyx_t_9 = __pyx_v_bead_type;
  __pyx_t_8 = __pyx_v_bead_type;
  __pyx_v_energy_new = (__pyx_v_energy_new - (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_interaction_table.data + __pyx_t_9 * __pyx_v_interaction_table.strides[0]) ) + __pyx_t_8 * __pyx_v_interaction_table.strides[1]) ))));
 0846: 
+0847:     type_grid[old_x, old_y] = type_grid[new_x, new_y]
  __pyx_t_2 = __pyx_v_new_x;
  __pyx_t_1 = __pyx_v_new_y;
  __pyx_t_10 = __pyx_v_old_x;
  __pyx_t_11 = __pyx_v_old_y;
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_11 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_2 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )));
+0848:     type_grid[new_x, new_y] = 0
  __pyx_t_1 = __pyx_v_new_x;
  __pyx_t_2 = __pyx_v_new_y;
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )) = 0;
 0849: 
+0850:     return (energy_new + energy_old_empty) - (energy_old + energy_new_empty)
  __pyx_r = ((__pyx_v_energy_new + __pyx_v_energy_old_empty) - (__pyx_v_energy_old + __pyx_v_energy_new_empty));
  goto __pyx_L0;
 0851: 
 0852: 
 0853: # ---- public 2D entry point (signature matches mega_crank_2D.mega_crank_2D) ----
+0854: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_3mega_crank_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_2mega_crank_2D, "\n    Optimized, allocation-free 2D crankshaft Monte Carlo kernel.\n\n    Behaviourally identical (same RNG stream) to\n    pimms.mega_crank_2D.mega_crank_2D. Returns (energy, accepted_moves).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_3mega_crank_2D = {"mega_crank_2D", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_3mega_crank_2D, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_2mega_crank_2D};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_3mega_crank_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_nsteps;
  __Pyx_memviewslice __pyx_v_bead_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_crank_2D (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_nsteps,&__pyx_mstate_global->__pyx_n_u_bead_selector,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,0};
  PyObject* values[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 854, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 854, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_crank_2D", 0) < (0)) __PYX_ERR(0, 854, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 13; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_crank_2D", 1, 13, 13, i); __PYX_ERR(0, 854, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 13)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 854, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 854, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 856, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 857, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 858, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 859, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 860, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 861, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 862, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[7]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 863, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[8]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 864, __pyx_L3_error)
    __pyx_v_nsteps = __Pyx_PyLong_As_int(values[9]); if (unlikely((__pyx_v_nsteps == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 865, __pyx_L3_error)
    __pyx_v_bead_selector = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_bead_selector.memview)) __PYX_ERR(0, 866, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[11]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 867, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[12]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 868, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_crank_2D", 1, 13, 13, __pyx_nargs); __PYX_ERR(0, 854, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_bead_selector, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_2mega_crank_2D(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_nsteps, __pyx_v_bead_selector, __pyx_v_passed_seed, __pyx_v_hardwall);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_bead_selector, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_2mega_crank_2D(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_nsteps, __Pyx_memviewslice __pyx_v_bead_selector, int __pyx_v_passed_seed, int __pyx_v_hardwall) {
  unsigned int __pyx_v_i;
  int __pyx_v_bead_index;
  int __pyx_v_accepted_moves;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  long __pyx_v_delta_energy;
  long __pyx_v_delta_angle_energy;
  int __pyx_v_beadflag;
  int __pyx_v_ok;
  int __pyx_v_old_x;
  int __pyx_v_old_y;
  int __pyx_v_lr_vs_sr;
  int __pyx_v_bead_id;
  int __pyx_v_new_position[2];
  int __pyx_v_anchor0;
  int __pyx_v_anchor1;
  int __pyx_v_Nx;
  int __pyx_v_Ny;
  int __pyx_v_Cx;
  int __pyx_v_Cy;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_3mega_crank_2D, 0, __pyx_mstate_global->__pyx_n_u_mega_crank_2D, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[7])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_crank_2D, __pyx_t_4) < (0)) __PYX_ERR(0, 854, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 0855: @cython.boundscheck(False)
 0856: def mega_crank_2D(NUMPY_INT_TYPE[:, :] grid,
 0857:                   NUMPY_INT_TYPE[:, :] type_grid,
 0858:                   NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 0859:                   NUMPY_INT_TYPE[:, :] interaction_table,
 0860:                   NUMPY_INT_TYPE[:, :] LR_interaction_table,
 0861:                   NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 0862:                   NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 0863:                   long energy,
 0864:                   float invtemp,
 0865:                   int nsteps,
 0866:                   NUMPY_INT_TYPE_long[:] bead_selector,
 0867:                   int passed_seed,
 0868:                   int hardwall):
 0869:     """
 0870:     Optimized, allocation-free 2D crankshaft Monte Carlo kernel.
 0871: 
 0872:     Behaviourally identical (same RNG stream) to
 0873:     pimms.mega_crank_2D.mega_crank_2D. Returns (energy, accepted_moves).
 0874:     """
+0875:     mc_seed(passed_seed)
  __pyx_f_5pimms_15mega_crank_fast_mc_seed(__pyx_v_passed_seed);
 0876: 
 0877:     cdef unsigned int i
 0878:     cdef int bead_index
+0879:     cdef int accepted_moves = 0
  __pyx_v_accepted_moves = 0;
+0880:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+0881:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
 0882:     cdef long delta_energy, delta_angle_energy
 0883:     cdef int beadflag, ok
 0884: 
 0885:     cdef int old_x, old_y, lr_vs_sr, bead_id
 0886:     cdef int new_position[2]
 0887:     cdef int anchor0, anchor1
 0888:     cdef int Nx, Ny, Cx, Cy
 0889: 
+0890:     for i in range(nsteps):
  __pyx_t_1 = __pyx_v_nsteps;
  __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;
+0891:         bead_index = bead_selector[i]
    __pyx_t_4 = __pyx_v_i;
    __pyx_v_bead_index = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=0 */ (__pyx_v_bead_selector.data + __pyx_t_4 * __pyx_v_bead_selector.strides[0]) )));
 0892: 
+0893:         beadflag = idx_to_bead[bead_index, 0]
    __pyx_t_5 = __pyx_v_bead_index;
    __pyx_t_6 = 0;
    __pyx_v_beadflag = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0894:         old_x = idx_to_bead[bead_index, 5]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_5 = 5;
    __pyx_v_old_x = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0895:         old_y = idx_to_bead[bead_index, 6]
    __pyx_t_5 = __pyx_v_bead_index;
    __pyx_t_6 = 6;
    __pyx_v_old_y = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0896:         lr_vs_sr = idx_to_bead[bead_index, 1]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_5 = 1;
    __pyx_v_lr_vs_sr = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0897:         bead_id = idx_to_bead[bead_index, 4]
    __pyx_t_5 = __pyx_v_bead_index;
    __pyx_t_6 = 4;
    __pyx_v_bead_id = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 0898: 
 0899:         # ---- single bead (flag 0) ----
+0900:         if beadflag == 0:
    switch (__pyx_v_beadflag) {
      case 0:
/* … */
      break;
      case 1:
+0901:             ok = single_bead_crank_2D_c(old_x, old_y, grid, XDIM, YDIM, new_position)
      __pyx_v_ok = __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_2D_c(__pyx_v_old_x, __pyx_v_old_y, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_new_position);
 0902: 
 0903:         # ---- N-terminal bead (flag 1) ----
+0904:         elif beadflag == 1:
      break;
      case 3:
+0905:             anchor0 = idx_to_bead[bead_index + 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_5 = 5;
      __pyx_v_anchor0 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0906:             anchor1 = idx_to_bead[bead_index + 1, 6]
      __pyx_t_5 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 6;
      __pyx_v_anchor1 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0907:             ok = single_bead_crank_2D_c(anchor0, anchor1, grid, XDIM, YDIM, new_position)
      __pyx_v_ok = __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_2D_c(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_new_position);
+0908:             if hardwall == 1:
      __pyx_t_7 = (__pyx_v_hardwall == 1);
      if (__pyx_t_7) {
/* … */
      }
+0909:                 if straddle_pair(new_position[0], new_position[1], 0,
        if (__pyx_t_7) {
/* … */
        }
+0910:                                  anchor0, anchor1, 0) == 1:
        __pyx_t_7 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0, __pyx_v_anchor0, __pyx_v_anchor1, 0) == 1);
+0911:                     continue
          goto __pyx_L3_continue;
 0912: 
 0913:         # ---- C-terminal bead (flag 3) ----
+0914:         elif beadflag == 3:
      break;
      default:
+0915:             anchor0 = idx_to_bead[bead_index - 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_5 = 5;
      __pyx_v_anchor0 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0916:             anchor1 = idx_to_bead[bead_index - 1, 6]
      __pyx_t_5 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 6;
      __pyx_v_anchor1 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0917:             ok = single_bead_crank_2D_c(anchor0, anchor1, grid, XDIM, YDIM, new_position)
      __pyx_v_ok = __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_2D_c(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_new_position);
+0918:             if hardwall == 1:
      __pyx_t_7 = (__pyx_v_hardwall == 1);
      if (__pyx_t_7) {
/* … */
      }
+0919:                 if straddle_pair(anchor0, anchor1, 0,
        if (__pyx_t_7) {
/* … */
        }
+0920:                                  new_position[0], new_position[1], 0) == 1:
        __pyx_t_7 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_anchor0, __pyx_v_anchor1, 0, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0) == 1);
+0921:                     continue
          goto __pyx_L3_continue;
 0922: 
 0923:         # ---- internal bead (flags 2,4,5,6) ----
 0924:         else:
+0925:             Nx = idx_to_bead[bead_index - 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_5 = 5;
      __pyx_v_Nx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0926:             Ny = idx_to_bead[bead_index - 1, 6]
      __pyx_t_5 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 6;
      __pyx_v_Ny = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0927:             Cx = idx_to_bead[bead_index + 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_5 = 5;
      __pyx_v_Cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )));
+0928:             Cy = idx_to_bead[bead_index + 1, 6]
      __pyx_t_5 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 6;
      __pyx_v_Cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+0929:             ok = crank_it_2D_c(Nx, Ny, Cx, Cy, grid, XDIM, YDIM, new_position)
      __pyx_v_ok = __pyx_f_5pimms_15mega_crank_fast_crank_it_2D_c(__pyx_v_Nx, __pyx_v_Ny, __pyx_v_Cx, __pyx_v_Cy, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_new_position);
+0930:             if hardwall == 1:
      __pyx_t_7 = (__pyx_v_hardwall == 1);
      if (__pyx_t_7) {
/* … */
      }
      break;
    }
+0931:                 if (straddle_pair(Nx, Ny, 0,
        if (__pyx_t_7) {
/* … */
        }
+0932:                                   new_position[0], new_position[1], 0) == 1
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_Nx, __pyx_v_Ny, 0, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0) == 1);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_7 = __pyx_t_8;
          goto __pyx_L11_bool_binop_done;
        }
 0933:                     or straddle_pair(new_position[0], new_position[1], 0,
+0934:                                      Cx, Cy, 0) == 1):
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0, __pyx_v_Cx, __pyx_v_Cy, 0) == 1);
        __pyx_t_7 = __pyx_t_8;
        __pyx_L11_bool_binop_done:;
+0935:                     continue
          goto __pyx_L3_continue;
 0936: 
+0937:         if ok == 1:
    __pyx_t_7 = (__pyx_v_ok == 1);
    if (__pyx_t_7) {
/* … */
    }
    __pyx_L3_continue:;
  }
+0938:             delta_energy = get_energy_change_2D_c(grid, type_grid,
      __pyx_v_delta_energy = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_old_x, __pyx_v_old_y, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), __pyx_v_lr_vs_sr, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
 0939:                                                   old_x, old_y,
 0940:                                                   new_position[0], new_position[1],
 0941:                                                   lr_vs_sr,
 0942:                                                   interaction_table, LR_interaction_table,
 0943:                                                   SLR_interaction_table,
 0944:                                                   XDIM, YDIM, hardwall)
+0945:             delta_angle_energy = get_angle_energy_change_2D_c(bead_index, idx_to_bead,
      __pyx_v_delta_angle_energy = __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c(__pyx_v_bead_index, __pyx_v_idx_to_bead, __pyx_v_new_position, __pyx_v_angle_lookup);
 0946:                                                               new_position, angle_lookup)
 0947: 
+0948:             if accept_or_reject(invtemp, energy, energy + delta_energy + delta_angle_energy) == 1:
      __pyx_t_7 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, ((__pyx_v_energy + __pyx_v_delta_energy) + __pyx_v_delta_angle_energy)) == 1);
      if (__pyx_t_7) {
/* … */
      }
+0949:                 grid[old_x, old_y] = 0
        __pyx_t_6 = __pyx_v_old_x;
        __pyx_t_5 = __pyx_v_old_y;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_grid.strides[1]) )) = 0;
+0950:                 grid[new_position[0], new_position[1]] = bead_id
        __pyx_t_5 = (__pyx_v_new_position[0]);
        __pyx_t_6 = (__pyx_v_new_position[1]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_5 * __pyx_v_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_grid.strides[1]) )) = __pyx_v_bead_id;
+0951:                 type_grid[new_position[0], new_position[1]] = type_grid[old_x, old_y]
        __pyx_t_6 = __pyx_v_old_x;
        __pyx_t_5 = __pyx_v_old_y;
        __pyx_t_9 = (__pyx_v_new_position[0]);
        __pyx_t_10 = (__pyx_v_new_position[1]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_9 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_6 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_type_grid.strides[1]) )));
+0952:                 type_grid[old_x, old_y] = 0
        __pyx_t_5 = __pyx_v_old_x;
        __pyx_t_6 = __pyx_v_old_y;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_5 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) )) = 0;
+0953:                 idx_to_bead[bead_index, 5] = new_position[0]
        __pyx_t_6 = __pyx_v_bead_index;
        __pyx_t_5 = 5;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_5 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[0]);
+0954:                 idx_to_bead[bead_index, 6] = new_position[1]
        __pyx_t_5 = __pyx_v_bead_index;
        __pyx_t_6 = 6;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_5 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[1]);
+0955:                 energy = energy + delta_energy + delta_angle_energy
        __pyx_v_energy = ((__pyx_v_energy + __pyx_v_delta_energy) + __pyx_v_delta_angle_energy);
+0956:                 accepted_moves = accepted_moves + 1
        __pyx_v_accepted_moves = (__pyx_v_accepted_moves + 1);
 0957: 
+0958:     return (energy, accepted_moves)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 958, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_accepted_moves); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 958, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_13 = PyTuple_New(2); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 958, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11) != (0)) __PYX_ERR(0, 958, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_12);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_12) != (0)) __PYX_ERR(0, 958, __pyx_L1_error);
  __pyx_t_11 = 0;
  __pyx_t_12 = 0;
  __pyx_r = __pyx_t_13;
  __pyx_t_13 = 0;
  goto __pyx_L0;
 0959: 
 0960: 
 0961: # =====================================================================
 0962: #
 0963: #   PARALLEL (checkerboard / domain-decomposition) crankshaft kernel
 0964: #
 0965: #   Correctness argument (see pimms/fast_kernels/CHECKERBOARD_DESIGN.md):
 0966: #
 0967: #     * A single crankshaft/terminal move displaces a bead by at most 2
 0968: #       lattice sites and the energy evaluation reads +/- R_int around the
 0969: #       old and new positions (R_int = 3 if any long-range beads exist, else
 0970: #       1). Chain-neighbour (anchor / angle) reads are <= 2 sites away.
 0971: #       So the entire read+write footprint of a move lies within
 0972: #       W = R_int + 2 sites of the bead's current position.
 0973: #
 0974: #     * The box is split into blocks; only beads at least W sites inside their
 0975: #       block (a frozen halo of width W on every blocked face) are moved.
 0976: #       Hence every block's footprint stays strictly inside that block, blocks
 0977: #       are pairwise disjoint, and they can be updated concurrently with NO
 0978: #       locks and NO colouring. (A dim that is not split, nb==1, has no halo -
 0979: #       PBC wrap is fine because that whole dimension belongs to one block.)
 0980: #
 0981: #     * Metropolis acceptance depends only on dE, so each block accumulates a
 0982: #       private energy delta; the global energy is base + sum(block deltas).
 0983: #       Per-block independent PRNG streams avoid the non-thread-safe libc rand.
 0984: #
 0985: #     * Beads in the frozen halo are skipped this sweep; a fresh random origin
 0986: #       shift each call restores ergodicity over many sweeps. The kernel is
 0987: #       therefore NOT bit-identical to the serial kernel - it is a different
 0988: #       (but equally valid) Markov chain targeting the same Boltzmann
 0989: #       distribution, and is validated by ensemble + energy-consistency checks
 0990: #       (pimms/fast_kernels/benchmark_parallel.py).
 0991: #
 0992: # =====================================================================
 0993: 
 0994: # ---- per-thread PRNG (splitmix64) -----------------------------------
+0995: cdef inline unsigned long long splitmix64(unsigned long long* state) noexcept nogil:
static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_5pimms_15mega_crank_fast_splitmix64(unsigned PY_LONG_LONG *__pyx_v_state) {
  unsigned PY_LONG_LONG __pyx_v_z;
  unsigned PY_LONG_LONG __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
+0996:     state[0] = state[0] + <unsigned long long>0x9E3779B97F4A7C15
  (__pyx_v_state[0]) = ((__pyx_v_state[0]) + ((unsigned PY_LONG_LONG)0x9E3779B97F4A7C15));
+0997:     cdef unsigned long long z = state[0]
  __pyx_v_z = (__pyx_v_state[0]);
+0998:     z = (z ^ (z >> 30)) * <unsigned long long>0xBF58476D1CE4E5B9
  __pyx_v_z = ((__pyx_v_z ^ (__pyx_v_z >> 30)) * ((unsigned PY_LONG_LONG)0xBF58476D1CE4E5B9));
+0999:     z = (z ^ (z >> 27)) * <unsigned long long>0x94D049BB133111EB
  __pyx_v_z = ((__pyx_v_z ^ (__pyx_v_z >> 27)) * ((unsigned PY_LONG_LONG)0x94D049BB133111EB));
+1000:     return z ^ (z >> 31)
  __pyx_r = (__pyx_v_z ^ (__pyx_v_z >> 31));
  goto __pyx_L0;
 1001: 
+1002: cdef inline double rng_uniform(unsigned long long* state) noexcept nogil:
static CYTHON_INLINE double __pyx_f_5pimms_15mega_crank_fast_rng_uniform(unsigned PY_LONG_LONG *__pyx_v_state) {
  double __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 1003:     # 53-bit uniform in [0, 1)
+1004:     return <double>(splitmix64(state) >> 11) * (1.0 / 9007199254740992.0)
  __pyx_r = (((double)(__pyx_f_5pimms_15mega_crank_fast_splitmix64(__pyx_v_state) >> 11)) * (1.0 / 9007199254740992.0));
  goto __pyx_L0;
 1005: 
+1006: cdef inline int rng_randint(unsigned long long* state, int start, int end) noexcept nogil:
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_rng_randint(unsigned PY_LONG_LONG *__pyx_v_state, int __pyx_v_start, int __pyx_v_end) {
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 1007:     # mirrors the integer RANGE of the serial randint(start, end)
+1008:     if start == 0:
  __pyx_t_1 = (__pyx_v_start == 0);
  if (__pyx_t_1) {
/* … */
  }
+1009:         end = end + 1
    __pyx_v_end = (__pyx_v_end + 1);
+1010:     return start + <int>(rng_uniform(state) * end)
  __pyx_r = (__pyx_v_start + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform(__pyx_v_state) * __pyx_v_end)));
  goto __pyx_L0;
 1011: 
+1012: cdef inline int accept_p(float invtemp, long delta, unsigned long long* rng) noexcept nogil:
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_accept_p(float __pyx_v_invtemp, long __pyx_v_delta, unsigned PY_LONG_LONG *__pyx_v_rng) {
  double __pyx_v_expterm;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 1013:     cdef double expterm
+1014:     if delta <= 0:
  __pyx_t_1 = (__pyx_v_delta <= 0);
  if (__pyx_t_1) {
/* … */
  }
+1015:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+1016:     expterm = exp(-(<double>delta) * invtemp)
  __pyx_v_expterm = exp(((-((double)__pyx_v_delta)) * __pyx_v_invtemp));
+1017:     if rng_uniform(rng) < expterm:
  __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_rng_uniform(__pyx_v_rng) < __pyx_v_expterm);
  if (__pyx_t_1) {
/* … */
  }
+1018:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+1019:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 1020: 
 1021: 
 1022: # ---- move proposals using a per-thread PRNG (mirror the _c versions) ----
+1023: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp(int __pyx_v_ox, int __pyx_v_oy, int __pyx_v_oz, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, unsigned PY_LONG_LONG *__pyx_v_rng, int *__pyx_v_out) {
  int __pyx_v_x_off;
  int __pyx_v_y_off;
  int __pyx_v_z_off;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_v_local_z;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 1024: @cython.boundscheck(False)
 1025: cdef inline int single_bead_crank_cp(int ox, int oy, int oz,
 1026:                                      NUMPY_INT_TYPE[:, :, :] grid,
 1027:                                      int XDIM, int YDIM, int ZDIM,
 1028:                                      unsigned long long* rng, int* out) noexcept nogil:
+1029:     cdef int x_off = rng_randint(rng, 0, 2) - 1
  __pyx_v_x_off = (__pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 0, 2) - 1);
+1030:     cdef int y_off = rng_randint(rng, 0, 2) - 1
  __pyx_v_y_off = (__pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 0, 2) - 1);
+1031:     cdef int z_off = rng_randint(rng, 0, 2) - 1
  __pyx_v_z_off = (__pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 0, 2) - 1);
+1032:     cdef int local_x = pbc_correction(ox + x_off, XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_ox + __pyx_v_x_off), __pyx_v_XDIM);
+1033:     cdef int local_y = pbc_correction(oy + y_off, YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_oy + __pyx_v_y_off), __pyx_v_YDIM);
+1034:     cdef int local_z = pbc_correction(oz + z_off, ZDIM)
  __pyx_v_local_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_oz + __pyx_v_z_off), __pyx_v_ZDIM);
+1035:     if grid[local_x, local_y, local_z] > 0:
  __pyx_t_1 = __pyx_v_local_x;
  __pyx_t_2 = __pyx_v_local_y;
  __pyx_t_3 = __pyx_v_local_z;
  __pyx_t_4 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_grid.strides[2]) ))) > 0);
  if (__pyx_t_4) {
/* … */
  }
+1036:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+1037:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+1038:         out[2] = 0
    (__pyx_v_out[2]) = 0;
+1039:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+1040:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+1041:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+1042:     out[2] = local_z
  (__pyx_v_out[2]) = __pyx_v_local_z;
+1043:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 1044: 
 1045: 
+1046: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_crank_it_cp(int __pyx_v_N_side_x, int __pyx_v_N_side_y, int __pyx_v_N_side_z, int __pyx_v_C_side_x, int __pyx_v_C_side_y, int __pyx_v_C_side_z, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, unsigned PY_LONG_LONG *__pyx_v_rng, int *__pyx_v_out) {
  int __pyx_v_x_min;
  int __pyx_v_x_max;
  int __pyx_v_y_min;
  int __pyx_v_y_max;
  int __pyx_v_z_min;
  int __pyx_v_z_max;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_v_local_z;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.crank_it_cp", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 1047: @cython.boundscheck(False)
 1048: cdef inline int crank_it_cp(int N_side_x, int N_side_y, int N_side_z,
 1049:                             int C_side_x, int C_side_y, int C_side_z,
 1050:                             NUMPY_INT_TYPE[:, :, :] grid,
 1051:                             int XDIM, int YDIM, int ZDIM,
 1052:                             unsigned long long* rng, int* out) noexcept nogil:
 1053:     cdef int x_min, x_max, y_min, y_max, z_min, z_max
 1054:     cdef int local_x, local_y, local_z
 1055: 
+1056:     if abs(N_side_x - C_side_x) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_x - __pyx_v_C_side_x)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 1056, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+1057:         if N_side_x > C_side_x:
    __pyx_t_2 = (__pyx_v_N_side_x > __pyx_v_C_side_x);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L4;
    }
+1058:             C_side_x = C_side_x + XDIM
      __pyx_v_C_side_x = (__pyx_v_C_side_x + __pyx_v_XDIM);
 1059:         else:
+1060:             N_side_x = N_side_x + XDIM
    /*else*/ {
      __pyx_v_N_side_x = (__pyx_v_N_side_x + __pyx_v_XDIM);
    }
    __pyx_L4:;
+1061:     if abs(N_side_y - C_side_y) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_y - __pyx_v_C_side_y)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 1061, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+1062:         if N_side_y > C_side_y:
    __pyx_t_2 = (__pyx_v_N_side_y > __pyx_v_C_side_y);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L6;
    }
+1063:             C_side_y = C_side_y + YDIM
      __pyx_v_C_side_y = (__pyx_v_C_side_y + __pyx_v_YDIM);
 1064:         else:
+1065:             N_side_y = N_side_y + YDIM
    /*else*/ {
      __pyx_v_N_side_y = (__pyx_v_N_side_y + __pyx_v_YDIM);
    }
    __pyx_L6:;
+1066:     if abs(N_side_z - C_side_z) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_z - __pyx_v_C_side_z)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 1066, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+1067:         if N_side_z > C_side_z:
    __pyx_t_2 = (__pyx_v_N_side_z > __pyx_v_C_side_z);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L8;
    }
+1068:             C_side_z = C_side_z + ZDIM
      __pyx_v_C_side_z = (__pyx_v_C_side_z + __pyx_v_ZDIM);
 1069:         else:
+1070:             N_side_z = N_side_z + ZDIM
    /*else*/ {
      __pyx_v_N_side_z = (__pyx_v_N_side_z + __pyx_v_ZDIM);
    }
    __pyx_L8:;
 1071: 
+1072:     x_min = int_max(N_side_x - 1, C_side_x - 1)
  __pyx_v_x_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_x - 1), (__pyx_v_C_side_x - 1));
+1073:     x_max = int_min(N_side_x + 1, C_side_x + 1)
  __pyx_v_x_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_x + 1), (__pyx_v_C_side_x + 1));
+1074:     y_min = int_max(N_side_y - 1, C_side_y - 1)
  __pyx_v_y_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_y - 1), (__pyx_v_C_side_y - 1));
+1075:     y_max = int_min(N_side_y + 1, C_side_y + 1)
  __pyx_v_y_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_y + 1), (__pyx_v_C_side_y + 1));
+1076:     z_min = int_max(N_side_z - 1, C_side_z - 1)
  __pyx_v_z_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_z - 1), (__pyx_v_C_side_z - 1));
+1077:     z_max = int_min(N_side_z + 1, C_side_z + 1)
  __pyx_v_z_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_z + 1), (__pyx_v_C_side_z + 1));
 1078: 
+1079:     local_x = pbc_correction((x_min + rng_randint(rng, 1, (x_max - x_min + 1)) - 1), XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_x_min + __pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 1, ((__pyx_v_x_max - __pyx_v_x_min) + 1))) - 1), __pyx_v_XDIM);
+1080:     local_y = pbc_correction((y_min + rng_randint(rng, 1, (y_max - y_min + 1)) - 1), YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_y_min + __pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 1, ((__pyx_v_y_max - __pyx_v_y_min) + 1))) - 1), __pyx_v_YDIM);
+1081:     local_z = pbc_correction((z_min + rng_randint(rng, 1, (z_max - z_min + 1)) - 1), ZDIM)
  __pyx_v_local_z = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_z_min + __pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 1, ((__pyx_v_z_max - __pyx_v_z_min) + 1))) - 1), __pyx_v_ZDIM);
 1082: 
+1083:     if grid[local_x, local_y, local_z] > 0:
  __pyx_t_3 = __pyx_v_local_x;
  __pyx_t_4 = __pyx_v_local_y;
  __pyx_t_5 = __pyx_v_local_z;
  __pyx_t_2 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ) + __pyx_t_5 * __pyx_v_grid.strides[2]) ))) > 0);
  if (__pyx_t_2) {
/* … */
  }
+1084:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+1085:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+1086:         out[2] = 0
    (__pyx_v_out[2]) = 0;
+1087:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+1088:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+1089:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+1090:     out[2] = local_z
  (__pyx_v_out[2]) = __pyx_v_local_z;
+1091:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 1092: 
 1093: 
 1094: # ---- per-block worker (runs entirely without the GIL) ---------------
+1095: @cython.wraparound(False)
static void __pyx_f_5pimms_15mega_crank_fast_run_block(int __pyx_v_b, __Pyx_memviewslice __pyx_v_ids, __Pyx_memviewslice __pyx_v_starts, __Pyx_memviewslice __pyx_v_attempts, __Pyx_memviewslice __pyx_v_seeds, __Pyx_memviewslice __pyx_v_blo_x, __Pyx_memviewslice __pyx_v_blo_y, __Pyx_memviewslice __pyx_v_blo_z, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_Lz, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_nbz, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_shift_z, int __pyx_v_W, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, float __pyx_v_invtemp, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int __pyx_v_hardwall, __Pyx_memviewslice __pyx_v_out_delta, __Pyx_memviewslice __pyx_v_out_accepted) {
  int __pyx_v_lo;
  int __pyx_v_hi;
  int __pyx_v_n_block;
  unsigned PY_LONG_LONG __pyx_v_rng;
  long __pyx_v_dsum;
  int __pyx_v_acc;
  CYTHON_UNUSED int __pyx_v_k;
  int __pyx_v_pick;
  int __pyx_v_bead_index;
  int __pyx_v_beadflag;
  int __pyx_v_gx;
  int __pyx_v_gy;
  int __pyx_v_gz;
  int __pyx_v_sx;
  int __pyx_v_sy;
  int __pyx_v_sz;
  int __pyx_v_wx;
  int __pyx_v_wy;
  int __pyx_v_wz;
  int __pyx_v_old0;
  int __pyx_v_old1;
  int __pyx_v_old2;
  int __pyx_v_new_position[3];
  int __pyx_v_anchor0;
  int __pyx_v_anchor1;
  int __pyx_v_anchor2;
  int __pyx_v_Nx;
  int __pyx_v_Ny;
  int __pyx_v_Nz;
  int __pyx_v_Cx;
  int __pyx_v_Cy;
  int __pyx_v_Cz;
  long __pyx_v_delta_energy;
  long __pyx_v_delta_angle_energy;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.run_block", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 1096: @cython.boundscheck(False)
 1097: cdef void run_block(int b,
 1098:                     int[::1] ids, int[::1] starts, int[::1] attempts,
 1099:                     unsigned long long[::1] seeds,
 1100:                     int[::1] blo_x, int[::1] blo_y, int[::1] blo_z,
 1101:                     int Lx, int Ly, int Lz,
 1102:                     int nbx, int nby, int nbz,
 1103:                     int shift_x, int shift_y, int shift_z, int W,
 1104:                     NUMPY_INT_TYPE[:, :, :] grid,
 1105:                     NUMPY_INT_TYPE[:, :, :] type_grid,
 1106:                     NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 1107:                     NUMPY_INT_TYPE[:, :] interaction_table,
 1108:                     NUMPY_INT_TYPE[:, :] LR_interaction_table,
 1109:                     NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 1110:                     NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 1111:                     float invtemp, int XDIM, int YDIM, int ZDIM, int hardwall,
 1112:                     long[::1] out_delta, int[::1] out_accepted) noexcept nogil:
 1113: 
+1114:     cdef int lo = starts[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_v_lo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+1115:     cdef int hi = starts[b + 1]
  __pyx_t_1 = (__pyx_v_b + 1);
  __pyx_v_hi = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+1116:     cdef int n_block = hi - lo
  __pyx_v_n_block = (__pyx_v_hi - __pyx_v_lo);
+1117:     out_delta[b] = 0
  __pyx_t_1 = __pyx_v_b;
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = 0;
+1118:     out_accepted[b] = 0
  __pyx_t_1 = __pyx_v_b;
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = 0;
+1119:     if n_block <= 0:
  __pyx_t_2 = (__pyx_v_n_block <= 0);
  if (__pyx_t_2) {
/* … */
  }
+1120:         return
    goto __pyx_L0;
 1121: 
+1122:     cdef unsigned long long rng = seeds[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_v_rng = (*((unsigned PY_LONG_LONG *) ( /* dim=0 */ ((char *) (((unsigned PY_LONG_LONG *) __pyx_v_seeds.data) + __pyx_t_1)) )));
+1123:     cdef long dsum = 0
  __pyx_v_dsum = 0;
+1124:     cdef int acc = 0
  __pyx_v_acc = 0;
 1125:     cdef int k, pick, bead_index, beadflag, ok
 1126:     cdef int gx, gy, gz, sx, sy, sz, wx, wy, wz
 1127:     cdef int old0, old1, old2
 1128:     cdef int new_position[3]
 1129:     cdef int anchor0, anchor1, anchor2
 1130:     cdef int Nx, Ny, Nz, Cx, Cy, Cz
 1131:     cdef long delta_energy, delta_angle_energy
 1132: 
+1133:     for k in range(attempts[b]):
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_3 = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_attempts.data) + __pyx_t_1)) )));
  __pyx_t_4 = __pyx_t_3;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_k = __pyx_t_5;
 1134:         # pick a random bead from this block's list
+1135:         pick = lo + <int>(rng_uniform(&rng) * n_block)
    __pyx_v_pick = (__pyx_v_lo + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform((&__pyx_v_rng)) * __pyx_v_n_block)));
+1136:         if pick >= hi:
    __pyx_t_2 = (__pyx_v_pick >= __pyx_v_hi);
    if (__pyx_t_2) {
/* … */
    }
+1137:             pick = hi - 1
      __pyx_v_pick = (__pyx_v_hi - 1);
+1138:         bead_index = ids[pick]
    __pyx_t_1 = __pyx_v_pick;
    __pyx_v_bead_index = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_ids.data) + __pyx_t_1)) )));
 1139: 
+1140:         gx = idx_to_bead[bead_index, 5]
    __pyx_t_1 = __pyx_v_bead_index;
    __pyx_t_6 = 5;
    __pyx_v_gx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1141:         gy = idx_to_bead[bead_index, 6]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_1 = 6;
    __pyx_v_gy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1142:         gz = idx_to_bead[bead_index, 7]
    __pyx_t_1 = __pyx_v_bead_index;
    __pyx_t_6 = 7;
    __pyx_v_gz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 1143: 
 1144:         # re-test interior membership against the CURRENT position (a bead may
 1145:         # have drifted to the frozen halo during this block's run). Skip if not
 1146:         # at least W inside every blocked dimension - guarantees the footprint
 1147:         # stays in-block.
+1148:         if nbx > 1:
    __pyx_t_2 = (__pyx_v_nbx > 1);
    if (__pyx_t_2) {
/* … */
    }
+1149:             sx = (gx - shift_x + XDIM) % XDIM
      __pyx_t_7 = ((__pyx_v_gx - __pyx_v_shift_x) + __pyx_v_XDIM);
      if (unlikely(__pyx_v_XDIM == 0)) {
        PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
        __Pyx_PyGILState_Release(__pyx_gilstate_save);
        __PYX_ERR(0, 1149, __pyx_L1_error)
      }
      __pyx_v_sx = __Pyx_mod_int(__pyx_t_7, __pyx_v_XDIM, 0);
+1150:             wx = sx - blo_x[b]
      __pyx_t_6 = __pyx_v_b;
      __pyx_v_wx = (__pyx_v_sx - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_6)) ))));
+1151:             if wx < W or wx >= Lx - W:
      __pyx_t_8 = (__pyx_v_wx < __pyx_v_W);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_2 = __pyx_t_8;
        goto __pyx_L9_bool_binop_done;
      }
      __pyx_t_8 = (__pyx_v_wx >= (__pyx_v_Lx - __pyx_v_W));
      __pyx_t_2 = __pyx_t_8;
      __pyx_L9_bool_binop_done:;
      if (__pyx_t_2) {
/* … */
      }
+1152:                 continue
        goto __pyx_L4_continue;
+1153:         if nby > 1:
    __pyx_t_2 = (__pyx_v_nby > 1);
    if (__pyx_t_2) {
/* … */
    }
+1154:             sy = (gy - shift_y + YDIM) % YDIM
      __pyx_t_7 = ((__pyx_v_gy - __pyx_v_shift_y) + __pyx_v_YDIM);
      if (unlikely(__pyx_v_YDIM == 0)) {
        PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
        __Pyx_PyGILState_Release(__pyx_gilstate_save);
        __PYX_ERR(0, 1154, __pyx_L1_error)
      }
      __pyx_v_sy = __Pyx_mod_int(__pyx_t_7, __pyx_v_YDIM, 0);
+1155:             wy = sy - blo_y[b]
      __pyx_t_6 = __pyx_v_b;
      __pyx_v_wy = (__pyx_v_sy - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_6)) ))));
+1156:             if wy < W or wy >= Ly - W:
      __pyx_t_8 = (__pyx_v_wy < __pyx_v_W);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_2 = __pyx_t_8;
        goto __pyx_L13_bool_binop_done;
      }
      __pyx_t_8 = (__pyx_v_wy >= (__pyx_v_Ly - __pyx_v_W));
      __pyx_t_2 = __pyx_t_8;
      __pyx_L13_bool_binop_done:;
      if (__pyx_t_2) {
/* … */
      }
+1157:                 continue
        goto __pyx_L4_continue;
+1158:         if nbz > 1:
    __pyx_t_2 = (__pyx_v_nbz > 1);
    if (__pyx_t_2) {
/* … */
    }
+1159:             sz = (gz - shift_z + ZDIM) % ZDIM
      __pyx_t_7 = ((__pyx_v_gz - __pyx_v_shift_z) + __pyx_v_ZDIM);
      if (unlikely(__pyx_v_ZDIM == 0)) {
        PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
        __Pyx_PyGILState_Release(__pyx_gilstate_save);
        __PYX_ERR(0, 1159, __pyx_L1_error)
      }
      __pyx_v_sz = __Pyx_mod_int(__pyx_t_7, __pyx_v_ZDIM, 0);
+1160:             wz = sz - blo_z[b]
      __pyx_t_6 = __pyx_v_b;
      __pyx_v_wz = (__pyx_v_sz - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_z.data) + __pyx_t_6)) ))));
+1161:             if wz < W or wz >= Lz - W:
      __pyx_t_8 = (__pyx_v_wz < __pyx_v_W);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_2 = __pyx_t_8;
        goto __pyx_L17_bool_binop_done;
      }
      __pyx_t_8 = (__pyx_v_wz >= (__pyx_v_Lz - __pyx_v_W));
      __pyx_t_2 = __pyx_t_8;
      __pyx_L17_bool_binop_done:;
      if (__pyx_t_2) {
/* … */
      }
+1162:                 continue
        goto __pyx_L4_continue;
 1163: 
+1164:         old0 = gx
    __pyx_v_old0 = __pyx_v_gx;
+1165:         old1 = gy
    __pyx_v_old1 = __pyx_v_gy;
+1166:         old2 = gz
    __pyx_v_old2 = __pyx_v_gz;
+1167:         beadflag = idx_to_bead[bead_index, 0]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_1 = 0;
    __pyx_v_beadflag = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
 1168: 
+1169:         if beadflag == 0:
    switch (__pyx_v_beadflag) {
      case 0:
/* … */
      break;
      case 1:
+1170:             single_bead_crank_cp(old0, old1, old2, grid, XDIM, YDIM, ZDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp(__pyx_v_old0, __pyx_v_old1, __pyx_v_old2, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, (&__pyx_v_rng), __pyx_v_new_position));
 1171: 
+1172:         elif beadflag == 1:
      break;
      case 3:
+1173:             anchor0 = idx_to_bead[bead_index + 1, 5]
      __pyx_t_1 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 5;
      __pyx_v_anchor0 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1174:             anchor1 = idx_to_bead[bead_index + 1, 6]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_1 = 6;
      __pyx_v_anchor1 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1175:             anchor2 = idx_to_bead[bead_index + 1, 7]
      __pyx_t_1 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 7;
      __pyx_v_anchor2 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1176:             single_bead_crank_cp(anchor0, anchor1, anchor2, grid, XDIM, YDIM, ZDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_anchor2, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, (&__pyx_v_rng), __pyx_v_new_position));
+1177:             if hardwall == 1:
      __pyx_t_2 = (__pyx_v_hardwall == 1);
      if (__pyx_t_2) {
/* … */
      }
+1178:                 if straddle_pair(new_position[0], new_position[1], new_position[2],
        if (__pyx_t_2) {
/* … */
        }
+1179:                                  anchor0, anchor1, anchor2) == 1:
        __pyx_t_2 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2]), __pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_anchor2) == 1);
+1180:                     continue
          goto __pyx_L4_continue;
 1181: 
+1182:         elif beadflag == 3:
      break;
      default:
+1183:             anchor0 = idx_to_bead[bead_index - 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_1 = 5;
      __pyx_v_anchor0 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1184:             anchor1 = idx_to_bead[bead_index - 1, 6]
      __pyx_t_1 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 6;
      __pyx_v_anchor1 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1185:             anchor2 = idx_to_bead[bead_index - 1, 7]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_1 = 7;
      __pyx_v_anchor2 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1186:             single_bead_crank_cp(anchor0, anchor1, anchor2, grid, XDIM, YDIM, ZDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_anchor2, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, (&__pyx_v_rng), __pyx_v_new_position));
+1187:             if hardwall == 1:
      __pyx_t_2 = (__pyx_v_hardwall == 1);
      if (__pyx_t_2) {
/* … */
      }
+1188:                 if straddle_pair(anchor0, anchor1, anchor2,
        if (__pyx_t_2) {
/* … */
        }
+1189:                                  new_position[0], new_position[1], new_position[2]) == 1:
        __pyx_t_2 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_anchor2, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2])) == 1);
+1190:                     continue
          goto __pyx_L4_continue;
 1191: 
 1192:         else:
+1193:             Nx = idx_to_bead[bead_index - 1, 5]
      __pyx_t_1 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 5;
      __pyx_v_Nx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1194:             Ny = idx_to_bead[bead_index - 1, 6]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_1 = 6;
      __pyx_v_Ny = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1195:             Nz = idx_to_bead[bead_index - 1, 7]
      __pyx_t_1 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 7;
      __pyx_v_Nz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1196:             Cx = idx_to_bead[bead_index + 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_1 = 5;
      __pyx_v_Cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1197:             Cy = idx_to_bead[bead_index + 1, 6]
      __pyx_t_1 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 6;
      __pyx_v_Cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1198:             Cz = idx_to_bead[bead_index + 1, 7]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_1 = 7;
      __pyx_v_Cz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1199:             crank_it_cp(Nx, Ny, Nz, Cx, Cy, Cz, grid, XDIM, YDIM, ZDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_crank_it_cp(__pyx_v_Nx, __pyx_v_Ny, __pyx_v_Nz, __pyx_v_Cx, __pyx_v_Cy, __pyx_v_Cz, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, (&__pyx_v_rng), __pyx_v_new_position));
+1200:             if hardwall == 1:
      __pyx_t_2 = (__pyx_v_hardwall == 1);
      if (__pyx_t_2) {
/* … */
      }
      break;
    }
+1201:                 if (straddle_pair(Nx, Ny, Nz,
        if (__pyx_t_2) {
/* … */
        }
+1202:                                   new_position[0], new_position[1], new_position[2]) == 1
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_Nx, __pyx_v_Ny, __pyx_v_Nz, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2])) == 1);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L25_bool_binop_done;
        }
 1203:                     or straddle_pair(new_position[0], new_position[1], new_position[2],
+1204:                                      Cx, Cy, Cz) == 1):
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2]), __pyx_v_Cx, __pyx_v_Cy, __pyx_v_Cz) == 1);
        __pyx_t_2 = __pyx_t_8;
        __pyx_L25_bool_binop_done:;
+1205:                     continue
          goto __pyx_L4_continue;
 1206: 
+1207:         if not new_position[0] < 0:
    __pyx_t_2 = (!((__pyx_v_new_position[0]) < 0));
    if (__pyx_t_2) {
/* … */
    }
    __pyx_L4_continue:;
  }
 1208:             # DETAILED BALANCE: reject any move whose NEW position would leave
 1209:             # the movable interior (i.e. land in the frozen halo). A halo bead is
 1210:             # never selected, so it could never make the reverse move; allowing
 1211:             # the forward move (interior -> halo) without the reverse breaks
 1212:             # detailed balance and biases the sampled ensemble. Rejecting these
 1213:             # out-of-interior proposals (the bead simply stays put) keeps the
 1214:             # movable region closed and the move set symmetric.
+1215:             if nbx > 1:
      __pyx_t_2 = (__pyx_v_nbx > 1);
      if (__pyx_t_2) {
/* … */
      }
+1216:                 sx = (new_position[0] - shift_x + XDIM) % XDIM
        __pyx_t_7 = (((__pyx_v_new_position[0]) - __pyx_v_shift_x) + __pyx_v_XDIM);
        if (unlikely(__pyx_v_XDIM == 0)) {
          PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
          PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
          __Pyx_PyGILState_Release(__pyx_gilstate_save);
          __PYX_ERR(0, 1216, __pyx_L1_error)
        }
        __pyx_v_sx = __Pyx_mod_int(__pyx_t_7, __pyx_v_XDIM, 0);
+1217:                 wx = sx - blo_x[b]
        __pyx_t_1 = __pyx_v_b;
        __pyx_v_wx = (__pyx_v_sx - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) ))));
+1218:                 if wx < W or wx >= Lx - W:
        __pyx_t_8 = (__pyx_v_wx < __pyx_v_W);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L30_bool_binop_done;
        }
        __pyx_t_8 = (__pyx_v_wx >= (__pyx_v_Lx - __pyx_v_W));
        __pyx_t_2 = __pyx_t_8;
        __pyx_L30_bool_binop_done:;
        if (__pyx_t_2) {
/* … */
        }
+1219:                     continue
          goto __pyx_L4_continue;
+1220:             if nby > 1:
      __pyx_t_2 = (__pyx_v_nby > 1);
      if (__pyx_t_2) {
/* … */
      }
+1221:                 sy = (new_position[1] - shift_y + YDIM) % YDIM
        __pyx_t_7 = (((__pyx_v_new_position[1]) - __pyx_v_shift_y) + __pyx_v_YDIM);
        if (unlikely(__pyx_v_YDIM == 0)) {
          PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
          PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
          __Pyx_PyGILState_Release(__pyx_gilstate_save);
          __PYX_ERR(0, 1221, __pyx_L1_error)
        }
        __pyx_v_sy = __Pyx_mod_int(__pyx_t_7, __pyx_v_YDIM, 0);
+1222:                 wy = sy - blo_y[b]
        __pyx_t_1 = __pyx_v_b;
        __pyx_v_wy = (__pyx_v_sy - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_1)) ))));
+1223:                 if wy < W or wy >= Ly - W:
        __pyx_t_8 = (__pyx_v_wy < __pyx_v_W);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L34_bool_binop_done;
        }
        __pyx_t_8 = (__pyx_v_wy >= (__pyx_v_Ly - __pyx_v_W));
        __pyx_t_2 = __pyx_t_8;
        __pyx_L34_bool_binop_done:;
        if (__pyx_t_2) {
/* … */
        }
+1224:                     continue
          goto __pyx_L4_continue;
+1225:             if nbz > 1:
      __pyx_t_2 = (__pyx_v_nbz > 1);
      if (__pyx_t_2) {
/* … */
      }
+1226:                 sz = (new_position[2] - shift_z + ZDIM) % ZDIM
        __pyx_t_7 = (((__pyx_v_new_position[2]) - __pyx_v_shift_z) + __pyx_v_ZDIM);
        if (unlikely(__pyx_v_ZDIM == 0)) {
          PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
          PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
          __Pyx_PyGILState_Release(__pyx_gilstate_save);
          __PYX_ERR(0, 1226, __pyx_L1_error)
        }
        __pyx_v_sz = __Pyx_mod_int(__pyx_t_7, __pyx_v_ZDIM, 0);
+1227:                 wz = sz - blo_z[b]
        __pyx_t_1 = __pyx_v_b;
        __pyx_v_wz = (__pyx_v_sz - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_z.data) + __pyx_t_1)) ))));
+1228:                 if wz < W or wz >= Lz - W:
        __pyx_t_8 = (__pyx_v_wz < __pyx_v_W);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L38_bool_binop_done;
        }
        __pyx_t_8 = (__pyx_v_wz >= (__pyx_v_Lz - __pyx_v_W));
        __pyx_t_2 = __pyx_t_8;
        __pyx_L38_bool_binop_done:;
        if (__pyx_t_2) {
/* … */
        }
+1229:                     continue
          goto __pyx_L4_continue;
 1230: 
+1231:             delta_energy = get_energy_change_c(grid, type_grid,
      __pyx_v_delta_energy = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_old0, __pyx_v_old1, __pyx_v_old2, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (__pyx_v_new_position[2]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
 1232:                                                old0, old1, old2,
 1233:                                                new_position[0], new_position[1], new_position[2],
+1234:                                                idx_to_bead[bead_index, 1],
      __pyx_t_1 = __pyx_v_bead_index;
      __pyx_t_6 = 1;
 1235:                                                interaction_table, LR_interaction_table,
 1236:                                                SLR_interaction_table,
 1237:                                                XDIM, YDIM, ZDIM, hardwall)
+1238:             delta_angle_energy = get_angle_energy_change_c(bead_index, idx_to_bead,
      __pyx_v_delta_angle_energy = __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c(__pyx_v_bead_index, __pyx_v_idx_to_bead, __pyx_v_new_position, __pyx_v_angle_lookup);
 1239:                                                            new_position, angle_lookup)
+1240:             if accept_p(invtemp, delta_energy + delta_angle_energy, &rng) == 1:
      __pyx_t_2 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, (__pyx_v_delta_energy + __pyx_v_delta_angle_energy), (&__pyx_v_rng)) == 1);
      if (__pyx_t_2) {
/* … */
      }
+1241:                 grid[old0, old1, old2] = 0
        __pyx_t_6 = __pyx_v_old0;
        __pyx_t_1 = __pyx_v_old1;
        __pyx_t_9 = __pyx_v_old2;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_grid.strides[1]) ) + __pyx_t_9 * __pyx_v_grid.strides[2]) )) = 0;
+1242:                 grid[new_position[0], new_position[1], new_position[2]] = idx_to_bead[bead_index, 4]
        __pyx_t_9 = __pyx_v_bead_index;
        __pyx_t_1 = 4;
        __pyx_t_6 = (__pyx_v_new_position[0]);
        __pyx_t_10 = (__pyx_v_new_position[1]);
        __pyx_t_11 = (__pyx_v_new_position[2]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1243:                 type_grid[new_position[0], new_position[1], new_position[2]] = type_grid[old0, old1, old2]
        __pyx_t_1 = __pyx_v_old0;
        __pyx_t_9 = __pyx_v_old1;
        __pyx_t_11 = __pyx_v_old2;
        __pyx_t_10 = (__pyx_v_new_position[0]);
        __pyx_t_6 = (__pyx_v_new_position[1]);
        __pyx_t_12 = (__pyx_v_new_position[2]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_12 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_type_grid.strides[2]) )));
+1244:                 type_grid[old0, old1, old2] = 0
        __pyx_t_11 = __pyx_v_old0;
        __pyx_t_9 = __pyx_v_old1;
        __pyx_t_1 = __pyx_v_old2;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_11 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )) = 0;
+1245:                 idx_to_bead[bead_index, 5] = new_position[0]
        __pyx_t_1 = __pyx_v_bead_index;
        __pyx_t_9 = 5;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[0]);
+1246:                 idx_to_bead[bead_index, 6] = new_position[1]
        __pyx_t_9 = __pyx_v_bead_index;
        __pyx_t_1 = 6;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[1]);
+1247:                 idx_to_bead[bead_index, 7] = new_position[2]
        __pyx_t_1 = __pyx_v_bead_index;
        __pyx_t_9 = 7;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[2]);
+1248:                 dsum = dsum + delta_energy + delta_angle_energy
        __pyx_v_dsum = ((__pyx_v_dsum + __pyx_v_delta_energy) + __pyx_v_delta_angle_energy);
+1249:                 acc = acc + 1
        __pyx_v_acc = (__pyx_v_acc + 1);
 1250: 
+1251:     out_delta[b] = dsum
  __pyx_t_9 = __pyx_v_b;
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_9)) )) = __pyx_v_dsum;
+1252:     out_accepted[b] = acc
  __pyx_t_9 = __pyx_v_b;
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_9)) )) = __pyx_v_acc;
 1253: 
 1254: 
+1255: def _choose_nb(int DIM, int W, int cap):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_5_choose_nb(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_4_choose_nb, "Pick the number of blocks along one dimension: large enough blocks\n    (>= 4W so the movable interior is a healthy fraction) and at most `cap`.");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_5_choose_nb = {"_choose_nb", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_5_choose_nb, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_4_choose_nb};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_5_choose_nb(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  int __pyx_v_DIM;
  int __pyx_v_W;
  int __pyx_v_cap;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_choose_nb (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_W,&__pyx_mstate_global->__pyx_n_u_cap,0};
  PyObject* values[3] = {0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1255, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1255, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1255, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1255, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "_choose_nb", 0) < (0)) __PYX_ERR(0, 1255, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 3; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("_choose_nb", 1, 3, 3, i); __PYX_ERR(0, 1255, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 3)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1255, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1255, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1255, __pyx_L3_error)
    }
    __pyx_v_DIM = __Pyx_PyLong_As_int(values[0]); if (unlikely((__pyx_v_DIM == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1255, __pyx_L3_error)
    __pyx_v_W = __Pyx_PyLong_As_int(values[1]); if (unlikely((__pyx_v_W == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1255, __pyx_L3_error)
    __pyx_v_cap = __Pyx_PyLong_As_int(values[2]); if (unlikely((__pyx_v_cap == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1255, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_choose_nb", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 1255, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast._choose_nb", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_4_choose_nb(__pyx_self, __pyx_v_DIM, __pyx_v_W, __pyx_v_cap);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_4_choose_nb(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_DIM, int __pyx_v_W, int __pyx_v_cap) {
  int __pyx_v_max_nb;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("pimms.mega_crank_fast._choose_nb", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_5_choose_nb, 0, __pyx_mstate_global->__pyx_n_u_choose_nb, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[8])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_choose_nb, __pyx_t_4) < (0)) __PYX_ERR(0, 1255, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 1256:     """Pick the number of blocks along one dimension: large enough blocks
 1257:     (>= 4W so the movable interior is a healthy fraction) and at most `cap`."""
+1258:     cdef int max_nb = DIM // (4 * W)
  __pyx_t_1 = (4 * __pyx_v_W);
  if (unlikely(__pyx_t_1 == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1258, __pyx_L1_error)
  }
  else if (sizeof(long) == sizeof(long) && (!(((long)-1) > 0)) && unlikely(__pyx_t_1 == (long)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_DIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1258, __pyx_L1_error)
  }
  __pyx_v_max_nb = __Pyx_div_long(__pyx_v_DIM, __pyx_t_1, 0);
+1259:     if max_nb < 1:
  __pyx_t_2 = (__pyx_v_max_nb < 1);
  if (__pyx_t_2) {
/* … */
  }
+1260:         return 1
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_1);
    __pyx_r = __pyx_mstate_global->__pyx_int_1;
    goto __pyx_L0;
+1261:     if max_nb > cap:
  __pyx_t_2 = (__pyx_v_max_nb > __pyx_v_cap);
  if (__pyx_t_2) {
/* … */
  }
+1262:         return cap
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1262, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
+1263:     return max_nb
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_max_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 1264: 
 1265: 
+1266: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_7mega_crank_parallel(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_6mega_crank_parallel, "\n    Parallel checkerboard crankshaft kernel.\n\n    Same role as mega_crank() but distributes the substep work across\n    `num_threads` OpenMP threads using a frozen-halo block decomposition.\n    Does NOT take a pre-built bead_selector (it selects beads per block); does\n    NOT preserve the serial RNG stream. `frozen_mask` is a per-bead int array\n    (1 = bead belongs to a frozen chain) - frozen beads are excluded from the\n    movable set (never proposed for a move) but remain in the grid as fixed,\n    energy-contributing obstacles. Returns (energy, accepted_moves).\n\n    Falls back to a single-block (effectively serial) sweep when the box is too\n    small to decompose.\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_7mega_crank_parallel = {"mega_crank_parallel", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_7mega_crank_parallel, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_6mega_crank_parallel};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_7mega_crank_parallel(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_nsteps;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  int __pyx_v_num_threads;
  __Pyx_memviewslice __pyx_v_frozen_mask = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_crank_parallel (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_nsteps,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_num_threads,&__pyx_mstate_global->__pyx_n_u_frozen_mask,0};
  PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1266, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1266, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_crank_parallel", 0) < (0)) __PYX_ERR(0, 1266, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 14; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_crank_parallel", 1, 14, 14, i); __PYX_ERR(0, 1266, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 14)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 1266, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 1266, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 1268, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 1269, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 1270, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 1271, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 1272, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 1273, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 1274, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[7]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 1275, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[8]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 1276, __pyx_L3_error)
    __pyx_v_nsteps = __Pyx_PyLong_As_int(values[9]); if (unlikely((__pyx_v_nsteps == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1277, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[10]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1278, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[11]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1279, __pyx_L3_error)
    __pyx_v_num_threads = __Pyx_PyLong_As_int(values[12]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1280, __pyx_L3_error)
    __pyx_v_frozen_mask = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[13], PyBUF_WRITABLE); if (unlikely(!__pyx_v_frozen_mask.memview)) __PYX_ERR(0, 1281, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_crank_parallel", 1, 14, 14, __pyx_nargs); __PYX_ERR(0, 1266, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_6mega_crank_parallel(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_nsteps, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_num_threads, __pyx_v_frozen_mask);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_5pimms_15mega_crank_fast_6mega_crank_parallel(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_nsteps, int __pyx_v_passed_seed, int __pyx_v_hardwall, int __pyx_v_num_threads, __Pyx_memviewslice __pyx_v_frozen_mask) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel *__pyx_cur_scope;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  PyObject *__pyx_v_idx_np = NULL;
  int __pyx_v_R_int;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_nbz;
  int __pyx_v_Lx;
  int __pyx_v_Ly;
  int __pyx_v_Lz;
  int __pyx_v_num_blocks;
  PyObject *__pyx_v_rstate = NULL;
  int __pyx_v_shift_x;
  int __pyx_v_shift_y;
  int __pyx_v_shift_z;
  PyObject *__pyx_v_gx = NULL;
  PyObject *__pyx_v_gy = NULL;
  PyObject *__pyx_v_gz = NULL;
  PyObject *__pyx_v_dim_block = 0;
  PyObject *__pyx_v_bxj = NULL;
  PyObject *__pyx_v_byj = NULL;
  PyObject *__pyx_v_bzj = NULL;
  PyObject *__pyx_v_movable = NULL;
  PyObject *__pyx_v_block_of_bead = NULL;
  PyObject *__pyx_v_sel = NULL;
  PyObject *__pyx_v_sel_blocks = NULL;
  PyObject *__pyx_v_order = NULL;
  PyObject *__pyx_v_ids = NULL;
  PyObject *__pyx_v_sorted_blocks = NULL;
  PyObject *__pyx_v_counts = NULL;
  PyObject *__pyx_v_starts = NULL;
  PyObject *__pyx_v_total_interior = NULL;
  PyObject *__pyx_v_attempts = NULL;
  PyObject *__pyx_v_bix = NULL;
  PyObject *__pyx_v_biy = NULL;
  PyObject *__pyx_v_biz = NULL;
  PyObject *__pyx_v_blo_x = NULL;
  PyObject *__pyx_v_blo_y = NULL;
  PyObject *__pyx_v_blo_z = NULL;
  PyObject *__pyx_v_seeds = NULL;
  PyObject *__pyx_v_out_delta = NULL;
  PyObject *__pyx_v_out_accepted = NULL;
  __Pyx_memviewslice __pyx_v_ids_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_starts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_attempts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_seeds_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_x_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_y_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_z_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_delta_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_accepted_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_b;
  CYTHON_UNUSED int __pyx_v_nthreads;
  long __pyx_v_total_delta;
  int __pyx_v_total_accepted;
  PyObject *__pyx_r = NULL;
  __pyx_cur_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel *)__pyx_tp_new_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel(__pyx_mstate_global->__pyx_ptype_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel, __pyx_mstate_global->__pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 1266, __pyx_L1_error)
  } else {
    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
  }
/* … */
  /* 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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_16);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_18, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_19, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_idx_np);
  __Pyx_XDECREF(__pyx_v_rstate);
  __Pyx_XDECREF(__pyx_v_gx);
  __Pyx_XDECREF(__pyx_v_gy);
  __Pyx_XDECREF(__pyx_v_gz);
  __Pyx_XDECREF(__pyx_v_dim_block);
  __Pyx_XDECREF(__pyx_v_bxj);
  __Pyx_XDECREF(__pyx_v_byj);
  __Pyx_XDECREF(__pyx_v_bzj);
  __Pyx_XDECREF(__pyx_v_movable);
  __Pyx_XDECREF(__pyx_v_block_of_bead);
  __Pyx_XDECREF(__pyx_v_sel);
  __Pyx_XDECREF(__pyx_v_sel_blocks);
  __Pyx_XDECREF(__pyx_v_order);
  __Pyx_XDECREF(__pyx_v_ids);
  __Pyx_XDECREF(__pyx_v_sorted_blocks);
  __Pyx_XDECREF(__pyx_v_counts);
  __Pyx_XDECREF(__pyx_v_starts);
  __Pyx_XDECREF(__pyx_v_total_interior);
  __Pyx_XDECREF(__pyx_v_attempts);
  __Pyx_XDECREF(__pyx_v_bix);
  __Pyx_XDECREF(__pyx_v_biy);
  __Pyx_XDECREF(__pyx_v_biz);
  __Pyx_XDECREF(__pyx_v_blo_x);
  __Pyx_XDECREF(__pyx_v_blo_y);
  __Pyx_XDECREF(__pyx_v_blo_z);
  __Pyx_XDECREF(__pyx_v_seeds);
  __Pyx_XDECREF(__pyx_v_out_delta);
  __Pyx_XDECREF(__pyx_v_out_accepted);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_ids_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_starts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_attempts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_seeds_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_x_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_y_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_z_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_delta_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_accepted_mv, 1);
  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_7mega_crank_parallel, 0, __pyx_mstate_global->__pyx_n_u_mega_crank_parallel, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[9])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1266, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_crank_parallel, __pyx_t_4) < (0)) __PYX_ERR(0, 1266, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel {
  PyObject_HEAD
  int __pyx_v_W;
  int __pyx_v_num_beads;
};

 1267: @cython.boundscheck(False)
 1268: def mega_crank_parallel(NUMPY_INT_TYPE[:, :, :] grid,
 1269:                         NUMPY_INT_TYPE[:, :, :] type_grid,
 1270:                         NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 1271:                         NUMPY_INT_TYPE[:, :] interaction_table,
 1272:                         NUMPY_INT_TYPE[:, :] LR_interaction_table,
 1273:                         NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 1274:                         NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 1275:                         long energy,
 1276:                         float invtemp,
 1277:                         int nsteps,
 1278:                         int passed_seed,
 1279:                         int hardwall,
 1280:                         int num_threads,
 1281:                         NUMPY_INT_TYPE[::1] frozen_mask):
 1282:     """
 1283:     Parallel checkerboard crankshaft kernel.
 1284: 
 1285:     Same role as mega_crank() but distributes the substep work across
 1286:     `num_threads` OpenMP threads using a frozen-halo block decomposition.
 1287:     Does NOT take a pre-built bead_selector (it selects beads per block); does
 1288:     NOT preserve the serial RNG stream. `frozen_mask` is a per-bead int array
 1289:     (1 = bead belongs to a frozen chain) - frozen beads are excluded from the
 1290:     movable set (never proposed for a move) but remain in the grid as fixed,
 1291:     energy-contributing obstacles. Returns (energy, accepted_moves).
 1292: 
 1293:     Falls back to a single-block (effectively serial) sweep when the box is too
 1294:     small to decompose.
 1295:     """
+1296:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+1297:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+1298:     cdef int ZDIM = grid.shape[2]
  __pyx_v_ZDIM = (__pyx_v_grid.shape[2]);
+1299:     cdef int num_beads = idx_to_bead.shape[0]
  __pyx_cur_scope->__pyx_v_num_beads = (__pyx_v_idx_to_bead.shape[0]);
 1300: 
 1301:     # interaction radius -> halo width W = R_int + 2 (2 covers the max bead
 1302:     # displacement of a terminal/internal move; R_int covers the energy read).
+1303:     idx_np = np.asarray(idx_to_bead)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1303, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1303, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_idx_to_bead, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1303, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1303, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_idx_np = __pyx_t_1;
  __pyx_t_1 = 0;
+1304:     cdef int R_int = 3 if np.any(idx_np[:, 1] == 1) else 1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[1]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1304, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1304, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_8) {
    __pyx_t_6 = 3;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_R_int = __pyx_t_6;
/* … */
  __pyx_mstate_global->__pyx_tuple[1] = PyTuple_Pack(2, __pyx_mstate_global->__pyx_slice[0], __pyx_mstate_global->__pyx_int_1); if (unlikely(!__pyx_mstate_global->__pyx_tuple[1])) __PYX_ERR(0, 1304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_mstate_global->__pyx_tuple[1]);
  __Pyx_GIVEREF(__pyx_mstate_global->__pyx_tuple[1]);
+1305:     cdef int W = R_int + 2
  __pyx_cur_scope->__pyx_v_W = (__pyx_v_R_int + 2);
 1306: 
 1307:     # block counts per dim. IMPORTANT: this depends ONLY on box geometry (and W),
 1308:     # NOT on num_threads, so the decomposition - and therefore the result - is
 1309:     # identical for any thread count. Threads only change how fast the fixed set
 1310:     # of independent blocks is processed. cap=4 -> up to 4^3=64 blocks, which is
 1311:     # plenty for dynamic load-balancing across typical core counts.
+1312:     cdef int cap = 4
  __pyx_v_cap = 4;
+1313:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1313, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1313, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1313, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1313, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_4, __pyx_t_3, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1313, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1313, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbx = __pyx_t_6;
+1314:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1314, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1314, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1314, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1314, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, __pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1314, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1314, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nby = __pyx_t_6;
+1315:     cdef int nbz = _choose_nb(ZDIM, W, cap)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1315, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1315, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1315, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1315, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_t_4, __pyx_t_3, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1315, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1315, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbz = __pyx_t_6;
+1316:     cdef int Lx = XDIM // nbx
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1316, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1316, __pyx_L1_error)
  }
  __pyx_v_Lx = __Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0);
+1317:     cdef int Ly = YDIM // nby
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1317, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1317, __pyx_L1_error)
  }
  __pyx_v_Ly = __Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0);
+1318:     cdef int Lz = ZDIM // nbz
  if (unlikely(__pyx_v_nbz == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1318, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbz == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_ZDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1318, __pyx_L1_error)
  }
  __pyx_v_Lz = __Pyx_div_int(__pyx_v_ZDIM, __pyx_v_nbz, 0);
+1319:     cdef int num_blocks = nbx * nby * nbz
  __pyx_v_num_blocks = ((__pyx_v_nbx * __pyx_v_nby) * __pyx_v_nbz);
 1320: 
 1321:     # reproducible shifts + per-block seeds derived from passed_seed
+1322:     rstate = np.random.RandomState(passed_seed & 0x7FFFFFFF)
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1322, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1322, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_2 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyLong_From_long((__pyx_v_passed_seed & 0x7FFFFFFF)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1322, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_RandomState, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1322, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_rstate = __pyx_t_1;
  __pyx_t_1 = 0;
+1323:     cdef int shift_x = int(rstate.randint(0, Lx)) if nbx > 1 else 0
  __pyx_t_8 = (__pyx_v_nbx > 1);
  if (__pyx_t_8) {
    __pyx_t_3 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1323, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_mstate_global->__pyx_int_0, __pyx_t_7};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1323, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_t_7 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1323, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_7); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1323, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_x = __pyx_t_6;
+1324:     cdef int shift_y = int(rstate.randint(0, Ly)) if nby > 1 else 0
  __pyx_t_8 = (__pyx_v_nby > 1);
  if (__pyx_t_8) {
    __pyx_t_1 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1324, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_0, __pyx_t_3};
      __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1324, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
    }
    __pyx_t_3 = __Pyx_PyNumber_Int(__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1324, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_3); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1324, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_y = __pyx_t_6;
+1325:     cdef int shift_z = int(rstate.randint(0, Lz)) if nbz > 1 else 0
  __pyx_t_8 = (__pyx_v_nbz > 1);
  if (__pyx_t_8) {
    __pyx_t_7 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_7);
    __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1325, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_0, __pyx_t_1};
      __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1325, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    }
    __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1325, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1325, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_z = __pyx_t_6;
 1326: 
 1327:     # ---- bucket beads into blocks (interior beads only) -----------------
+1328:     gx = idx_np[:, 5].astype(np.int64)
  __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[2]); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1328, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1328, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1328, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1328, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gx = __pyx_t_1;
  __pyx_t_1 = 0;
/* … */
  __pyx_mstate_global->__pyx_tuple[2] = PyTuple_Pack(2, __pyx_mstate_global->__pyx_slice[0], __pyx_mstate_global->__pyx_int_5); if (unlikely(!__pyx_mstate_global->__pyx_tuple[2])) __PYX_ERR(0, 1328, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_mstate_global->__pyx_tuple[2]);
  __Pyx_GIVEREF(__pyx_mstate_global->__pyx_tuple[2]);
+1329:     gy = idx_np[:, 6].astype(np.int64)
  __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[3]); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1329, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1329, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1329, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1329, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gy = __pyx_t_1;
  __pyx_t_1 = 0;
/* … */
  __pyx_mstate_global->__pyx_tuple[3] = PyTuple_Pack(2, __pyx_mstate_global->__pyx_slice[0], __pyx_mstate_global->__pyx_int_6); if (unlikely(!__pyx_mstate_global->__pyx_tuple[3])) __PYX_ERR(0, 1329, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_mstate_global->__pyx_tuple[3]);
  __Pyx_GIVEREF(__pyx_mstate_global->__pyx_tuple[3]);
+1330:     gz = idx_np[:, 7].astype(np.int64)
  __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[4]); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1330, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1330, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1330, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1330, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gz = __pyx_t_1;
  __pyx_t_1 = 0;
/* … */
  __pyx_mstate_global->__pyx_tuple[4] = PyTuple_Pack(2, __pyx_mstate_global->__pyx_slice[0], __pyx_mstate_global->__pyx_int_7); if (unlikely(!__pyx_mstate_global->__pyx_tuple[4])) __PYX_ERR(0, 1330, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_mstate_global->__pyx_tuple[4]);
  __Pyx_GIVEREF(__pyx_mstate_global->__pyx_tuple[4]);
 1331: 
 1332:     # per-dim block index (-1 => frozen: in halo or remainder or wrong region)
+1333:     def dim_block(g, nb, L, DIM, shift):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_19mega_crank_parallel_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_19mega_crank_parallel_1dim_block = {"dim_block", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_19mega_crank_parallel_1dim_block, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_19mega_crank_parallel_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_g = 0;
  PyObject *__pyx_v_nb = 0;
  PyObject *__pyx_v_L = 0;
  PyObject *__pyx_v_DIM = 0;
  PyObject *__pyx_v_shift = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dim_block (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_g,&__pyx_mstate_global->__pyx_n_u_nb,&__pyx_mstate_global->__pyx_n_u_L,&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_shift,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1333, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1333, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1333, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1333, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1333, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1333, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "dim_block", 0) < (0)) __PYX_ERR(0, 1333, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, i); __PYX_ERR(0, 1333, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1333, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1333, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1333, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1333, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1333, __pyx_L3_error)
    }
    __pyx_v_g = values[0];
    __pyx_v_nb = values[1];
    __pyx_v_L = values[2];
    __pyx_v_DIM = values[3];
    __pyx_v_shift = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 1333, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_19mega_crank_parallel_dim_block(__pyx_self, __pyx_v_g, __pyx_v_nb, __pyx_v_L, __pyx_v_DIM, __pyx_v_shift);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_19mega_crank_parallel_dim_block(PyObject *__pyx_self, PyObject *__pyx_v_g, PyObject *__pyx_v_nb, PyObject *__pyx_v_L, PyObject *__pyx_v_DIM, PyObject *__pyx_v_shift) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel *__pyx_cur_scope;
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel *__pyx_outer_scope;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_bj = NULL;
  PyObject *__pyx_v_within = NULL;
  PyObject *__pyx_v_bad = NULL;
  PyObject *__pyx_r = NULL;
  __pyx_outer_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct__mega_crank_parallel *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_bj);
  __Pyx_XDECREF(__pyx_v_within);
  __Pyx_XDECREF(__pyx_v_bad);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_19mega_crank_parallel_1dim_block, 0, __pyx_mstate_global->__pyx_n_u_mega_crank_parallel_locals_dim_b, ((PyObject*)__pyx_cur_scope), __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[0])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1333, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_dim_block = __pyx_t_1;
  __pyx_t_1 = 0;
+1334:         if nb == 1:
  __pyx_t_1 = (__Pyx_PyLong_BoolEqObjC(__pyx_v_nb, __pyx_mstate_global->__pyx_int_1, 1, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1334, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+1335:             return np.zeros(num_beads, dtype=np.int64)        # whole dim = block 0
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1335, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1335, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_num_beads); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1335, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1335, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1335, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_8 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_6 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_6, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1335, __pyx_L1_error)
      __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_8, (2-__pyx_t_8) | (__pyx_t_8*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_6);
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+1336:         s = (g - shift) % DIM
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_g, __pyx_v_shift); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1336, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyNumber_Remainder(__pyx_t_2, __pyx_v_DIM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1336, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_5;
  __pyx_t_5 = 0;
+1337:         bj = s // L
  __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_s, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1337, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_bj = __pyx_t_5;
  __pyx_t_5 = 0;
+1338:         within = s - bj * L
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_bj, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1338, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1338, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_within = __pyx_t_2;
  __pyx_t_2 = 0;
 1339:         # frozen if outside valid region (remainder) or inside the W halo
+1340:         bad = (s >= nb * L) | (within < W) | (within >= L - W)
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nb, __pyx_v_L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_s, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_L, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Or(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_bad = __pyx_t_5;
  __pyx_t_5 = 0;
+1341:         bj = bj.copy()
  __pyx_t_6 = __pyx_v_bj;
  __Pyx_INCREF(__pyx_t_6);
  __pyx_t_8 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
    __pyx_t_5 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_copy, __pyx_callargs+__pyx_t_8, (1-__pyx_t_8) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1341, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
  }
  __Pyx_DECREF_SET(__pyx_v_bj, __pyx_t_5);
  __pyx_t_5 = 0;
+1342:         bj[bad] = -1
  if (unlikely((PyObject_SetItem(__pyx_v_bj, __pyx_v_bad, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 1342, __pyx_L1_error)
+1343:         return bj
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_bj);
  __pyx_r = __pyx_v_bj;
  goto __pyx_L0;
 1344: 
+1345:     bxj = dim_block(gx, nbx, Lx, XDIM, shift_x)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_shift_x); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_pf_5pimms_15mega_crank_fast_19mega_crank_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gx, __pyx_t_1, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bxj = __pyx_t_7;
  __pyx_t_7 = 0;
+1346:     byj = dim_block(gy, nby, Ly, YDIM, shift_y)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_shift_y); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __pyx_pf_5pimms_15mega_crank_fast_19mega_crank_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gy, __pyx_t_7, __pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_byj = __pyx_t_1;
  __pyx_t_1 = 0;
+1347:     bzj = dim_block(gz, nbz, Lz, ZDIM, shift_z)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1347, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1347, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1347, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_shift_z); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1347, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_pf_5pimms_15mega_crank_fast_19mega_crank_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gz, __pyx_t_1, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1347, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bzj = __pyx_t_7;
  __pyx_t_7 = 0;
 1348: 
 1349:     # a bead is movable iff it is in a block interior AND not frozen (frozen beads
 1350:     # stay in the grid as fixed obstacles but are never selected for a move)
+1351:     movable = (bxj >= 0) & (byj >= 0) & (bzj >= 0) & (np.asarray(frozen_mask) == 0)
  __pyx_t_7 = PyObject_RichCompare(__pyx_v_bxj, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_byj, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __pyx_t_3 = PyNumber_And(__pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_bzj, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __pyx_t_7 = PyNumber_And(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_frozen_mask, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_2};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1351, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_1 = __Pyx_PyLong_EqObjC(__pyx_t_4, __pyx_mstate_global->__pyx_int_0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyNumber_And(__pyx_t_7, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_movable = __pyx_t_4;
  __pyx_t_4 = 0;
+1352:     block_of_bead = (bxj * nby * nbz + byj * nbz + bzj)
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_bxj, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_byj, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyNumber_Add(__pyx_t_7, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Add(__pyx_t_4, __pyx_v_bzj); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1352, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_block_of_bead = __pyx_t_1;
  __pyx_t_1 = 0;
+1353:     block_of_bead[~movable] = -1
  __pyx_t_1 = PyNumber_Invert(__pyx_v_movable); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1353, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_1, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 1353, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 1354: 
+1355:     sel = np.nonzero(movable)[0].astype(np.int32)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_nonzero); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_movable};
    __pyx_t_7 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1355, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_4 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1355, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1355, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_sel = __pyx_t_1;
  __pyx_t_1 = 0;
+1356:     if sel.shape[0] == 0:
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_sel, __pyx_mstate_global->__pyx_n_u_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1356, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1356, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_8 = (__Pyx_PyLong_BoolEqObjC(__pyx_t_9, __pyx_mstate_global->__pyx_int_0, 0, 0)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1356, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (__pyx_t_8) {
/* … */
  }
 1357:         # nothing movable this sweep (tiny box / unlucky shift) - no-op
+1358:         return (energy, 0)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_9 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1358, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1358, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_9);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 1358, __pyx_L1_error);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_0);
    __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_0);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_mstate_global->__pyx_int_0) != (0)) __PYX_ERR(0, 1358, __pyx_L1_error);
    __pyx_t_9 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 1359: 
+1360:     sel_blocks = block_of_bead[sel]
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_block_of_bead, __pyx_v_sel); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1360, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_sel_blocks = __pyx_t_1;
  __pyx_t_1 = 0;
+1361:     order = np.argsort(sel_blocks, kind="stable")
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1361, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_argsort); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1361, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_v_sel_blocks};
    __pyx_t_2 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1361, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_kind, __pyx_mstate_global->__pyx_n_u_stable, __pyx_t_2, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1361, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_2);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1361, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_order = __pyx_t_1;
  __pyx_t_1 = 0;
+1362:     ids = sel[order].astype(np.int32)
  __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_sel, __pyx_v_order); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1362, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_ids = __pyx_t_1;
  __pyx_t_1 = 0;
+1363:     sorted_blocks = sel_blocks[order]
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_sel_blocks, __pyx_v_order); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_sorted_blocks = __pyx_t_1;
  __pyx_t_1 = 0;
 1364: 
+1365:     counts = np.bincount(sorted_blocks, minlength=num_blocks).astype(np.int32)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1365, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_bincount); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1365, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1365, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_v_sorted_blocks};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1365, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_minlength, __pyx_t_9, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1365, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1365, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_2 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1365, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1365, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_11};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1365, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_counts = __pyx_t_1;
  __pyx_t_1 = 0;
+1366:     starts = np.zeros(num_blocks + 1, dtype=np.int32)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_long((__pyx_v_num_blocks + 1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_11};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1366, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1366, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1366, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_starts = __pyx_t_1;
  __pyx_t_1 = 0;
+1367:     starts[1:] = np.cumsum(counts)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1367, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_cumsum); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1367, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_counts};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1367, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  if (__Pyx_PyObject_SetSlice(__pyx_v_starts, __pyx_t_1, 1, 0, NULL, NULL, &__pyx_mstate_global->__pyx_slice[1], 1, 0, 0) < (0)) __PYX_ERR(0, 1367, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 1368: 
 1369:     # distribute nsteps proportional to each block's movable bead count
+1370:     total_interior = int(counts.sum())
  __pyx_t_9 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_9);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, NULL};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_sum, __pyx_callargs+__pyx_t_5, (1-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1370, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_9 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_total_interior = ((PyObject*)__pyx_t_9);
  __pyx_t_9 = 0;
+1371:     attempts = np.maximum(
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1371, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1371, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+1372:         (nsteps * counts.astype(np.int64) // max(total_interior, 1)), 0).astype(np.int32)
  __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_nsteps); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_14};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1372, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_14 = PyNumber_Multiply(__pyx_t_11, __pyx_t_4); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_15 = 1;
  __Pyx_INCREF(__pyx_v_total_interior);
  __pyx_t_16 = __pyx_v_total_interior;
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_16, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  if (__pyx_t_8) {
    __pyx_t_12 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1372, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_PyInt_FromNumber(&__pyx_t_12, NULL, 0) < (0)) __PYX_ERR(0, 1372, __pyx_L1_error)
    __pyx_t_4 = __pyx_t_12;
    __pyx_t_12 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_16);
    __pyx_t_4 = __pyx_t_16;
  }
  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_14, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_12, __pyx_mstate_global->__pyx_int_0};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1371, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_1 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1372, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1372, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_attempts = __pyx_t_9;
  __pyx_t_9 = 0;
 1373: 
 1374:     # shifted lower bound of each block per dim (for the in-worker interior test)
+1375:     bix = np.arange(num_blocks, dtype=np.int32) // (nby * nbz)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_t_12};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1375, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1375, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1375, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = __Pyx_PyLong_From_int((__pyx_v_nby * __pyx_v_nbz)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = PyNumber_FloorDivide(__pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1375, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_bix = __pyx_t_7;
  __pyx_t_7 = 0;
+1376:     biy = (np.arange(num_blocks, dtype=np.int32) // nbz) % nby
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_9};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1376, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_2, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1376, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1376, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = PyNumber_Remainder(__pyx_t_12, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_biy = __pyx_t_7;
  __pyx_t_7 = 0;
+1377:     biz = np.arange(num_blocks, dtype=np.int32) % nbz
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_12};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1377, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_1, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1377, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1377, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = PyNumber_Remainder(__pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1377, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_biz = __pyx_t_9;
  __pyx_t_9 = 0;
+1378:     blo_x = (bix * Lx).astype(np.int32)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_bix, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_x = __pyx_t_9;
  __pyx_t_9 = 0;
+1379:     blo_y = (biy * Ly).astype(np.int32)
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1379, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_biy, __pyx_t_12); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1379, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_1 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1379, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1379, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_7};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1379, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_y = __pyx_t_9;
  __pyx_t_9 = 0;
+1380:     blo_z = (biz * Lz).astype(np.int32)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_biz, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1380, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1380, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_z = __pyx_t_9;
  __pyx_t_9 = 0;
 1381: 
 1382:     # independent PRNG seed per block
+1383:     seeds = (np.arange(num_blocks, dtype=np.uint64) + np.uint64(passed_seed) + np.uint64(0x9E3779B9)) \
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_12};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1383, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1383, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1383, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_passed_seed); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_3};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1383, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_12 = PyNumber_Add(__pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_mstate_global->__pyx_int_2654435769};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1383, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_7 = PyNumber_Add(__pyx_t_12, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+1384:         * np.uint64(0x2545F4914F6CDD1D) + np.uint64(1)
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_mstate_global->__pyx_int_0x2545f4914f6cdd1d};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1384, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_1};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1384, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_9 = PyNumber_Add(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_seeds = __pyx_t_9;
  __pyx_t_9 = 0;
 1385: 
+1386:     out_delta = np.zeros(num_blocks, dtype=np.int64)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1386, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1386, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1386, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1386, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1386, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1386, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_1, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1386, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1386, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_out_delta = __pyx_t_9;
  __pyx_t_9 = 0;
+1387:     out_accepted = np.zeros(num_blocks, dtype=np.int32)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1387, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_12};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1387, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_2, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1387, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1387, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_out_accepted = __pyx_t_9;
  __pyx_t_9 = 0;
 1388: 
 1389:     # typed memoryviews for the nogil region
+1390:     cdef int[::1] ids_mv = ids
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_ids, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1390, __pyx_L1_error)
  __pyx_v_ids_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1391:     cdef int[::1] starts_mv = starts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_starts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1391, __pyx_L1_error)
  __pyx_v_starts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1392:     cdef int[::1] attempts_mv = attempts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_attempts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1392, __pyx_L1_error)
  __pyx_v_attempts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1393:     cdef unsigned long long[::1] seeds_mv = seeds
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_PY_LONG_LONG(__pyx_v_seeds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 1393, __pyx_L1_error)
  __pyx_v_seeds_mv = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+1394:     cdef int[::1] blo_x_mv = blo_x
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_x, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1394, __pyx_L1_error)
  __pyx_v_blo_x_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1395:     cdef int[::1] blo_y_mv = blo_y
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_y, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1395, __pyx_L1_error)
  __pyx_v_blo_y_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1396:     cdef int[::1] blo_z_mv = blo_z
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_z, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1396, __pyx_L1_error)
  __pyx_v_blo_z_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1397:     cdef long[::1] out_delta_mv = out_delta
  __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_long(__pyx_v_out_delta, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 1397, __pyx_L1_error)
  __pyx_v_out_delta_mv = __pyx_t_19;
  __pyx_t_19.memview = NULL;
  __pyx_t_19.data = NULL;
+1398:     cdef int[::1] out_accepted_mv = out_accepted
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_out_accepted, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1398, __pyx_L1_error)
  __pyx_v_out_accepted_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
 1399: 
 1400:     cdef int b
+1401:     cdef int nthreads = num_threads if num_threads > 0 else 1
  __pyx_t_8 = (__pyx_v_num_threads > 0);
  if (__pyx_t_8) {
    __pyx_t_6 = __pyx_v_num_threads;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_nthreads = __pyx_t_6;
 1402: 
 1403:     # ---- parallel region: each block is independent -----------------
+1404:     for b in prange(num_blocks, nogil=True, num_threads=nthreads, schedule='dynamic'):
  {
      PyThreadState * _save;
      _save = PyEval_SaveThread();
      __Pyx_FastGIL_Remember();
      /*try:*/ {
        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic)        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic) num_threads(__pyx_v_nthreads)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_b = (int)(0 + 1 * __pyx_t_10);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          __Pyx_FastGIL_Forget();
          PyEval_RestoreThread(_save);
          goto __pyx_L6;
        }
        __pyx_L6:;
      }
  }
+1405:         run_block(b, ids_mv, starts_mv, attempts_mv, seeds_mv,
                            __pyx_f_5pimms_15mega_crank_fast_run_block(__pyx_v_b, __pyx_v_ids_mv, __pyx_v_starts_mv, __pyx_v_attempts_mv, __pyx_v_seeds_mv, __pyx_v_blo_x_mv, __pyx_v_blo_y_mv, __pyx_v_blo_z_mv, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_cur_scope->__pyx_v_W, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_invtemp, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall, __pyx_v_out_delta_mv, __pyx_v_out_accepted_mv);
                        }
                    }
                }
            }
        }
        #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
      }
 1406:                   blo_x_mv, blo_y_mv, blo_z_mv,
 1407:                   Lx, Ly, Lz, nbx, nby, nbz,
 1408:                   shift_x, shift_y, shift_z, W,
 1409:                   grid, type_grid, idx_to_bead,
 1410:                   interaction_table, LR_interaction_table, SLR_interaction_table,
 1411:                   angle_lookup, invtemp, XDIM, YDIM, ZDIM, hardwall,
 1412:                   out_delta_mv, out_accepted_mv)
 1413: 
+1414:     cdef long total_delta = 0
  __pyx_v_total_delta = 0;
+1415:     cdef int total_accepted = 0
  __pyx_v_total_accepted = 0;
+1416:     for b in range(num_blocks):
  __pyx_t_20 = __pyx_v_num_blocks;
  __pyx_t_10 = __pyx_t_20;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_10; __pyx_t_6+=1) {
    __pyx_v_b = __pyx_t_6;
+1417:         total_delta += out_delta_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_total_delta = (__pyx_v_total_delta + (*((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta_mv.data) + __pyx_t_21)) ))));
+1418:         total_accepted += out_accepted_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_total_accepted = (__pyx_v_total_accepted + (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted_mv.data) + __pyx_t_21)) ))));
  }
 1419: 
+1420:     return (energy + total_delta, total_accepted)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_9 = __Pyx_PyLong_From_long((__pyx_v_energy + __pyx_v_total_delta)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1420, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_total_accepted); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1420, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1420, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 1420, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_1);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1) != (0)) __PYX_ERR(0, 1420, __pyx_L1_error);
  __pyx_t_9 = 0;
  __pyx_t_1 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 1421: 
 1422: 
 1423: # =====================================================================
 1424: #   PARALLEL checkerboard crankshaft kernel - 2D
 1425: #
 1426: #   Exact 2D analogue of the 3D kernel above: same frozen-halo block
 1427: #   decomposition (independent of num_threads), same per-block splitmix64
 1428: #   streams, same detailed-balance halo handling - just over a 2D grid using
 1429: #   the 2D move/energy helpers. Targets the same Boltzmann distribution as the
 1430: #   serial 2D kernel (mega_crank_2D); not bit-identical to it.
 1431: # =====================================================================
 1432: 
 1433: # ---- 2D move proposals using a per-thread PRNG (mirror the _c versions) ----
+1434: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp_2D(int __pyx_v_ox, int __pyx_v_oy, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, unsigned PY_LONG_LONG *__pyx_v_rng, int *__pyx_v_out) {
  int __pyx_v_x_off;
  int __pyx_v_y_off;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 1435: @cython.boundscheck(False)
 1436: cdef inline int single_bead_crank_cp_2D(int ox, int oy,
 1437:                                         NUMPY_INT_TYPE[:, :] grid,
 1438:                                         int XDIM, int YDIM,
 1439:                                         unsigned long long* rng, int* out) noexcept nogil:
+1440:     cdef int x_off = rng_randint(rng, 0, 2) - 1
  __pyx_v_x_off = (__pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 0, 2) - 1);
+1441:     cdef int y_off = rng_randint(rng, 0, 2) - 1
  __pyx_v_y_off = (__pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 0, 2) - 1);
+1442:     cdef int local_x = pbc_correction(ox + x_off, XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_ox + __pyx_v_x_off), __pyx_v_XDIM);
+1443:     cdef int local_y = pbc_correction(oy + y_off, YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_oy + __pyx_v_y_off), __pyx_v_YDIM);
+1444:     if grid[local_x, local_y] > 0:
  __pyx_t_1 = __pyx_v_local_x;
  __pyx_t_2 = __pyx_v_local_y;
  __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) ))) > 0);
  if (__pyx_t_3) {
/* … */
  }
+1445:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+1446:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+1447:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+1448:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+1449:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+1450:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 1451: 
 1452: 
+1453: @cython.wraparound(False)
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_crank_it_cp_2D(int __pyx_v_N_side_x, int __pyx_v_N_side_y, int __pyx_v_C_side_x, int __pyx_v_C_side_y, __Pyx_memviewslice __pyx_v_grid, int __pyx_v_XDIM, int __pyx_v_YDIM, unsigned PY_LONG_LONG *__pyx_v_rng, int *__pyx_v_out) {
  int __pyx_v_x_min;
  int __pyx_v_x_max;
  int __pyx_v_y_min;
  int __pyx_v_y_max;
  int __pyx_v_local_x;
  int __pyx_v_local_y;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.crank_it_cp_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 1454: @cython.boundscheck(False)
 1455: cdef inline int crank_it_cp_2D(int N_side_x, int N_side_y,
 1456:                                int C_side_x, int C_side_y,
 1457:                                NUMPY_INT_TYPE[:, :] grid,
 1458:                                int XDIM, int YDIM,
 1459:                                unsigned long long* rng, int* out) noexcept nogil:
 1460:     cdef int x_min, x_max, y_min, y_max, local_x, local_y
 1461: 
+1462:     if abs(N_side_x - C_side_x) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_x - __pyx_v_C_side_x)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 1462, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+1463:         if N_side_x > C_side_x:
    __pyx_t_2 = (__pyx_v_N_side_x > __pyx_v_C_side_x);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L4;
    }
+1464:             C_side_x = C_side_x + XDIM
      __pyx_v_C_side_x = (__pyx_v_C_side_x + __pyx_v_XDIM);
 1465:         else:
+1466:             N_side_x = N_side_x + XDIM
    /*else*/ {
      __pyx_v_N_side_x = (__pyx_v_N_side_x + __pyx_v_XDIM);
    }
    __pyx_L4:;
+1467:     if abs(N_side_y - C_side_y) > 2:
  __pyx_t_1 = abs((__pyx_v_N_side_y - __pyx_v_C_side_y)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 1467, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 > 2);
  if (__pyx_t_2) {
/* … */
  }
+1468:         if N_side_y > C_side_y:
    __pyx_t_2 = (__pyx_v_N_side_y > __pyx_v_C_side_y);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L6;
    }
+1469:             C_side_y = C_side_y + YDIM
      __pyx_v_C_side_y = (__pyx_v_C_side_y + __pyx_v_YDIM);
 1470:         else:
+1471:             N_side_y = N_side_y + YDIM
    /*else*/ {
      __pyx_v_N_side_y = (__pyx_v_N_side_y + __pyx_v_YDIM);
    }
    __pyx_L6:;
 1472: 
+1473:     x_min = int_max(N_side_x - 1, C_side_x - 1)
  __pyx_v_x_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_x - 1), (__pyx_v_C_side_x - 1));
+1474:     x_max = int_min(N_side_x + 1, C_side_x + 1)
  __pyx_v_x_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_x + 1), (__pyx_v_C_side_x + 1));
+1475:     y_min = int_max(N_side_y - 1, C_side_y - 1)
  __pyx_v_y_min = __pyx_f_5pimms_15mega_crank_fast_int_max((__pyx_v_N_side_y - 1), (__pyx_v_C_side_y - 1));
+1476:     y_max = int_min(N_side_y + 1, C_side_y + 1)
  __pyx_v_y_max = __pyx_f_5pimms_15mega_crank_fast_int_min((__pyx_v_N_side_y + 1), (__pyx_v_C_side_y + 1));
 1477: 
+1478:     local_x = pbc_correction((x_min + rng_randint(rng, 1, (x_max - x_min + 1)) - 1), XDIM)
  __pyx_v_local_x = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_x_min + __pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 1, ((__pyx_v_x_max - __pyx_v_x_min) + 1))) - 1), __pyx_v_XDIM);
+1479:     local_y = pbc_correction((y_min + rng_randint(rng, 1, (y_max - y_min + 1)) - 1), YDIM)
  __pyx_v_local_y = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_y_min + __pyx_f_5pimms_15mega_crank_fast_rng_randint(__pyx_v_rng, 1, ((__pyx_v_y_max - __pyx_v_y_min) + 1))) - 1), __pyx_v_YDIM);
 1480: 
+1481:     if grid[local_x, local_y] > 0:
  __pyx_t_3 = __pyx_v_local_x;
  __pyx_t_4 = __pyx_v_local_y;
  __pyx_t_2 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ))) > 0);
  if (__pyx_t_2) {
/* … */
  }
+1482:         out[0] = -1
    (__pyx_v_out[0]) = -1;
+1483:         out[1] = 0
    (__pyx_v_out[1]) = 0;
+1484:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+1485:     out[0] = local_x
  (__pyx_v_out[0]) = __pyx_v_local_x;
+1486:     out[1] = local_y
  (__pyx_v_out[1]) = __pyx_v_local_y;
+1487:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 1488: 
 1489: 
 1490: # ---- per-block worker (2D), runs entirely without the GIL ----
+1491: @cython.wraparound(False)
static void __pyx_f_5pimms_15mega_crank_fast_run_block_2D(int __pyx_v_b, __Pyx_memviewslice __pyx_v_ids, __Pyx_memviewslice __pyx_v_starts, __Pyx_memviewslice __pyx_v_attempts, __Pyx_memviewslice __pyx_v_seeds, __Pyx_memviewslice __pyx_v_blo_x, __Pyx_memviewslice __pyx_v_blo_y, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_W, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, float __pyx_v_invtemp, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_hardwall, __Pyx_memviewslice __pyx_v_out_delta, __Pyx_memviewslice __pyx_v_out_accepted) {
  int __pyx_v_lo;
  int __pyx_v_hi;
  int __pyx_v_n_block;
  unsigned PY_LONG_LONG __pyx_v_rng;
  long __pyx_v_dsum;
  int __pyx_v_acc;
  CYTHON_UNUSED int __pyx_v_k;
  int __pyx_v_pick;
  int __pyx_v_bead_index;
  int __pyx_v_beadflag;
  int __pyx_v_gx;
  int __pyx_v_gy;
  int __pyx_v_sx;
  int __pyx_v_sy;
  int __pyx_v_wx;
  int __pyx_v_wy;
  int __pyx_v_old0;
  int __pyx_v_old1;
  int __pyx_v_new_position[2];
  int __pyx_v_anchor0;
  int __pyx_v_anchor1;
  int __pyx_v_Nx;
  int __pyx_v_Ny;
  int __pyx_v_Cx;
  int __pyx_v_Cy;
  long __pyx_v_delta_energy;
  long __pyx_v_delta_angle_energy;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.run_block_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 1492: @cython.boundscheck(False)
 1493: cdef void run_block_2D(int b,
 1494:                        int[::1] ids, int[::1] starts, int[::1] attempts,
 1495:                        unsigned long long[::1] seeds,
 1496:                        int[::1] blo_x, int[::1] blo_y,
 1497:                        int Lx, int Ly,
 1498:                        int nbx, int nby,
 1499:                        int shift_x, int shift_y, int W,
 1500:                        NUMPY_INT_TYPE[:, :] grid,
 1501:                        NUMPY_INT_TYPE[:, :] type_grid,
 1502:                        NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 1503:                        NUMPY_INT_TYPE[:, :] interaction_table,
 1504:                        NUMPY_INT_TYPE[:, :] LR_interaction_table,
 1505:                        NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 1506:                        NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 1507:                        float invtemp, int XDIM, int YDIM, int hardwall,
 1508:                        long[::1] out_delta, int[::1] out_accepted) noexcept nogil:
 1509: 
+1510:     cdef int lo = starts[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_v_lo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+1511:     cdef int hi = starts[b + 1]
  __pyx_t_1 = (__pyx_v_b + 1);
  __pyx_v_hi = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+1512:     cdef int n_block = hi - lo
  __pyx_v_n_block = (__pyx_v_hi - __pyx_v_lo);
+1513:     out_delta[b] = 0
  __pyx_t_1 = __pyx_v_b;
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = 0;
+1514:     out_accepted[b] = 0
  __pyx_t_1 = __pyx_v_b;
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = 0;
+1515:     if n_block <= 0:
  __pyx_t_2 = (__pyx_v_n_block <= 0);
  if (__pyx_t_2) {
/* … */
  }
+1516:         return
    goto __pyx_L0;
 1517: 
+1518:     cdef unsigned long long rng = seeds[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_v_rng = (*((unsigned PY_LONG_LONG *) ( /* dim=0 */ ((char *) (((unsigned PY_LONG_LONG *) __pyx_v_seeds.data) + __pyx_t_1)) )));
+1519:     cdef long dsum = 0
  __pyx_v_dsum = 0;
+1520:     cdef int acc = 0
  __pyx_v_acc = 0;
 1521:     cdef int k, pick, bead_index, beadflag
 1522:     cdef int gx, gy, sx, sy, wx, wy
 1523:     cdef int old0, old1
 1524:     cdef int new_position[2]
 1525:     cdef int anchor0, anchor1
 1526:     cdef int Nx, Ny, Cx, Cy
 1527:     cdef long delta_energy, delta_angle_energy
 1528: 
+1529:     for k in range(attempts[b]):
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_3 = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_attempts.data) + __pyx_t_1)) )));
  __pyx_t_4 = __pyx_t_3;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_k = __pyx_t_5;
 1530:         # pick a random bead from this block's list
+1531:         pick = lo + <int>(rng_uniform(&rng) * n_block)
    __pyx_v_pick = (__pyx_v_lo + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform((&__pyx_v_rng)) * __pyx_v_n_block)));
+1532:         if pick >= hi:
    __pyx_t_2 = (__pyx_v_pick >= __pyx_v_hi);
    if (__pyx_t_2) {
/* … */
    }
+1533:             pick = hi - 1
      __pyx_v_pick = (__pyx_v_hi - 1);
+1534:         bead_index = ids[pick]
    __pyx_t_1 = __pyx_v_pick;
    __pyx_v_bead_index = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_ids.data) + __pyx_t_1)) )));
 1535: 
+1536:         gx = idx_to_bead[bead_index, 5]
    __pyx_t_1 = __pyx_v_bead_index;
    __pyx_t_6 = 5;
    __pyx_v_gx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1537:         gy = idx_to_bead[bead_index, 6]
    __pyx_t_6 = __pyx_v_bead_index;
    __pyx_t_1 = 6;
    __pyx_v_gy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
 1538: 
 1539:         # re-test interior membership against the CURRENT position (a bead may
 1540:         # have drifted into the frozen halo during this block's run).
+1541:         if nbx > 1:
    __pyx_t_2 = (__pyx_v_nbx > 1);
    if (__pyx_t_2) {
/* … */
    }
+1542:             sx = (gx - shift_x + XDIM) % XDIM
      __pyx_t_7 = ((__pyx_v_gx - __pyx_v_shift_x) + __pyx_v_XDIM);
      if (unlikely(__pyx_v_XDIM == 0)) {
        PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
        __Pyx_PyGILState_Release(__pyx_gilstate_save);
        __PYX_ERR(0, 1542, __pyx_L1_error)
      }
      __pyx_v_sx = __Pyx_mod_int(__pyx_t_7, __pyx_v_XDIM, 0);
+1543:             wx = sx - blo_x[b]
      __pyx_t_1 = __pyx_v_b;
      __pyx_v_wx = (__pyx_v_sx - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) ))));
+1544:             if wx < W or wx >= Lx - W:
      __pyx_t_8 = (__pyx_v_wx < __pyx_v_W);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_2 = __pyx_t_8;
        goto __pyx_L9_bool_binop_done;
      }
      __pyx_t_8 = (__pyx_v_wx >= (__pyx_v_Lx - __pyx_v_W));
      __pyx_t_2 = __pyx_t_8;
      __pyx_L9_bool_binop_done:;
      if (__pyx_t_2) {
/* … */
      }
+1545:                 continue
        goto __pyx_L4_continue;
+1546:         if nby > 1:
    __pyx_t_2 = (__pyx_v_nby > 1);
    if (__pyx_t_2) {
/* … */
    }
+1547:             sy = (gy - shift_y + YDIM) % YDIM
      __pyx_t_7 = ((__pyx_v_gy - __pyx_v_shift_y) + __pyx_v_YDIM);
      if (unlikely(__pyx_v_YDIM == 0)) {
        PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
        PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
        __Pyx_PyGILState_Release(__pyx_gilstate_save);
        __PYX_ERR(0, 1547, __pyx_L1_error)
      }
      __pyx_v_sy = __Pyx_mod_int(__pyx_t_7, __pyx_v_YDIM, 0);
+1548:             wy = sy - blo_y[b]
      __pyx_t_1 = __pyx_v_b;
      __pyx_v_wy = (__pyx_v_sy - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_1)) ))));
+1549:             if wy < W or wy >= Ly - W:
      __pyx_t_8 = (__pyx_v_wy < __pyx_v_W);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_2 = __pyx_t_8;
        goto __pyx_L13_bool_binop_done;
      }
      __pyx_t_8 = (__pyx_v_wy >= (__pyx_v_Ly - __pyx_v_W));
      __pyx_t_2 = __pyx_t_8;
      __pyx_L13_bool_binop_done:;
      if (__pyx_t_2) {
/* … */
      }
+1550:                 continue
        goto __pyx_L4_continue;
 1551: 
+1552:         old0 = gx
    __pyx_v_old0 = __pyx_v_gx;
+1553:         old1 = gy
    __pyx_v_old1 = __pyx_v_gy;
+1554:         beadflag = idx_to_bead[bead_index, 0]
    __pyx_t_1 = __pyx_v_bead_index;
    __pyx_t_6 = 0;
    __pyx_v_beadflag = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 1555: 
+1556:         if beadflag == 0:
    switch (__pyx_v_beadflag) {
      case 0:
/* … */
      break;
      case 1:
+1557:             single_bead_crank_cp_2D(old0, old1, grid, XDIM, YDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp_2D(__pyx_v_old0, __pyx_v_old1, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, (&__pyx_v_rng), __pyx_v_new_position));
 1558: 
+1559:         elif beadflag == 1:
      break;
      case 3:
+1560:             anchor0 = idx_to_bead[bead_index + 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_1 = 5;
      __pyx_v_anchor0 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1561:             anchor1 = idx_to_bead[bead_index + 1, 6]
      __pyx_t_1 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 6;
      __pyx_v_anchor1 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1562:             single_bead_crank_cp_2D(anchor0, anchor1, grid, XDIM, YDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp_2D(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, (&__pyx_v_rng), __pyx_v_new_position));
+1563:             if hardwall == 1:
      __pyx_t_2 = (__pyx_v_hardwall == 1);
      if (__pyx_t_2) {
/* … */
      }
+1564:                 if straddle_pair(new_position[0], new_position[1], 0,
        if (__pyx_t_2) {
/* … */
        }
+1565:                                  anchor0, anchor1, 0) == 1:
        __pyx_t_2 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0, __pyx_v_anchor0, __pyx_v_anchor1, 0) == 1);
+1566:                     continue
          goto __pyx_L4_continue;
 1567: 
+1568:         elif beadflag == 3:
      break;
      default:
+1569:             anchor0 = idx_to_bead[bead_index - 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_1 = 5;
      __pyx_v_anchor0 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1570:             anchor1 = idx_to_bead[bead_index - 1, 6]
      __pyx_t_1 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 6;
      __pyx_v_anchor1 = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1571:             single_bead_crank_cp_2D(anchor0, anchor1, grid, XDIM, YDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp_2D(__pyx_v_anchor0, __pyx_v_anchor1, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, (&__pyx_v_rng), __pyx_v_new_position));
+1572:             if hardwall == 1:
      __pyx_t_2 = (__pyx_v_hardwall == 1);
      if (__pyx_t_2) {
/* … */
      }
+1573:                 if straddle_pair(anchor0, anchor1, 0,
        if (__pyx_t_2) {
/* … */
        }
+1574:                                  new_position[0], new_position[1], 0) == 1:
        __pyx_t_2 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_anchor0, __pyx_v_anchor1, 0, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0) == 1);
+1575:                     continue
          goto __pyx_L4_continue;
 1576: 
 1577:         else:
+1578:             Nx = idx_to_bead[bead_index - 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index - 1);
      __pyx_t_1 = 5;
      __pyx_v_Nx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1579:             Ny = idx_to_bead[bead_index - 1, 6]
      __pyx_t_1 = (__pyx_v_bead_index - 1);
      __pyx_t_6 = 6;
      __pyx_v_Ny = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1580:             Cx = idx_to_bead[bead_index + 1, 5]
      __pyx_t_6 = (__pyx_v_bead_index + 1);
      __pyx_t_1 = 5;
      __pyx_v_Cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1581:             Cy = idx_to_bead[bead_index + 1, 6]
      __pyx_t_1 = (__pyx_v_bead_index + 1);
      __pyx_t_6 = 6;
      __pyx_v_Cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1582:             crank_it_cp_2D(Nx, Ny, Cx, Cy, grid, XDIM, YDIM, &rng, new_position)
      (void)(__pyx_f_5pimms_15mega_crank_fast_crank_it_cp_2D(__pyx_v_Nx, __pyx_v_Ny, __pyx_v_Cx, __pyx_v_Cy, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, (&__pyx_v_rng), __pyx_v_new_position));
+1583:             if hardwall == 1:
      __pyx_t_2 = (__pyx_v_hardwall == 1);
      if (__pyx_t_2) {
/* … */
      }
      break;
    }
+1584:                 if (straddle_pair(Nx, Ny, 0,
        if (__pyx_t_2) {
/* … */
        }
+1585:                                   new_position[0], new_position[1], 0) == 1
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_Nx, __pyx_v_Ny, 0, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0) == 1);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L21_bool_binop_done;
        }
 1586:                     or straddle_pair(new_position[0], new_position[1], 0,
+1587:                                      Cx, Cy, 0) == 1):
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair((__pyx_v_new_position[0]), (__pyx_v_new_position[1]), 0, __pyx_v_Cx, __pyx_v_Cy, 0) == 1);
        __pyx_t_2 = __pyx_t_8;
        __pyx_L21_bool_binop_done:;
+1588:                     continue
          goto __pyx_L4_continue;
 1589: 
+1590:         if not new_position[0] < 0:
    __pyx_t_2 = (!((__pyx_v_new_position[0]) < 0));
    if (__pyx_t_2) {
/* … */
    }
    __pyx_L4_continue:;
  }
 1591:             # DETAILED BALANCE: reject any move whose NEW position would leave the
 1592:             # movable interior (land in the frozen halo); see run_block for the
 1593:             # full argument.
+1594:             if nbx > 1:
      __pyx_t_2 = (__pyx_v_nbx > 1);
      if (__pyx_t_2) {
/* … */
      }
+1595:                 sx = (new_position[0] - shift_x + XDIM) % XDIM
        __pyx_t_7 = (((__pyx_v_new_position[0]) - __pyx_v_shift_x) + __pyx_v_XDIM);
        if (unlikely(__pyx_v_XDIM == 0)) {
          PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
          PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
          __Pyx_PyGILState_Release(__pyx_gilstate_save);
          __PYX_ERR(0, 1595, __pyx_L1_error)
        }
        __pyx_v_sx = __Pyx_mod_int(__pyx_t_7, __pyx_v_XDIM, 0);
+1596:                 wx = sx - blo_x[b]
        __pyx_t_6 = __pyx_v_b;
        __pyx_v_wx = (__pyx_v_sx - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_6)) ))));
+1597:                 if wx < W or wx >= Lx - W:
        __pyx_t_8 = (__pyx_v_wx < __pyx_v_W);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L26_bool_binop_done;
        }
        __pyx_t_8 = (__pyx_v_wx >= (__pyx_v_Lx - __pyx_v_W));
        __pyx_t_2 = __pyx_t_8;
        __pyx_L26_bool_binop_done:;
        if (__pyx_t_2) {
/* … */
        }
+1598:                     continue
          goto __pyx_L4_continue;
+1599:             if nby > 1:
      __pyx_t_2 = (__pyx_v_nby > 1);
      if (__pyx_t_2) {
/* … */
      }
+1600:                 sy = (new_position[1] - shift_y + YDIM) % YDIM
        __pyx_t_7 = (((__pyx_v_new_position[1]) - __pyx_v_shift_y) + __pyx_v_YDIM);
        if (unlikely(__pyx_v_YDIM == 0)) {
          PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
          PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
          __Pyx_PyGILState_Release(__pyx_gilstate_save);
          __PYX_ERR(0, 1600, __pyx_L1_error)
        }
        __pyx_v_sy = __Pyx_mod_int(__pyx_t_7, __pyx_v_YDIM, 0);
+1601:                 wy = sy - blo_y[b]
        __pyx_t_6 = __pyx_v_b;
        __pyx_v_wy = (__pyx_v_sy - (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_6)) ))));
+1602:                 if wy < W or wy >= Ly - W:
        __pyx_t_8 = (__pyx_v_wy < __pyx_v_W);
        if (!__pyx_t_8) {
        } else {
          __pyx_t_2 = __pyx_t_8;
          goto __pyx_L30_bool_binop_done;
        }
        __pyx_t_8 = (__pyx_v_wy >= (__pyx_v_Ly - __pyx_v_W));
        __pyx_t_2 = __pyx_t_8;
        __pyx_L30_bool_binop_done:;
        if (__pyx_t_2) {
/* … */
        }
+1603:                     continue
          goto __pyx_L4_continue;
 1604: 
+1605:             delta_energy = get_energy_change_2D_c(grid, type_grid,
      __pyx_v_delta_energy = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_old0, __pyx_v_old1, (__pyx_v_new_position[0]), (__pyx_v_new_position[1]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
 1606:                                                   old0, old1,
 1607:                                                   new_position[0], new_position[1],
+1608:                                                   idx_to_bead[bead_index, 1],
      __pyx_t_6 = __pyx_v_bead_index;
      __pyx_t_1 = 1;
 1609:                                                   interaction_table, LR_interaction_table,
 1610:                                                   SLR_interaction_table,
 1611:                                                   XDIM, YDIM, hardwall)
+1612:             delta_angle_energy = get_angle_energy_change_2D_c(bead_index, idx_to_bead,
      __pyx_v_delta_angle_energy = __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c(__pyx_v_bead_index, __pyx_v_idx_to_bead, __pyx_v_new_position, __pyx_v_angle_lookup);
 1613:                                                               new_position, angle_lookup)
+1614:             if accept_p(invtemp, delta_energy + delta_angle_energy, &rng) == 1:
      __pyx_t_2 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, (__pyx_v_delta_energy + __pyx_v_delta_angle_energy), (&__pyx_v_rng)) == 1);
      if (__pyx_t_2) {
/* … */
      }
+1615:                 grid[old0, old1] = 0
        __pyx_t_1 = __pyx_v_old0;
        __pyx_t_6 = __pyx_v_old1;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_grid.strides[1]) )) = 0;
+1616:                 grid[new_position[0], new_position[1]] = idx_to_bead[bead_index, 4]
        __pyx_t_6 = __pyx_v_bead_index;
        __pyx_t_1 = 4;
        __pyx_t_9 = (__pyx_v_new_position[0]);
        __pyx_t_10 = (__pyx_v_new_position[1]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_9 * __pyx_v_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+1617:                 type_grid[new_position[0], new_position[1]] = type_grid[old0, old1]
        __pyx_t_1 = __pyx_v_old0;
        __pyx_t_6 = __pyx_v_old1;
        __pyx_t_10 = (__pyx_v_new_position[0]);
        __pyx_t_9 = (__pyx_v_new_position[1]);
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) )));
+1618:                 type_grid[old0, old1] = 0
        __pyx_t_6 = __pyx_v_old0;
        __pyx_t_1 = __pyx_v_old1;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_6 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )) = 0;
+1619:                 idx_to_bead[bead_index, 5] = new_position[0]
        __pyx_t_1 = __pyx_v_bead_index;
        __pyx_t_6 = 5;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[0]);
+1620:                 idx_to_bead[bead_index, 6] = new_position[1]
        __pyx_t_6 = __pyx_v_bead_index;
        __pyx_t_1 = 6;
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_new_position[1]);
+1621:                 dsum = dsum + delta_energy + delta_angle_energy
        __pyx_v_dsum = ((__pyx_v_dsum + __pyx_v_delta_energy) + __pyx_v_delta_angle_energy);
+1622:                 acc = acc + 1
        __pyx_v_acc = (__pyx_v_acc + 1);
 1623: 
+1624:     out_delta[b] = dsum
  __pyx_t_1 = __pyx_v_b;
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = __pyx_v_dsum;
+1625:     out_accepted[b] = acc
  __pyx_t_1 = __pyx_v_b;
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = __pyx_v_acc;
 1626: 
 1627: 
+1628: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_9mega_crank_parallel_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_8mega_crank_parallel_2D, "\n    Parallel checkerboard crankshaft kernel (2D).\n\n    The 2D analogue of mega_crank_parallel: distributes the substep work across\n    `num_threads` OpenMP threads using the same frozen-halo block decomposition,\n    over a 2D grid. The decomposition depends only on box geometry (and the halo\n    width W), NOT on num_threads, so the result is identical for any thread count.\n    `frozen_mask` is a per-bead int array (1 = frozen) - frozen beads are excluded\n    from the movable set but kept as fixed obstacles. Targets the same Boltzmann\n    distribution as the serial 2D kernel (mega_crank_2D); it is not bit-identical\n    to it. Returns (energy, accepted).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_9mega_crank_parallel_2D = {"mega_crank_parallel_2D", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_9mega_crank_parallel_2D, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_8mega_crank_parallel_2D};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_9mega_crank_parallel_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_nsteps;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  int __pyx_v_num_threads;
  __Pyx_memviewslice __pyx_v_frozen_mask = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_crank_parallel_2D (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_nsteps,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_num_threads,&__pyx_mstate_global->__pyx_n_u_frozen_mask,0};
  PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1628, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1628, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_crank_parallel_2D", 0) < (0)) __PYX_ERR(0, 1628, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 14; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_crank_parallel_2D", 1, 14, 14, i); __PYX_ERR(0, 1628, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 14)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 1628, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 1628, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 1630, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 1631, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 1632, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 1633, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 1634, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 1635, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 1636, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[7]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 1637, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[8]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 1638, __pyx_L3_error)
    __pyx_v_nsteps = __Pyx_PyLong_As_int(values[9]); if (unlikely((__pyx_v_nsteps == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1639, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[10]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1640, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[11]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1641, __pyx_L3_error)
    __pyx_v_num_threads = __Pyx_PyLong_As_int(values[12]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1642, __pyx_L3_error)
    __pyx_v_frozen_mask = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[13], PyBUF_WRITABLE); if (unlikely(!__pyx_v_frozen_mask.memview)) __PYX_ERR(0, 1643, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_crank_parallel_2D", 1, 14, 14, __pyx_nargs); __PYX_ERR(0, 1628, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_8mega_crank_parallel_2D(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_nsteps, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_num_threads, __pyx_v_frozen_mask);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_5pimms_15mega_crank_fast_8mega_crank_parallel_2D(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_nsteps, int __pyx_v_passed_seed, int __pyx_v_hardwall, int __pyx_v_num_threads, __Pyx_memviewslice __pyx_v_frozen_mask) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D *__pyx_cur_scope;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  PyObject *__pyx_v_idx_np = NULL;
  int __pyx_v_R_int;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_Lx;
  int __pyx_v_Ly;
  int __pyx_v_num_blocks;
  PyObject *__pyx_v_rstate = NULL;
  int __pyx_v_shift_x;
  int __pyx_v_shift_y;
  PyObject *__pyx_v_gx = NULL;
  PyObject *__pyx_v_gy = NULL;
  PyObject *__pyx_v_dim_block = 0;
  PyObject *__pyx_v_bxj = NULL;
  PyObject *__pyx_v_byj = NULL;
  PyObject *__pyx_v_movable = NULL;
  PyObject *__pyx_v_block_of_bead = NULL;
  PyObject *__pyx_v_sel = NULL;
  PyObject *__pyx_v_sel_blocks = NULL;
  PyObject *__pyx_v_order = NULL;
  PyObject *__pyx_v_ids = NULL;
  PyObject *__pyx_v_sorted_blocks = NULL;
  PyObject *__pyx_v_counts = NULL;
  PyObject *__pyx_v_starts = NULL;
  PyObject *__pyx_v_total_interior = NULL;
  PyObject *__pyx_v_attempts = NULL;
  PyObject *__pyx_v_bix = NULL;
  PyObject *__pyx_v_biy = NULL;
  PyObject *__pyx_v_blo_x = NULL;
  PyObject *__pyx_v_blo_y = NULL;
  PyObject *__pyx_v_seeds = NULL;
  PyObject *__pyx_v_out_delta = NULL;
  PyObject *__pyx_v_out_accepted = NULL;
  __Pyx_memviewslice __pyx_v_ids_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_starts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_attempts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_seeds_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_x_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_y_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_delta_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_accepted_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_b;
  CYTHON_UNUSED int __pyx_v_nthreads;
  long __pyx_v_total_delta_2d;
  int __pyx_v_total_accepted_2d;
  PyObject *__pyx_r = NULL;
  __pyx_cur_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D *)__pyx_tp_new_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D(__pyx_mstate_global->__pyx_ptype_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D, __pyx_mstate_global->__pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 1628, __pyx_L1_error)
  } else {
    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
  }
/* … */
  /* 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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_16);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_18, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_19, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_idx_np);
  __Pyx_XDECREF(__pyx_v_rstate);
  __Pyx_XDECREF(__pyx_v_gx);
  __Pyx_XDECREF(__pyx_v_gy);
  __Pyx_XDECREF(__pyx_v_dim_block);
  __Pyx_XDECREF(__pyx_v_bxj);
  __Pyx_XDECREF(__pyx_v_byj);
  __Pyx_XDECREF(__pyx_v_movable);
  __Pyx_XDECREF(__pyx_v_block_of_bead);
  __Pyx_XDECREF(__pyx_v_sel);
  __Pyx_XDECREF(__pyx_v_sel_blocks);
  __Pyx_XDECREF(__pyx_v_order);
  __Pyx_XDECREF(__pyx_v_ids);
  __Pyx_XDECREF(__pyx_v_sorted_blocks);
  __Pyx_XDECREF(__pyx_v_counts);
  __Pyx_XDECREF(__pyx_v_starts);
  __Pyx_XDECREF(__pyx_v_total_interior);
  __Pyx_XDECREF(__pyx_v_attempts);
  __Pyx_XDECREF(__pyx_v_bix);
  __Pyx_XDECREF(__pyx_v_biy);
  __Pyx_XDECREF(__pyx_v_blo_x);
  __Pyx_XDECREF(__pyx_v_blo_y);
  __Pyx_XDECREF(__pyx_v_seeds);
  __Pyx_XDECREF(__pyx_v_out_delta);
  __Pyx_XDECREF(__pyx_v_out_accepted);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_ids_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_starts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_attempts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_seeds_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_x_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_y_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_delta_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_accepted_mv, 1);
  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_9mega_crank_parallel_2D, 0, __pyx_mstate_global->__pyx_n_u_mega_crank_parallel_2D, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[10])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1628, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_crank_parallel_2D, __pyx_t_4) < (0)) __PYX_ERR(0, 1628, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D {
  PyObject_HEAD
  int __pyx_v_W;
  int __pyx_v_num_beads;
};

 1629: @cython.boundscheck(False)
 1630: def mega_crank_parallel_2D(NUMPY_INT_TYPE[:, :] grid,
 1631:                            NUMPY_INT_TYPE[:, :] type_grid,
 1632:                            NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 1633:                            NUMPY_INT_TYPE[:, :] interaction_table,
 1634:                            NUMPY_INT_TYPE[:, :] LR_interaction_table,
 1635:                            NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 1636:                            NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 1637:                            long energy,
 1638:                            float invtemp,
 1639:                            int nsteps,
 1640:                            int passed_seed,
 1641:                            int hardwall,
 1642:                            int num_threads,
 1643:                            NUMPY_INT_TYPE[::1] frozen_mask):
 1644:     """
 1645:     Parallel checkerboard crankshaft kernel (2D).
 1646: 
 1647:     The 2D analogue of mega_crank_parallel: distributes the substep work across
 1648:     `num_threads` OpenMP threads using the same frozen-halo block decomposition,
 1649:     over a 2D grid. The decomposition depends only on box geometry (and the halo
 1650:     width W), NOT on num_threads, so the result is identical for any thread count.
 1651:     `frozen_mask` is a per-bead int array (1 = frozen) - frozen beads are excluded
 1652:     from the movable set but kept as fixed obstacles. Targets the same Boltzmann
 1653:     distribution as the serial 2D kernel (mega_crank_2D); it is not bit-identical
 1654:     to it. Returns (energy, accepted).
 1655:     """
+1656:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+1657:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+1658:     cdef int num_beads = idx_to_bead.shape[0]
  __pyx_cur_scope->__pyx_v_num_beads = (__pyx_v_idx_to_bead.shape[0]);
 1659: 
 1660:     # interaction radius -> halo width W = R_int + 2 (2 covers the max bead
 1661:     # displacement of a terminal/internal move; R_int covers the energy read).
+1662:     idx_np = np.asarray(idx_to_bead)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1662, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1662, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_idx_to_bead, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1662, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1662, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_idx_np = __pyx_t_1;
  __pyx_t_1 = 0;
+1663:     cdef int R_int = 3 if np.any(idx_np[:, 1] == 1) else 1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[1]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1663, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1663, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_8) {
    __pyx_t_6 = 3;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_R_int = __pyx_t_6;
+1664:     cdef int W = R_int + 2
  __pyx_cur_scope->__pyx_v_W = (__pyx_v_R_int + 2);
 1665: 
+1666:     cdef int cap = 4
  __pyx_v_cap = 4;
+1667:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1667, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1667, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1667, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1667, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_4, __pyx_t_3, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1667, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1667, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbx = __pyx_t_6;
+1668:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1668, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1668, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1668, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1668, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, __pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1668, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1668, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nby = __pyx_t_6;
+1669:     cdef int Lx = XDIM // nbx
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1669, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1669, __pyx_L1_error)
  }
  __pyx_v_Lx = __Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0);
+1670:     cdef int Ly = YDIM // nby
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1670, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1670, __pyx_L1_error)
  }
  __pyx_v_Ly = __Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0);
+1671:     cdef int num_blocks = nbx * nby
  __pyx_v_num_blocks = (__pyx_v_nbx * __pyx_v_nby);
 1672: 
 1673:     # reproducible shifts + per-block seeds derived from passed_seed
+1674:     rstate = np.random.RandomState(passed_seed & 0x7FFFFFFF)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1674, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1674, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_9 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_9);
  __pyx_t_2 = __Pyx_PyLong_From_long((__pyx_v_passed_seed & 0x7FFFFFFF)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1674, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_RandomState, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1674, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_rstate = __pyx_t_1;
  __pyx_t_1 = 0;
+1675:     cdef int shift_x = int(rstate.randint(0, Lx)) if nbx > 1 else 0
  __pyx_t_8 = (__pyx_v_nbx > 1);
  if (__pyx_t_8) {
    __pyx_t_4 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1675, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_mstate_global->__pyx_int_0, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1675, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_t_2 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1675, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_2); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1675, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_x = __pyx_t_6;
+1676:     cdef int shift_y = int(rstate.randint(0, Ly)) if nby > 1 else 0
  __pyx_t_8 = (__pyx_v_nby > 1);
  if (__pyx_t_8) {
    __pyx_t_1 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1676, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_0, __pyx_t_4};
      __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1676, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_t_4 = __Pyx_PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1676, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_4); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1676, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_y = __pyx_t_6;
 1677: 
 1678:     # ---- bucket beads into blocks (interior beads only) -----------------
+1679:     gx = idx_np[:, 5].astype(np.int64)
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[2]); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1679, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1679, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1679, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1679, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_v_gx = __pyx_t_4;
  __pyx_t_4 = 0;
+1680:     gy = idx_np[:, 6].astype(np.int64)
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[3]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_9};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1680, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_v_gy = __pyx_t_4;
  __pyx_t_4 = 0;
 1681: 
 1682:     # per-dim block index (-1 => frozen: in halo or remainder or wrong region)
+1683:     def dim_block(g, nb, L, DIM, shift):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_1dim_block = {"dim_block", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_1dim_block, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_g = 0;
  PyObject *__pyx_v_nb = 0;
  PyObject *__pyx_v_L = 0;
  PyObject *__pyx_v_DIM = 0;
  PyObject *__pyx_v_shift = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dim_block (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_g,&__pyx_mstate_global->__pyx_n_u_nb,&__pyx_mstate_global->__pyx_n_u_L,&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_shift,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1683, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1683, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1683, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1683, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1683, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1683, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "dim_block", 0) < (0)) __PYX_ERR(0, 1683, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, i); __PYX_ERR(0, 1683, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1683, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1683, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1683, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1683, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1683, __pyx_L3_error)
    }
    __pyx_v_g = values[0];
    __pyx_v_nb = values[1];
    __pyx_v_L = values[2];
    __pyx_v_DIM = values[3];
    __pyx_v_shift = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 1683, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel_2D.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_dim_block(__pyx_self, __pyx_v_g, __pyx_v_nb, __pyx_v_L, __pyx_v_DIM, __pyx_v_shift);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_dim_block(PyObject *__pyx_self, PyObject *__pyx_v_g, PyObject *__pyx_v_nb, PyObject *__pyx_v_L, PyObject *__pyx_v_DIM, PyObject *__pyx_v_shift) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D *__pyx_cur_scope;
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D *__pyx_outer_scope;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_bj = NULL;
  PyObject *__pyx_v_within = NULL;
  PyObject *__pyx_v_bad = NULL;
  PyObject *__pyx_r = NULL;
  __pyx_outer_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_1_mega_crank_parallel_2D *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_crank_parallel_2D.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_bj);
  __Pyx_XDECREF(__pyx_v_within);
  __Pyx_XDECREF(__pyx_v_bad);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_1dim_block, 0, __pyx_mstate_global->__pyx_n_u_mega_crank_parallel_2D_locals_di, ((PyObject*)__pyx_cur_scope), __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[1])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1683, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_dim_block = __pyx_t_4;
  __pyx_t_4 = 0;
+1684:         if nb == 1:
  __pyx_t_1 = (__Pyx_PyLong_BoolEqObjC(__pyx_v_nb, __pyx_mstate_global->__pyx_int_1, 1, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 1684, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+1685:             return np.zeros(num_beads, dtype=np.int64)        # whole dim = block 0
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_num_beads); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_8 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_6 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_6, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1685, __pyx_L1_error)
      __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_8, (2-__pyx_t_8) | (__pyx_t_8*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_6);
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+1686:         s = (g - shift) % DIM
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_g, __pyx_v_shift); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1686, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyNumber_Remainder(__pyx_t_2, __pyx_v_DIM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1686, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_5;
  __pyx_t_5 = 0;
+1687:         bj = s // L
  __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_s, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_bj = __pyx_t_5;
  __pyx_t_5 = 0;
+1688:         within = s - bj * L
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_bj, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_within = __pyx_t_2;
  __pyx_t_2 = 0;
+1689:         bad = (s >= nb * L) | (within < W) | (within >= L - W)
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nb, __pyx_v_L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_s, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_L, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Or(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_bad = __pyx_t_5;
  __pyx_t_5 = 0;
+1690:         bj = bj.copy()
  __pyx_t_6 = __pyx_v_bj;
  __Pyx_INCREF(__pyx_t_6);
  __pyx_t_8 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
    __pyx_t_5 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_copy, __pyx_callargs+__pyx_t_8, (1-__pyx_t_8) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1690, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
  }
  __Pyx_DECREF_SET(__pyx_v_bj, __pyx_t_5);
  __pyx_t_5 = 0;
+1691:         bj[bad] = -1
  if (unlikely((PyObject_SetItem(__pyx_v_bj, __pyx_v_bad, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 1691, __pyx_L1_error)
+1692:         return bj
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_bj);
  __pyx_r = __pyx_v_bj;
  goto __pyx_L0;
 1693: 
+1694:     bxj = dim_block(gx, nbx, Lx, XDIM, shift_x)
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_shift_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_pf_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_dim_block(__pyx_v_dim_block, __pyx_v_gx, __pyx_t_4, __pyx_t_3, __pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_bxj = __pyx_t_2;
  __pyx_t_2 = 0;
+1695:     byj = dim_block(gy, nby, Ly, YDIM, shift_y)
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_shift_y); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __pyx_pf_5pimms_15mega_crank_fast_22mega_crank_parallel_2D_dim_block(__pyx_v_dim_block, __pyx_v_gy, __pyx_t_2, __pyx_t_1, __pyx_t_9, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1695, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_byj = __pyx_t_4;
  __pyx_t_4 = 0;
 1696: 
 1697:     # movable iff in a block interior AND not frozen (frozen beads remain as
 1698:     # fixed obstacles but are never selected for a move)
+1699:     movable = (bxj >= 0) & (byj >= 0) & (np.asarray(frozen_mask) == 0)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_bxj, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_byj, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __pyx_t_9 = PyNumber_And(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_frozen_mask, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_1};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1699, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_2 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyNumber_And(__pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_movable = __pyx_t_3;
  __pyx_t_3 = 0;
+1700:     block_of_bead = (bxj * nby + byj)
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_bxj, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyNumber_Add(__pyx_t_2, __pyx_v_byj); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_block_of_bead = __pyx_t_3;
  __pyx_t_3 = 0;
+1701:     block_of_bead[~movable] = -1
  __pyx_t_3 = PyNumber_Invert(__pyx_v_movable); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1701, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_3, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 1701, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 1702: 
+1703:     sel = np.nonzero(movable)[0].astype(np.int32)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1703, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_nonzero); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1703, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_v_movable};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1703, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_9, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1703, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_2 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1703, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1703, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_1};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1703, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_sel = __pyx_t_3;
  __pyx_t_3 = 0;
+1704:     if sel.shape[0] == 0:
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_sel, __pyx_mstate_global->__pyx_n_u_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1704, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1704, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_8 = (__Pyx_PyLong_BoolEqObjC(__pyx_t_7, __pyx_mstate_global->__pyx_int_0, 0, 0)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1704, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (__pyx_t_8) {
/* … */
  }
 1705:         # nothing movable this sweep (tiny box / unlucky shift) - no-op
+1706:         return (energy, 0)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1706, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1706, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_7);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7) != (0)) __PYX_ERR(0, 1706, __pyx_L1_error);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_0);
    __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_0);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_mstate_global->__pyx_int_0) != (0)) __PYX_ERR(0, 1706, __pyx_L1_error);
    __pyx_t_7 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
 1707: 
+1708:     sel_blocks = block_of_bead[sel]
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_block_of_bead, __pyx_v_sel); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1708, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_sel_blocks = __pyx_t_3;
  __pyx_t_3 = 0;
+1709:     order = np.argsort(sel_blocks, kind="stable")
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1709, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_argsort); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1709, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_v_sel_blocks};
    __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1709, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_kind, __pyx_mstate_global->__pyx_n_u_stable, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1709, __pyx_L1_error)
    __pyx_t_3 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1709, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_order = __pyx_t_3;
  __pyx_t_3 = 0;
+1710:     ids = sel[order].astype(np.int32)
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_sel, __pyx_v_order); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1710, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1710, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1710, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_9};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1710, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_ids = __pyx_t_3;
  __pyx_t_3 = 0;
+1711:     sorted_blocks = sel_blocks[order]
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_sel_blocks, __pyx_v_order); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1711, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_sorted_blocks = __pyx_t_3;
  __pyx_t_3 = 0;
 1712: 
+1713:     counts = np.bincount(sorted_blocks, minlength=num_blocks).astype(np.int32)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1713, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_bincount); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1713, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1713, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_v_sorted_blocks};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1713, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_minlength, __pyx_t_7, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1713, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1713, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1713, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1713, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_11};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1713, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_counts = __pyx_t_3;
  __pyx_t_3 = 0;
+1714:     starts = np.zeros(num_blocks + 1, dtype=np.int32)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_long((__pyx_v_num_blocks + 1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_t_11};
    __pyx_t_4 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1714, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_4, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1714, __pyx_L1_error)
    __pyx_t_3 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_4);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1714, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_starts = __pyx_t_3;
  __pyx_t_3 = 0;
+1715:     starts[1:] = np.cumsum(counts)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1715, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_cumsum); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1715, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_v_counts};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1715, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  if (__Pyx_PyObject_SetSlice(__pyx_v_starts, __pyx_t_3, 1, 0, NULL, NULL, &__pyx_mstate_global->__pyx_slice[1], 1, 0, 0) < (0)) __PYX_ERR(0, 1715, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 1716: 
 1717:     # distribute nsteps proportional to each block's movable bead count
+1718:     total_interior = int(counts.sum())
  __pyx_t_7 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_7);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_sum, __pyx_callargs+__pyx_t_5, (1-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1718, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_7 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1718, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_total_interior = ((PyObject*)__pyx_t_7);
  __pyx_t_7 = 0;
+1719:     attempts = np.maximum(
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1719, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1719, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+1720:         (nsteps * counts.astype(np.int64) // max(total_interior, 1)), 0).astype(np.int32)
  __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_nsteps); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_14};
    __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1720, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_14 = PyNumber_Multiply(__pyx_t_11, __pyx_t_2); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_15 = 1;
  __Pyx_INCREF(__pyx_v_total_interior);
  __pyx_t_16 = __pyx_v_total_interior;
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_16, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  if (__pyx_t_8) {
    __pyx_t_12 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1720, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_PyInt_FromNumber(&__pyx_t_12, NULL, 0) < (0)) __PYX_ERR(0, 1720, __pyx_L1_error)
    __pyx_t_2 = __pyx_t_12;
    __pyx_t_12 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_16);
    __pyx_t_2 = __pyx_t_16;
  }
  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_14, __pyx_t_2); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_12, __pyx_mstate_global->__pyx_int_0};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1719, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_3 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1720, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_12};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1720, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_attempts = __pyx_t_7;
  __pyx_t_7 = 0;
 1721: 
 1722:     # shifted lower bound of each block per dim (for the in-worker interior test)
+1723:     bix = np.arange(num_blocks, dtype=np.int32) // nby
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_12};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1723, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1723, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1723, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = PyNumber_FloorDivide(__pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1723, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_bix = __pyx_t_9;
  __pyx_t_9 = 0;
+1724:     biy = np.arange(num_blocks, dtype=np.int32) % nby
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_7};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1724, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_1, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1724, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1724, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_12 = PyNumber_Remainder(__pyx_t_9, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1724, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_biy = __pyx_t_12;
  __pyx_t_12 = 0;
+1725:     blo_x = (bix * Lx).astype(np.int32)
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_bix, __pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_4 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_12 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1725, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_blo_x = __pyx_t_12;
  __pyx_t_12 = 0;
+1726:     blo_y = (biy * Ly).astype(np.int32)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1726, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_biy, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1726, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_1 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1726, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1726, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_9};
    __pyx_t_12 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1726, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_blo_y = __pyx_t_12;
  __pyx_t_12 = 0;
 1727: 
 1728:     # independent PRNG seed per block
+1729:     seeds = (np.arange(num_blocks, dtype=np.uint64) + np.uint64(passed_seed) + np.uint64(0x9E3779B9)) \
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_9};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1729, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_passed_seed); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_9 = PyNumber_Add(__pyx_t_12, __pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_mstate_global->__pyx_int_2654435769};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_7 = PyNumber_Add(__pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+1730:         * np.uint64(0x2545F4914F6CDD1D) + np.uint64(1)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_mstate_global->__pyx_int_0x2545f4914f6cdd1d};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1730, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_7, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_1};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1730, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_12 = PyNumber_Add(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_seeds = __pyx_t_12;
  __pyx_t_12 = 0;
 1731: 
+1732:     out_delta = np.zeros(num_blocks, dtype=np.int64)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1732, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1732, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1732, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1732, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1732, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_3};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1732, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1732, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1732, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_out_delta = __pyx_t_12;
  __pyx_t_12 = 0;
+1733:     out_accepted = np.zeros(num_blocks, dtype=np.int32)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1733, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1733, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1733, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1733, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1733, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_9};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1733, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_1, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 1733, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1733, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_out_accepted = __pyx_t_12;
  __pyx_t_12 = 0;
 1734: 
 1735:     # typed memoryviews for the nogil region
+1736:     cdef int[::1] ids_mv = ids
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_ids, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1736, __pyx_L1_error)
  __pyx_v_ids_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1737:     cdef int[::1] starts_mv = starts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_starts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1737, __pyx_L1_error)
  __pyx_v_starts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1738:     cdef int[::1] attempts_mv = attempts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_attempts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1738, __pyx_L1_error)
  __pyx_v_attempts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1739:     cdef unsigned long long[::1] seeds_mv = seeds
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_PY_LONG_LONG(__pyx_v_seeds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 1739, __pyx_L1_error)
  __pyx_v_seeds_mv = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+1740:     cdef int[::1] blo_x_mv = blo_x
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_x, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1740, __pyx_L1_error)
  __pyx_v_blo_x_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1741:     cdef int[::1] blo_y_mv = blo_y
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_y, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1741, __pyx_L1_error)
  __pyx_v_blo_y_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+1742:     cdef long[::1] out_delta_mv = out_delta
  __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_long(__pyx_v_out_delta, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 1742, __pyx_L1_error)
  __pyx_v_out_delta_mv = __pyx_t_19;
  __pyx_t_19.memview = NULL;
  __pyx_t_19.data = NULL;
+1743:     cdef int[::1] out_accepted_mv = out_accepted
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_out_accepted, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 1743, __pyx_L1_error)
  __pyx_v_out_accepted_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
 1744: 
 1745:     cdef int b
+1746:     cdef int nthreads = num_threads if num_threads > 0 else 1
  __pyx_t_8 = (__pyx_v_num_threads > 0);
  if (__pyx_t_8) {
    __pyx_t_6 = __pyx_v_num_threads;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_nthreads = __pyx_t_6;
 1747: 
 1748:     # ---- parallel region: each block is independent -----------------
+1749:     for b in prange(num_blocks, nogil=True, num_threads=nthreads, schedule='dynamic'):
  {
      PyThreadState * _save;
      _save = PyEval_SaveThread();
      __Pyx_FastGIL_Remember();
      /*try:*/ {
        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic)        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic) num_threads(__pyx_v_nthreads)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_b = (int)(0 + 1 * __pyx_t_10);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          __Pyx_FastGIL_Forget();
          PyEval_RestoreThread(_save);
          goto __pyx_L6;
        }
        __pyx_L6:;
      }
  }
+1750:         run_block_2D(b, ids_mv, starts_mv, attempts_mv, seeds_mv,
                            __pyx_f_5pimms_15mega_crank_fast_run_block_2D(__pyx_v_b, __pyx_v_ids_mv, __pyx_v_starts_mv, __pyx_v_attempts_mv, __pyx_v_seeds_mv, __pyx_v_blo_x_mv, __pyx_v_blo_y_mv, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_cur_scope->__pyx_v_W, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_invtemp, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall, __pyx_v_out_delta_mv, __pyx_v_out_accepted_mv);
                        }
                    }
                }
            }
        }
        #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
      }
 1751:                      blo_x_mv, blo_y_mv,
 1752:                      Lx, Ly, nbx, nby,
 1753:                      shift_x, shift_y, W,
 1754:                      grid, type_grid, idx_to_bead,
 1755:                      interaction_table, LR_interaction_table, SLR_interaction_table,
 1756:                      angle_lookup, invtemp, XDIM, YDIM, hardwall,
 1757:                      out_delta_mv, out_accepted_mv)
 1758: 
+1759:     cdef long total_delta_2d = 0
  __pyx_v_total_delta_2d = 0;
+1760:     cdef int total_accepted_2d = 0
  __pyx_v_total_accepted_2d = 0;
+1761:     for b in range(num_blocks):
  __pyx_t_20 = __pyx_v_num_blocks;
  __pyx_t_10 = __pyx_t_20;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_10; __pyx_t_6+=1) {
    __pyx_v_b = __pyx_t_6;
+1762:         total_delta_2d += out_delta_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_total_delta_2d = (__pyx_v_total_delta_2d + (*((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta_mv.data) + __pyx_t_21)) ))));
+1763:         total_accepted_2d += out_accepted_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_total_accepted_2d = (__pyx_v_total_accepted_2d + (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted_mv.data) + __pyx_t_21)) ))));
  }
 1764: 
+1765:     return (energy + total_delta_2d, total_accepted_2d)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_12 = __Pyx_PyLong_From_long((__pyx_v_energy + __pyx_v_total_delta_2d)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 1765, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_total_accepted_2d); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1765, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1765, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_12);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_12) != (0)) __PYX_ERR(0, 1765, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4) != (0)) __PYX_ERR(0, 1765, __pyx_L1_error);
  __pyx_t_12 = 0;
  __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 1766: 
 1767: 
+1768: def parallel_layout_info(int XDIM, int YDIM, int ZDIM, has_LR, int num_threads=1):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_11parallel_layout_info(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_10parallel_layout_info, "Introspection helper: returns the block decomposition the parallel kernel\n    would use for a given box (decomposition is independent of num_threads).");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_11parallel_layout_info = {"parallel_layout_info", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_11parallel_layout_info, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_10parallel_layout_info};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_11parallel_layout_info(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  PyObject *__pyx_v_has_LR = 0;
  CYTHON_UNUSED int __pyx_v_num_threads;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("parallel_layout_info (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_XDIM,&__pyx_mstate_global->__pyx_n_u_YDIM,&__pyx_mstate_global->__pyx_n_u_ZDIM,&__pyx_mstate_global->__pyx_n_u_has_LR,&__pyx_mstate_global->__pyx_n_u_num_threads,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1768, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1768, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1768, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1768, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1768, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1768, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "parallel_layout_info", 0) < (0)) __PYX_ERR(0, 1768, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 4; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("parallel_layout_info", 0, 4, 5, i); __PYX_ERR(0, 1768, __pyx_L3_error) }
      }
    } else {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1768, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1768, __pyx_L3_error)
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1768, __pyx_L3_error)
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1768, __pyx_L3_error)
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1768, __pyx_L3_error)
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_XDIM = __Pyx_PyLong_As_int(values[0]); if (unlikely((__pyx_v_XDIM == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1768, __pyx_L3_error)
    __pyx_v_YDIM = __Pyx_PyLong_As_int(values[1]); if (unlikely((__pyx_v_YDIM == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1768, __pyx_L3_error)
    __pyx_v_ZDIM = __Pyx_PyLong_As_int(values[2]); if (unlikely((__pyx_v_ZDIM == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1768, __pyx_L3_error)
    __pyx_v_has_LR = values[3];
    if (values[4]) {
      __pyx_v_num_threads = __Pyx_PyLong_As_int(values[4]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1768, __pyx_L3_error)
    } else {
      __pyx_v_num_threads = ((int)((int)1));
    }
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("parallel_layout_info", 0, 4, 5, __pyx_nargs); __PYX_ERR(0, 1768, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.parallel_layout_info", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_10parallel_layout_info(__pyx_self, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_has_LR, __pyx_v_num_threads);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_10parallel_layout_info(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, PyObject *__pyx_v_has_LR, CYTHON_UNUSED int __pyx_v_num_threads) {
  int __pyx_v_R_int;
  int __pyx_v_W;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_nbz;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("pimms.mega_crank_fast.parallel_layout_info", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_PyLong_From_int(((int)1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = PyTuple_Pack(1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_11parallel_layout_info, 0, __pyx_mstate_global->__pyx_n_u_parallel_layout_info, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[11])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_4, __pyx_t_5);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_parallel_layout_info, __pyx_t_4) < (0)) __PYX_ERR(0, 1768, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 1769:     """Introspection helper: returns the block decomposition the parallel kernel
 1770:     would use for a given box (decomposition is independent of num_threads)."""
+1771:     cdef int R_int = 3 if has_LR else 1
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_has_LR); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 1771, __pyx_L1_error)
  if (__pyx_t_2) {
    __pyx_t_1 = 3;
  } else {
    __pyx_t_1 = 1;
  }
  __pyx_v_R_int = __pyx_t_1;
+1772:     cdef int W = R_int + 2
  __pyx_v_W = (__pyx_v_R_int + 2);
+1773:     cdef int cap = 4
  __pyx_v_cap = 4;
+1774:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_W); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_8 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_9 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
    __pyx_t_9 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_t_6, __pyx_t_7, __pyx_t_8};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_9, (4-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1774, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_1 = __Pyx_PyLong_As_int(__pyx_t_3); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1774, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_nbx = __pyx_t_1;
+1775:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_5 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 1775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_9 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_8))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_8);
    assert(__pyx_t_5);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_8, __pyx__function);
    __pyx_t_9 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_5, __pyx_t_7, __pyx_t_6, __pyx_t_4};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_8, __pyx_callargs+__pyx_t_9, (4-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1775, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_1 = __Pyx_PyLong_As_int(__pyx_t_3); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1775, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_nby = __pyx_t_1;
+1776:     cdef int nbz = _choose_nb(ZDIM, W, cap)
  __pyx_t_8 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_W); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_9 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_8);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_9 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_8, __pyx_t_6, __pyx_t_7, __pyx_t_5};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_9, (4-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1776, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_1 = __Pyx_PyLong_As_int(__pyx_t_3); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1776, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_nbz = __pyx_t_1;
+1777:     return {
  __Pyx_XDECREF(__pyx_r);
+1778:         "W": W, "blocks": (nbx, nby, nbz), "num_blocks": nbx * nby * nbz,
  __pyx_t_3 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_W, __pyx_t_4) < (0)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4) != (0)) __PYX_ERR(0, 1778, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5) != (0)) __PYX_ERR(0, 1778, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_7) != (0)) __PYX_ERR(0, 1778, __pyx_L1_error);
  __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  __pyx_t_7 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_blocks, __pyx_t_6) < (0)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(((__pyx_v_nbx * __pyx_v_nby) * __pyx_v_nbz)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (PyDict_SetItem(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_num_blocks, __pyx_t_6) < (0)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+1779:         "block_size": (XDIM // nbx, YDIM // nby, ZDIM // nbz),
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1779, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1779, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_PyLong_From_int(__Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1779, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1779, __pyx_L1_error)
  }
  __pyx_t_7 = __Pyx_PyLong_From_int(__Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (unlikely(__pyx_v_nbz == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 1779, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbz == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_ZDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 1779, __pyx_L1_error)
  }
  __pyx_t_5 = __Pyx_PyLong_From_int(__Pyx_div_int(__pyx_v_ZDIM, __pyx_v_nbz, 0)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6) != (0)) __PYX_ERR(0, 1779, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_7) != (0)) __PYX_ERR(0, 1779, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_5) != (0)) __PYX_ERR(0, 1779, __pyx_L1_error);
  __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_block_size, __pyx_t_4) < (0)) __PYX_ERR(0, 1778, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 1780:     }
 1781: 
 1782: 
 1783: 
 1784: # =====================================================================
 1785: #
 1786: #   SLITHER (reptation) megamove kernel
 1787: #
 1788: #   A slither advances a chain forwards or backwards like a snake: one end
 1789: #   "grows" into a random adjacent empty site and the other end retracts,
 1790: #   preserving the chain's shape (path) shifted by one bead.
 1791: #
 1792: #   * Single-bead chains  -> a local translation (single_bead_crank).
 1793: #   * Homopolymers        -> O(1) interaction energy: only the vacated tail and
 1794: #                            the new head sites change type, so dE is exactly
 1795: #                            get_energy_change_c(vacated, new_end). Angle energy
 1796: #                            is the (cheap) before/after chain-angle difference.
 1797: #   * Heteropolymers      -> the reptation is decomposed into L single-bead moves
 1798: #                            (move each bead, from the leading end inwards, into
 1799: #                            the now-empty site ahead of it). dE is the sum of the
 1800: #                            already-validated get_energy_change_c +
 1801: #                            get_angle_energy_change_c over those L moves, which
 1802: #                            is exact and energy-consistent by construction.
 1803: #
 1804: #   Detailed balance: direction (head/tail grow) is 1/2 each and the new end is
 1805: #   proposed uniformly over the leading end's 27 neighbour offsets (the self
 1806: #   offset lands on the occupied end bead and is rejected), so the forward and
 1807: #   reverse proposals are symmetric and plain Metropolis on the total dE holds.
 1808: # =====================================================================
 1809: 
+1810: cdef inline long _triplet_angle_3D(int mx, int my, int mz,
static CYTHON_INLINE long __pyx_f_5pimms_15mega_crank_fast__triplet_angle_3D(int __pyx_v_mx, int __pyx_v_my, int __pyx_v_mz, int __pyx_v_lx, int __pyx_v_ly, int __pyx_v_lz, int __pyx_v_rx, int __pyx_v_ry, int __pyx_v_rz, int __pyx_v_ic, __Pyx_memviewslice __pyx_v_angle_lookup) {
  int __pyx_v_a0;
  int __pyx_v_a1;
  int __pyx_v_a2;
  int __pyx_v_b0;
  int __pyx_v_b1;
  int __pyx_v_b2;
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._triplet_angle_3D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 1811:                                    int lx, int ly, int lz,
 1812:                                    int rx, int ry, int rz,
 1813:                                    int ic,
 1814:                                    NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup) noexcept nogil:
+1815:     cdef int a0 = fix_angle_pbc_issues(mx - lx)
  __pyx_v_a0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_mx - __pyx_v_lx));
+1816:     cdef int a1 = fix_angle_pbc_issues(my - ly)
  __pyx_v_a1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_my - __pyx_v_ly));
+1817:     cdef int a2 = fix_angle_pbc_issues(mz - lz)
  __pyx_v_a2 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_mz - __pyx_v_lz));
+1818:     cdef int b0 = fix_angle_pbc_issues(mx - rx)
  __pyx_v_b0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_mx - __pyx_v_rx));
+1819:     cdef int b1 = fix_angle_pbc_issues(my - ry)
  __pyx_v_b1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_my - __pyx_v_ry));
+1820:     cdef int b2 = fix_angle_pbc_issues(mz - rz)
  __pyx_v_b2 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_mz - __pyx_v_rz));
+1821:     return angle_lookup[ic, a0 + 1, a1 + 1, a2 + 1, b0 + 1, b1 + 1, b2 + 1]
  __pyx_t_1 = __pyx_v_ic;
  __pyx_t_2 = (__pyx_v_a0 + 1);
  __pyx_t_3 = (__pyx_v_a1 + 1);
  __pyx_t_4 = (__pyx_v_a2 + 1);
  __pyx_t_5 = (__pyx_v_b0 + 1);
  __pyx_t_6 = (__pyx_v_b1 + 1);
  __pyx_t_7 = (__pyx_v_b2 + 1);
  __pyx_t_8 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_angle_lookup.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_8 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_angle_lookup.shape[0])) __pyx_t_8 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_angle_lookup.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_8 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_angle_lookup.shape[1])) __pyx_t_8 = 1;
  if (__pyx_t_3 < 0) {
    __pyx_t_3 += __pyx_v_angle_lookup.shape[2];
    if (unlikely(__pyx_t_3 < 0)) __pyx_t_8 = 2;
  } else if (unlikely(__pyx_t_3 >= __pyx_v_angle_lookup.shape[2])) __pyx_t_8 = 2;
  if (__pyx_t_4 < 0) {
    __pyx_t_4 += __pyx_v_angle_lookup.shape[3];
    if (unlikely(__pyx_t_4 < 0)) __pyx_t_8 = 3;
  } else if (unlikely(__pyx_t_4 >= __pyx_v_angle_lookup.shape[3])) __pyx_t_8 = 3;
  if (__pyx_t_5 < 0) {
    __pyx_t_5 += __pyx_v_angle_lookup.shape[4];
    if (unlikely(__pyx_t_5 < 0)) __pyx_t_8 = 4;
  } else if (unlikely(__pyx_t_5 >= __pyx_v_angle_lookup.shape[4])) __pyx_t_8 = 4;
  if (__pyx_t_6 < 0) {
    __pyx_t_6 += __pyx_v_angle_lookup.shape[5];
    if (unlikely(__pyx_t_6 < 0)) __pyx_t_8 = 5;
  } else if (unlikely(__pyx_t_6 >= __pyx_v_angle_lookup.shape[5])) __pyx_t_8 = 5;
  if (__pyx_t_7 < 0) {
    __pyx_t_7 += __pyx_v_angle_lookup.shape[6];
    if (unlikely(__pyx_t_7 < 0)) __pyx_t_8 = 6;
  } else if (unlikely(__pyx_t_7 >= __pyx_v_angle_lookup.shape[6])) __pyx_t_8 = 6;
  if (unlikely(__pyx_t_8 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_8);
    __PYX_ERR(0, 1821, __pyx_L1_error)
  }
  __pyx_r = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=6 */ (( /* dim=5 */ (( /* dim=4 */ (( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angle_lookup.data + __pyx_t_1 * __pyx_v_angle_lookup.strides[0]) ) + __pyx_t_2 * __pyx_v_angle_lookup.strides[1]) ) + __pyx_t_3 * __pyx_v_angle_lookup.strides[2]) ) + __pyx_t_4 * __pyx_v_angle_lookup.strides[3]) ) + __pyx_t_5 * __pyx_v_angle_lookup.strides[4]) ) + __pyx_t_6 * __pyx_v_angle_lookup.strides[5]) ) + __pyx_t_7 * __pyx_v_angle_lookup.strides[6]) )));
  goto __pyx_L0;
 1822: 
 1823: 
 1824: # position of chain-index k under a slither mode:
 1825: #   mode 0 = current (old) positions; 1 = head-grow proposal; 2 = tail-grow proposal
+1826: cdef inline void _smode_pos(NUMPY_INT_TYPE_long[:, :] idx, int off, int L, int mode,
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast__smode_pos(__Pyx_memviewslice __pyx_v_idx, int __pyx_v_off, int __pyx_v_L, int __pyx_v_mode, int __pyx_v_nex, int __pyx_v_ney, int __pyx_v_nez, int __pyx_v_k, int *__pyx_v_o) {
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._smode_pos", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 1827:                             int nex, int ney, int nez, int k, int* o) noexcept nogil:
+1828:     if mode == 0:
  switch (__pyx_v_mode) {
    case 0:
/* … */
    break;
    case 1:
+1829:         o[0] = idx[off + k, 5]; o[1] = idx[off + k, 6]; o[2] = idx[off + k, 7]
    __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_2 = 5;
    __pyx_t_3 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
    if (__pyx_t_2 < 0) {
      __pyx_t_2 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
    } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
    if (unlikely(__pyx_t_3 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
      __PYX_ERR(0, 1829, __pyx_L1_error)
    }
    (__pyx_v_o[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
    __pyx_t_2 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_1 = 6;
    __pyx_t_3 = -1;
    if (__pyx_t_2 < 0) {
      __pyx_t_2 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
    } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
    if (unlikely(__pyx_t_3 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
      __PYX_ERR(0, 1829, __pyx_L1_error)
    }
    (__pyx_v_o[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
    __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_2 = 7;
    __pyx_t_3 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
    if (__pyx_t_2 < 0) {
      __pyx_t_2 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
    } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
    if (unlikely(__pyx_t_3 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
      __PYX_ERR(0, 1829, __pyx_L1_error)
    }
    (__pyx_v_o[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
+1830:     elif mode == 1:                 # head-grow: bead k takes bead (k+1)'s old site, last takes new end
    break;
    default:
+1831:         if k < L - 1:
    __pyx_t_4 = (__pyx_v_k < (__pyx_v_L - 1));
    if (__pyx_t_4) {
/* … */
      goto __pyx_L3;
    }
+1832:             o[0] = idx[off + k + 1, 5]; o[1] = idx[off + k + 1, 6]; o[2] = idx[off + k + 1, 7]
      __pyx_t_2 = ((__pyx_v_off + __pyx_v_k) + 1);
      __pyx_t_1 = 5;
      __pyx_t_3 = -1;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 1832, __pyx_L1_error)
      }
      (__pyx_v_o[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
      __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) + 1);
      __pyx_t_2 = 6;
      __pyx_t_3 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 1832, __pyx_L1_error)
      }
      (__pyx_v_o[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
      __pyx_t_2 = ((__pyx_v_off + __pyx_v_k) + 1);
      __pyx_t_1 = 7;
      __pyx_t_3 = -1;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 1832, __pyx_L1_error)
      }
      (__pyx_v_o[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
 1833:         else:
+1834:             o[0] = nex; o[1] = ney; o[2] = nez
    /*else*/ {
      (__pyx_v_o[0]) = __pyx_v_nex;
      (__pyx_v_o[1]) = __pyx_v_ney;
      (__pyx_v_o[2]) = __pyx_v_nez;
    }
    __pyx_L3:;
 1835:     else:                           # tail-grow: bead k takes bead (k-1)'s old site, first takes new end
+1836:         if k > 0:
    __pyx_t_4 = (__pyx_v_k > 0);
    if (__pyx_t_4) {
/* … */
      goto __pyx_L4;
    }
+1837:             o[0] = idx[off + k - 1, 5]; o[1] = idx[off + k - 1, 6]; o[2] = idx[off + k - 1, 7]
      __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) - 1);
      __pyx_t_2 = 5;
      __pyx_t_3 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 1837, __pyx_L1_error)
      }
      (__pyx_v_o[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
      __pyx_t_2 = ((__pyx_v_off + __pyx_v_k) - 1);
      __pyx_t_1 = 6;
      __pyx_t_3 = -1;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 1837, __pyx_L1_error)
      }
      (__pyx_v_o[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
      __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) - 1);
      __pyx_t_2 = 7;
      __pyx_t_3 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 1837, __pyx_L1_error)
      }
      (__pyx_v_o[2]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
 1838:         else:
+1839:             o[0] = nex; o[1] = ney; o[2] = nez
    /*else*/ {
      (__pyx_v_o[0]) = __pyx_v_nex;
      (__pyx_v_o[1]) = __pyx_v_ney;
      (__pyx_v_o[2]) = __pyx_v_nez;
    }
    __pyx_L4:;
    break;
  }
 1840: 
 1841: 
+1842: cdef long _chain_angle_mode(NUMPY_INT_TYPE_long[:, :] idx, int off, int L, int mode,
static long __pyx_f_5pimms_15mega_crank_fast__chain_angle_mode(__Pyx_memviewslice __pyx_v_idx, int __pyx_v_off, int __pyx_v_L, int __pyx_v_mode, int __pyx_v_nex, int __pyx_v_ney, int __pyx_v_nez, __Pyx_memviewslice __pyx_v_angle_lookup) {
  long __pyx_v_e;
  int __pyx_v_k;
  int __pyx_v_pl[3];
  int __pyx_v_pm[3];
  int __pyx_v_pr[3];
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._chain_angle_mode", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 1843:                             int nex, int ney, int nez,
 1844:                             NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup) noexcept nogil:
 1845:     # total angle energy of the chain under the given mode (reads idx; does not mutate)
+1846:     cdef long e = 0
  __pyx_v_e = 0;
 1847:     cdef int k
 1848:     cdef int pl[3]
 1849:     cdef int pm[3]
 1850:     cdef int pr[3]
+1851:     for k in range(1, L - 1):
  __pyx_t_1 = (__pyx_v_L - 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
+1852:         if idx[off + k, 3] == 1:    # skip-angle bead
    __pyx_t_4 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_5 = 3;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 1852, __pyx_L1_error)
    }
    __pyx_t_7 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_5 * __pyx_v_idx.strides[1]) ))) == 1);
    if (__pyx_t_7) {
/* … */
    }
+1853:             continue
      goto __pyx_L3_continue;
+1854:         _smode_pos(idx, off, L, mode, nex, ney, nez, k - 1, pl)
    __pyx_f_5pimms_15mega_crank_fast__smode_pos(__pyx_v_idx, __pyx_v_off, __pyx_v_L, __pyx_v_mode, __pyx_v_nex, __pyx_v_ney, __pyx_v_nez, (__pyx_v_k - 1), __pyx_v_pl);
+1855:         _smode_pos(idx, off, L, mode, nex, ney, nez, k, pm)
    __pyx_f_5pimms_15mega_crank_fast__smode_pos(__pyx_v_idx, __pyx_v_off, __pyx_v_L, __pyx_v_mode, __pyx_v_nex, __pyx_v_ney, __pyx_v_nez, __pyx_v_k, __pyx_v_pm);
+1856:         _smode_pos(idx, off, L, mode, nex, ney, nez, k + 1, pr)
    __pyx_f_5pimms_15mega_crank_fast__smode_pos(__pyx_v_idx, __pyx_v_off, __pyx_v_L, __pyx_v_mode, __pyx_v_nex, __pyx_v_ney, __pyx_v_nez, (__pyx_v_k + 1), __pyx_v_pr);
+1857:         e = e + _triplet_angle_3D(pm[0], pm[1], pm[2], pl[0], pl[1], pl[2],
    __pyx_v_e = (__pyx_v_e + __pyx_f_5pimms_15mega_crank_fast__triplet_angle_3D((__pyx_v_pm[0]), (__pyx_v_pm[1]), (__pyx_v_pm[2]), (__pyx_v_pl[0]), (__pyx_v_pl[1]), (__pyx_v_pl[2]), (__pyx_v_pr[0]), (__pyx_v_pr[1]), (__pyx_v_pr[2]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_5 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) ))), __pyx_v_angle_lookup));
    __pyx_L3_continue:;
  }
+1858:                                   pr[0], pr[1], pr[2], idx[off + k, 2], angle_lookup)
    __pyx_t_5 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_4 = 2;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 1858, __pyx_L1_error)
    }
+1859:     return e
  __pyx_r = __pyx_v_e;
  goto __pyx_L0;
 1860: 
 1861: 
+1862: cdef inline void _apply_bead_move(NUMPY_INT_TYPE[:, :, :] grid, NUMPY_INT_TYPE[:, :, :] type_grid,
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx, int __pyx_v_bead_index, int __pyx_v_ox, int __pyx_v_oy, int __pyx_v_oz, int __pyx_v_nx, int __pyx_v_ny, int __pyx_v_nz, int __pyx_v_chainID) {
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._apply_bead_move", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 1863:                                   NUMPY_INT_TYPE_long[:, :] idx, int bead_index,
 1864:                                   int ox, int oy, int oz, int nx, int ny, int nz,
 1865:                                   int chainID) noexcept nogil:
+1866:     grid[ox, oy, oz] = 0
  __pyx_t_1 = __pyx_v_ox;
  __pyx_t_2 = __pyx_v_oy;
  __pyx_t_3 = __pyx_v_oz;
  __pyx_t_4 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_grid.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_grid.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_grid.shape[1])) __pyx_t_4 = 1;
  if (__pyx_t_3 < 0) {
    __pyx_t_3 += __pyx_v_grid.shape[2];
    if (unlikely(__pyx_t_3 < 0)) __pyx_t_4 = 2;
  } else if (unlikely(__pyx_t_3 >= __pyx_v_grid.shape[2])) __pyx_t_4 = 2;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1866, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_grid.strides[2]) )) = 0;
+1867:     grid[nx, ny, nz] = chainID
  __pyx_t_3 = __pyx_v_nx;
  __pyx_t_2 = __pyx_v_ny;
  __pyx_t_1 = __pyx_v_nz;
  __pyx_t_4 = -1;
  if (__pyx_t_3 < 0) {
    __pyx_t_3 += __pyx_v_grid.shape[0];
    if (unlikely(__pyx_t_3 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_3 >= __pyx_v_grid.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_grid.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_grid.shape[1])) __pyx_t_4 = 1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_grid.shape[2];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 2;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[2])) __pyx_t_4 = 2;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1867, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_grid.strides[2]) )) = __pyx_v_chainID;
+1868:     type_grid[nx, ny, nz] = type_grid[ox, oy, oz]
  __pyx_t_1 = __pyx_v_ox;
  __pyx_t_2 = __pyx_v_oy;
  __pyx_t_3 = __pyx_v_oz;
  __pyx_t_4 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_type_grid.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_type_grid.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_type_grid.shape[1])) __pyx_t_4 = 1;
  if (__pyx_t_3 < 0) {
    __pyx_t_3 += __pyx_v_type_grid.shape[2];
    if (unlikely(__pyx_t_3 < 0)) __pyx_t_4 = 2;
  } else if (unlikely(__pyx_t_3 >= __pyx_v_type_grid.shape[2])) __pyx_t_4 = 2;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1868, __pyx_L1_error)
  }
  __pyx_t_5 = __pyx_v_nx;
  __pyx_t_6 = __pyx_v_ny;
  __pyx_t_7 = __pyx_v_nz;
  __pyx_t_4 = -1;
  if (__pyx_t_5 < 0) {
    __pyx_t_5 += __pyx_v_type_grid.shape[0];
    if (unlikely(__pyx_t_5 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_5 >= __pyx_v_type_grid.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_6 < 0) {
    __pyx_t_6 += __pyx_v_type_grid.shape[1];
    if (unlikely(__pyx_t_6 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_6 >= __pyx_v_type_grid.shape[1])) __pyx_t_4 = 1;
  if (__pyx_t_7 < 0) {
    __pyx_t_7 += __pyx_v_type_grid.shape[2];
    if (unlikely(__pyx_t_7 < 0)) __pyx_t_4 = 2;
  } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[2])) __pyx_t_4 = 2;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1868, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_5 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_7 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_3 * __pyx_v_type_grid.strides[2]) )));
+1869:     type_grid[ox, oy, oz] = 0
  __pyx_t_3 = __pyx_v_ox;
  __pyx_t_2 = __pyx_v_oy;
  __pyx_t_1 = __pyx_v_oz;
  __pyx_t_4 = -1;
  if (__pyx_t_3 < 0) {
    __pyx_t_3 += __pyx_v_type_grid.shape[0];
    if (unlikely(__pyx_t_3 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_3 >= __pyx_v_type_grid.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_type_grid.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_type_grid.shape[1])) __pyx_t_4 = 1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_type_grid.shape[2];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 2;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[2])) __pyx_t_4 = 2;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1869, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_3 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[2]) )) = 0;
+1870:     idx[bead_index, 5] = nx
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 5;
  __pyx_t_4 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_idx.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_idx.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_4 = 1;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1870, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )) = __pyx_v_nx;
+1871:     idx[bead_index, 6] = ny
  __pyx_t_2 = __pyx_v_bead_index;
  __pyx_t_1 = 6;
  __pyx_t_4 = -1;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_idx.shape[0];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_idx.shape[1];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_4 = 1;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1871, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )) = __pyx_v_ny;
+1872:     idx[bead_index, 7] = nz
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 7;
  __pyx_t_4 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_idx.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_4 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_4 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_idx.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_4 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_4 = 1;
  if (unlikely(__pyx_t_4 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_4);
    __PYX_ERR(0, 1872, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )) = __pyx_v_nz;
 1873: 
 1874: 
+1875: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_13mega_slither(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_12mega_slither, "\n    3D slither (reptation) megamove. chain_selector lists chain indices to slither,\n    one per entry (build it so every chain appears SLITHER_SUBSTEPS times, shuffled).\n    Mutates grid / type_grid / idx_to_bead in place. Returns (energy, accepted).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_13mega_slither = {"mega_slither", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_13mega_slither, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_12mega_slither};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_13mega_slither(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  int __pyx_v_max_chain_len;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_slither (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,0};
  PyObject* values[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 1875, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1875, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_slither", 0) < (0)) __PYX_ERR(0, 1875, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 16; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_slither", 1, 16, 16, i); __PYX_ERR(0, 1875, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 16)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 1875, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 1875, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 1877, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 1878, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 1879, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 1880, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 1881, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 1882, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 1883, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 1884, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 1885, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 1886, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 1887, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 1888, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 1889, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1890, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1891, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 1892, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_slither", 1, 16, 16, __pyx_nargs); __PYX_ERR(0, 1875, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_12mega_slither(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_12mega_slither(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, int __pyx_v_max_chain_len) {
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  int __pyx_v_n_steps;
  int __pyx_v_accepted;
  int __pyx_v_i;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_homo;
  int __pyx_v_chainID;
  int __pyx_v_direction;
  int __pyx_v_k;
  int __pyx_v_ex;
  int __pyx_v_ey;
  int __pyx_v_ez;
  int __pyx_v_nx;
  int __pyx_v_ny;
  int __pyx_v_nz;
  int __pyx_v_vx;
  int __pyx_v_vy;
  int __pyx_v_vz;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_oz;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_tz;
  int __pyx_v_cx;
  int __pyx_v_cy;
  int __pyx_v_cz;
  long __pyx_v_de;
  int __pyx_v_newp[3];
  int *__pyx_v_bx;
  int *__pyx_v_by;
  int *__pyx_v_bz;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_XDECREF(__pyx_t_17);
  __Pyx_XDECREF(__pyx_t_18);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_13mega_slither, 0, __pyx_mstate_global->__pyx_n_u_mega_slither, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[12])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1875, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_slither, __pyx_t_4) < (0)) __PYX_ERR(0, 1875, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 1876: @cython.boundscheck(False)
 1877: def mega_slither(NUMPY_INT_TYPE[:, :, :] grid,
 1878:                  NUMPY_INT_TYPE[:, :, :] type_grid,
 1879:                  NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 1880:                  int[::1] chain_offset,
 1881:                  int[::1] chain_length,
 1882:                  int[::1] chain_homo,
 1883:                  int[::1] chain_selector,
 1884:                  NUMPY_INT_TYPE[:, :] interaction_table,
 1885:                  NUMPY_INT_TYPE[:, :] LR_interaction_table,
 1886:                  NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 1887:                  NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 1888:                  long energy,
 1889:                  float invtemp,
 1890:                  int passed_seed,
 1891:                  int hardwall,
 1892:                  int max_chain_len):
 1893:     """
 1894:     3D slither (reptation) megamove. chain_selector lists chain indices to slither,
 1895:     one per entry (build it so every chain appears SLITHER_SUBSTEPS times, shuffled).
 1896:     Mutates grid / type_grid / idx_to_bead in place. Returns (energy, accepted).
 1897:     """
+1898:     mc_seed(passed_seed)
  __pyx_f_5pimms_15mega_crank_fast_mc_seed(__pyx_v_passed_seed);
 1899: 
+1900:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+1901:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+1902:     cdef int ZDIM = grid.shape[2]
  __pyx_v_ZDIM = (__pyx_v_grid.shape[2]);
+1903:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
+1904:     cdef int accepted = 0
  __pyx_v_accepted = 0;
 1905: 
 1906:     cdef int i, c, off, L, homo, chainID, direction, k
 1907:     cdef int ex, ey, ez, nx, ny, nz, vx, vy, vz, ox, oy, oz, tx, ty, tz, cx, cy, cz
 1908:     cdef long de
 1909:     cdef int newp[3]
 1910: 
 1911:     # work buffers for the heteropolymer revert (old chain positions)
+1912:     cdef int* bx = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_bx = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+1913:     cdef int* by = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_by = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+1914:     cdef int* bz = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_bz = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+1915:     if bx == NULL or by == NULL or bz == NULL:
  __pyx_t_2 = (__pyx_v_bx == NULL);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_by == NULL);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_bz == NULL);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+1916:         if bx != NULL: free(bx)
    __pyx_t_1 = (__pyx_v_bx != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_bx);
    }
+1917:         if by != NULL: free(by)
    __pyx_t_1 = (__pyx_v_by != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_by);
    }
+1918:         if bz != NULL: free(bz)
    __pyx_t_1 = (__pyx_v_bz != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_bz);
    }
+1919:         raise MemoryError()
    PyErr_NoMemory(); __PYX_ERR(0, 1919, __pyx_L1_error)
 1920: 
+1921:     try:
  /*try:*/ {
+1922:         for i in range(n_steps):
    __pyx_t_3 = __pyx_v_n_steps;
    __pyx_t_4 = __pyx_t_3;
    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
      __pyx_v_i = __pyx_t_5;
+1923:             c = chain_selector[i]
      __pyx_t_6 = __pyx_v_i;
      __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_selector.data) + __pyx_t_6)) )));
+1924:             off = chain_offset[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_6)) )));
+1925:             L = chain_length[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_6)) )));
+1926:             homo = chain_homo[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_homo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_homo.data) + __pyx_t_6)) )));
+1927:             chainID = idx_to_bead[off, 4]
      __pyx_t_6 = __pyx_v_off;
      __pyx_t_7 = 4;
      __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 1928: 
 1929:             # ----- single-bead chain: local translation -----
+1930:             if L == 1:
      __pyx_t_1 = (__pyx_v_L == 1);
      if (__pyx_t_1) {
/* … */
      }
+1931:                 ox = idx_to_bead[off, 5]; oy = idx_to_bead[off, 6]; oz = idx_to_bead[off, 7]
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_6 = 5;
        __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_6 = __pyx_v_off;
        __pyx_t_7 = 6;
        __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_6 = 7;
        __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+1932:                 if single_bead_crank_c(ox, oy, oz, grid, XDIM, YDIM, ZDIM, newp) == 1:
        __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_c(__pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_newp) == 1);
        if (__pyx_t_1) {
/* … */
        }
+1933:                     de = get_energy_change_c(grid, type_grid, ox, oy, oz,
          __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, (__pyx_v_newp[0]), (__pyx_v_newp[1]), (__pyx_v_newp[2]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+1934:                                              newp[0], newp[1], newp[2], idx_to_bead[off, 1],
          __pyx_t_6 = __pyx_v_off;
          __pyx_t_7 = 1;
 1935:                                              interaction_table, LR_interaction_table,
 1936:                                              SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+1937:                     de = de + get_angle_energy_change_c(off, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c(__pyx_v_off, __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+1938:                     if accept_or_reject(invtemp, energy, energy + de) == 1:
          __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de)) == 1);
          if (__pyx_t_1) {
/* … */
          }
+1939:                         _apply_bead_move(grid, type_grid, idx_to_bead, off,
            __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, (__pyx_v_newp[0]), (__pyx_v_newp[1]), (__pyx_v_newp[2]), __pyx_v_chainID);
 1940:                                          ox, oy, oz, newp[0], newp[1], newp[2], chainID)
+1941:                         energy = energy + de
            __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+1942:                         accepted = accepted + 1
            __pyx_v_accepted = (__pyx_v_accepted + 1);
+1943:                 continue
        goto __pyx_L13_continue;
 1944: 
 1945:             # ----- reptation: pick a growing end and propose a new end site -----
+1946:             direction = randint(0, 1)                  # 0 = head-grow (last bead), 1 = tail-grow (first bead)
      __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_randint(0, 1);
+1947:             if direction == 0:
      __pyx_t_1 = (__pyx_v_direction == 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L18;
      }
+1948:                 ex = idx_to_bead[off + L - 1, 5]; ey = idx_to_bead[off + L - 1, 6]; ez = idx_to_bead[off + L - 1, 7]
        __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_6 = 5;
        __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_6 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_7 = 6;
        __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_6 = 7;
        __pyx_v_ez = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 1949:             else:
+1950:                 ex = idx_to_bead[off, 5]; ey = idx_to_bead[off, 6]; ez = idx_to_bead[off, 7]
      /*else*/ {
        __pyx_t_6 = __pyx_v_off;
        __pyx_t_7 = 5;
        __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_6 = 6;
        __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_6 = __pyx_v_off;
        __pyx_t_7 = 7;
        __pyx_v_ez = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      }
      __pyx_L18:;
 1951: 
+1952:             nx = pbc_correction(ex + randint(0, 2) - 1, XDIM)
      __pyx_v_nx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ex + __pyx_f_5pimms_15mega_crank_fast_randint(0, 2)) - 1), __pyx_v_XDIM);
+1953:             ny = pbc_correction(ey + randint(0, 2) - 1, YDIM)
      __pyx_v_ny = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ey + __pyx_f_5pimms_15mega_crank_fast_randint(0, 2)) - 1), __pyx_v_YDIM);
+1954:             nz = pbc_correction(ez + randint(0, 2) - 1, ZDIM)
      __pyx_v_nz = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ez + __pyx_f_5pimms_15mega_crank_fast_randint(0, 2)) - 1), __pyx_v_ZDIM);
 1955: 
+1956:             if grid[nx, ny, nz] > 0:                   # occupied (incl. self when offset is 0) -> reject
      __pyx_t_7 = __pyx_v_nx;
      __pyx_t_6 = __pyx_v_ny;
      __pyx_t_8 = __pyx_v_nz;
      __pyx_t_1 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_7 * __pyx_v_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_grid.strides[1]) ) + __pyx_t_8 * __pyx_v_grid.strides[2]) ))) > 0);
      if (__pyx_t_1) {
/* … */
      }
+1957:                 continue
        goto __pyx_L13_continue;
+1958:             if hardwall == 1:
      __pyx_t_1 = (__pyx_v_hardwall == 1);
      if (__pyx_t_1) {
/* … */
      }
+1959:                 if straddle_pair(ex, ey, ez, nx, ny, nz) == 1:
        __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_ex, __pyx_v_ey, __pyx_v_ez, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz) == 1);
        if (__pyx_t_1) {
/* … */
        }
+1960:                     continue
          goto __pyx_L13_continue;
 1961: 
+1962:             if homo == 1:
      __pyx_t_1 = (__pyx_v_homo == 1);
      if (__pyx_t_1) {
/* … */
      }
 1963:                 # vacated end (opposite the growing end)
+1964:                 if direction == 0:
        __pyx_t_1 = (__pyx_v_direction == 0);
        if (__pyx_t_1) {
/* … */
          goto __pyx_L23;
        }
+1965:                     vx = idx_to_bead[off, 5]; vy = idx_to_bead[off, 6]; vz = idx_to_bead[off, 7]
          __pyx_t_8 = __pyx_v_off;
          __pyx_t_6 = 5;
          __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_6 = __pyx_v_off;
          __pyx_t_8 = 6;
          __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_8 = __pyx_v_off;
          __pyx_t_6 = 7;
          __pyx_v_vz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 1966:                 else:
+1967:                     vx = idx_to_bead[off + L - 1, 5]; vy = idx_to_bead[off + L - 1, 6]; vz = idx_to_bead[off + L - 1, 7]
        /*else*/ {
          __pyx_t_6 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_8 = 5;
          __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_8 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_6 = 6;
          __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_6 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_8 = 7;
          __pyx_v_vz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
        }
        __pyx_L23:;
 1968: 
+1969:                 de = get_energy_change_c(grid, type_grid, vx, vy, vz, nx, ny, nz,
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_vx, __pyx_v_vy, __pyx_v_vz, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+1970:                                          idx_to_bead[off, 1], interaction_table, LR_interaction_table,
        __pyx_t_8 = __pyx_v_off;
        __pyx_t_6 = 1;
 1971:                                          SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
 1972:                 # angle change: new-config chain angle minus old-config chain angle
+1973:                 de = de + (_chain_angle_mode(idx_to_bead, off, L, 1 if direction == 0 else 2, nx, ny, nz, angle_lookup)
        __pyx_t_1 = (__pyx_v_direction == 0);
        if (__pyx_t_1) {
          __pyx_t_9 = 1;
        } else {
          __pyx_t_9 = 2;
        }
/* … */
        __pyx_v_de = (__pyx_v_de + (__pyx_f_5pimms_15mega_crank_fast__chain_angle_mode(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, __pyx_t_9, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz, __pyx_v_angle_lookup) - __pyx_f_5pimms_15mega_crank_fast__chain_angle_mode(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, 0, 0, 0, 0, __pyx_v_angle_lookup)));
 1974:                            - _chain_angle_mode(idx_to_bead, off, L, 0, 0, 0, 0, angle_lookup))
 1975: 
+1976:                 if accept_or_reject(invtemp, energy, energy + de) == 1:
        __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de)) == 1);
        if (__pyx_t_1) {
/* … */
        }
 1977:                     # apply: only the two end sites change in grid/type_grid; all positions shift
+1978:                     grid[vx, vy, vz] = 0; type_grid[vx, vy, vz] = 0
          __pyx_t_6 = __pyx_v_vx;
          __pyx_t_8 = __pyx_v_vy;
          __pyx_t_7 = __pyx_v_vz;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_8 * __pyx_v_grid.strides[1]) ) + __pyx_t_7 * __pyx_v_grid.strides[2]) )) = 0;
          __pyx_t_7 = __pyx_v_vx;
          __pyx_t_8 = __pyx_v_vy;
          __pyx_t_6 = __pyx_v_vz;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_8 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[2]) )) = 0;
+1979:                     grid[nx, ny, nz] = chainID; type_grid[nx, ny, nz] = idx_to_bead[off, 2]
          __pyx_t_6 = __pyx_v_nx;
          __pyx_t_8 = __pyx_v_ny;
          __pyx_t_7 = __pyx_v_nz;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_8 * __pyx_v_grid.strides[1]) ) + __pyx_t_7 * __pyx_v_grid.strides[2]) )) = __pyx_v_chainID;
          __pyx_t_7 = __pyx_v_off;
          __pyx_t_8 = 2;
          __pyx_t_6 = __pyx_v_nx;
          __pyx_t_10 = __pyx_v_ny;
          __pyx_t_11 = __pyx_v_nz;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_6 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+1980:                     if direction == 0:                  # head-grow: bead k -> bead (k+1)'s old site
          __pyx_t_1 = (__pyx_v_direction == 0);
          if (__pyx_t_1) {
/* … */
            goto __pyx_L25;
          }
+1981:                         for k in range(0, L - 1):
            __pyx_t_12 = (__pyx_v_L - 1);
            __pyx_t_13 = __pyx_t_12;
            for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_13; __pyx_t_9+=1) {
              __pyx_v_k = __pyx_t_9;
+1982:                             idx_to_bead[off + k, 5] = idx_to_bead[off + k + 1, 5]
              __pyx_t_8 = ((__pyx_v_off + __pyx_v_k) + 1);
              __pyx_t_7 = 5;
              __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_10 = 5;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+1983:                             idx_to_bead[off + k, 6] = idx_to_bead[off + k + 1, 6]
              __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) + 1);
              __pyx_t_8 = 6;
              __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_11 = 6;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+1984:                             idx_to_bead[off + k, 7] = idx_to_bead[off + k + 1, 7]
              __pyx_t_8 = ((__pyx_v_off + __pyx_v_k) + 1);
              __pyx_t_7 = 7;
              __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_10 = 7;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
            }
+1985:                         idx_to_bead[off + L - 1, 5] = nx; idx_to_bead[off + L - 1, 6] = ny; idx_to_bead[off + L - 1, 7] = nz
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
            __pyx_t_8 = 5;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
            __pyx_t_8 = ((__pyx_v_off + __pyx_v_L) - 1);
            __pyx_t_7 = 6;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
            __pyx_t_8 = 7;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nz;
 1986:                     else:                               # tail-grow: bead k -> bead (k-1)'s old site
+1987:                         for k in range(L - 1, 0, -1):
          /*else*/ {
            for (__pyx_t_9 = (__pyx_v_L - 1); __pyx_t_9 > 0; __pyx_t_9-=1) {
              __pyx_v_k = __pyx_t_9;
+1988:                             idx_to_bead[off + k, 5] = idx_to_bead[off + k - 1, 5]
              __pyx_t_8 = ((__pyx_v_off + __pyx_v_k) - 1);
              __pyx_t_7 = 5;
              __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_11 = 5;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+1989:                             idx_to_bead[off + k, 6] = idx_to_bead[off + k - 1, 6]
              __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) - 1);
              __pyx_t_8 = 6;
              __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_10 = 6;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+1990:                             idx_to_bead[off + k, 7] = idx_to_bead[off + k - 1, 7]
              __pyx_t_8 = ((__pyx_v_off + __pyx_v_k) - 1);
              __pyx_t_7 = 7;
              __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_11 = 7;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
            }
+1991:                         idx_to_bead[off, 5] = nx; idx_to_bead[off, 6] = ny; idx_to_bead[off, 7] = nz
            __pyx_t_7 = __pyx_v_off;
            __pyx_t_8 = 5;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
            __pyx_t_8 = __pyx_v_off;
            __pyx_t_7 = 6;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
            __pyx_t_7 = __pyx_v_off;
            __pyx_t_8 = 7;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nz;
          }
          __pyx_L25:;
+1992:                     energy = energy + de
          __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+1993:                     accepted = accepted + 1
          __pyx_v_accepted = (__pyx_v_accepted + 1);
 1994:                 # reject: get_energy_change_c self-reverted type_grid; idx untouched
+1995:                 continue
        goto __pyx_L13_continue;
 1996: 
 1997:             # ----- heteropolymer: decompose into L single-bead moves -----
+1998:             for k in range(L):
      __pyx_t_9 = __pyx_v_L;
      __pyx_t_14 = __pyx_t_9;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_k = __pyx_t_15;
+1999:                 bx[k] = idx_to_bead[off + k, 5]; by[k] = idx_to_bead[off + k, 6]; bz[k] = idx_to_bead[off + k, 7]
        __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        (__pyx_v_bx[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_8 = 6;
        (__pyx_v_by[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 7;
        (__pyx_v_bz[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      }
 2000: 
+2001:             de = 0
      __pyx_v_de = 0;
+2002:             if direction == 0:                          # head-grow: move bead L-1 -> new, then L-2 -> P[L-1], ...
      __pyx_t_1 = (__pyx_v_direction == 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L32;
      }
+2003:                 for k in range(L - 1, -1, -1):
        for (__pyx_t_9 = (__pyx_v_L - 1); __pyx_t_9 > -1; __pyx_t_9-=1) {
          __pyx_v_k = __pyx_t_9;
+2004:                     ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]; oz = idx_to_bead[off + k, 7]
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_8 = 5;
          __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 6;
          __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_8 = 7;
          __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+2005:                     if k == L - 1:
          __pyx_t_1 = (__pyx_v_k == (__pyx_v_L - 1));
          if (__pyx_t_1) {
/* … */
            goto __pyx_L35;
          }
+2006:                         tx = nx; ty = ny; tz = nz
            __pyx_v_tx = __pyx_v_nx;
            __pyx_v_ty = __pyx_v_ny;
            __pyx_v_tz = __pyx_v_nz;
 2007:                     else:
+2008:                         tx = bx[k + 1]; ty = by[k + 1]; tz = bz[k + 1]
          /*else*/ {
            __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k + 1)]);
            __pyx_v_ty = (__pyx_v_by[(__pyx_v_k + 1)]);
            __pyx_v_tz = (__pyx_v_bz[(__pyx_v_k + 1)]);
          }
          __pyx_L35:;
+2009:                     de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+2010:                                                   idx_to_bead[off + k, 1], interaction_table,
          __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 1;
 2011:                                                   LR_interaction_table, SLR_interaction_table,
 2012:                                                   XDIM, YDIM, ZDIM, hardwall)
+2013:                     newp[0] = tx; newp[1] = ty; newp[2] = tz
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
          (__pyx_v_newp[2]) = __pyx_v_tz;
+2014:                     de = de + get_angle_energy_change_c(off + k, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2015:                     _apply_bead_move(grid, type_grid, idx_to_bead, off + k, ox, oy, oz, tx, ty, tz, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
        }
 2016:             else:                                       # tail-grow: move bead 0 -> new, then 1 -> P[0], ...
+2017:                 for k in range(0, L):
      /*else*/ {
        __pyx_t_9 = __pyx_v_L;
        __pyx_t_14 = __pyx_t_9;
        for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_k = __pyx_t_15;
+2018:                     ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]; oz = idx_to_bead[off + k, 7]
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_8 = 5;
          __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 6;
          __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_8 = 7;
          __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+2019:                     if k == 0:
          __pyx_t_1 = (__pyx_v_k == 0);
          if (__pyx_t_1) {
/* … */
            goto __pyx_L38;
          }
+2020:                         tx = nx; ty = ny; tz = nz
            __pyx_v_tx = __pyx_v_nx;
            __pyx_v_ty = __pyx_v_ny;
            __pyx_v_tz = __pyx_v_nz;
 2021:                     else:
+2022:                         tx = bx[k - 1]; ty = by[k - 1]; tz = bz[k - 1]
          /*else*/ {
            __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k - 1)]);
            __pyx_v_ty = (__pyx_v_by[(__pyx_v_k - 1)]);
            __pyx_v_tz = (__pyx_v_bz[(__pyx_v_k - 1)]);
          }
          __pyx_L38:;
+2023:                     de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+2024:                                                   idx_to_bead[off + k, 1], interaction_table,
          __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 1;
 2025:                                                   LR_interaction_table, SLR_interaction_table,
 2026:                                                   XDIM, YDIM, ZDIM, hardwall)
+2027:                     newp[0] = tx; newp[1] = ty; newp[2] = tz
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
          (__pyx_v_newp[2]) = __pyx_v_tz;
+2028:                     de = de + get_angle_energy_change_c(off + k, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2029:                     _apply_bead_move(grid, type_grid, idx_to_bead, off + k, ox, oy, oz, tx, ty, tz, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
        }
      }
      __pyx_L32:;
 2030: 
+2031:             if accept_or_reject(invtemp, energy, energy + de) == 1:
      __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de)) == 1);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L39;
      }
+2032:                 energy = energy + de
        __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+2033:                 accepted = accepted + 1
        __pyx_v_accepted = (__pyx_v_accepted + 1);
 2034:             else:
 2035:                 # revert: clear current (new) chain sites, then restore the buffered old chain
+2036:                 for k in range(L):
      /*else*/ {
        __pyx_t_9 = __pyx_v_L;
        __pyx_t_14 = __pyx_t_9;
        for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_k = __pyx_t_15;
+2037:                     cx = idx_to_bead[off + k, 5]; cy = idx_to_bead[off + k, 6]; cz = idx_to_bead[off + k, 7]
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_8 = 5;
          __pyx_v_cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 6;
          __pyx_v_cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_8 = 7;
          __pyx_v_cz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+2038:                     grid[cx, cy, cz] = 0; type_grid[cx, cy, cz] = 0
          __pyx_t_8 = __pyx_v_cx;
          __pyx_t_7 = __pyx_v_cy;
          __pyx_t_11 = __pyx_v_cz;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_8 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_grid.strides[2]) )) = 0;
          __pyx_t_11 = __pyx_v_cx;
          __pyx_t_7 = __pyx_v_cy;
          __pyx_t_8 = __pyx_v_cz;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_11 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_8 * __pyx_v_type_grid.strides[2]) )) = 0;
        }
+2039:                 for k in range(L):
        __pyx_t_9 = __pyx_v_L;
        __pyx_t_14 = __pyx_t_9;
        for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
          __pyx_v_k = __pyx_t_15;
+2040:                     grid[bx[k], by[k], bz[k]] = chainID
          __pyx_t_8 = (__pyx_v_bx[__pyx_v_k]);
          __pyx_t_7 = (__pyx_v_by[__pyx_v_k]);
          __pyx_t_11 = (__pyx_v_bz[__pyx_v_k]);
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_8 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_grid.strides[2]) )) = __pyx_v_chainID;
+2041:                     type_grid[bx[k], by[k], bz[k]] = idx_to_bead[off + k, 2]
          __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 2;
          __pyx_t_8 = (__pyx_v_bx[__pyx_v_k]);
          __pyx_t_10 = (__pyx_v_by[__pyx_v_k]);
          __pyx_t_6 = (__pyx_v_bz[__pyx_v_k]);
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_8 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2042:                     idx_to_bead[off + k, 5] = bx[k]; idx_to_bead[off + k, 6] = by[k]; idx_to_bead[off + k, 7] = bz[k]
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_11 = 5;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_bx[__pyx_v_k]);
          __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 6;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_by[__pyx_v_k]);
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_11 = 7;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_bz[__pyx_v_k]);
        }
      }
      __pyx_L39:;
      __pyx_L13_continue:;
    }
  }
 2043:     finally:
+2044:         free(bx); free(by); free(bz)
  /*finally:*/ {
    /*normal exit:*/{
      free(__pyx_v_bx);
      free(__pyx_v_by);
      free(__pyx_v_bz);
      goto __pyx_L12;
    }
    __pyx_L12:;
  }
 2045: 
+2046:     return (energy, accepted)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_16 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 2046, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_16);
  __pyx_t_17 = __Pyx_PyLong_From_int(__pyx_v_accepted); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 2046, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __pyx_t_18 = PyTuple_New(2); if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 2046, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_18);
  __Pyx_GIVEREF(__pyx_t_16);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_16) != (0)) __PYX_ERR(0, 2046, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_17);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_18, 1, __pyx_t_17) != (0)) __PYX_ERR(0, 2046, __pyx_L1_error);
  __pyx_t_16 = 0;
  __pyx_t_17 = 0;
  __pyx_r = __pyx_t_18;
  __pyx_t_18 = 0;
  goto __pyx_L0;
 2047: 
 2048: 
 2049: # =====================================================================
 2050: #   SLITHER (reptation) megamove kernel - 2D variant
 2051: #
 2052: #   Identical logic to mega_slither (3D) but on a 2D lattice, reusing the
 2053: #   bit-exact 2D primitives (get_energy_change_2D_c, get_angle_energy_change_2D_c,
 2054: #   single_bead_crank_2D_c). See mega_slither for the full design notes.
 2055: # =====================================================================
 2056: 
+2057: cdef inline long _triplet_angle_2D(int mx, int my,
static CYTHON_INLINE long __pyx_f_5pimms_15mega_crank_fast__triplet_angle_2D(int __pyx_v_mx, int __pyx_v_my, int __pyx_v_lx, int __pyx_v_ly, int __pyx_v_rx, int __pyx_v_ry, int __pyx_v_ic, __Pyx_memviewslice __pyx_v_angle_lookup) {
  int __pyx_v_a0;
  int __pyx_v_a1;
  int __pyx_v_b0;
  int __pyx_v_b1;
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._triplet_angle_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 2058:                                    int lx, int ly,
 2059:                                    int rx, int ry,
 2060:                                    int ic,
 2061:                                    NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup) noexcept nogil:
+2062:     cdef int a0 = fix_angle_pbc_issues(mx - lx)
  __pyx_v_a0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_mx - __pyx_v_lx));
+2063:     cdef int a1 = fix_angle_pbc_issues(my - ly)
  __pyx_v_a1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_my - __pyx_v_ly));
+2064:     cdef int b0 = fix_angle_pbc_issues(mx - rx)
  __pyx_v_b0 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_mx - __pyx_v_rx));
+2065:     cdef int b1 = fix_angle_pbc_issues(my - ry)
  __pyx_v_b1 = __pyx_f_5pimms_15mega_crank_fast_fix_angle_pbc_issues((__pyx_v_my - __pyx_v_ry));
+2066:     return angle_lookup[ic, a0 + 1, a1 + 1, b0 + 1, b1 + 1]
  __pyx_t_1 = __pyx_v_ic;
  __pyx_t_2 = (__pyx_v_a0 + 1);
  __pyx_t_3 = (__pyx_v_a1 + 1);
  __pyx_t_4 = (__pyx_v_b0 + 1);
  __pyx_t_5 = (__pyx_v_b1 + 1);
  __pyx_t_6 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_angle_lookup.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_angle_lookup.shape[0])) __pyx_t_6 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_angle_lookup.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_6 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_angle_lookup.shape[1])) __pyx_t_6 = 1;
  if (__pyx_t_3 < 0) {
    __pyx_t_3 += __pyx_v_angle_lookup.shape[2];
    if (unlikely(__pyx_t_3 < 0)) __pyx_t_6 = 2;
  } else if (unlikely(__pyx_t_3 >= __pyx_v_angle_lookup.shape[2])) __pyx_t_6 = 2;
  if (__pyx_t_4 < 0) {
    __pyx_t_4 += __pyx_v_angle_lookup.shape[3];
    if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 3;
  } else if (unlikely(__pyx_t_4 >= __pyx_v_angle_lookup.shape[3])) __pyx_t_6 = 3;
  if (__pyx_t_5 < 0) {
    __pyx_t_5 += __pyx_v_angle_lookup.shape[4];
    if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 4;
  } else if (unlikely(__pyx_t_5 >= __pyx_v_angle_lookup.shape[4])) __pyx_t_6 = 4;
  if (unlikely(__pyx_t_6 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
    __PYX_ERR(0, 2066, __pyx_L1_error)
  }
  __pyx_r = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=4 */ (( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angle_lookup.data + __pyx_t_1 * __pyx_v_angle_lookup.strides[0]) ) + __pyx_t_2 * __pyx_v_angle_lookup.strides[1]) ) + __pyx_t_3 * __pyx_v_angle_lookup.strides[2]) ) + __pyx_t_4 * __pyx_v_angle_lookup.strides[3]) ) + __pyx_t_5 * __pyx_v_angle_lookup.strides[4]) )));
  goto __pyx_L0;
 2067: 
 2068: 
+2069: cdef inline void _smode_pos_2D(NUMPY_INT_TYPE_long[:, :] idx, int off, int L, int mode,
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast__smode_pos_2D(__Pyx_memviewslice __pyx_v_idx, int __pyx_v_off, int __pyx_v_L, int __pyx_v_mode, int __pyx_v_nex, int __pyx_v_ney, int __pyx_v_k, int *__pyx_v_o) {
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._smode_pos_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 2070:                                int nex, int ney, int k, int* o) noexcept nogil:
+2071:     if mode == 0:
  switch (__pyx_v_mode) {
    case 0:
/* … */
    break;
    case 1:
+2072:         o[0] = idx[off + k, 5]; o[1] = idx[off + k, 6]
    __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_2 = 5;
    __pyx_t_3 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
    if (__pyx_t_2 < 0) {
      __pyx_t_2 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
    } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
    if (unlikely(__pyx_t_3 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
      __PYX_ERR(0, 2072, __pyx_L1_error)
    }
    (__pyx_v_o[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
    __pyx_t_2 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_1 = 6;
    __pyx_t_3 = -1;
    if (__pyx_t_2 < 0) {
      __pyx_t_2 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
    } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
    if (unlikely(__pyx_t_3 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
      __PYX_ERR(0, 2072, __pyx_L1_error)
    }
    (__pyx_v_o[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
+2073:     elif mode == 1:                 # head-grow
    break;
    default:
+2074:         if k < L - 1:
    __pyx_t_4 = (__pyx_v_k < (__pyx_v_L - 1));
    if (__pyx_t_4) {
/* … */
      goto __pyx_L3;
    }
+2075:             o[0] = idx[off + k + 1, 5]; o[1] = idx[off + k + 1, 6]
      __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) + 1);
      __pyx_t_2 = 5;
      __pyx_t_3 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 2075, __pyx_L1_error)
      }
      (__pyx_v_o[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
      __pyx_t_2 = ((__pyx_v_off + __pyx_v_k) + 1);
      __pyx_t_1 = 6;
      __pyx_t_3 = -1;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 2075, __pyx_L1_error)
      }
      (__pyx_v_o[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
 2076:         else:
+2077:             o[0] = nex; o[1] = ney
    /*else*/ {
      (__pyx_v_o[0]) = __pyx_v_nex;
      (__pyx_v_o[1]) = __pyx_v_ney;
    }
    __pyx_L3:;
 2078:     else:                           # tail-grow
+2079:         if k > 0:
    __pyx_t_4 = (__pyx_v_k > 0);
    if (__pyx_t_4) {
/* … */
      goto __pyx_L4;
    }
+2080:             o[0] = idx[off + k - 1, 5]; o[1] = idx[off + k - 1, 6]
      __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) - 1);
      __pyx_t_2 = 5;
      __pyx_t_3 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 2080, __pyx_L1_error)
      }
      (__pyx_v_o[0]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )));
      __pyx_t_2 = ((__pyx_v_off + __pyx_v_k) - 1);
      __pyx_t_1 = 6;
      __pyx_t_3 = -1;
      if (__pyx_t_2 < 0) {
        __pyx_t_2 += __pyx_v_idx.shape[0];
        if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
      } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
      if (unlikely(__pyx_t_3 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
        __PYX_ERR(0, 2080, __pyx_L1_error)
      }
      (__pyx_v_o[1]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )));
 2081:         else:
+2082:             o[0] = nex; o[1] = ney
    /*else*/ {
      (__pyx_v_o[0]) = __pyx_v_nex;
      (__pyx_v_o[1]) = __pyx_v_ney;
    }
    __pyx_L4:;
    break;
  }
 2083: 
 2084: 
+2085: cdef long _chain_angle_mode_2D(NUMPY_INT_TYPE_long[:, :] idx, int off, int L, int mode,
static long __pyx_f_5pimms_15mega_crank_fast__chain_angle_mode_2D(__Pyx_memviewslice __pyx_v_idx, int __pyx_v_off, int __pyx_v_L, int __pyx_v_mode, int __pyx_v_nex, int __pyx_v_ney, __Pyx_memviewslice __pyx_v_angle_lookup) {
  long __pyx_v_e;
  int __pyx_v_k;
  int __pyx_v_pl[2];
  int __pyx_v_pm[2];
  int __pyx_v_pr[2];
  long __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._chain_angle_mode_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 2086:                                int nex, int ney,
 2087:                                NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup) noexcept nogil:
+2088:     cdef long e = 0
  __pyx_v_e = 0;
 2089:     cdef int k
 2090:     cdef int pl[2]
 2091:     cdef int pm[2]
 2092:     cdef int pr[2]
+2093:     for k in range(1, L - 1):
  __pyx_t_1 = (__pyx_v_L - 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
+2094:         if idx[off + k, 3] == 1:
    __pyx_t_4 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_5 = 3;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2094, __pyx_L1_error)
    }
    __pyx_t_7 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_5 * __pyx_v_idx.strides[1]) ))) == 1);
    if (__pyx_t_7) {
/* … */
    }
+2095:             continue
      goto __pyx_L3_continue;
+2096:         _smode_pos_2D(idx, off, L, mode, nex, ney, k - 1, pl)
    __pyx_f_5pimms_15mega_crank_fast__smode_pos_2D(__pyx_v_idx, __pyx_v_off, __pyx_v_L, __pyx_v_mode, __pyx_v_nex, __pyx_v_ney, (__pyx_v_k - 1), __pyx_v_pl);
+2097:         _smode_pos_2D(idx, off, L, mode, nex, ney, k, pm)
    __pyx_f_5pimms_15mega_crank_fast__smode_pos_2D(__pyx_v_idx, __pyx_v_off, __pyx_v_L, __pyx_v_mode, __pyx_v_nex, __pyx_v_ney, __pyx_v_k, __pyx_v_pm);
+2098:         _smode_pos_2D(idx, off, L, mode, nex, ney, k + 1, pr)
    __pyx_f_5pimms_15mega_crank_fast__smode_pos_2D(__pyx_v_idx, __pyx_v_off, __pyx_v_L, __pyx_v_mode, __pyx_v_nex, __pyx_v_ney, (__pyx_v_k + 1), __pyx_v_pr);
+2099:         e = e + _triplet_angle_2D(pm[0], pm[1], pl[0], pl[1], pr[0], pr[1], idx[off + k, 2], angle_lookup)
    __pyx_t_5 = (__pyx_v_off + __pyx_v_k);
    __pyx_t_4 = 2;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2099, __pyx_L1_error)
    }
    __pyx_v_e = (__pyx_v_e + __pyx_f_5pimms_15mega_crank_fast__triplet_angle_2D((__pyx_v_pm[0]), (__pyx_v_pm[1]), (__pyx_v_pl[0]), (__pyx_v_pl[1]), (__pyx_v_pr[0]), (__pyx_v_pr[1]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_5 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) ))), __pyx_v_angle_lookup));
    __pyx_L3_continue:;
  }
+2100:     return e
  __pyx_r = __pyx_v_e;
  goto __pyx_L0;
 2101: 
 2102: 
+2103: cdef inline void _apply_bead_move_2D(NUMPY_INT_TYPE[:, :] grid, NUMPY_INT_TYPE[:, :] type_grid,
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx, int __pyx_v_bead_index, int __pyx_v_ox, int __pyx_v_oy, int __pyx_v_nx, int __pyx_v_ny, int __pyx_v_chainID) {
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._apply_bead_move_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 2104:                                      NUMPY_INT_TYPE_long[:, :] idx, int bead_index,
 2105:                                      int ox, int oy, int nx, int ny, int chainID) noexcept nogil:
+2106:     grid[ox, oy] = 0
  __pyx_t_1 = __pyx_v_ox;
  __pyx_t_2 = __pyx_v_oy;
  __pyx_t_3 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_grid.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_grid.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_grid.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2106, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_grid.strides[1]) )) = 0;
+2107:     grid[nx, ny] = chainID
  __pyx_t_2 = __pyx_v_nx;
  __pyx_t_1 = __pyx_v_ny;
  __pyx_t_3 = -1;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_grid.shape[0];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_grid.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_grid.shape[1];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2107, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_2 * __pyx_v_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_grid.strides[1]) )) = __pyx_v_chainID;
+2108:     type_grid[nx, ny] = type_grid[ox, oy]
  __pyx_t_1 = __pyx_v_ox;
  __pyx_t_2 = __pyx_v_oy;
  __pyx_t_3 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_type_grid.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_type_grid.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_type_grid.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2108, __pyx_L1_error)
  }
  __pyx_t_4 = __pyx_v_nx;
  __pyx_t_5 = __pyx_v_ny;
  __pyx_t_3 = -1;
  if (__pyx_t_4 < 0) {
    __pyx_t_4 += __pyx_v_type_grid.shape[0];
    if (unlikely(__pyx_t_4 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_4 >= __pyx_v_type_grid.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_5 < 0) {
    __pyx_t_5 += __pyx_v_type_grid.shape[1];
    if (unlikely(__pyx_t_5 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_5 >= __pyx_v_type_grid.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2108, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_4 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_2 * __pyx_v_type_grid.strides[1]) )));
+2109:     type_grid[ox, oy] = 0
  __pyx_t_2 = __pyx_v_ox;
  __pyx_t_1 = __pyx_v_oy;
  __pyx_t_3 = -1;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_type_grid.shape[0];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_type_grid.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_type_grid.shape[1];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2109, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_2 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )) = 0;
+2110:     idx[bead_index, 5] = nx
  __pyx_t_1 = __pyx_v_bead_index;
  __pyx_t_2 = 5;
  __pyx_t_3 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_idx.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_idx.shape[1];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2110, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_1 * __pyx_v_idx.strides[0]) ) + __pyx_t_2 * __pyx_v_idx.strides[1]) )) = __pyx_v_nx;
+2111:     idx[bead_index, 6] = ny
  __pyx_t_2 = __pyx_v_bead_index;
  __pyx_t_1 = 6;
  __pyx_t_3 = -1;
  if (__pyx_t_2 < 0) {
    __pyx_t_2 += __pyx_v_idx.shape[0];
    if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
  } else if (unlikely(__pyx_t_2 >= __pyx_v_idx.shape[0])) __pyx_t_3 = 0;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_idx.shape[1];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 1;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_idx.shape[1])) __pyx_t_3 = 1;
  if (unlikely(__pyx_t_3 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_3);
    __PYX_ERR(0, 2111, __pyx_L1_error)
  }
  *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_2 * __pyx_v_idx.strides[0]) ) + __pyx_t_1 * __pyx_v_idx.strides[1]) )) = __pyx_v_ny;
 2112: 
 2113: 
+2114: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_15mega_slither_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_14mega_slither_2D, "2D slither (reptation) megamove. See mega_slither for semantics.");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_15mega_slither_2D = {"mega_slither_2D", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_15mega_slither_2D, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_14mega_slither_2D};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_15mega_slither_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  int __pyx_v_max_chain_len;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_slither_2D (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,0};
  PyObject* values[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 2114, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2114, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_slither_2D", 0) < (0)) __PYX_ERR(0, 2114, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 16; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_slither_2D", 1, 16, 16, i); __PYX_ERR(0, 2114, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 16)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 2114, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 2114, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 2116, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 2117, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 2118, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 2119, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 2120, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 2121, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 2122, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 2123, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 2124, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 2125, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 2126, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 2127, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 2128, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2129, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2130, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2131, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_slither_2D", 1, 16, 16, __pyx_nargs); __PYX_ERR(0, 2114, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_14mega_slither_2D(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_14mega_slither_2D(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, int __pyx_v_max_chain_len) {
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_n_steps;
  int __pyx_v_accepted;
  int __pyx_v_i;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_homo;
  int __pyx_v_chainID;
  int __pyx_v_direction;
  int __pyx_v_k;
  int __pyx_v_ex;
  int __pyx_v_ey;
  int __pyx_v_nx;
  int __pyx_v_ny;
  int __pyx_v_vx;
  int __pyx_v_vy;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_cx;
  int __pyx_v_cy;
  long __pyx_v_de;
  int __pyx_v_newp[2];
  int *__pyx_v_bx;
  int *__pyx_v_by;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_XDECREF(__pyx_t_17);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_15mega_slither_2D, 0, __pyx_mstate_global->__pyx_n_u_mega_slither_2D, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[13])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2114, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_slither_2D, __pyx_t_4) < (0)) __PYX_ERR(0, 2114, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 2115: @cython.boundscheck(False)
 2116: def mega_slither_2D(NUMPY_INT_TYPE[:, :] grid,
 2117:                     NUMPY_INT_TYPE[:, :] type_grid,
 2118:                     NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 2119:                     int[::1] chain_offset,
 2120:                     int[::1] chain_length,
 2121:                     int[::1] chain_homo,
 2122:                     int[::1] chain_selector,
 2123:                     NUMPY_INT_TYPE[:, :] interaction_table,
 2124:                     NUMPY_INT_TYPE[:, :] LR_interaction_table,
 2125:                     NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 2126:                     NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 2127:                     long energy,
 2128:                     float invtemp,
 2129:                     int passed_seed,
 2130:                     int hardwall,
 2131:                     int max_chain_len):
 2132:     """2D slither (reptation) megamove. See mega_slither for semantics."""
+2133:     mc_seed(passed_seed)
  __pyx_f_5pimms_15mega_crank_fast_mc_seed(__pyx_v_passed_seed);
 2134: 
+2135:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+2136:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+2137:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
+2138:     cdef int accepted = 0
  __pyx_v_accepted = 0;
 2139: 
 2140:     cdef int i, c, off, L, homo, chainID, direction, k
 2141:     cdef int ex, ey, nx, ny, vx, vy, ox, oy, tx, ty, cx, cy
 2142:     cdef long de
 2143:     cdef int newp[2]
 2144: 
+2145:     cdef int* bx = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_bx = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+2146:     cdef int* by = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_by = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+2147:     if bx == NULL or by == NULL:
  __pyx_t_2 = (__pyx_v_bx == NULL);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_by == NULL);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+2148:         if bx != NULL: free(bx)
    __pyx_t_1 = (__pyx_v_bx != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_bx);
    }
+2149:         if by != NULL: free(by)
    __pyx_t_1 = (__pyx_v_by != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_by);
    }
+2150:         raise MemoryError()
    PyErr_NoMemory(); __PYX_ERR(0, 2150, __pyx_L1_error)
 2151: 
+2152:     try:
  /*try:*/ {
+2153:         for i in range(n_steps):
    __pyx_t_3 = __pyx_v_n_steps;
    __pyx_t_4 = __pyx_t_3;
    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
      __pyx_v_i = __pyx_t_5;
+2154:             c = chain_selector[i]
      __pyx_t_6 = __pyx_v_i;
      __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_selector.data) + __pyx_t_6)) )));
+2155:             off = chain_offset[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_6)) )));
+2156:             L = chain_length[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_6)) )));
+2157:             homo = chain_homo[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_homo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_homo.data) + __pyx_t_6)) )));
+2158:             chainID = idx_to_bead[off, 4]
      __pyx_t_6 = __pyx_v_off;
      __pyx_t_7 = 4;
      __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 2159: 
 2160:             # ----- single-bead chain: local translation -----
+2161:             if L == 1:
      __pyx_t_1 = (__pyx_v_L == 1);
      if (__pyx_t_1) {
/* … */
      }
+2162:                 ox = idx_to_bead[off, 5]; oy = idx_to_bead[off, 6]
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_6 = 5;
        __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_6 = __pyx_v_off;
        __pyx_t_7 = 6;
        __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2163:                 if single_bead_crank_2D_c(ox, oy, grid, XDIM, YDIM, newp) == 1:
        __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_2D_c(__pyx_v_ox, __pyx_v_oy, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_newp) == 1);
        if (__pyx_t_1) {
/* … */
        }
+2164:                     de = get_energy_change_2D_c(grid, type_grid, ox, oy, newp[0], newp[1],
          __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, (__pyx_v_newp[0]), (__pyx_v_newp[1]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+2165:                                                 idx_to_bead[off, 1], interaction_table,
          __pyx_t_7 = __pyx_v_off;
          __pyx_t_6 = 1;
 2166:                                                 LR_interaction_table, SLR_interaction_table,
 2167:                                                 XDIM, YDIM, hardwall)
+2168:                     de = de + get_angle_energy_change_2D_c(off, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c(__pyx_v_off, __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2169:                     if accept_or_reject(invtemp, energy, energy + de) == 1:
          __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de)) == 1);
          if (__pyx_t_1) {
/* … */
          }
+2170:                         _apply_bead_move_2D(grid, type_grid, idx_to_bead, off,
            __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_ox, __pyx_v_oy, (__pyx_v_newp[0]), (__pyx_v_newp[1]), __pyx_v_chainID);
 2171:                                             ox, oy, newp[0], newp[1], chainID)
+2172:                         energy = energy + de
            __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+2173:                         accepted = accepted + 1
            __pyx_v_accepted = (__pyx_v_accepted + 1);
+2174:                 continue
        goto __pyx_L11_continue;
 2175: 
 2176:             # ----- reptation -----
+2177:             direction = randint(0, 1)
      __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_randint(0, 1);
+2178:             if direction == 0:
      __pyx_t_1 = (__pyx_v_direction == 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L16;
      }
+2179:                 ex = idx_to_bead[off + L - 1, 5]; ey = idx_to_bead[off + L - 1, 6]
        __pyx_t_6 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_7 = 5;
        __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_6 = 6;
        __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
 2180:             else:
+2181:                 ex = idx_to_bead[off, 5]; ey = idx_to_bead[off, 6]
      /*else*/ {
        __pyx_t_6 = __pyx_v_off;
        __pyx_t_7 = 5;
        __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_6 = 6;
        __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
      }
      __pyx_L16:;
 2182: 
+2183:             nx = pbc_correction(ex + randint(0, 2) - 1, XDIM)
      __pyx_v_nx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ex + __pyx_f_5pimms_15mega_crank_fast_randint(0, 2)) - 1), __pyx_v_XDIM);
+2184:             ny = pbc_correction(ey + randint(0, 2) - 1, YDIM)
      __pyx_v_ny = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ey + __pyx_f_5pimms_15mega_crank_fast_randint(0, 2)) - 1), __pyx_v_YDIM);
 2185: 
+2186:             if grid[nx, ny] > 0:
      __pyx_t_6 = __pyx_v_nx;
      __pyx_t_7 = __pyx_v_ny;
      __pyx_t_1 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) ))) > 0);
      if (__pyx_t_1) {
/* … */
      }
+2187:                 continue
        goto __pyx_L11_continue;
+2188:             if hardwall == 1:
      __pyx_t_1 = (__pyx_v_hardwall == 1);
      if (__pyx_t_1) {
/* … */
      }
+2189:                 if straddle_pair(ex, ey, 0, nx, ny, 0) == 1:
        __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_ex, __pyx_v_ey, 0, __pyx_v_nx, __pyx_v_ny, 0) == 1);
        if (__pyx_t_1) {
/* … */
        }
+2190:                     continue
          goto __pyx_L11_continue;
 2191: 
+2192:             if homo == 1:
      __pyx_t_1 = (__pyx_v_homo == 1);
      if (__pyx_t_1) {
/* … */
      }
+2193:                 if direction == 0:
        __pyx_t_1 = (__pyx_v_direction == 0);
        if (__pyx_t_1) {
/* … */
          goto __pyx_L21;
        }
+2194:                     vx = idx_to_bead[off, 5]; vy = idx_to_bead[off, 6]
          __pyx_t_7 = __pyx_v_off;
          __pyx_t_6 = 5;
          __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_6 = __pyx_v_off;
          __pyx_t_7 = 6;
          __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 2195:                 else:
+2196:                     vx = idx_to_bead[off + L - 1, 5]; vy = idx_to_bead[off + L - 1, 6]
        /*else*/ {
          __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_6 = 5;
          __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_6 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_7 = 6;
          __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        }
        __pyx_L21:;
 2197: 
+2198:                 de = get_energy_change_2D_c(grid, type_grid, vx, vy, nx, ny,
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_vx, __pyx_v_vy, __pyx_v_nx, __pyx_v_ny, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+2199:                                             idx_to_bead[off, 1], interaction_table,
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_6 = 1;
 2200:                                             LR_interaction_table, SLR_interaction_table,
 2201:                                             XDIM, YDIM, hardwall)
+2202:                 de = de + (_chain_angle_mode_2D(idx_to_bead, off, L, 1 if direction == 0 else 2, nx, ny, angle_lookup)
        __pyx_t_1 = (__pyx_v_direction == 0);
        if (__pyx_t_1) {
          __pyx_t_8 = 1;
        } else {
          __pyx_t_8 = 2;
        }
/* … */
        __pyx_v_de = (__pyx_v_de + (__pyx_f_5pimms_15mega_crank_fast__chain_angle_mode_2D(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, __pyx_t_8, __pyx_v_nx, __pyx_v_ny, __pyx_v_angle_lookup) - __pyx_f_5pimms_15mega_crank_fast__chain_angle_mode_2D(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, 0, 0, 0, __pyx_v_angle_lookup)));
 2203:                            - _chain_angle_mode_2D(idx_to_bead, off, L, 0, 0, 0, angle_lookup))
 2204: 
+2205:                 if accept_or_reject(invtemp, energy, energy + de) == 1:
        __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de)) == 1);
        if (__pyx_t_1) {
/* … */
        }
+2206:                     grid[vx, vy] = 0; type_grid[vx, vy] = 0
          __pyx_t_6 = __pyx_v_vx;
          __pyx_t_7 = __pyx_v_vy;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = 0;
          __pyx_t_7 = __pyx_v_vx;
          __pyx_t_6 = __pyx_v_vy;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) )) = 0;
+2207:                     grid[nx, ny] = chainID; type_grid[nx, ny] = idx_to_bead[off, 2]
          __pyx_t_6 = __pyx_v_nx;
          __pyx_t_7 = __pyx_v_ny;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = __pyx_v_chainID;
          __pyx_t_7 = __pyx_v_off;
          __pyx_t_6 = 2;
          __pyx_t_9 = __pyx_v_nx;
          __pyx_t_10 = __pyx_v_ny;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_9 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+2208:                     if direction == 0:
          __pyx_t_1 = (__pyx_v_direction == 0);
          if (__pyx_t_1) {
/* … */
            goto __pyx_L23;
          }
+2209:                         for k in range(0, L - 1):
            __pyx_t_11 = (__pyx_v_L - 1);
            __pyx_t_12 = __pyx_t_11;
            for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_12; __pyx_t_8+=1) {
              __pyx_v_k = __pyx_t_8;
+2210:                             idx_to_bead[off + k, 5] = idx_to_bead[off + k + 1, 5]
              __pyx_t_6 = ((__pyx_v_off + __pyx_v_k) + 1);
              __pyx_t_7 = 5;
              __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_9 = 5;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2211:                             idx_to_bead[off + k, 6] = idx_to_bead[off + k + 1, 6]
              __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) + 1);
              __pyx_t_6 = 6;
              __pyx_t_9 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_10 = 6;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
            }
+2212:                         idx_to_bead[off + L - 1, 5] = nx; idx_to_bead[off + L - 1, 6] = ny
            __pyx_t_6 = ((__pyx_v_off + __pyx_v_L) - 1);
            __pyx_t_7 = 5;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
            __pyx_t_6 = 6;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
 2213:                     else:
+2214:                         for k in range(L - 1, 0, -1):
          /*else*/ {
            for (__pyx_t_8 = (__pyx_v_L - 1); __pyx_t_8 > 0; __pyx_t_8-=1) {
              __pyx_v_k = __pyx_t_8;
+2215:                             idx_to_bead[off + k, 5] = idx_to_bead[off + k - 1, 5]
              __pyx_t_6 = ((__pyx_v_off + __pyx_v_k) - 1);
              __pyx_t_7 = 5;
              __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_9 = 5;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2216:                             idx_to_bead[off + k, 6] = idx_to_bead[off + k - 1, 6]
              __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) - 1);
              __pyx_t_6 = 6;
              __pyx_t_9 = (__pyx_v_off + __pyx_v_k);
              __pyx_t_10 = 6;
              *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
            }
+2217:                         idx_to_bead[off, 5] = nx; idx_to_bead[off, 6] = ny
            __pyx_t_6 = __pyx_v_off;
            __pyx_t_7 = 5;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
            __pyx_t_7 = __pyx_v_off;
            __pyx_t_6 = 6;
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
          }
          __pyx_L23:;
+2218:                     energy = energy + de
          __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+2219:                     accepted = accepted + 1
          __pyx_v_accepted = (__pyx_v_accepted + 1);
+2220:                 continue
        goto __pyx_L11_continue;
 2221: 
 2222:             # ----- heteropolymer: decompose into L single-bead moves -----
+2223:             for k in range(L):
      __pyx_t_8 = __pyx_v_L;
      __pyx_t_13 = __pyx_t_8;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_k = __pyx_t_14;
+2224:                 bx[k] = idx_to_bead[off + k, 5]; by[k] = idx_to_bead[off + k, 6]
        __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        (__pyx_v_bx[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_6 = 6;
        (__pyx_v_by[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
      }
 2225: 
+2226:             de = 0
      __pyx_v_de = 0;
+2227:             if direction == 0:
      __pyx_t_1 = (__pyx_v_direction == 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L30;
      }
+2228:                 for k in range(L - 1, -1, -1):
        for (__pyx_t_8 = (__pyx_v_L - 1); __pyx_t_8 > -1; __pyx_t_8-=1) {
          __pyx_v_k = __pyx_t_8;
+2229:                     ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 5;
          __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 6;
          __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+2230:                     if k == L - 1:
          __pyx_t_1 = (__pyx_v_k == (__pyx_v_L - 1));
          if (__pyx_t_1) {
/* … */
            goto __pyx_L33;
          }
+2231:                         tx = nx; ty = ny
            __pyx_v_tx = __pyx_v_nx;
            __pyx_v_ty = __pyx_v_ny;
 2232:                     else:
+2233:                         tx = bx[k + 1]; ty = by[k + 1]
          /*else*/ {
            __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k + 1)]);
            __pyx_v_ty = (__pyx_v_by[(__pyx_v_k + 1)]);
          }
          __pyx_L33:;
+2234:                     de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+2235:                                                      idx_to_bead[off + k, 1], interaction_table,
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 1;
 2236:                                                      LR_interaction_table, SLR_interaction_table,
 2237:                                                      XDIM, YDIM, hardwall)
+2238:                     newp[0] = tx; newp[1] = ty
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
+2239:                     de = de + get_angle_energy_change_2D_c(off + k, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2240:                     _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + k, ox, oy, tx, ty, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
        }
 2241:             else:
+2242:                 for k in range(0, L):
      /*else*/ {
        __pyx_t_8 = __pyx_v_L;
        __pyx_t_13 = __pyx_t_8;
        for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
          __pyx_v_k = __pyx_t_14;
+2243:                     ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 5;
          __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 6;
          __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2244:                     if k == 0:
          __pyx_t_1 = (__pyx_v_k == 0);
          if (__pyx_t_1) {
/* … */
            goto __pyx_L36;
          }
+2245:                         tx = nx; ty = ny
            __pyx_v_tx = __pyx_v_nx;
            __pyx_v_ty = __pyx_v_ny;
 2246:                     else:
+2247:                         tx = bx[k - 1]; ty = by[k - 1]
          /*else*/ {
            __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k - 1)]);
            __pyx_v_ty = (__pyx_v_by[(__pyx_v_k - 1)]);
          }
          __pyx_L36:;
+2248:                     de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+2249:                                                      idx_to_bead[off + k, 1], interaction_table,
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 1;
 2250:                                                      LR_interaction_table, SLR_interaction_table,
 2251:                                                      XDIM, YDIM, hardwall)
+2252:                     newp[0] = tx; newp[1] = ty
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
+2253:                     de = de + get_angle_energy_change_2D_c(off + k, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2254:                     _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + k, ox, oy, tx, ty, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
        }
      }
      __pyx_L30:;
 2255: 
+2256:             if accept_or_reject(invtemp, energy, energy + de) == 1:
      __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de)) == 1);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L37;
      }
+2257:                 energy = energy + de
        __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+2258:                 accepted = accepted + 1
        __pyx_v_accepted = (__pyx_v_accepted + 1);
 2259:             else:
+2260:                 for k in range(L):
      /*else*/ {
        __pyx_t_8 = __pyx_v_L;
        __pyx_t_13 = __pyx_t_8;
        for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
          __pyx_v_k = __pyx_t_14;
+2261:                     cx = idx_to_bead[off + k, 5]; cy = idx_to_bead[off + k, 6]
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 5;
          __pyx_v_cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 6;
          __pyx_v_cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+2262:                     grid[cx, cy] = 0; type_grid[cx, cy] = 0
          __pyx_t_6 = __pyx_v_cx;
          __pyx_t_7 = __pyx_v_cy;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = 0;
          __pyx_t_7 = __pyx_v_cx;
          __pyx_t_6 = __pyx_v_cy;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_6 * __pyx_v_type_grid.strides[1]) )) = 0;
        }
+2263:                 for k in range(L):
        __pyx_t_8 = __pyx_v_L;
        __pyx_t_13 = __pyx_t_8;
        for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
          __pyx_v_k = __pyx_t_14;
+2264:                     grid[bx[k], by[k]] = chainID
          __pyx_t_6 = (__pyx_v_bx[__pyx_v_k]);
          __pyx_t_7 = (__pyx_v_by[__pyx_v_k]);
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_6 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = __pyx_v_chainID;
+2265:                     type_grid[bx[k], by[k]] = idx_to_bead[off + k, 2]
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 2;
          __pyx_t_10 = (__pyx_v_bx[__pyx_v_k]);
          __pyx_t_9 = (__pyx_v_by[__pyx_v_k]);
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+2266:                     idx_to_bead[off + k, 5] = bx[k]; idx_to_bead[off + k, 6] = by[k]
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 5;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_bx[__pyx_v_k]);
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 6;
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_by[__pyx_v_k]);
        }
      }
      __pyx_L37:;
      __pyx_L11_continue:;
    }
  }
 2267:     finally:
+2268:         free(bx); free(by)
  /*finally:*/ {
    /*normal exit:*/{
      free(__pyx_v_bx);
      free(__pyx_v_by);
      goto __pyx_L10;
    }
    __pyx_L10:;
  }
 2269: 
+2270:     return (energy, accepted)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_15 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 2270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_15);
  __pyx_t_16 = __Pyx_PyLong_From_int(__pyx_v_accepted); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 2270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_16);
  __pyx_t_17 = PyTuple_New(2); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 2270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_GIVEREF(__pyx_t_15);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_15) != (0)) __PYX_ERR(0, 2270, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_16);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_17, 1, __pyx_t_16) != (0)) __PYX_ERR(0, 2270, __pyx_L1_error);
  __pyx_t_15 = 0;
  __pyx_t_16 = 0;
  __pyx_r = __pyx_t_17;
  __pyx_t_17 = 0;
  goto __pyx_L0;
 2271: 
 2272: 
 2273: # =====================================================================
 2274: #   PARALLEL slither (reptation) megamove - chain-level frozen-halo
 2275: #
 2276: #   Slither/pull are WHOLE-CHAIN moves, so the per-bead frozen-halo of the
 2277: #   crankshaft kernel does not apply directly. Instead the decomposition is at the
 2278: #   chain level: a chain is movable in a block only if ALL of its beads lie in
 2279: #   that block's interior (>= W = R_int + 2 inside every split face). A chain that
 2280: #   straddles a block boundary is frozen for that sweep. The only NEW occupied site
 2281: #   a slither creates is the growing end; every other site is relabelled in place
 2282: #   (homo) or revisited (hetero), so requiring the new end to stay in the interior
 2283: #   keeps the whole chain invariantly inside the block -> block footprints are
 2284: #   disjoint and the blocks run concurrently with no locks. Rejecting a move whose
 2285: #   new end would enter the halo keeps the movable region closed (the same
 2286: #   detailed-balance argument as the crankshaft kernel: a halo chain is never
 2287: #   selected, so the reverse move could not occur). The decomposition is
 2288: #   independent of the thread count, so the result is identical for any number of
 2289: #   threads. Targets the same Boltzmann distribution as the serial slither.
 2290: # =====================================================================
 2291: 
+2292: cdef inline int _in_interior_3d(int x, int y, int z,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast__in_interior_3d(int __pyx_v_x, int __pyx_v_y, int __pyx_v_z, int __pyx_v_blo_x_b, int __pyx_v_blo_y_b, int __pyx_v_blo_z_b, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_Lz, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_nbz, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_shift_z, int __pyx_v_W, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM) {
  int __pyx_v_s;
  int __pyx_v_w;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._in_interior_3d", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 2293:                                 int blo_x_b, int blo_y_b, int blo_z_b,
 2294:                                 int Lx, int Ly, int Lz, int nbx, int nby, int nbz,
 2295:                                 int shift_x, int shift_y, int shift_z, int W,
 2296:                                 int XDIM, int YDIM, int ZDIM) noexcept nogil:
 2297:     cdef int s, w
+2298:     if nbx > 1:
  __pyx_t_1 = (__pyx_v_nbx > 1);
  if (__pyx_t_1) {
/* … */
  }
+2299:         s = (x - shift_x + XDIM) % XDIM
    __pyx_t_2 = ((__pyx_v_x - __pyx_v_shift_x) + __pyx_v_XDIM);
    if (unlikely(__pyx_v_XDIM == 0)) {
      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
      PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
      __Pyx_PyGILState_Release(__pyx_gilstate_save);
      __PYX_ERR(0, 2299, __pyx_L1_error)
    }
    __pyx_v_s = __Pyx_mod_int(__pyx_t_2, __pyx_v_XDIM, 0);
+2300:         w = s - blo_x_b
    __pyx_v_w = (__pyx_v_s - __pyx_v_blo_x_b);
+2301:         if w < W or w >= Lx - W:
    __pyx_t_3 = (__pyx_v_w < __pyx_v_W);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L5_bool_binop_done;
    }
    __pyx_t_3 = (__pyx_v_w >= (__pyx_v_Lx - __pyx_v_W));
    __pyx_t_1 = __pyx_t_3;
    __pyx_L5_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
+2302:             return 0
      __pyx_r = 0;
      goto __pyx_L0;
+2303:     if nby > 1:
  __pyx_t_1 = (__pyx_v_nby > 1);
  if (__pyx_t_1) {
/* … */
  }
+2304:         s = (y - shift_y + YDIM) % YDIM
    __pyx_t_2 = ((__pyx_v_y - __pyx_v_shift_y) + __pyx_v_YDIM);
    if (unlikely(__pyx_v_YDIM == 0)) {
      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
      PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
      __Pyx_PyGILState_Release(__pyx_gilstate_save);
      __PYX_ERR(0, 2304, __pyx_L1_error)
    }
    __pyx_v_s = __Pyx_mod_int(__pyx_t_2, __pyx_v_YDIM, 0);
+2305:         w = s - blo_y_b
    __pyx_v_w = (__pyx_v_s - __pyx_v_blo_y_b);
+2306:         if w < W or w >= Ly - W:
    __pyx_t_3 = (__pyx_v_w < __pyx_v_W);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_3 = (__pyx_v_w >= (__pyx_v_Ly - __pyx_v_W));
    __pyx_t_1 = __pyx_t_3;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
+2307:             return 0
      __pyx_r = 0;
      goto __pyx_L0;
+2308:     if nbz > 1:
  __pyx_t_1 = (__pyx_v_nbz > 1);
  if (__pyx_t_1) {
/* … */
  }
+2309:         s = (z - shift_z + ZDIM) % ZDIM
    __pyx_t_2 = ((__pyx_v_z - __pyx_v_shift_z) + __pyx_v_ZDIM);
    if (unlikely(__pyx_v_ZDIM == 0)) {
      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
      PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
      __Pyx_PyGILState_Release(__pyx_gilstate_save);
      __PYX_ERR(0, 2309, __pyx_L1_error)
    }
    __pyx_v_s = __Pyx_mod_int(__pyx_t_2, __pyx_v_ZDIM, 0);
+2310:         w = s - blo_z_b
    __pyx_v_w = (__pyx_v_s - __pyx_v_blo_z_b);
+2311:         if w < W or w >= Lz - W:
    __pyx_t_3 = (__pyx_v_w < __pyx_v_W);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L13_bool_binop_done;
    }
    __pyx_t_3 = (__pyx_v_w >= (__pyx_v_Lz - __pyx_v_W));
    __pyx_t_1 = __pyx_t_3;
    __pyx_L13_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
+2312:             return 0
      __pyx_r = 0;
      goto __pyx_L0;
+2313:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 2314: 
 2315: 
+2316: cdef void run_block_slither(int b,
static void __pyx_f_5pimms_15mega_crank_fast_run_block_slither(int __pyx_v_b, __Pyx_memviewslice __pyx_v_chain_ids, __Pyx_memviewslice __pyx_v_starts, __Pyx_memviewslice __pyx_v_attempts, __Pyx_memviewslice __pyx_v_seeds, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_blo_x, __Pyx_memviewslice __pyx_v_blo_y, __Pyx_memviewslice __pyx_v_blo_z, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_Lz, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_nbz, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_shift_z, int __pyx_v_W, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, float __pyx_v_invtemp, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int __pyx_v_hardwall, __Pyx_memviewslice __pyx_v_out_delta, __Pyx_memviewslice __pyx_v_out_accepted) {
  int __pyx_v_lo;
  int __pyx_v_hi;
  int __pyx_v_n_block;
  unsigned PY_LONG_LONG __pyx_v_rng;
  long __pyx_v_dsum;
  int __pyx_v_acc;
  CYTHON_UNUSED int __pyx_v_step;
  int __pyx_v_pick;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_homo;
  int __pyx_v_chainID;
  int __pyx_v_direction;
  int __pyx_v_k;
  int __pyx_v_ex;
  int __pyx_v_ey;
  int __pyx_v_ez;
  int __pyx_v_nx;
  int __pyx_v_ny;
  int __pyx_v_nz;
  int __pyx_v_vx;
  int __pyx_v_vy;
  int __pyx_v_vz;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_oz;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_tz;
  int __pyx_v_cx;
  int __pyx_v_cy;
  int __pyx_v_cz;
  long __pyx_v_de;
  int __pyx_v_newp[3];
  int __pyx_v_bx[512];
  int __pyx_v_by[512];
  int __pyx_v_bz[512];
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.run_block_slither", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 2317:                             int[::1] chain_ids, int[::1] starts, int[::1] attempts,
 2318:                             unsigned long long[::1] seeds,
 2319:                             int[::1] chain_offset, int[::1] chain_length, int[::1] chain_homo,
 2320:                             int[::1] blo_x, int[::1] blo_y, int[::1] blo_z,
 2321:                             int Lx, int Ly, int Lz, int nbx, int nby, int nbz,
 2322:                             int shift_x, int shift_y, int shift_z, int W,
 2323:                             NUMPY_INT_TYPE[:, :, :] grid, NUMPY_INT_TYPE[:, :, :] type_grid,
 2324:                             NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 2325:                             NUMPY_INT_TYPE[:, :] interaction_table,
 2326:                             NUMPY_INT_TYPE[:, :] LR_interaction_table,
 2327:                             NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 2328:                             NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 2329:                             float invtemp, int XDIM, int YDIM, int ZDIM, int hardwall,
 2330:                             long[::1] out_delta, int[::1] out_accepted) noexcept nogil:
 2331: 
+2332:     cdef int lo = starts[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2332, __pyx_L1_error)
  }
  __pyx_v_lo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+2333:     cdef int hi = starts[b + 1]
  __pyx_t_1 = (__pyx_v_b + 1);
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2333, __pyx_L1_error)
  }
  __pyx_v_hi = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+2334:     cdef int n_block = hi - lo
  __pyx_v_n_block = (__pyx_v_hi - __pyx_v_lo);
+2335:     out_delta[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2335, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = 0;
+2336:     out_accepted[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2336, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = 0;
+2337:     if n_block <= 0:
  __pyx_t_3 = (__pyx_v_n_block <= 0);
  if (__pyx_t_3) {
/* … */
  }
+2338:         return
    goto __pyx_L0;
 2339: 
+2340:     cdef unsigned long long rng = seeds[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_seeds.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_seeds.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2340, __pyx_L1_error)
  }
  __pyx_v_rng = (*((unsigned PY_LONG_LONG *) ( /* dim=0 */ ((char *) (((unsigned PY_LONG_LONG *) __pyx_v_seeds.data) + __pyx_t_1)) )));
+2341:     cdef long dsum = 0
  __pyx_v_dsum = 0;
+2342:     cdef int acc = 0
  __pyx_v_acc = 0;
 2343:     cdef int step, pick, c, off, L, homo, chainID, direction, k
 2344:     cdef int ex, ey, ez, nx, ny, nz, vx, vy, vz, ox, oy, oz, tx, ty, tz, cx, cy, cz
 2345:     cdef long de
 2346:     cdef int newp[3]
 2347:     cdef int bx[512]
 2348:     cdef int by[512]
 2349:     cdef int bz[512]
 2350: 
+2351:     for step in range(attempts[b]):
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_attempts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_attempts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2351, __pyx_L1_error)
  }
  __pyx_t_2 = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_attempts.data) + __pyx_t_1)) )));
  __pyx_t_4 = __pyx_t_2;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_step = __pyx_t_5;
+2352:         pick = lo + <int>(rng_uniform(&rng) * n_block)
    __pyx_v_pick = (__pyx_v_lo + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform((&__pyx_v_rng)) * __pyx_v_n_block)));
+2353:         if pick >= hi:
    __pyx_t_3 = (__pyx_v_pick >= __pyx_v_hi);
    if (__pyx_t_3) {
/* … */
    }
+2354:             pick = hi - 1
      __pyx_v_pick = (__pyx_v_hi - 1);
+2355:         c = chain_ids[pick]
    __pyx_t_1 = __pyx_v_pick;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_ids.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_ids.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2355, __pyx_L1_error)
    }
    __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_ids.data) + __pyx_t_1)) )));
+2356:         off = chain_offset[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_offset.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_offset.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2356, __pyx_L1_error)
    }
    __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_1)) )));
+2357:         L = chain_length[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_length.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_length.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2357, __pyx_L1_error)
    }
    __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_1)) )));
+2358:         homo = chain_homo[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_homo.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_homo.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2358, __pyx_L1_error)
    }
    __pyx_v_homo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_homo.data) + __pyx_t_1)) )));
+2359:         chainID = idx_to_bead[off, 4]
    __pyx_t_1 = __pyx_v_off;
    __pyx_t_7 = 4;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2359, __pyx_L1_error)
    }
    __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 2360: 
 2361:         # ----- single-bead chain: local translation -----
+2362:         if L == 1:
    __pyx_t_3 = (__pyx_v_L == 1);
    if (__pyx_t_3) {
/* … */
    }
+2363:             ox = idx_to_bead[off, 5]; oy = idx_to_bead[off, 6]; oz = idx_to_bead[off, 7]
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_1 = 5;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2363, __pyx_L1_error)
      }
      __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_1 = __pyx_v_off;
      __pyx_t_7 = 6;
      __pyx_t_6 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2363, __pyx_L1_error)
      }
      __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_1 = 7;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2363, __pyx_L1_error)
      }
      __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2364:             if single_bead_crank_cp(ox, oy, oz, grid, XDIM, YDIM, ZDIM, &rng, newp) == 1:
      __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp(__pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, (&__pyx_v_rng), __pyx_v_newp) == 1);
      if (__pyx_t_3) {
/* … */
      }
+2365:                 if _in_interior_3d(newp[0], newp[1], newp[2], blo_x[b], blo_y[b], blo_z[b],
        __pyx_t_1 = __pyx_v_b;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_blo_x.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_x.shape[0])) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2365, __pyx_L1_error)
        }
        __pyx_t_7 = __pyx_v_b;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_blo_y.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_blo_y.shape[0])) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2365, __pyx_L1_error)
        }
        __pyx_t_8 = __pyx_v_b;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_blo_z.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_blo_z.shape[0])) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2365, __pyx_L1_error)
        }
/* … */
        if (__pyx_t_3) {
/* … */
        }
 2366:                                    Lx, Ly, Lz, nbx, nby, nbz, shift_x, shift_y, shift_z, W,
+2367:                                    XDIM, YDIM, ZDIM) == 0:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast__in_interior_3d((__pyx_v_newp[0]), (__pyx_v_newp[1]), (__pyx_v_newp[2]), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) ))), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_7)) ))), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_z.data) + __pyx_t_8)) ))), __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM) == 0);
+2368:                     continue
          goto __pyx_L4_continue;
+2369:                 de = get_energy_change_c(grid, type_grid, ox, oy, oz, newp[0], newp[1], newp[2],
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, (__pyx_v_newp[0]), (__pyx_v_newp[1]), (__pyx_v_newp[2]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+2370:                                          idx_to_bead[off, 1], interaction_table, LR_interaction_table,
        __pyx_t_8 = __pyx_v_off;
        __pyx_t_7 = 1;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2370, __pyx_L1_error)
        }
 2371:                                          SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+2372:                 de = de + get_angle_energy_change_c(off, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c(__pyx_v_off, __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2373:                 if accept_p(invtemp, de, &rng) == 1:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, __pyx_v_de, (&__pyx_v_rng)) == 1);
        if (__pyx_t_3) {
/* … */
        }
+2374:                     _apply_bead_move(grid, type_grid, idx_to_bead, off, ox, oy, oz,
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, (__pyx_v_newp[0]), (__pyx_v_newp[1]), (__pyx_v_newp[2]), __pyx_v_chainID);
 2375:                                      newp[0], newp[1], newp[2], chainID)
+2376:                     dsum = dsum + de
          __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+2377:                     acc = acc + 1
          __pyx_v_acc = (__pyx_v_acc + 1);
+2378:             continue
      goto __pyx_L4_continue;
 2379: 
 2380:         # cap the heteropolymer revert buffer (long hetero chains stay frozen)
+2381:         if homo == 0 and L > 512:
    __pyx_t_9 = (__pyx_v_homo == 0);
    if (__pyx_t_9) {
    } else {
      __pyx_t_3 = __pyx_t_9;
      goto __pyx_L12_bool_binop_done;
    }
    __pyx_t_9 = (__pyx_v_L > 0x200);
    __pyx_t_3 = __pyx_t_9;
    __pyx_L12_bool_binop_done:;
    if (__pyx_t_3) {
/* … */
    }
+2382:             continue
      goto __pyx_L4_continue;
 2383: 
 2384:         # ----- reptation: pick a growing end and propose a new end site -----
+2385:         direction = rng_randint(&rng, 0, 1)
    __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 1);
+2386:         if direction == 0:
    __pyx_t_3 = (__pyx_v_direction == 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L14;
    }
+2387:             ex = idx_to_bead[off + L - 1, 5]; ey = idx_to_bead[off + L - 1, 6]; ez = idx_to_bead[off + L - 1, 7]
      __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
      __pyx_t_8 = 5;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2387, __pyx_L1_error)
      }
      __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_8 = ((__pyx_v_off + __pyx_v_L) - 1);
      __pyx_t_7 = 6;
      __pyx_t_6 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2387, __pyx_L1_error)
      }
      __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
      __pyx_t_8 = 7;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2387, __pyx_L1_error)
      }
      __pyx_v_ez = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
 2388:         else:
+2389:             ex = idx_to_bead[off, 5]; ey = idx_to_bead[off, 6]; ez = idx_to_bead[off, 7]
    /*else*/ {
      __pyx_t_8 = __pyx_v_off;
      __pyx_t_7 = 5;
      __pyx_t_6 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2389, __pyx_L1_error)
      }
      __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_8 = 6;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2389, __pyx_L1_error)
      }
      __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_8 = __pyx_v_off;
      __pyx_t_7 = 7;
      __pyx_t_6 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2389, __pyx_L1_error)
      }
      __pyx_v_ez = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
    }
    __pyx_L14:;
 2390: 
+2391:         nx = pbc_correction(ex + rng_randint(&rng, 0, 2) - 1, XDIM)
    __pyx_v_nx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ex + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 2)) - 1), __pyx_v_XDIM);
+2392:         ny = pbc_correction(ey + rng_randint(&rng, 0, 2) - 1, YDIM)
    __pyx_v_ny = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ey + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 2)) - 1), __pyx_v_YDIM);
+2393:         nz = pbc_correction(ez + rng_randint(&rng, 0, 2) - 1, ZDIM)
    __pyx_v_nz = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ez + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 2)) - 1), __pyx_v_ZDIM);
 2394: 
+2395:         if grid[nx, ny, nz] > 0:
    __pyx_t_7 = __pyx_v_nx;
    __pyx_t_8 = __pyx_v_ny;
    __pyx_t_1 = __pyx_v_nz;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_grid.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_v_grid.shape[1];
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_grid.shape[2];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 2;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[2])) __pyx_t_6 = 2;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2395, __pyx_L1_error)
    }
    __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_7 * __pyx_v_grid.strides[0]) ) + __pyx_t_8 * __pyx_v_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_grid.strides[2]) ))) > 0);
    if (__pyx_t_3) {
/* … */
    }
+2396:             continue
      goto __pyx_L4_continue;
+2397:         if hardwall == 1:
    __pyx_t_3 = (__pyx_v_hardwall == 1);
    if (__pyx_t_3) {
/* … */
    }
+2398:             if straddle_pair(ex, ey, ez, nx, ny, nz) == 1:
      __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_ex, __pyx_v_ey, __pyx_v_ez, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz) == 1);
      if (__pyx_t_3) {
/* … */
      }
+2399:                 continue
        goto __pyx_L4_continue;
 2400: 
 2401:         # the only new occupied site is the growing end - keep it in the interior
+2402:         if _in_interior_3d(nx, ny, nz, blo_x[b], blo_y[b], blo_z[b],
    __pyx_t_1 = __pyx_v_b;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_blo_x.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_x.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2402, __pyx_L1_error)
    }
    __pyx_t_8 = __pyx_v_b;
    __pyx_t_6 = -1;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_v_blo_y.shape[0];
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_blo_y.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2402, __pyx_L1_error)
    }
    __pyx_t_7 = __pyx_v_b;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_blo_z.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_blo_z.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2402, __pyx_L1_error)
    }
/* … */
    if (__pyx_t_3) {
/* … */
    }
 2403:                            Lx, Ly, Lz, nbx, nby, nbz, shift_x, shift_y, shift_z, W,
+2404:                            XDIM, YDIM, ZDIM) == 0:
    __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast__in_interior_3d(__pyx_v_nx, __pyx_v_ny, __pyx_v_nz, (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) ))), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_8)) ))), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_z.data) + __pyx_t_7)) ))), __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM) == 0);
+2405:             continue
      goto __pyx_L4_continue;
 2406: 
+2407:         if homo == 1:
    __pyx_t_3 = (__pyx_v_homo == 1);
    if (__pyx_t_3) {
/* … */
    }
+2408:             if direction == 0:
      __pyx_t_3 = (__pyx_v_direction == 0);
      if (__pyx_t_3) {
/* … */
        goto __pyx_L20;
      }
+2409:                 vx = idx_to_bead[off, 5]; vy = idx_to_bead[off, 6]; vz = idx_to_bead[off, 7]
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_8 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2409, __pyx_L1_error)
        }
        __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_8 = __pyx_v_off;
        __pyx_t_7 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2409, __pyx_L1_error)
        }
        __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_8 = 7;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2409, __pyx_L1_error)
        }
        __pyx_v_vz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
 2410:             else:
+2411:                 vx = idx_to_bead[off + L - 1, 5]; vy = idx_to_bead[off + L - 1, 6]; vz = idx_to_bead[off + L - 1, 7]
      /*else*/ {
        __pyx_t_8 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_7 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2411, __pyx_L1_error)
        }
        __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_8 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2411, __pyx_L1_error)
        }
        __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_8 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_7 = 7;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2411, __pyx_L1_error)
        }
        __pyx_v_vz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      }
      __pyx_L20:;
 2412: 
+2413:             de = get_energy_change_c(grid, type_grid, vx, vy, vz, nx, ny, nz,
      __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_vx, __pyx_v_vy, __pyx_v_vz, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+2414:                                      idx_to_bead[off, 1], interaction_table, LR_interaction_table,
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_8 = 1;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2414, __pyx_L1_error)
      }
 2415:                                      SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+2416:             de = de + (_chain_angle_mode(idx_to_bead, off, L, 1 if direction == 0 else 2, nx, ny, nz, angle_lookup)
      __pyx_t_3 = (__pyx_v_direction == 0);
      if (__pyx_t_3) {
        __pyx_t_6 = 1;
      } else {
        __pyx_t_6 = 2;
      }
/* … */
      __pyx_v_de = (__pyx_v_de + (__pyx_f_5pimms_15mega_crank_fast__chain_angle_mode(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, __pyx_t_6, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz, __pyx_v_angle_lookup) - __pyx_f_5pimms_15mega_crank_fast__chain_angle_mode(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, 0, 0, 0, 0, __pyx_v_angle_lookup)));
 2417:                        - _chain_angle_mode(idx_to_bead, off, L, 0, 0, 0, 0, angle_lookup))
 2418: 
+2419:             if accept_p(invtemp, de, &rng) == 1:
      __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, __pyx_v_de, (&__pyx_v_rng)) == 1);
      if (__pyx_t_3) {
/* … */
      }
+2420:                 grid[vx, vy, vz] = 0; type_grid[vx, vy, vz] = 0
        __pyx_t_8 = __pyx_v_vx;
        __pyx_t_7 = __pyx_v_vy;
        __pyx_t_1 = __pyx_v_vz;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[2];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 2;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[2])) __pyx_t_6 = 2;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2420, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_8 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_grid.strides[2]) )) = 0;
        __pyx_t_1 = __pyx_v_vx;
        __pyx_t_7 = __pyx_v_vy;
        __pyx_t_8 = __pyx_v_vz;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_type_grid.shape[2];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 2;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_type_grid.shape[2])) __pyx_t_6 = 2;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2420, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_1 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_8 * __pyx_v_type_grid.strides[2]) )) = 0;
+2421:                 grid[nx, ny, nz] = chainID; type_grid[nx, ny, nz] = idx_to_bead[off, 2]
        __pyx_t_8 = __pyx_v_nx;
        __pyx_t_7 = __pyx_v_ny;
        __pyx_t_1 = __pyx_v_nz;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[2];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 2;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[2])) __pyx_t_6 = 2;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2421, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_8 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) ) + __pyx_t_1 * __pyx_v_grid.strides[2]) )) = __pyx_v_chainID;
        __pyx_t_1 = __pyx_v_off;
        __pyx_t_7 = 2;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2421, __pyx_L1_error)
        }
        __pyx_t_8 = __pyx_v_nx;
        __pyx_t_10 = __pyx_v_ny;
        __pyx_t_11 = __pyx_v_nz;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_10 < 0) {
          __pyx_t_10 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_10 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_10 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_type_grid.shape[2];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_6 = 2;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_type_grid.shape[2])) __pyx_t_6 = 2;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2421, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_8 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2422:                 if direction == 0:
        __pyx_t_3 = (__pyx_v_direction == 0);
        if (__pyx_t_3) {
/* … */
          goto __pyx_L22;
        }
+2423:                     for k in range(0, L - 1):
          __pyx_t_12 = (__pyx_v_L - 1);
          __pyx_t_13 = __pyx_t_12;
          for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_13; __pyx_t_6+=1) {
            __pyx_v_k = __pyx_t_6;
+2424:                         idx_to_bead[off + k, 5] = idx_to_bead[off + k + 1, 5]
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) + 1);
            __pyx_t_1 = 5;
            __pyx_t_14 = -1;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2424, __pyx_L1_error)
            }
            __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_10 = 5;
            __pyx_t_14 = -1;
            if (__pyx_t_11 < 0) {
              __pyx_t_11 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_11 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2424, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2425:                         idx_to_bead[off + k, 6] = idx_to_bead[off + k + 1, 6]
            __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) + 1);
            __pyx_t_7 = 6;
            __pyx_t_14 = -1;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2425, __pyx_L1_error)
            }
            __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_11 = 6;
            __pyx_t_14 = -1;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_11 < 0) {
              __pyx_t_11 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_11 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2425, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2426:                         idx_to_bead[off + k, 7] = idx_to_bead[off + k + 1, 7]
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) + 1);
            __pyx_t_1 = 7;
            __pyx_t_14 = -1;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2426, __pyx_L1_error)
            }
            __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_10 = 7;
            __pyx_t_14 = -1;
            if (__pyx_t_11 < 0) {
              __pyx_t_11 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_11 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2426, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
          }
+2427:                     idx_to_bead[off + L - 1, 5] = nx; idx_to_bead[off + L - 1, 6] = ny; idx_to_bead[off + L - 1, 7] = nz
          __pyx_t_1 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_7 = 5;
          __pyx_t_6 = -1;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2427, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
          __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_1 = 6;
          __pyx_t_6 = -1;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2427, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
          __pyx_t_1 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_7 = 7;
          __pyx_t_6 = -1;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2427, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nz;
 2428:                 else:
+2429:                     for k in range(L - 1, 0, -1):
        /*else*/ {
          for (__pyx_t_6 = (__pyx_v_L - 1); __pyx_t_6 > 0; __pyx_t_6-=1) {
            __pyx_v_k = __pyx_t_6;
+2430:                         idx_to_bead[off + k, 5] = idx_to_bead[off + k - 1, 5]
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) - 1);
            __pyx_t_1 = 5;
            __pyx_t_14 = -1;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2430, __pyx_L1_error)
            }
            __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_11 = 5;
            __pyx_t_14 = -1;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_11 < 0) {
              __pyx_t_11 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_11 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2430, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2431:                         idx_to_bead[off + k, 6] = idx_to_bead[off + k - 1, 6]
            __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) - 1);
            __pyx_t_7 = 6;
            __pyx_t_14 = -1;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2431, __pyx_L1_error)
            }
            __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_10 = 6;
            __pyx_t_14 = -1;
            if (__pyx_t_11 < 0) {
              __pyx_t_11 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_11 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2431, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2432:                         idx_to_bead[off + k, 7] = idx_to_bead[off + k - 1, 7]
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) - 1);
            __pyx_t_1 = 7;
            __pyx_t_14 = -1;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2432, __pyx_L1_error)
            }
            __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_11 = 7;
            __pyx_t_14 = -1;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_14 = 0;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
            if (__pyx_t_11 < 0) {
              __pyx_t_11 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_11 < 0)) __pyx_t_14 = 1;
            } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
            if (unlikely(__pyx_t_14 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
              __PYX_ERR(0, 2432, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
          }
+2433:                     idx_to_bead[off, 5] = nx; idx_to_bead[off, 6] = ny; idx_to_bead[off, 7] = nz
          __pyx_t_1 = __pyx_v_off;
          __pyx_t_7 = 5;
          __pyx_t_6 = -1;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2433, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
          __pyx_t_7 = __pyx_v_off;
          __pyx_t_1 = 6;
          __pyx_t_6 = -1;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2433, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
          __pyx_t_1 = __pyx_v_off;
          __pyx_t_7 = 7;
          __pyx_t_6 = -1;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2433, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nz;
        }
        __pyx_L22:;
+2434:                 dsum = dsum + de
        __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+2435:                 acc = acc + 1
        __pyx_v_acc = (__pyx_v_acc + 1);
+2436:             continue
      goto __pyx_L4_continue;
 2437: 
 2438:         # ----- heteropolymer: decompose into L single-bead moves -----
+2439:         for k in range(L):
    __pyx_t_6 = __pyx_v_L;
    __pyx_t_14 = __pyx_t_6;
    for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
      __pyx_v_k = __pyx_t_15;
+2440:             bx[k] = idx_to_bead[off + k, 5]; by[k] = idx_to_bead[off + k, 6]; bz[k] = idx_to_bead[off + k, 7]
      __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
      __pyx_t_1 = 5;
      __pyx_t_16 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
      if (unlikely(__pyx_t_16 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
        __PYX_ERR(0, 2440, __pyx_L1_error)
      }
      (__pyx_v_bx[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
      __pyx_t_7 = 6;
      __pyx_t_16 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
      if (unlikely(__pyx_t_16 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
        __PYX_ERR(0, 2440, __pyx_L1_error)
      }
      (__pyx_v_by[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
      __pyx_t_1 = 7;
      __pyx_t_16 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
      if (unlikely(__pyx_t_16 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
        __PYX_ERR(0, 2440, __pyx_L1_error)
      }
      (__pyx_v_bz[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
    }
 2441: 
+2442:         de = 0
    __pyx_v_de = 0;
+2443:         if direction == 0:
    __pyx_t_3 = (__pyx_v_direction == 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L29;
    }
+2444:             for k in range(L - 1, -1, -1):
      for (__pyx_t_6 = (__pyx_v_L - 1); __pyx_t_6 > -1; __pyx_t_6-=1) {
        __pyx_v_k = __pyx_t_6;
+2445:                 ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]; oz = idx_to_bead[off + k, 7]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        __pyx_t_14 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
          __PYX_ERR(0, 2445, __pyx_L1_error)
        }
        __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_14 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
          __PYX_ERR(0, 2445, __pyx_L1_error)
        }
        __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 7;
        __pyx_t_14 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
          __PYX_ERR(0, 2445, __pyx_L1_error)
        }
        __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2446:                 if k == L - 1:
        __pyx_t_3 = (__pyx_v_k == (__pyx_v_L - 1));
        if (__pyx_t_3) {
/* … */
          goto __pyx_L32;
        }
+2447:                     tx = nx; ty = ny; tz = nz
          __pyx_v_tx = __pyx_v_nx;
          __pyx_v_ty = __pyx_v_ny;
          __pyx_v_tz = __pyx_v_nz;
 2448:                 else:
+2449:                     tx = bx[k + 1]; ty = by[k + 1]; tz = bz[k + 1]
        /*else*/ {
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k + 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_k + 1)]);
          __pyx_v_tz = (__pyx_v_bz[(__pyx_v_k + 1)]);
        }
        __pyx_L32:;
+2450:                 de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+2451:                                               idx_to_bead[off + k, 1], interaction_table,
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 1;
        __pyx_t_14 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_14 = 1;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_14);
          __PYX_ERR(0, 2451, __pyx_L1_error)
        }
 2452:                                               LR_interaction_table, SLR_interaction_table,
 2453:                                               XDIM, YDIM, ZDIM, hardwall)
+2454:                 newp[0] = tx; newp[1] = ty; newp[2] = tz
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
        (__pyx_v_newp[2]) = __pyx_v_tz;
+2455:                 de = de + get_angle_energy_change_c(off + k, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2456:                 _apply_bead_move(grid, type_grid, idx_to_bead, off + k, ox, oy, oz, tx, ty, tz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
      }
 2457:         else:
+2458:             for k in range(0, L):
    /*else*/ {
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_14 = __pyx_t_6;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_k = __pyx_t_15;
+2459:                 ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]; oz = idx_to_bead[off + k, 7]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        __pyx_t_16 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2459, __pyx_L1_error)
        }
        __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_16 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2459, __pyx_L1_error)
        }
        __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 7;
        __pyx_t_16 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2459, __pyx_L1_error)
        }
        __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2460:                 if k == 0:
        __pyx_t_3 = (__pyx_v_k == 0);
        if (__pyx_t_3) {
/* … */
          goto __pyx_L35;
        }
+2461:                     tx = nx; ty = ny; tz = nz
          __pyx_v_tx = __pyx_v_nx;
          __pyx_v_ty = __pyx_v_ny;
          __pyx_v_tz = __pyx_v_nz;
 2462:                 else:
+2463:                     tx = bx[k - 1]; ty = by[k - 1]; tz = bz[k - 1]
        /*else*/ {
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k - 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_k - 1)]);
          __pyx_v_tz = (__pyx_v_bz[(__pyx_v_k - 1)]);
        }
        __pyx_L35:;
+2464:                 de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+2465:                                               idx_to_bead[off + k, 1], interaction_table,
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 1;
        __pyx_t_16 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2465, __pyx_L1_error)
        }
 2466:                                               LR_interaction_table, SLR_interaction_table,
 2467:                                               XDIM, YDIM, ZDIM, hardwall)
+2468:                 newp[0] = tx; newp[1] = ty; newp[2] = tz
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
        (__pyx_v_newp[2]) = __pyx_v_tz;
+2469:                 de = de + get_angle_energy_change_c(off + k, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2470:                 _apply_bead_move(grid, type_grid, idx_to_bead, off + k, ox, oy, oz, tx, ty, tz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
      }
    }
    __pyx_L29:;
 2471: 
+2472:         if accept_p(invtemp, de, &rng) == 1:
    __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, __pyx_v_de, (&__pyx_v_rng)) == 1);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L36;
    }
+2473:             dsum = dsum + de
      __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+2474:             acc = acc + 1
      __pyx_v_acc = (__pyx_v_acc + 1);
 2475:         else:
+2476:             for k in range(L):
    /*else*/ {
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_14 = __pyx_t_6;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_k = __pyx_t_15;
+2477:                 cx = idx_to_bead[off + k, 5]; cy = idx_to_bead[off + k, 6]; cz = idx_to_bead[off + k, 7]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        __pyx_t_16 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2477, __pyx_L1_error)
        }
        __pyx_v_cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_16 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2477, __pyx_L1_error)
        }
        __pyx_v_cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 7;
        __pyx_t_16 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2477, __pyx_L1_error)
        }
        __pyx_v_cz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2478:                 grid[cx, cy, cz] = 0; type_grid[cx, cy, cz] = 0
        __pyx_t_7 = __pyx_v_cx;
        __pyx_t_1 = __pyx_v_cy;
        __pyx_t_11 = __pyx_v_cz;
        __pyx_t_16 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[1])) __pyx_t_16 = 1;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_grid.shape[2];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 2;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_grid.shape[2])) __pyx_t_16 = 2;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2478, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_7 * __pyx_v_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_grid.strides[2]) )) = 0;
        __pyx_t_11 = __pyx_v_cx;
        __pyx_t_1 = __pyx_v_cy;
        __pyx_t_7 = __pyx_v_cz;
        __pyx_t_16 = -1;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_type_grid.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[1])) __pyx_t_16 = 1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_type_grid.shape[2];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 2;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[2])) __pyx_t_16 = 2;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2478, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_11 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_7 * __pyx_v_type_grid.strides[2]) )) = 0;
      }
+2479:             for k in range(L):
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_14 = __pyx_t_6;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_k = __pyx_t_15;
+2480:                 grid[bx[k], by[k], bz[k]] = chainID
        __pyx_t_7 = (__pyx_v_bx[__pyx_v_k]);
        __pyx_t_1 = (__pyx_v_by[__pyx_v_k]);
        __pyx_t_11 = (__pyx_v_bz[__pyx_v_k]);
        __pyx_t_16 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[1])) __pyx_t_16 = 1;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_grid.shape[2];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 2;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_grid.shape[2])) __pyx_t_16 = 2;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2480, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_7 * __pyx_v_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_grid.strides[1]) ) + __pyx_t_11 * __pyx_v_grid.strides[2]) )) = __pyx_v_chainID;
+2481:                 type_grid[bx[k], by[k], bz[k]] = idx_to_bead[off + k, 2]
        __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 2;
        __pyx_t_16 = -1;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2481, __pyx_L1_error)
        }
        __pyx_t_7 = (__pyx_v_bx[__pyx_v_k]);
        __pyx_t_10 = (__pyx_v_by[__pyx_v_k]);
        __pyx_t_8 = (__pyx_v_bz[__pyx_v_k]);
        __pyx_t_16 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_10 < 0) {
          __pyx_t_10 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_10 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_10 >= __pyx_v_type_grid.shape[1])) __pyx_t_16 = 1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_type_grid.shape[2];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_16 = 2;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_type_grid.shape[2])) __pyx_t_16 = 2;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2481, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_8 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2482:                 idx_to_bead[off + k, 5] = bx[k]; idx_to_bead[off + k, 6] = by[k]; idx_to_bead[off + k, 7] = bz[k]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_11 = 5;
        __pyx_t_16 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2482, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_bx[__pyx_v_k]);
        __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_16 = -1;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2482, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_by[__pyx_v_k]);
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_11 = 7;
        __pyx_t_16 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_16 = 0;
        if (__pyx_t_11 < 0) {
          __pyx_t_11 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_11 < 0)) __pyx_t_16 = 1;
        } else if (unlikely(__pyx_t_11 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_16 = 1;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_16);
          __PYX_ERR(0, 2482, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_bz[__pyx_v_k]);
      }
    }
    __pyx_L36:;
    __pyx_L4_continue:;
  }
 2483: 
+2484:     out_delta[b] = dsum
  __pyx_t_11 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_11 < 0) {
    __pyx_t_11 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_11 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_11 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2484, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_11)) )) = __pyx_v_dsum;
+2485:     out_accepted[b] = acc
  __pyx_t_11 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_11 < 0) {
    __pyx_t_11 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_11 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_11 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2485, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_11)) )) = __pyx_v_acc;
 2486: 
 2487: 
 2488: # helper shared by both slither/pull parallel kernels: assign each chain to the
 2489: # block whose interior contains ALL of its beads, or -1 (frozen) otherwise.
+2490: def _chain_block_assignment(block_of_bead, chain_offset, num_chains):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_17_chain_block_assignment(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_17_chain_block_assignment = {"_chain_block_assignment", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_17_chain_block_assignment, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_17_chain_block_assignment(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_block_of_bead = 0;
  PyObject *__pyx_v_chain_offset = 0;
  CYTHON_UNUSED PyObject *__pyx_v_num_chains = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_chain_block_assignment (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_block_of_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_num_chains,0};
  PyObject* values[3] = {0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 2490, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2490, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2490, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2490, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "_chain_block_assignment", 0) < (0)) __PYX_ERR(0, 2490, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 3; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("_chain_block_assignment", 1, 3, 3, i); __PYX_ERR(0, 2490, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 3)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2490, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2490, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2490, __pyx_L3_error)
    }
    __pyx_v_block_of_bead = values[0];
    __pyx_v_chain_offset = values[1];
    __pyx_v_num_chains = values[2];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_chain_block_assignment", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 2490, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast._chain_block_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_16_chain_block_assignment(__pyx_self, __pyx_v_block_of_bead, __pyx_v_chain_offset, __pyx_v_num_chains);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_16_chain_block_assignment(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_block_of_bead, PyObject *__pyx_v_chain_offset, CYTHON_UNUSED PyObject *__pyx_v_num_chains) {
  PyObject *__pyx_v_offs = NULL;
  PyObject *__pyx_v_bmin = NULL;
  PyObject *__pyx_v_bmax = NULL;
  PyObject *__pyx_r = NULL;
/* … */
  /* 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_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("pimms.mega_crank_fast._chain_block_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_offs);
  __Pyx_XDECREF(__pyx_v_bmin);
  __Pyx_XDECREF(__pyx_v_bmax);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_17_chain_block_assignment, 0, __pyx_mstate_global->__pyx_n_u_chain_block_assignment, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[14])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_chain_block_assignment, __pyx_t_4) < (0)) __PYX_ERR(0, 2490, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+2491:     offs = np.asarray(chain_offset).astype(np.intp)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2491, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2491, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_7 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_6, __pyx__function);
    __pyx_t_7 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_chain_offset};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_6, __pyx_callargs+__pyx_t_7, (2-__pyx_t_7) | (__pyx_t_7*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2491, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_2 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2491, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_intp); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2491, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_7 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_7, (2-__pyx_t_7) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2491, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_offs = __pyx_t_1;
  __pyx_t_1 = 0;
+2492:     bmin = np.minimum.reduceat(block_of_bead, offs)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_minimum); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_3);
  __pyx_t_7 = 0;
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_v_block_of_bead, __pyx_v_offs};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_reduceat, __pyx_callargs+__pyx_t_7, (3-__pyx_t_7) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2492, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_bmin = __pyx_t_1;
  __pyx_t_1 = 0;
+2493:     bmax = np.maximum.reduceat(block_of_bead, offs)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2493, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2493, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_7 = 0;
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_block_of_bead, __pyx_v_offs};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_reduceat, __pyx_callargs+__pyx_t_7, (3-__pyx_t_7) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2493, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_bmax = __pyx_t_1;
  __pyx_t_1 = 0;
+2494:     return np.where((bmin == bmax) & (bmin >= 0), bmin, -1).astype(np.int64)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_where); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_bmin, __pyx_v_bmax, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __pyx_t_8 = PyObject_RichCompare(__pyx_v_bmin, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __pyx_t_9 = PyNumber_And(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_7 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
    __pyx_t_7 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_3, __pyx_t_9, __pyx_v_bmin, __pyx_mstate_global->__pyx_int_neg_1};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_7, (4-__pyx_t_7) | (__pyx_t_7*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2494, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_7 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_7, (2-__pyx_t_7) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2494, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 2495: 
 2496: 
+2497: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_19mega_slither_parallel(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_18mega_slither_parallel, "\n    Parallel 3D slither megamove. Same role/return as mega_slither, but distributes\n    the per-chain slithers across `num_threads` threads using a chain-level\n    frozen-halo block decomposition (a chain is only moved if all its beads lie in\n    one block's interior). `chain_selector` is used only for the total work count\n    (its length); chains are picked per block. Returns (energy, accepted).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_19mega_slither_parallel = {"mega_slither_parallel", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_19mega_slither_parallel, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_18mega_slither_parallel};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_19mega_slither_parallel(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  CYTHON_UNUSED int __pyx_v_max_chain_len;
  int __pyx_v_num_threads;
  __Pyx_memviewslice __pyx_v_frozen_mask = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_slither_parallel (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,&__pyx_mstate_global->__pyx_n_u_num_threads,&__pyx_mstate_global->__pyx_n_u_frozen_mask,0};
  PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 2497, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 18:
        values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 17:
        values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2497, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_slither_parallel", 0) < (0)) __PYX_ERR(0, 2497, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 18; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_slither_parallel", 1, 18, 18, i); __PYX_ERR(0, 2497, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 18)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 2497, __pyx_L3_error)
      values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 2497, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 2499, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 2500, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 2501, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 2502, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 2503, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 2504, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 2505, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 2506, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 2507, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 2508, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 2509, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 2510, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 2511, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2512, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2513, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2514, __pyx_L3_error)
    __pyx_v_num_threads = __Pyx_PyLong_As_int(values[16]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2515, __pyx_L3_error)
    __pyx_v_frozen_mask = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[17], PyBUF_WRITABLE); if (unlikely(!__pyx_v_frozen_mask.memview)) __PYX_ERR(0, 2516, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_slither_parallel", 1, 18, 18, __pyx_nargs); __PYX_ERR(0, 2497, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_18mega_slither_parallel(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len, __pyx_v_num_threads, __pyx_v_frozen_mask);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_5pimms_15mega_crank_fast_18mega_slither_parallel(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, CYTHON_UNUSED int __pyx_v_max_chain_len, int __pyx_v_num_threads, __Pyx_memviewslice __pyx_v_frozen_mask) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel *__pyx_cur_scope;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  int __pyx_v_num_chains;
  int __pyx_v_n_steps;
  PyObject *__pyx_v_idx_np = NULL;
  int __pyx_v_R_int;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_nbz;
  int __pyx_v_Lx;
  int __pyx_v_Ly;
  int __pyx_v_Lz;
  int __pyx_v_num_blocks;
  PyObject *__pyx_v_rstate = NULL;
  int __pyx_v_shift_x;
  int __pyx_v_shift_y;
  int __pyx_v_shift_z;
  PyObject *__pyx_v_gx = NULL;
  PyObject *__pyx_v_gy = NULL;
  PyObject *__pyx_v_gz = NULL;
  PyObject *__pyx_v_dim_block = 0;
  PyObject *__pyx_v_bxj = NULL;
  PyObject *__pyx_v_byj = NULL;
  PyObject *__pyx_v_bzj = NULL;
  PyObject *__pyx_v_block_of_bead = NULL;
  PyObject *__pyx_v_chain_block = NULL;
  PyObject *__pyx_v_movable = NULL;
  PyObject *__pyx_v_mblocks = NULL;
  PyObject *__pyx_v_order = NULL;
  PyObject *__pyx_v_chain_ids = NULL;
  PyObject *__pyx_v_sorted_blocks = NULL;
  PyObject *__pyx_v_counts = NULL;
  PyObject *__pyx_v_starts = NULL;
  PyObject *__pyx_v_total_movable = NULL;
  PyObject *__pyx_v_attempts = NULL;
  PyObject *__pyx_v_bix = NULL;
  PyObject *__pyx_v_biy = NULL;
  PyObject *__pyx_v_biz = NULL;
  PyObject *__pyx_v_blo_x = NULL;
  PyObject *__pyx_v_blo_y = NULL;
  PyObject *__pyx_v_blo_z = NULL;
  PyObject *__pyx_v_seeds = NULL;
  PyObject *__pyx_v_out_delta = NULL;
  PyObject *__pyx_v_out_accepted = NULL;
  __Pyx_memviewslice __pyx_v_chain_ids_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_starts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_attempts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_seeds_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_x_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_y_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_z_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_delta_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_accepted_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_b;
  CYTHON_UNUSED int __pyx_v_nthreads;
  long __pyx_v_tot_d;
  int __pyx_v_tot_a;
  PyObject *__pyx_r = NULL;
  __pyx_cur_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel *)__pyx_tp_new_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel(__pyx_mstate_global->__pyx_ptype_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel, __pyx_mstate_global->__pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 2497, __pyx_L1_error)
  } else {
    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
  }
/* … */
  /* 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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_16);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_18, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_19, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_idx_np);
  __Pyx_XDECREF(__pyx_v_rstate);
  __Pyx_XDECREF(__pyx_v_gx);
  __Pyx_XDECREF(__pyx_v_gy);
  __Pyx_XDECREF(__pyx_v_gz);
  __Pyx_XDECREF(__pyx_v_dim_block);
  __Pyx_XDECREF(__pyx_v_bxj);
  __Pyx_XDECREF(__pyx_v_byj);
  __Pyx_XDECREF(__pyx_v_bzj);
  __Pyx_XDECREF(__pyx_v_block_of_bead);
  __Pyx_XDECREF(__pyx_v_chain_block);
  __Pyx_XDECREF(__pyx_v_movable);
  __Pyx_XDECREF(__pyx_v_mblocks);
  __Pyx_XDECREF(__pyx_v_order);
  __Pyx_XDECREF(__pyx_v_chain_ids);
  __Pyx_XDECREF(__pyx_v_sorted_blocks);
  __Pyx_XDECREF(__pyx_v_counts);
  __Pyx_XDECREF(__pyx_v_starts);
  __Pyx_XDECREF(__pyx_v_total_movable);
  __Pyx_XDECREF(__pyx_v_attempts);
  __Pyx_XDECREF(__pyx_v_bix);
  __Pyx_XDECREF(__pyx_v_biy);
  __Pyx_XDECREF(__pyx_v_biz);
  __Pyx_XDECREF(__pyx_v_blo_x);
  __Pyx_XDECREF(__pyx_v_blo_y);
  __Pyx_XDECREF(__pyx_v_blo_z);
  __Pyx_XDECREF(__pyx_v_seeds);
  __Pyx_XDECREF(__pyx_v_out_delta);
  __Pyx_XDECREF(__pyx_v_out_accepted);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_ids_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_starts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_attempts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_seeds_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_x_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_y_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_z_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_delta_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_accepted_mv, 1);
  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_19mega_slither_parallel, 0, __pyx_mstate_global->__pyx_n_u_mega_slither_parallel, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[15])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2497, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_slither_parallel, __pyx_t_4) < (0)) __PYX_ERR(0, 2497, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel {
  PyObject_HEAD
  int __pyx_v_W;
  int __pyx_v_num_beads;
};

 2498: @cython.boundscheck(False)
 2499: def mega_slither_parallel(NUMPY_INT_TYPE[:, :, :] grid,
 2500:                           NUMPY_INT_TYPE[:, :, :] type_grid,
 2501:                           NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 2502:                           int[::1] chain_offset,
 2503:                           int[::1] chain_length,
 2504:                           int[::1] chain_homo,
 2505:                           int[::1] chain_selector,
 2506:                           NUMPY_INT_TYPE[:, :] interaction_table,
 2507:                           NUMPY_INT_TYPE[:, :] LR_interaction_table,
 2508:                           NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 2509:                           NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 2510:                           long energy,
 2511:                           float invtemp,
 2512:                           int passed_seed,
 2513:                           int hardwall,
 2514:                           int max_chain_len,
 2515:                           int num_threads,
 2516:                           NUMPY_INT_TYPE[::1] frozen_mask):
 2517:     """
 2518:     Parallel 3D slither megamove. Same role/return as mega_slither, but distributes
 2519:     the per-chain slithers across `num_threads` threads using a chain-level
 2520:     frozen-halo block decomposition (a chain is only moved if all its beads lie in
 2521:     one block's interior). `chain_selector` is used only for the total work count
 2522:     (its length); chains are picked per block. Returns (energy, accepted).
 2523:     """
+2524:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+2525:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+2526:     cdef int ZDIM = grid.shape[2]
  __pyx_v_ZDIM = (__pyx_v_grid.shape[2]);
+2527:     cdef int num_beads = idx_to_bead.shape[0]
  __pyx_cur_scope->__pyx_v_num_beads = (__pyx_v_idx_to_bead.shape[0]);
+2528:     cdef int num_chains = chain_offset.shape[0]
  __pyx_v_num_chains = (__pyx_v_chain_offset.shape[0]);
+2529:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
 2530: 
+2531:     idx_np = np.asarray(idx_to_bead)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2531, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2531, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_idx_to_bead, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2531, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2531, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_idx_np = __pyx_t_1;
  __pyx_t_1 = 0;
+2532:     cdef int R_int = 3 if np.any(idx_np[:, 1] == 1) else 1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2532, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2532, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[1]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2532, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2532, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2532, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 2532, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_8) {
    __pyx_t_6 = 3;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_R_int = __pyx_t_6;
+2533:     cdef int W = R_int + 2
  __pyx_cur_scope->__pyx_v_W = (__pyx_v_R_int + 2);
 2534: 
+2535:     cdef int cap = 4
  __pyx_v_cap = 4;
+2536:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2536, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2536, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2536, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2536, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_4, __pyx_t_3, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2536, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2536, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbx = __pyx_t_6;
+2537:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2537, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2537, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2537, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2537, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, __pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2537, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2537, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nby = __pyx_t_6;
+2538:     cdef int nbz = _choose_nb(ZDIM, W, cap)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2538, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2538, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2538, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2538, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_t_4, __pyx_t_3, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2538, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2538, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbz = __pyx_t_6;
+2539:     cdef int Lx = XDIM // nbx
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 2539, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 2539, __pyx_L1_error)
  }
  __pyx_v_Lx = __Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0);
+2540:     cdef int Ly = YDIM // nby
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 2540, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 2540, __pyx_L1_error)
  }
  __pyx_v_Ly = __Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0);
+2541:     cdef int Lz = ZDIM // nbz
  if (unlikely(__pyx_v_nbz == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 2541, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbz == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_ZDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 2541, __pyx_L1_error)
  }
  __pyx_v_Lz = __Pyx_div_int(__pyx_v_ZDIM, __pyx_v_nbz, 0);
+2542:     cdef int num_blocks = nbx * nby * nbz
  __pyx_v_num_blocks = ((__pyx_v_nbx * __pyx_v_nby) * __pyx_v_nbz);
 2543: 
+2544:     rstate = np.random.RandomState(passed_seed & 0x7FFFFFFF)
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_2 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyLong_From_long((__pyx_v_passed_seed & 0x7FFFFFFF)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_RandomState, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2544, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_rstate = __pyx_t_1;
  __pyx_t_1 = 0;
+2545:     cdef int shift_x = int(rstate.randint(0, Lx)) if nbx > 1 else 0
  __pyx_t_8 = (__pyx_v_nbx > 1);
  if (__pyx_t_8) {
    __pyx_t_3 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2545, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_mstate_global->__pyx_int_0, __pyx_t_7};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2545, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_t_7 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2545, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_7); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2545, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_x = __pyx_t_6;
+2546:     cdef int shift_y = int(rstate.randint(0, Ly)) if nby > 1 else 0
  __pyx_t_8 = (__pyx_v_nby > 1);
  if (__pyx_t_8) {
    __pyx_t_1 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2546, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_0, __pyx_t_3};
      __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2546, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
    }
    __pyx_t_3 = __Pyx_PyNumber_Int(__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2546, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_3); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2546, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_y = __pyx_t_6;
+2547:     cdef int shift_z = int(rstate.randint(0, Lz)) if nbz > 1 else 0
  __pyx_t_8 = (__pyx_v_nbz > 1);
  if (__pyx_t_8) {
    __pyx_t_7 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_7);
    __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2547, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_0, __pyx_t_1};
      __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2547, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    }
    __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2547, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2547, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_z = __pyx_t_6;
 2548: 
+2549:     gx = idx_np[:, 5].astype(np.int64)
  __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[2]); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2549, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2549, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2549, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2549, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gx = __pyx_t_1;
  __pyx_t_1 = 0;
+2550:     gy = idx_np[:, 6].astype(np.int64)
  __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[3]); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2550, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gy = __pyx_t_1;
  __pyx_t_1 = 0;
+2551:     gz = idx_np[:, 7].astype(np.int64)
  __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[4]); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2551, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2551, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2551, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2551, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gz = __pyx_t_1;
  __pyx_t_1 = 0;
 2552: 
+2553:     def dim_block(g, nb, L, DIM, shift):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_21mega_slither_parallel_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_21mega_slither_parallel_1dim_block = {"dim_block", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_21mega_slither_parallel_1dim_block, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_21mega_slither_parallel_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_g = 0;
  PyObject *__pyx_v_nb = 0;
  PyObject *__pyx_v_L = 0;
  PyObject *__pyx_v_DIM = 0;
  PyObject *__pyx_v_shift = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dim_block (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_g,&__pyx_mstate_global->__pyx_n_u_nb,&__pyx_mstate_global->__pyx_n_u_L,&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_shift,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 2553, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2553, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2553, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2553, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2553, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2553, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "dim_block", 0) < (0)) __PYX_ERR(0, 2553, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, i); __PYX_ERR(0, 2553, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2553, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2553, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2553, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2553, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2553, __pyx_L3_error)
    }
    __pyx_v_g = values[0];
    __pyx_v_nb = values[1];
    __pyx_v_L = values[2];
    __pyx_v_DIM = values[3];
    __pyx_v_shift = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 2553, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_21mega_slither_parallel_dim_block(__pyx_self, __pyx_v_g, __pyx_v_nb, __pyx_v_L, __pyx_v_DIM, __pyx_v_shift);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_21mega_slither_parallel_dim_block(PyObject *__pyx_self, PyObject *__pyx_v_g, PyObject *__pyx_v_nb, PyObject *__pyx_v_L, PyObject *__pyx_v_DIM, PyObject *__pyx_v_shift) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel *__pyx_cur_scope;
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel *__pyx_outer_scope;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_bj = NULL;
  PyObject *__pyx_v_within = NULL;
  PyObject *__pyx_v_bad = NULL;
  PyObject *__pyx_r = NULL;
  __pyx_outer_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_2_mega_slither_parallel *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_bj);
  __Pyx_XDECREF(__pyx_v_within);
  __Pyx_XDECREF(__pyx_v_bad);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_21mega_slither_parallel_1dim_block, 0, __pyx_mstate_global->__pyx_n_u_mega_slither_parallel_locals_dim, ((PyObject*)__pyx_cur_scope), __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[2])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2553, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_dim_block = __pyx_t_1;
  __pyx_t_1 = 0;
+2554:         if nb == 1:
  __pyx_t_1 = (__Pyx_PyLong_BoolEqObjC(__pyx_v_nb, __pyx_mstate_global->__pyx_int_1, 1, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 2554, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+2555:             return np.zeros(num_beads, dtype=np.int64)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2555, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2555, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_num_beads); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2555, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2555, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2555, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_8 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_6 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2555, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_6, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2555, __pyx_L1_error)
      __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_8, (2-__pyx_t_8) | (__pyx_t_8*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_6);
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2555, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+2556:         s = (g - shift) % DIM
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_g, __pyx_v_shift); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2556, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyNumber_Remainder(__pyx_t_2, __pyx_v_DIM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2556, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_5;
  __pyx_t_5 = 0;
+2557:         bj = s // L
  __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_s, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2557, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_bj = __pyx_t_5;
  __pyx_t_5 = 0;
+2558:         within = s - bj * L
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_bj, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2558, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2558, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_within = __pyx_t_2;
  __pyx_t_2 = 0;
+2559:         bad = (s >= nb * L) | (within < W) | (within >= L - W)
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nb, __pyx_v_L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_s, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_L, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Or(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_bad = __pyx_t_5;
  __pyx_t_5 = 0;
+2560:         bj = bj.copy()
  __pyx_t_6 = __pyx_v_bj;
  __Pyx_INCREF(__pyx_t_6);
  __pyx_t_8 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
    __pyx_t_5 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_copy, __pyx_callargs+__pyx_t_8, (1-__pyx_t_8) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2560, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
  }
  __Pyx_DECREF_SET(__pyx_v_bj, __pyx_t_5);
  __pyx_t_5 = 0;
+2561:         bj[bad] = -1
  if (unlikely((PyObject_SetItem(__pyx_v_bj, __pyx_v_bad, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 2561, __pyx_L1_error)
+2562:         return bj
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_bj);
  __pyx_r = __pyx_v_bj;
  goto __pyx_L0;
 2563: 
+2564:     bxj = dim_block(gx, nbx, Lx, XDIM, shift_x)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2564, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2564, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2564, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_shift_x); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2564, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_pf_5pimms_15mega_crank_fast_21mega_slither_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gx, __pyx_t_1, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2564, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bxj = __pyx_t_7;
  __pyx_t_7 = 0;
+2565:     byj = dim_block(gy, nby, Ly, YDIM, shift_y)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2565, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2565, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2565, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_shift_y); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2565, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __pyx_pf_5pimms_15mega_crank_fast_21mega_slither_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gy, __pyx_t_7, __pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2565, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_byj = __pyx_t_1;
  __pyx_t_1 = 0;
+2566:     bzj = dim_block(gz, nbz, Lz, ZDIM, shift_z)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2566, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2566, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2566, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_shift_z); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2566, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_pf_5pimms_15mega_crank_fast_21mega_slither_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gz, __pyx_t_1, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2566, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bzj = __pyx_t_7;
  __pyx_t_7 = 0;
+2567:     block_of_bead = (bxj * nby * nbz + byj * nbz + bzj)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_bxj, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_byj, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = PyNumber_Add(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyNumber_Add(__pyx_t_7, __pyx_v_bzj); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2567, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_block_of_bead = __pyx_t_4;
  __pyx_t_4 = 0;
+2568:     block_of_bead[(bxj < 0) | (byj < 0) | (bzj < 0)] = -1
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_bxj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2568, __pyx_L1_error)
  __pyx_t_7 = PyObject_RichCompare(__pyx_v_byj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2568, __pyx_L1_error)
  __pyx_t_3 = PyNumber_Or(__pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2568, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = PyObject_RichCompare(__pyx_v_bzj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2568, __pyx_L1_error)
  __pyx_t_4 = PyNumber_Or(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2568, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_4, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 2568, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 2569: 
+2570:     block_of_bead[np.asarray(frozen_mask) != 0] = -1   # frozen beads -> whole chain frozen
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2570, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2570, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_frozen_mask, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2570, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_3};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2570, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_2 = __Pyx_PyLong_NeObjC(__pyx_t_4, __pyx_mstate_global->__pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2570, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_2, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 2570, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+2571:     chain_block = _chain_block_assignment(block_of_bead, chain_offset, num_chains)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_chain_block_assignment); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2571, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_chain_offset, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2571, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_num_chains); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2571, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_block_of_bead, __pyx_t_7, __pyx_t_1};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2571, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_chain_block = __pyx_t_2;
  __pyx_t_2 = 0;
+2572:     movable = np.nonzero(chain_block >= 0)[0].astype(np.int32)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_nonzero); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_chain_block, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2572, __pyx_L1_error)
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2572, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2572, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_movable = __pyx_t_2;
  __pyx_t_2 = 0;
+2573:     if movable.shape[0] == 0:
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_movable, __pyx_mstate_global->__pyx_n_u_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2573, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2573, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_8 = (__Pyx_PyLong_BoolEqObjC(__pyx_t_9, __pyx_mstate_global->__pyx_int_0, 0, 0)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 2573, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (__pyx_t_8) {
/* … */
  }
+2574:         return (energy, 0)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_9 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2574, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2574, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_9);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 2574, __pyx_L1_error);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_0);
    __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_0);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_mstate_global->__pyx_int_0) != (0)) __PYX_ERR(0, 2574, __pyx_L1_error);
    __pyx_t_9 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
 2575: 
+2576:     mblocks = chain_block[movable]
  __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_chain_block, __pyx_v_movable); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2576, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_mblocks = __pyx_t_2;
  __pyx_t_2 = 0;
+2577:     order = np.argsort(mblocks, kind="stable")
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2577, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_argsort); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2577, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_v_mblocks};
    __pyx_t_4 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2577, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_kind, __pyx_mstate_global->__pyx_n_u_stable, __pyx_t_4, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2577, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_4);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2577, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_order = __pyx_t_2;
  __pyx_t_2 = 0;
+2578:     chain_ids = movable[order].astype(np.int32)
  __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_v_movable, __pyx_v_order); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2578, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2578, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2578, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_1};
    __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2578, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_chain_ids = __pyx_t_2;
  __pyx_t_2 = 0;
+2579:     sorted_blocks = mblocks[order]
  __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_mblocks, __pyx_v_order); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2579, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_sorted_blocks = __pyx_t_2;
  __pyx_t_2 = 0;
 2580: 
+2581:     counts = np.bincount(sorted_blocks, minlength=num_blocks).astype(np.int32)
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_bincount); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_v_sorted_blocks};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2581, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_minlength, __pyx_t_9, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2581, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2581, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_4 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_11};
    __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2581, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_counts = __pyx_t_2;
  __pyx_t_2 = 0;
+2582:     starts = np.zeros(num_blocks + 1, dtype=np.int32)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2582, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2582, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_long((__pyx_v_num_blocks + 1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2582, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2582, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2582, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_11};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2582, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2582, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2582, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_starts = __pyx_t_2;
  __pyx_t_2 = 0;
+2583:     starts[1:] = np.cumsum(counts)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2583, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_cumsum); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2583, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_counts};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2583, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  if (__Pyx_PyObject_SetSlice(__pyx_v_starts, __pyx_t_2, 1, 0, NULL, NULL, &__pyx_mstate_global->__pyx_slice[1], 1, 0, 0) < (0)) __PYX_ERR(0, 2583, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 2584: 
+2585:     total_movable = int(counts.sum())
  __pyx_t_9 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_9);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, NULL};
    __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_sum, __pyx_callargs+__pyx_t_5, (1-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2585, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_9 = __Pyx_PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2585, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_total_movable = ((PyObject*)__pyx_t_9);
  __pyx_t_9 = 0;
+2586:     attempts = np.maximum(
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2586, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2586, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+2587:         (n_steps * counts.astype(np.int64) // max(total_movable, 1)), 0).astype(np.int32)
  __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_n_steps); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_14};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2587, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_14 = PyNumber_Multiply(__pyx_t_11, __pyx_t_3); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_15 = 1;
  __Pyx_INCREF(__pyx_v_total_movable);
  __pyx_t_16 = __pyx_v_total_movable;
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_16, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  if (__pyx_t_8) {
    __pyx_t_12 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2587, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_PyInt_FromNumber(&__pyx_t_12, NULL, 0) < (0)) __PYX_ERR(0, 2587, __pyx_L1_error)
    __pyx_t_3 = __pyx_t_12;
    __pyx_t_12 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_16);
    __pyx_t_3 = __pyx_t_16;
  }
  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_14, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_12, __pyx_mstate_global->__pyx_int_0};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2586, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_2 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2587, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2587, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_attempts = __pyx_t_9;
  __pyx_t_9 = 0;
 2588: 
+2589:     bix = np.arange(num_blocks, dtype=np.int32) // (nby * nbz)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_12};
    __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2589, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2589, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2589, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_2 = __Pyx_PyLong_From_int((__pyx_v_nby * __pyx_v_nbz)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_FloorDivide(__pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2589, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_bix = __pyx_t_1;
  __pyx_t_1 = 0;
+2590:     biy = (np.arange(num_blocks, dtype=np.int32) // nbz) % nby
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_t_9};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2590, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2590, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2590, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_1, __pyx_t_7); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = PyNumber_Remainder(__pyx_t_12, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_biy = __pyx_t_1;
  __pyx_t_1 = 0;
+2591:     biz = np.arange(num_blocks, dtype=np.int32) % nbz
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_12};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_2, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2591, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2591, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_9 = PyNumber_Remainder(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2591, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_biz = __pyx_t_9;
  __pyx_t_9 = 0;
+2592:     blo_x = (bix * Lx).astype(np.int32)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2592, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_bix, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2592, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2592, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2592, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2592, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_x = __pyx_t_9;
  __pyx_t_9 = 0;
+2593:     blo_y = (biy * Ly).astype(np.int32)
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_biy, __pyx_t_12); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_2 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_1};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2593, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_y = __pyx_t_9;
  __pyx_t_9 = 0;
+2594:     blo_z = (biz * Lz).astype(np.int32)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2594, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_biz, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2594, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2594, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2594, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2594, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_z = __pyx_t_9;
  __pyx_t_9 = 0;
 2595: 
+2596:     seeds = (np.arange(num_blocks, dtype=np.uint64) + np.uint64(passed_seed) + np.uint64(0x9E3779B9)) \
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_t_12};
    __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2596, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2596, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2596, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_passed_seed); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_7};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2596, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_12 = PyNumber_Add(__pyx_t_9, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_mstate_global->__pyx_int_2654435769};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2596, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_1 = PyNumber_Add(__pyx_t_12, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+2597:         * np.uint64(0x2545F4914F6CDD1D) + np.uint64(1)
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2597, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2597, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_mstate_global->__pyx_int_0x2545f4914f6cdd1d};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2597, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_7 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2597, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2597, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2597, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_1};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2597, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_9 = PyNumber_Add(__pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2597, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_seeds = __pyx_t_9;
  __pyx_t_9 = 0;
 2598: 
+2599:     out_delta = np.zeros(num_blocks, dtype=np.int64)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2599, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2599, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2599, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2599, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2599, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2599, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_2, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2599, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2599, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_out_delta = __pyx_t_9;
  __pyx_t_9 = 0;
+2600:     out_accepted = np.zeros(num_blocks, dtype=np.int32)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2600, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2600, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2600, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2600, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2600, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_12};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2600, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2600, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2600, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_out_accepted = __pyx_t_9;
  __pyx_t_9 = 0;
 2601: 
+2602:     cdef int[::1] chain_ids_mv = chain_ids
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_chain_ids, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2602, __pyx_L1_error)
  __pyx_v_chain_ids_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2603:     cdef int[::1] starts_mv = starts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_starts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2603, __pyx_L1_error)
  __pyx_v_starts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2604:     cdef int[::1] attempts_mv = attempts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_attempts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2604, __pyx_L1_error)
  __pyx_v_attempts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2605:     cdef unsigned long long[::1] seeds_mv = seeds
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_PY_LONG_LONG(__pyx_v_seeds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 2605, __pyx_L1_error)
  __pyx_v_seeds_mv = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+2606:     cdef int[::1] blo_x_mv = blo_x
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_x, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2606, __pyx_L1_error)
  __pyx_v_blo_x_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2607:     cdef int[::1] blo_y_mv = blo_y
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_y, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2607, __pyx_L1_error)
  __pyx_v_blo_y_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2608:     cdef int[::1] blo_z_mv = blo_z
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_z, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2608, __pyx_L1_error)
  __pyx_v_blo_z_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2609:     cdef long[::1] out_delta_mv = out_delta
  __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_long(__pyx_v_out_delta, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 2609, __pyx_L1_error)
  __pyx_v_out_delta_mv = __pyx_t_19;
  __pyx_t_19.memview = NULL;
  __pyx_t_19.data = NULL;
+2610:     cdef int[::1] out_accepted_mv = out_accepted
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_out_accepted, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2610, __pyx_L1_error)
  __pyx_v_out_accepted_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
 2611: 
 2612:     cdef int b
+2613:     cdef int nthreads = num_threads if num_threads > 0 else 1
  __pyx_t_8 = (__pyx_v_num_threads > 0);
  if (__pyx_t_8) {
    __pyx_t_6 = __pyx_v_num_threads;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_nthreads = __pyx_t_6;
 2614: 
+2615:     for b in prange(num_blocks, nogil=True, num_threads=nthreads, schedule='dynamic'):
  {
      PyThreadState * _save;
      _save = PyEval_SaveThread();
      __Pyx_FastGIL_Remember();
      /*try:*/ {
        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic)        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic) num_threads(__pyx_v_nthreads)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_b = (int)(0 + 1 * __pyx_t_10);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          __Pyx_FastGIL_Forget();
          PyEval_RestoreThread(_save);
          goto __pyx_L6;
        }
        __pyx_L6:;
      }
  }
+2616:         run_block_slither(b, chain_ids_mv, starts_mv, attempts_mv, seeds_mv,
                            __pyx_f_5pimms_15mega_crank_fast_run_block_slither(__pyx_v_b, __pyx_v_chain_ids_mv, __pyx_v_starts_mv, __pyx_v_attempts_mv, __pyx_v_seeds_mv, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_blo_x_mv, __pyx_v_blo_y_mv, __pyx_v_blo_z_mv, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_cur_scope->__pyx_v_W, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_invtemp, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall, __pyx_v_out_delta_mv, __pyx_v_out_accepted_mv);
                        }
                    }
                }
            }
        }
        #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
      }
 2617:                           chain_offset, chain_length, chain_homo,
 2618:                           blo_x_mv, blo_y_mv, blo_z_mv,
 2619:                           Lx, Ly, Lz, nbx, nby, nbz,
 2620:                           shift_x, shift_y, shift_z, W,
 2621:                           grid, type_grid, idx_to_bead,
 2622:                           interaction_table, LR_interaction_table, SLR_interaction_table,
 2623:                           angle_lookup, invtemp, XDIM, YDIM, ZDIM, hardwall,
 2624:                           out_delta_mv, out_accepted_mv)
 2625: 
+2626:     cdef long tot_d = 0
  __pyx_v_tot_d = 0;
+2627:     cdef int tot_a = 0
  __pyx_v_tot_a = 0;
+2628:     for b in range(num_blocks):
  __pyx_t_20 = __pyx_v_num_blocks;
  __pyx_t_10 = __pyx_t_20;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_10; __pyx_t_6+=1) {
    __pyx_v_b = __pyx_t_6;
+2629:         tot_d += out_delta_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_d = (__pyx_v_tot_d + (*((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta_mv.data) + __pyx_t_21)) ))));
+2630:         tot_a += out_accepted_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_a = (__pyx_v_tot_a + (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted_mv.data) + __pyx_t_21)) ))));
  }
+2631:     return (energy + tot_d, tot_a)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_9 = __Pyx_PyLong_From_long((__pyx_v_energy + __pyx_v_tot_d)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_tot_a); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 2631, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_2);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_2) != (0)) __PYX_ERR(0, 2631, __pyx_L1_error);
  __pyx_t_9 = 0;
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_7;
  __pyx_t_7 = 0;
  goto __pyx_L0;
 2632: 
 2633: 
+2634: cdef inline int _in_interior_2d(int x, int y,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast__in_interior_2d(int __pyx_v_x, int __pyx_v_y, int __pyx_v_blo_x_b, int __pyx_v_blo_y_b, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_W, int __pyx_v_XDIM, int __pyx_v_YDIM) {
  int __pyx_v_s;
  int __pyx_v_w;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._in_interior_2d", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 2635:                                 int blo_x_b, int blo_y_b,
 2636:                                 int Lx, int Ly, int nbx, int nby,
 2637:                                 int shift_x, int shift_y, int W,
 2638:                                 int XDIM, int YDIM) noexcept nogil:
 2639:     cdef int s, w
+2640:     if nbx > 1:
  __pyx_t_1 = (__pyx_v_nbx > 1);
  if (__pyx_t_1) {
/* … */
  }
+2641:         s = (x - shift_x + XDIM) % XDIM
    __pyx_t_2 = ((__pyx_v_x - __pyx_v_shift_x) + __pyx_v_XDIM);
    if (unlikely(__pyx_v_XDIM == 0)) {
      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
      PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
      __Pyx_PyGILState_Release(__pyx_gilstate_save);
      __PYX_ERR(0, 2641, __pyx_L1_error)
    }
    __pyx_v_s = __Pyx_mod_int(__pyx_t_2, __pyx_v_XDIM, 0);
+2642:         w = s - blo_x_b
    __pyx_v_w = (__pyx_v_s - __pyx_v_blo_x_b);
+2643:         if w < W or w >= Lx - W:
    __pyx_t_3 = (__pyx_v_w < __pyx_v_W);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L5_bool_binop_done;
    }
    __pyx_t_3 = (__pyx_v_w >= (__pyx_v_Lx - __pyx_v_W));
    __pyx_t_1 = __pyx_t_3;
    __pyx_L5_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
+2644:             return 0
      __pyx_r = 0;
      goto __pyx_L0;
+2645:     if nby > 1:
  __pyx_t_1 = (__pyx_v_nby > 1);
  if (__pyx_t_1) {
/* … */
  }
+2646:         s = (y - shift_y + YDIM) % YDIM
    __pyx_t_2 = ((__pyx_v_y - __pyx_v_shift_y) + __pyx_v_YDIM);
    if (unlikely(__pyx_v_YDIM == 0)) {
      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
      PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
      __Pyx_PyGILState_Release(__pyx_gilstate_save);
      __PYX_ERR(0, 2646, __pyx_L1_error)
    }
    __pyx_v_s = __Pyx_mod_int(__pyx_t_2, __pyx_v_YDIM, 0);
+2647:         w = s - blo_y_b
    __pyx_v_w = (__pyx_v_s - __pyx_v_blo_y_b);
+2648:         if w < W or w >= Ly - W:
    __pyx_t_3 = (__pyx_v_w < __pyx_v_W);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_3 = (__pyx_v_w >= (__pyx_v_Ly - __pyx_v_W));
    __pyx_t_1 = __pyx_t_3;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
+2649:             return 0
      __pyx_r = 0;
      goto __pyx_L0;
+2650:     return 1
  __pyx_r = 1;
  goto __pyx_L0;
 2651: 
 2652: 
+2653: cdef void run_block_slither_2D(int b,
static void __pyx_f_5pimms_15mega_crank_fast_run_block_slither_2D(int __pyx_v_b, __Pyx_memviewslice __pyx_v_chain_ids, __Pyx_memviewslice __pyx_v_starts, __Pyx_memviewslice __pyx_v_attempts, __Pyx_memviewslice __pyx_v_seeds, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_blo_x, __Pyx_memviewslice __pyx_v_blo_y, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_W, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, float __pyx_v_invtemp, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_hardwall, __Pyx_memviewslice __pyx_v_out_delta, __Pyx_memviewslice __pyx_v_out_accepted) {
  int __pyx_v_lo;
  int __pyx_v_hi;
  int __pyx_v_n_block;
  unsigned PY_LONG_LONG __pyx_v_rng;
  long __pyx_v_dsum;
  int __pyx_v_acc;
  CYTHON_UNUSED int __pyx_v_step;
  int __pyx_v_pick;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_homo;
  int __pyx_v_chainID;
  int __pyx_v_direction;
  int __pyx_v_k;
  int __pyx_v_ex;
  int __pyx_v_ey;
  int __pyx_v_nx;
  int __pyx_v_ny;
  int __pyx_v_vx;
  int __pyx_v_vy;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_cx;
  int __pyx_v_cy;
  long __pyx_v_de;
  int __pyx_v_newp[2];
  int __pyx_v_bx[512];
  int __pyx_v_by[512];
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.run_block_slither_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 2654:                                int[::1] chain_ids, int[::1] starts, int[::1] attempts,
 2655:                                unsigned long long[::1] seeds,
 2656:                                int[::1] chain_offset, int[::1] chain_length, int[::1] chain_homo,
 2657:                                int[::1] blo_x, int[::1] blo_y,
 2658:                                int Lx, int Ly, int nbx, int nby,
 2659:                                int shift_x, int shift_y, int W,
 2660:                                NUMPY_INT_TYPE[:, :] grid, NUMPY_INT_TYPE[:, :] type_grid,
 2661:                                NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 2662:                                NUMPY_INT_TYPE[:, :] interaction_table,
 2663:                                NUMPY_INT_TYPE[:, :] LR_interaction_table,
 2664:                                NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 2665:                                NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 2666:                                float invtemp, int XDIM, int YDIM, int hardwall,
 2667:                                long[::1] out_delta, int[::1] out_accepted) noexcept nogil:
 2668: 
+2669:     cdef int lo = starts[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2669, __pyx_L1_error)
  }
  __pyx_v_lo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+2670:     cdef int hi = starts[b + 1]
  __pyx_t_1 = (__pyx_v_b + 1);
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2670, __pyx_L1_error)
  }
  __pyx_v_hi = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+2671:     cdef int n_block = hi - lo
  __pyx_v_n_block = (__pyx_v_hi - __pyx_v_lo);
+2672:     out_delta[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2672, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = 0;
+2673:     out_accepted[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2673, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = 0;
+2674:     if n_block <= 0:
  __pyx_t_3 = (__pyx_v_n_block <= 0);
  if (__pyx_t_3) {
/* … */
  }
+2675:         return
    goto __pyx_L0;
 2676: 
+2677:     cdef unsigned long long rng = seeds[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_seeds.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_seeds.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2677, __pyx_L1_error)
  }
  __pyx_v_rng = (*((unsigned PY_LONG_LONG *) ( /* dim=0 */ ((char *) (((unsigned PY_LONG_LONG *) __pyx_v_seeds.data) + __pyx_t_1)) )));
+2678:     cdef long dsum = 0
  __pyx_v_dsum = 0;
+2679:     cdef int acc = 0
  __pyx_v_acc = 0;
 2680:     cdef int step, pick, c, off, L, homo, chainID, direction, k
 2681:     cdef int ex, ey, nx, ny, vx, vy, ox, oy, tx, ty, cx, cy
 2682:     cdef long de
 2683:     cdef int newp[2]
 2684:     cdef int bx[512]
 2685:     cdef int by[512]
 2686: 
+2687:     for step in range(attempts[b]):
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_attempts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_attempts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2687, __pyx_L1_error)
  }
  __pyx_t_2 = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_attempts.data) + __pyx_t_1)) )));
  __pyx_t_4 = __pyx_t_2;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_step = __pyx_t_5;
+2688:         pick = lo + <int>(rng_uniform(&rng) * n_block)
    __pyx_v_pick = (__pyx_v_lo + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform((&__pyx_v_rng)) * __pyx_v_n_block)));
+2689:         if pick >= hi:
    __pyx_t_3 = (__pyx_v_pick >= __pyx_v_hi);
    if (__pyx_t_3) {
/* … */
    }
+2690:             pick = hi - 1
      __pyx_v_pick = (__pyx_v_hi - 1);
+2691:         c = chain_ids[pick]
    __pyx_t_1 = __pyx_v_pick;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_ids.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_ids.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2691, __pyx_L1_error)
    }
    __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_ids.data) + __pyx_t_1)) )));
+2692:         off = chain_offset[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_offset.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_offset.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2692, __pyx_L1_error)
    }
    __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_1)) )));
+2693:         L = chain_length[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_length.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_length.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2693, __pyx_L1_error)
    }
    __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_1)) )));
+2694:         homo = chain_homo[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_homo.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_homo.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2694, __pyx_L1_error)
    }
    __pyx_v_homo = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_homo.data) + __pyx_t_1)) )));
+2695:         chainID = idx_to_bead[off, 4]
    __pyx_t_1 = __pyx_v_off;
    __pyx_t_7 = 4;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2695, __pyx_L1_error)
    }
    __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 2696: 
+2697:         if L == 1:
    __pyx_t_3 = (__pyx_v_L == 1);
    if (__pyx_t_3) {
/* … */
    }
+2698:             ox = idx_to_bead[off, 5]; oy = idx_to_bead[off, 6]
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_1 = 5;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2698, __pyx_L1_error)
      }
      __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_1 = __pyx_v_off;
      __pyx_t_7 = 6;
      __pyx_t_6 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2698, __pyx_L1_error)
      }
      __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2699:             if single_bead_crank_cp_2D(ox, oy, grid, XDIM, YDIM, &rng, newp) == 1:
      __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_single_bead_crank_cp_2D(__pyx_v_ox, __pyx_v_oy, __pyx_v_grid, __pyx_v_XDIM, __pyx_v_YDIM, (&__pyx_v_rng), __pyx_v_newp) == 1);
      if (__pyx_t_3) {
/* … */
      }
+2700:                 if _in_interior_2d(newp[0], newp[1], blo_x[b], blo_y[b],
        __pyx_t_7 = __pyx_v_b;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_blo_x.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_blo_x.shape[0])) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2700, __pyx_L1_error)
        }
        __pyx_t_1 = __pyx_v_b;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_blo_y.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_y.shape[0])) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2700, __pyx_L1_error)
        }
/* … */
        if (__pyx_t_3) {
/* … */
        }
+2701:                                    Lx, Ly, nbx, nby, shift_x, shift_y, W, XDIM, YDIM) == 0:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast__in_interior_2d((__pyx_v_newp[0]), (__pyx_v_newp[1]), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_7)) ))), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_1)) ))), __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W, __pyx_v_XDIM, __pyx_v_YDIM) == 0);
+2702:                     continue
          goto __pyx_L4_continue;
+2703:                 de = get_energy_change_2D_c(grid, type_grid, ox, oy, newp[0], newp[1],
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, (__pyx_v_newp[0]), (__pyx_v_newp[1]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+2704:                                             idx_to_bead[off, 1], interaction_table, LR_interaction_table,
        __pyx_t_1 = __pyx_v_off;
        __pyx_t_7 = 1;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2704, __pyx_L1_error)
        }
 2705:                                             SLR_interaction_table, XDIM, YDIM, hardwall)
+2706:                 de = de + get_angle_energy_change_2D_c(off, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c(__pyx_v_off, __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2707:                 if accept_p(invtemp, de, &rng) == 1:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, __pyx_v_de, (&__pyx_v_rng)) == 1);
        if (__pyx_t_3) {
/* … */
        }
+2708:                     _apply_bead_move_2D(grid, type_grid, idx_to_bead, off, ox, oy, newp[0], newp[1], chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_ox, __pyx_v_oy, (__pyx_v_newp[0]), (__pyx_v_newp[1]), __pyx_v_chainID);
+2709:                     dsum = dsum + de
          __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+2710:                     acc = acc + 1
          __pyx_v_acc = (__pyx_v_acc + 1);
+2711:             continue
      goto __pyx_L4_continue;
 2712: 
+2713:         if homo == 0 and L > 512:
    __pyx_t_8 = (__pyx_v_homo == 0);
    if (__pyx_t_8) {
    } else {
      __pyx_t_3 = __pyx_t_8;
      goto __pyx_L12_bool_binop_done;
    }
    __pyx_t_8 = (__pyx_v_L > 0x200);
    __pyx_t_3 = __pyx_t_8;
    __pyx_L12_bool_binop_done:;
    if (__pyx_t_3) {
/* … */
    }
+2714:             continue
      goto __pyx_L4_continue;
 2715: 
+2716:         direction = rng_randint(&rng, 0, 1)
    __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 1);
+2717:         if direction == 0:
    __pyx_t_3 = (__pyx_v_direction == 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L14;
    }
+2718:             ex = idx_to_bead[off + L - 1, 5]; ey = idx_to_bead[off + L - 1, 6]
      __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
      __pyx_t_1 = 5;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2718, __pyx_L1_error)
      }
      __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_1 = ((__pyx_v_off + __pyx_v_L) - 1);
      __pyx_t_7 = 6;
      __pyx_t_6 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2718, __pyx_L1_error)
      }
      __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 2719:         else:
+2720:             ex = idx_to_bead[off, 5]; ey = idx_to_bead[off, 6]
    /*else*/ {
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_1 = 5;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2720, __pyx_L1_error)
      }
      __pyx_v_ex = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_1 = __pyx_v_off;
      __pyx_t_7 = 6;
      __pyx_t_6 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2720, __pyx_L1_error)
      }
      __pyx_v_ey = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
    }
    __pyx_L14:;
 2721: 
+2722:         nx = pbc_correction(ex + rng_randint(&rng, 0, 2) - 1, XDIM)
    __pyx_v_nx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ex + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 2)) - 1), __pyx_v_XDIM);
+2723:         ny = pbc_correction(ey + rng_randint(&rng, 0, 2) - 1, YDIM)
    __pyx_v_ny = __pyx_f_5pimms_15mega_crank_fast_pbc_correction(((__pyx_v_ey + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 2)) - 1), __pyx_v_YDIM);
 2724: 
+2725:         if grid[nx, ny] > 0:
    __pyx_t_7 = __pyx_v_nx;
    __pyx_t_1 = __pyx_v_ny;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_grid.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_grid.shape[1];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2725, __pyx_L1_error)
    }
    __pyx_t_3 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_7 * __pyx_v_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_grid.strides[1]) ))) > 0);
    if (__pyx_t_3) {
/* … */
    }
+2726:             continue
      goto __pyx_L4_continue;
+2727:         if hardwall == 1:
    __pyx_t_3 = (__pyx_v_hardwall == 1);
    if (__pyx_t_3) {
/* … */
    }
+2728:             if straddle_pair(ex, ey, 0, nx, ny, 0) == 1:
      __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_straddle_pair(__pyx_v_ex, __pyx_v_ey, 0, __pyx_v_nx, __pyx_v_ny, 0) == 1);
      if (__pyx_t_3) {
/* … */
      }
+2729:                 continue
        goto __pyx_L4_continue;
 2730: 
+2731:         if _in_interior_2d(nx, ny, blo_x[b], blo_y[b],
    __pyx_t_1 = __pyx_v_b;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_blo_x.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_x.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2731, __pyx_L1_error)
    }
    __pyx_t_7 = __pyx_v_b;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_blo_y.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_blo_y.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 2731, __pyx_L1_error)
    }
/* … */
    if (__pyx_t_3) {
/* … */
    }
+2732:                            Lx, Ly, nbx, nby, shift_x, shift_y, W, XDIM, YDIM) == 0:
    __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast__in_interior_2d(__pyx_v_nx, __pyx_v_ny, (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) ))), (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_7)) ))), __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W, __pyx_v_XDIM, __pyx_v_YDIM) == 0);
+2733:             continue
      goto __pyx_L4_continue;
 2734: 
+2735:         if homo == 1:
    __pyx_t_3 = (__pyx_v_homo == 1);
    if (__pyx_t_3) {
/* … */
    }
+2736:             if direction == 0:
      __pyx_t_3 = (__pyx_v_direction == 0);
      if (__pyx_t_3) {
/* … */
        goto __pyx_L20;
      }
+2737:                 vx = idx_to_bead[off, 5]; vy = idx_to_bead[off, 6]
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_1 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2737, __pyx_L1_error)
        }
        __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_1 = __pyx_v_off;
        __pyx_t_7 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2737, __pyx_L1_error)
        }
        __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 2738:             else:
+2739:                 vx = idx_to_bead[off + L - 1, 5]; vy = idx_to_bead[off + L - 1, 6]
      /*else*/ {
        __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_1 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2739, __pyx_L1_error)
        }
        __pyx_v_vx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_1 = ((__pyx_v_off + __pyx_v_L) - 1);
        __pyx_t_7 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2739, __pyx_L1_error)
        }
        __pyx_v_vy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      }
      __pyx_L20:;
 2740: 
+2741:             de = get_energy_change_2D_c(grid, type_grid, vx, vy, nx, ny,
      __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_vx, __pyx_v_vy, __pyx_v_nx, __pyx_v_ny, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+2742:                                         idx_to_bead[off, 1], interaction_table, LR_interaction_table,
      __pyx_t_7 = __pyx_v_off;
      __pyx_t_1 = 1;
      __pyx_t_6 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 2742, __pyx_L1_error)
      }
 2743:                                         SLR_interaction_table, XDIM, YDIM, hardwall)
+2744:             de = de + (_chain_angle_mode_2D(idx_to_bead, off, L, 1 if direction == 0 else 2, nx, ny, angle_lookup)
      __pyx_t_3 = (__pyx_v_direction == 0);
      if (__pyx_t_3) {
        __pyx_t_6 = 1;
      } else {
        __pyx_t_6 = 2;
      }
/* … */
      __pyx_v_de = (__pyx_v_de + (__pyx_f_5pimms_15mega_crank_fast__chain_angle_mode_2D(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, __pyx_t_6, __pyx_v_nx, __pyx_v_ny, __pyx_v_angle_lookup) - __pyx_f_5pimms_15mega_crank_fast__chain_angle_mode_2D(__pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_L, 0, 0, 0, __pyx_v_angle_lookup)));
 2745:                        - _chain_angle_mode_2D(idx_to_bead, off, L, 0, 0, 0, angle_lookup))
 2746: 
+2747:             if accept_p(invtemp, de, &rng) == 1:
      __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, __pyx_v_de, (&__pyx_v_rng)) == 1);
      if (__pyx_t_3) {
/* … */
      }
+2748:                 grid[vx, vy] = 0; type_grid[vx, vy] = 0
        __pyx_t_1 = __pyx_v_vx;
        __pyx_t_7 = __pyx_v_vy;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2748, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = 0;
        __pyx_t_7 = __pyx_v_vx;
        __pyx_t_1 = __pyx_v_vy;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2748, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )) = 0;
+2749:                 grid[nx, ny] = chainID; type_grid[nx, ny] = idx_to_bead[off, 2]
        __pyx_t_1 = __pyx_v_nx;
        __pyx_t_7 = __pyx_v_ny;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2749, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = __pyx_v_chainID;
        __pyx_t_7 = __pyx_v_off;
        __pyx_t_1 = 2;
        __pyx_t_6 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2749, __pyx_L1_error)
        }
        __pyx_t_9 = __pyx_v_nx;
        __pyx_t_10 = __pyx_v_ny;
        __pyx_t_6 = -1;
        if (__pyx_t_9 < 0) {
          __pyx_t_9 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_9 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_9 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_10 < 0) {
          __pyx_t_10 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_10 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_10 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 2749, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_9 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_10 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2750:                 if direction == 0:
        __pyx_t_3 = (__pyx_v_direction == 0);
        if (__pyx_t_3) {
/* … */
          goto __pyx_L22;
        }
+2751:                     for k in range(0, L - 1):
          __pyx_t_11 = (__pyx_v_L - 1);
          __pyx_t_12 = __pyx_t_11;
          for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_12; __pyx_t_6+=1) {
            __pyx_v_k = __pyx_t_6;
+2752:                         idx_to_bead[off + k, 5] = idx_to_bead[off + k + 1, 5]
            __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) + 1);
            __pyx_t_7 = 5;
            __pyx_t_13 = -1;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2752, __pyx_L1_error)
            }
            __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_9 = 5;
            __pyx_t_13 = -1;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_9 < 0) {
              __pyx_t_9 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_9 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_9 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2752, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2753:                         idx_to_bead[off + k, 6] = idx_to_bead[off + k + 1, 6]
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) + 1);
            __pyx_t_1 = 6;
            __pyx_t_13 = -1;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2753, __pyx_L1_error)
            }
            __pyx_t_9 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_10 = 6;
            __pyx_t_13 = -1;
            if (__pyx_t_9 < 0) {
              __pyx_t_9 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_9 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_9 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2753, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
          }
+2754:                     idx_to_bead[off + L - 1, 5] = nx; idx_to_bead[off + L - 1, 6] = ny
          __pyx_t_1 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_7 = 5;
          __pyx_t_6 = -1;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2754, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
          __pyx_t_7 = ((__pyx_v_off + __pyx_v_L) - 1);
          __pyx_t_1 = 6;
          __pyx_t_6 = -1;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2754, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
 2755:                 else:
+2756:                     for k in range(L - 1, 0, -1):
        /*else*/ {
          for (__pyx_t_6 = (__pyx_v_L - 1); __pyx_t_6 > 0; __pyx_t_6-=1) {
            __pyx_v_k = __pyx_t_6;
+2757:                         idx_to_bead[off + k, 5] = idx_to_bead[off + k - 1, 5]
            __pyx_t_1 = ((__pyx_v_off + __pyx_v_k) - 1);
            __pyx_t_7 = 5;
            __pyx_t_13 = -1;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2757, __pyx_L1_error)
            }
            __pyx_t_10 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_9 = 5;
            __pyx_t_13 = -1;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_9 < 0) {
              __pyx_t_9 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_9 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_9 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2757, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_10 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_9 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2758:                         idx_to_bead[off + k, 6] = idx_to_bead[off + k - 1, 6]
            __pyx_t_7 = ((__pyx_v_off + __pyx_v_k) - 1);
            __pyx_t_1 = 6;
            __pyx_t_13 = -1;
            if (__pyx_t_7 < 0) {
              __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_1 < 0) {
              __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2758, __pyx_L1_error)
            }
            __pyx_t_9 = (__pyx_v_off + __pyx_v_k);
            __pyx_t_10 = 6;
            __pyx_t_13 = -1;
            if (__pyx_t_9 < 0) {
              __pyx_t_9 += __pyx_v_idx_to_bead.shape[0];
              if (unlikely(__pyx_t_9 < 0)) __pyx_t_13 = 0;
            } else if (unlikely(__pyx_t_9 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
            if (__pyx_t_10 < 0) {
              __pyx_t_10 += __pyx_v_idx_to_bead.shape[1];
              if (unlikely(__pyx_t_10 < 0)) __pyx_t_13 = 1;
            } else if (unlikely(__pyx_t_10 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
            if (unlikely(__pyx_t_13 != -1)) {
              __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
              __PYX_ERR(0, 2758, __pyx_L1_error)
            }
            *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_9 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_10 * __pyx_v_idx_to_bead.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
          }
+2759:                     idx_to_bead[off, 5] = nx; idx_to_bead[off, 6] = ny
          __pyx_t_1 = __pyx_v_off;
          __pyx_t_7 = 5;
          __pyx_t_6 = -1;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2759, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_nx;
          __pyx_t_7 = __pyx_v_off;
          __pyx_t_1 = 6;
          __pyx_t_6 = -1;
          if (__pyx_t_7 < 0) {
            __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
            if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
          } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
          if (__pyx_t_1 < 0) {
            __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
            if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
          } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
          if (unlikely(__pyx_t_6 != -1)) {
            __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
            __PYX_ERR(0, 2759, __pyx_L1_error)
          }
          *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = __pyx_v_ny;
        }
        __pyx_L22:;
+2760:                 dsum = dsum + de
        __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+2761:                 acc = acc + 1
        __pyx_v_acc = (__pyx_v_acc + 1);
+2762:             continue
      goto __pyx_L4_continue;
 2763: 
+2764:         for k in range(L):
    __pyx_t_6 = __pyx_v_L;
    __pyx_t_13 = __pyx_t_6;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_k = __pyx_t_14;
+2765:             bx[k] = idx_to_bead[off + k, 5]; by[k] = idx_to_bead[off + k, 6]
      __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
      __pyx_t_7 = 5;
      __pyx_t_15 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
      if (unlikely(__pyx_t_15 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
        __PYX_ERR(0, 2765, __pyx_L1_error)
      }
      (__pyx_v_bx[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
      __pyx_t_1 = 6;
      __pyx_t_15 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
      if (unlikely(__pyx_t_15 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
        __PYX_ERR(0, 2765, __pyx_L1_error)
      }
      (__pyx_v_by[__pyx_v_k]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
    }
 2766: 
+2767:         de = 0
    __pyx_v_de = 0;
+2768:         if direction == 0:
    __pyx_t_3 = (__pyx_v_direction == 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L29;
    }
+2769:             for k in range(L - 1, -1, -1):
      for (__pyx_t_6 = (__pyx_v_L - 1); __pyx_t_6 > -1; __pyx_t_6-=1) {
        __pyx_v_k = __pyx_t_6;
+2770:                 ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        __pyx_t_13 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
        if (unlikely(__pyx_t_13 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
          __PYX_ERR(0, 2770, __pyx_L1_error)
        }
        __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_13 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
        if (unlikely(__pyx_t_13 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
          __PYX_ERR(0, 2770, __pyx_L1_error)
        }
        __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2771:                 if k == L - 1:
        __pyx_t_3 = (__pyx_v_k == (__pyx_v_L - 1));
        if (__pyx_t_3) {
/* … */
          goto __pyx_L32;
        }
+2772:                     tx = nx; ty = ny
          __pyx_v_tx = __pyx_v_nx;
          __pyx_v_ty = __pyx_v_ny;
 2773:                 else:
+2774:                     tx = bx[k + 1]; ty = by[k + 1]
        /*else*/ {
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k + 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_k + 1)]);
        }
        __pyx_L32:;
+2775:                 de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+2776:                                                  idx_to_bead[off + k, 1], interaction_table,
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 1;
        __pyx_t_13 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_13 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_13 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_13 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_13 = 1;
        if (unlikely(__pyx_t_13 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_13);
          __PYX_ERR(0, 2776, __pyx_L1_error)
        }
 2777:                                                  LR_interaction_table, SLR_interaction_table,
 2778:                                                  XDIM, YDIM, hardwall)
+2779:                 newp[0] = tx; newp[1] = ty
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
+2780:                 de = de + get_angle_energy_change_2D_c(off + k, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2781:                 _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + k, ox, oy, tx, ty, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
      }
 2782:         else:
+2783:             for k in range(0, L):
    /*else*/ {
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_13 = __pyx_t_6;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_k = __pyx_t_14;
+2784:                 ox = idx_to_bead[off + k, 5]; oy = idx_to_bead[off + k, 6]
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 5;
        __pyx_t_15 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2784, __pyx_L1_error)
        }
        __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 6;
        __pyx_t_15 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2784, __pyx_L1_error)
        }
        __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+2785:                 if k == 0:
        __pyx_t_3 = (__pyx_v_k == 0);
        if (__pyx_t_3) {
/* … */
          goto __pyx_L35;
        }
+2786:                     tx = nx; ty = ny
          __pyx_v_tx = __pyx_v_nx;
          __pyx_v_ty = __pyx_v_ny;
 2787:                 else:
+2788:                     tx = bx[k - 1]; ty = by[k - 1]
        /*else*/ {
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_k - 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_k - 1)]);
        }
        __pyx_L35:;
+2789:                 de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+2790:                                                  idx_to_bead[off + k, 1], interaction_table,
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 1;
        __pyx_t_15 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2790, __pyx_L1_error)
        }
 2791:                                                  LR_interaction_table, SLR_interaction_table,
 2792:                                                  XDIM, YDIM, hardwall)
+2793:                 newp[0] = tx; newp[1] = ty
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
+2794:                 de = de + get_angle_energy_change_2D_c(off + k, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_k), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+2795:                 _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + k, ox, oy, tx, ty, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_k), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
      }
    }
    __pyx_L29:;
 2796: 
+2797:         if accept_p(invtemp, de, &rng) == 1:
    __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p(__pyx_v_invtemp, __pyx_v_de, (&__pyx_v_rng)) == 1);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L36;
    }
+2798:             dsum = dsum + de
      __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+2799:             acc = acc + 1
      __pyx_v_acc = (__pyx_v_acc + 1);
 2800:         else:
+2801:             for k in range(L):
    /*else*/ {
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_13 = __pyx_t_6;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_k = __pyx_t_14;
+2802:                 cx = idx_to_bead[off + k, 5]; cy = idx_to_bead[off + k, 6]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        __pyx_t_15 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2802, __pyx_L1_error)
        }
        __pyx_v_cx = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_15 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2802, __pyx_L1_error)
        }
        __pyx_v_cy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2803:                 grid[cx, cy] = 0; type_grid[cx, cy] = 0
        __pyx_t_1 = __pyx_v_cx;
        __pyx_t_7 = __pyx_v_cy;
        __pyx_t_15 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2803, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = 0;
        __pyx_t_7 = __pyx_v_cx;
        __pyx_t_1 = __pyx_v_cy;
        __pyx_t_15 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_type_grid.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2803, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_1 * __pyx_v_type_grid.strides[1]) )) = 0;
      }
+2804:             for k in range(L):
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_13 = __pyx_t_6;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_k = __pyx_t_14;
+2805:                 grid[bx[k], by[k]] = chainID
        __pyx_t_1 = (__pyx_v_bx[__pyx_v_k]);
        __pyx_t_7 = (__pyx_v_by[__pyx_v_k]);
        __pyx_t_15 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_grid.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2805, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_1 * __pyx_v_grid.strides[0]) ) + __pyx_t_7 * __pyx_v_grid.strides[1]) )) = __pyx_v_chainID;
+2806:                 type_grid[bx[k], by[k]] = idx_to_bead[off + k, 2]
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 2;
        __pyx_t_15 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2806, __pyx_L1_error)
        }
        __pyx_t_10 = (__pyx_v_bx[__pyx_v_k]);
        __pyx_t_9 = (__pyx_v_by[__pyx_v_k]);
        __pyx_t_15 = -1;
        if (__pyx_t_10 < 0) {
          __pyx_t_10 += __pyx_v_type_grid.shape[0];
          if (unlikely(__pyx_t_10 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_10 >= __pyx_v_type_grid.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_9 < 0) {
          __pyx_t_9 += __pyx_v_type_grid.shape[1];
          if (unlikely(__pyx_t_9 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_9 >= __pyx_v_type_grid.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2806, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_10 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+2807:                 idx_to_bead[off + k, 5] = bx[k]; idx_to_bead[off + k, 6] = by[k]
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_7 = 5;
        __pyx_t_15 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2807, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_bx[__pyx_v_k]);
        __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 6;
        __pyx_t_15 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_7 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_7 < 0)) __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_15);
          __PYX_ERR(0, 2807, __pyx_L1_error)
        }
        *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )) = (__pyx_v_by[__pyx_v_k]);
      }
    }
    __pyx_L36:;
    __pyx_L4_continue:;
  }
 2808: 
+2809:     out_delta[b] = dsum
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2809, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = __pyx_v_dsum;
+2810:     out_accepted[b] = acc
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 2810, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = __pyx_v_acc;
 2811: 
 2812: 
+2813: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_21mega_slither_parallel_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_20mega_slither_parallel_2D, "\n    Parallel 2D slither megamove (the 2D analogue of mega_slither_parallel).\n    Returns (energy, accepted).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_21mega_slither_parallel_2D = {"mega_slither_parallel_2D", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_21mega_slither_parallel_2D, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_20mega_slither_parallel_2D};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_21mega_slither_parallel_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  CYTHON_UNUSED int __pyx_v_max_chain_len;
  int __pyx_v_num_threads;
  __Pyx_memviewslice __pyx_v_frozen_mask = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_slither_parallel_2D (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,&__pyx_mstate_global->__pyx_n_u_num_threads,&__pyx_mstate_global->__pyx_n_u_frozen_mask,0};
  PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 2813, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 18:
        values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 17:
        values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2813, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_slither_parallel_2D", 0) < (0)) __PYX_ERR(0, 2813, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 18; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_slither_parallel_2D", 1, 18, 18, i); __PYX_ERR(0, 2813, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 18)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 2813, __pyx_L3_error)
      values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 2813, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 2815, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 2816, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 2817, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 2818, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 2819, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 2820, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 2821, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 2822, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 2823, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 2824, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 2825, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 2826, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 2827, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2828, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2829, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2830, __pyx_L3_error)
    __pyx_v_num_threads = __Pyx_PyLong_As_int(values[16]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2831, __pyx_L3_error)
    __pyx_v_frozen_mask = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[17], PyBUF_WRITABLE); if (unlikely(!__pyx_v_frozen_mask.memview)) __PYX_ERR(0, 2832, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_slither_parallel_2D", 1, 18, 18, __pyx_nargs); __PYX_ERR(0, 2813, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_20mega_slither_parallel_2D(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len, __pyx_v_num_threads, __pyx_v_frozen_mask);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_5pimms_15mega_crank_fast_20mega_slither_parallel_2D(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, CYTHON_UNUSED int __pyx_v_max_chain_len, int __pyx_v_num_threads, __Pyx_memviewslice __pyx_v_frozen_mask) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D *__pyx_cur_scope;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_num_chains;
  int __pyx_v_n_steps;
  PyObject *__pyx_v_idx_np = NULL;
  int __pyx_v_R_int;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_Lx;
  int __pyx_v_Ly;
  int __pyx_v_num_blocks;
  PyObject *__pyx_v_rstate = NULL;
  int __pyx_v_shift_x;
  int __pyx_v_shift_y;
  PyObject *__pyx_v_gx = NULL;
  PyObject *__pyx_v_gy = NULL;
  PyObject *__pyx_v_dim_block = 0;
  PyObject *__pyx_v_bxj = NULL;
  PyObject *__pyx_v_byj = NULL;
  PyObject *__pyx_v_block_of_bead = NULL;
  PyObject *__pyx_v_chain_block = NULL;
  PyObject *__pyx_v_movable = NULL;
  PyObject *__pyx_v_mblocks = NULL;
  PyObject *__pyx_v_order = NULL;
  PyObject *__pyx_v_chain_ids = NULL;
  PyObject *__pyx_v_sorted_blocks = NULL;
  PyObject *__pyx_v_counts = NULL;
  PyObject *__pyx_v_starts = NULL;
  PyObject *__pyx_v_total_movable = NULL;
  PyObject *__pyx_v_attempts = NULL;
  PyObject *__pyx_v_bix = NULL;
  PyObject *__pyx_v_biy = NULL;
  PyObject *__pyx_v_blo_x = NULL;
  PyObject *__pyx_v_blo_y = NULL;
  PyObject *__pyx_v_seeds = NULL;
  PyObject *__pyx_v_out_delta = NULL;
  PyObject *__pyx_v_out_accepted = NULL;
  __Pyx_memviewslice __pyx_v_chain_ids_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_starts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_attempts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_seeds_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_x_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_y_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_delta_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_accepted_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_b;
  CYTHON_UNUSED int __pyx_v_nthreads;
  long __pyx_v_tot_d;
  int __pyx_v_tot_a;
  PyObject *__pyx_r = NULL;
  __pyx_cur_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D *)__pyx_tp_new_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D(__pyx_mstate_global->__pyx_ptype_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D, __pyx_mstate_global->__pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 2813, __pyx_L1_error)
  } else {
    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
  }
/* … */
  /* 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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_16);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_18, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_19, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_idx_np);
  __Pyx_XDECREF(__pyx_v_rstate);
  __Pyx_XDECREF(__pyx_v_gx);
  __Pyx_XDECREF(__pyx_v_gy);
  __Pyx_XDECREF(__pyx_v_dim_block);
  __Pyx_XDECREF(__pyx_v_bxj);
  __Pyx_XDECREF(__pyx_v_byj);
  __Pyx_XDECREF(__pyx_v_block_of_bead);
  __Pyx_XDECREF(__pyx_v_chain_block);
  __Pyx_XDECREF(__pyx_v_movable);
  __Pyx_XDECREF(__pyx_v_mblocks);
  __Pyx_XDECREF(__pyx_v_order);
  __Pyx_XDECREF(__pyx_v_chain_ids);
  __Pyx_XDECREF(__pyx_v_sorted_blocks);
  __Pyx_XDECREF(__pyx_v_counts);
  __Pyx_XDECREF(__pyx_v_starts);
  __Pyx_XDECREF(__pyx_v_total_movable);
  __Pyx_XDECREF(__pyx_v_attempts);
  __Pyx_XDECREF(__pyx_v_bix);
  __Pyx_XDECREF(__pyx_v_biy);
  __Pyx_XDECREF(__pyx_v_blo_x);
  __Pyx_XDECREF(__pyx_v_blo_y);
  __Pyx_XDECREF(__pyx_v_seeds);
  __Pyx_XDECREF(__pyx_v_out_delta);
  __Pyx_XDECREF(__pyx_v_out_accepted);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_ids_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_starts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_attempts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_seeds_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_x_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_y_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_delta_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_accepted_mv, 1);
  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_21mega_slither_parallel_2D, 0, __pyx_mstate_global->__pyx_n_u_mega_slither_parallel_2D, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[16])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2813, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_slither_parallel_2D, __pyx_t_4) < (0)) __PYX_ERR(0, 2813, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D {
  PyObject_HEAD
  int __pyx_v_W;
  int __pyx_v_num_beads;
};

 2814: @cython.boundscheck(False)
 2815: def mega_slither_parallel_2D(NUMPY_INT_TYPE[:, :] grid,
 2816:                              NUMPY_INT_TYPE[:, :] type_grid,
 2817:                              NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 2818:                              int[::1] chain_offset,
 2819:                              int[::1] chain_length,
 2820:                              int[::1] chain_homo,
 2821:                              int[::1] chain_selector,
 2822:                              NUMPY_INT_TYPE[:, :] interaction_table,
 2823:                              NUMPY_INT_TYPE[:, :] LR_interaction_table,
 2824:                              NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 2825:                              NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 2826:                              long energy,
 2827:                              float invtemp,
 2828:                              int passed_seed,
 2829:                              int hardwall,
 2830:                              int max_chain_len,
 2831:                              int num_threads,
 2832:                           NUMPY_INT_TYPE[::1] frozen_mask):
 2833:     """
 2834:     Parallel 2D slither megamove (the 2D analogue of mega_slither_parallel).
 2835:     Returns (energy, accepted).
 2836:     """
+2837:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+2838:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+2839:     cdef int num_beads = idx_to_bead.shape[0]
  __pyx_cur_scope->__pyx_v_num_beads = (__pyx_v_idx_to_bead.shape[0]);
+2840:     cdef int num_chains = chain_offset.shape[0]
  __pyx_v_num_chains = (__pyx_v_chain_offset.shape[0]);
+2841:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
 2842: 
+2843:     idx_np = np.asarray(idx_to_bead)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2843, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2843, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_idx_to_bead, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2843, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2843, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_idx_np = __pyx_t_1;
  __pyx_t_1 = 0;
+2844:     cdef int R_int = 3 if np.any(idx_np[:, 1] == 1) else 1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2844, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2844, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[1]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2844, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2844, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2844, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 2844, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_8) {
    __pyx_t_6 = 3;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_R_int = __pyx_t_6;
+2845:     cdef int W = R_int + 2
  __pyx_cur_scope->__pyx_v_W = (__pyx_v_R_int + 2);
 2846: 
+2847:     cdef int cap = 4
  __pyx_v_cap = 4;
+2848:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2848, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2848, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2848, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2848, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_4, __pyx_t_3, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2848, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2848, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbx = __pyx_t_6;
+2849:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2849, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2849, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2849, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2849, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, __pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2849, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2849, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nby = __pyx_t_6;
+2850:     cdef int Lx = XDIM // nbx
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 2850, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 2850, __pyx_L1_error)
  }
  __pyx_v_Lx = __Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0);
+2851:     cdef int Ly = YDIM // nby
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 2851, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 2851, __pyx_L1_error)
  }
  __pyx_v_Ly = __Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0);
+2852:     cdef int num_blocks = nbx * nby
  __pyx_v_num_blocks = (__pyx_v_nbx * __pyx_v_nby);
 2853: 
+2854:     rstate = np.random.RandomState(passed_seed & 0x7FFFFFFF)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_9 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_9);
  __pyx_t_2 = __Pyx_PyLong_From_long((__pyx_v_passed_seed & 0x7FFFFFFF)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_RandomState, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2854, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_rstate = __pyx_t_1;
  __pyx_t_1 = 0;
+2855:     cdef int shift_x = int(rstate.randint(0, Lx)) if nbx > 1 else 0
  __pyx_t_8 = (__pyx_v_nbx > 1);
  if (__pyx_t_8) {
    __pyx_t_4 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_mstate_global->__pyx_int_0, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2855, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_t_2 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2855, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_2); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2855, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_x = __pyx_t_6;
+2856:     cdef int shift_y = int(rstate.randint(0, Ly)) if nby > 1 else 0
  __pyx_t_8 = (__pyx_v_nby > 1);
  if (__pyx_t_8) {
    __pyx_t_1 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2856, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_0, __pyx_t_4};
      __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2856, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_t_4 = __Pyx_PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2856, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_4); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 2856, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_y = __pyx_t_6;
 2857: 
+2858:     gx = idx_np[:, 5].astype(np.int64)
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[2]); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2858, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2858, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2858, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2858, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_v_gx = __pyx_t_4;
  __pyx_t_4 = 0;
+2859:     gy = idx_np[:, 6].astype(np.int64)
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[3]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2859, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2859, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2859, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_9};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2859, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_v_gy = __pyx_t_4;
  __pyx_t_4 = 0;
 2860: 
+2861:     def dim_block(g, nb, L, DIM, shift):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_1dim_block = {"dim_block", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_1dim_block, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_g = 0;
  PyObject *__pyx_v_nb = 0;
  PyObject *__pyx_v_L = 0;
  PyObject *__pyx_v_DIM = 0;
  PyObject *__pyx_v_shift = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dim_block (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_g,&__pyx_mstate_global->__pyx_n_u_nb,&__pyx_mstate_global->__pyx_n_u_L,&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_shift,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 2861, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2861, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2861, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2861, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2861, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2861, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "dim_block", 0) < (0)) __PYX_ERR(0, 2861, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, i); __PYX_ERR(0, 2861, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 2861, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 2861, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 2861, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 2861, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 2861, __pyx_L3_error)
    }
    __pyx_v_g = values[0];
    __pyx_v_nb = values[1];
    __pyx_v_L = values[2];
    __pyx_v_DIM = values[3];
    __pyx_v_shift = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 2861, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel_2D.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_dim_block(__pyx_self, __pyx_v_g, __pyx_v_nb, __pyx_v_L, __pyx_v_DIM, __pyx_v_shift);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_dim_block(PyObject *__pyx_self, PyObject *__pyx_v_g, PyObject *__pyx_v_nb, PyObject *__pyx_v_L, PyObject *__pyx_v_DIM, PyObject *__pyx_v_shift) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D *__pyx_cur_scope;
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D *__pyx_outer_scope;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_bj = NULL;
  PyObject *__pyx_v_within = NULL;
  PyObject *__pyx_v_bad = NULL;
  PyObject *__pyx_r = NULL;
  __pyx_outer_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_3_mega_slither_parallel_2D *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_slither_parallel_2D.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_bj);
  __Pyx_XDECREF(__pyx_v_within);
  __Pyx_XDECREF(__pyx_v_bad);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_1dim_block, 0, __pyx_mstate_global->__pyx_n_u_mega_slither_parallel_2D_locals, ((PyObject*)__pyx_cur_scope), __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[3])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2861, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_dim_block = __pyx_t_4;
  __pyx_t_4 = 0;
+2862:         if nb == 1:
  __pyx_t_1 = (__Pyx_PyLong_BoolEqObjC(__pyx_v_nb, __pyx_mstate_global->__pyx_int_1, 1, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 2862, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+2863:             return np.zeros(num_beads, dtype=np.int64)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2863, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2863, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_num_beads); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2863, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2863, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2863, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_8 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_6 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2863, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_6, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2863, __pyx_L1_error)
      __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_8, (2-__pyx_t_8) | (__pyx_t_8*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_6);
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2863, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+2864:         s = (g - shift) % DIM
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_g, __pyx_v_shift); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2864, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyNumber_Remainder(__pyx_t_2, __pyx_v_DIM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2864, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_5;
  __pyx_t_5 = 0;
+2865:         bj = s // L
  __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_s, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2865, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_bj = __pyx_t_5;
  __pyx_t_5 = 0;
+2866:         within = s - bj * L
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_bj, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2866, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2866, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_within = __pyx_t_2;
  __pyx_t_2 = 0;
+2867:         bad = (s >= nb * L) | (within < W) | (within >= L - W)
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nb, __pyx_v_L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_s, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_L, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Or(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2867, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_bad = __pyx_t_5;
  __pyx_t_5 = 0;
+2868:         bj = bj.copy()
  __pyx_t_6 = __pyx_v_bj;
  __Pyx_INCREF(__pyx_t_6);
  __pyx_t_8 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
    __pyx_t_5 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_copy, __pyx_callargs+__pyx_t_8, (1-__pyx_t_8) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 2868, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
  }
  __Pyx_DECREF_SET(__pyx_v_bj, __pyx_t_5);
  __pyx_t_5 = 0;
+2869:         bj[bad] = -1
  if (unlikely((PyObject_SetItem(__pyx_v_bj, __pyx_v_bad, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 2869, __pyx_L1_error)
+2870:         return bj
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_bj);
  __pyx_r = __pyx_v_bj;
  goto __pyx_L0;
 2871: 
+2872:     bxj = dim_block(gx, nbx, Lx, XDIM, shift_x)
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2872, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2872, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2872, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_shift_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2872, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_pf_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_dim_block(__pyx_v_dim_block, __pyx_v_gx, __pyx_t_4, __pyx_t_3, __pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2872, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_bxj = __pyx_t_2;
  __pyx_t_2 = 0;
+2873:     byj = dim_block(gy, nby, Ly, YDIM, shift_y)
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_shift_y); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __pyx_pf_5pimms_15mega_crank_fast_24mega_slither_parallel_2D_dim_block(__pyx_v_dim_block, __pyx_v_gy, __pyx_t_2, __pyx_t_1, __pyx_t_9, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_byj = __pyx_t_4;
  __pyx_t_4 = 0;
+2874:     block_of_bead = (bxj * nby + byj)
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_bxj, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_v_byj); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_block_of_bead = __pyx_t_4;
  __pyx_t_4 = 0;
+2875:     block_of_bead[(bxj < 0) | (byj < 0)] = -1
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_bxj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2875, __pyx_L1_error)
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_byj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2875, __pyx_L1_error)
  __pyx_t_9 = PyNumber_Or(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2875, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_9, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 2875, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 2876: 
+2877:     block_of_bead[np.asarray(frozen_mask) != 0] = -1   # frozen beads -> whole chain frozen
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2877, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2877, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_frozen_mask, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2877, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2877, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = __Pyx_PyLong_NeObjC(__pyx_t_9, __pyx_mstate_global->__pyx_int_0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2877, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_1, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 2877, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+2878:     chain_block = _chain_block_assignment(block_of_bead, chain_offset, num_chains)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_chain_block_assignment); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2878, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_chain_offset, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2878, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_num_chains); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2878, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_v_block_of_bead, __pyx_t_3, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2878, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_chain_block = __pyx_t_1;
  __pyx_t_1 = 0;
+2879:     movable = np.nonzero(chain_block >= 0)[0].astype(np.int32)
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2879, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_nonzero); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2879, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = PyObject_RichCompare(__pyx_v_chain_block, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2879, __pyx_L1_error)
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_9};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2879, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2879, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2879, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2879, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2879, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_movable = __pyx_t_1;
  __pyx_t_1 = 0;
+2880:     if movable.shape[0] == 0:
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_movable, __pyx_mstate_global->__pyx_n_u_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2880, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2880, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_8 = (__Pyx_PyLong_BoolEqObjC(__pyx_t_7, __pyx_mstate_global->__pyx_int_0, 0, 0)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 2880, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (__pyx_t_8) {
/* … */
  }
+2881:         return (energy, 0)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2881, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2881, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_7);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_7) != (0)) __PYX_ERR(0, 2881, __pyx_L1_error);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_0);
    __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_0);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_mstate_global->__pyx_int_0) != (0)) __PYX_ERR(0, 2881, __pyx_L1_error);
    __pyx_t_7 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 2882: 
+2883:     mblocks = chain_block[movable]
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_chain_block, __pyx_v_movable); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2883, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_mblocks = __pyx_t_1;
  __pyx_t_1 = 0;
+2884:     order = np.argsort(mblocks, kind="stable")
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2884, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_argsort); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2884, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_v_mblocks};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2884, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_kind, __pyx_mstate_global->__pyx_n_u_stable, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2884, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2884, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_order = __pyx_t_1;
  __pyx_t_1 = 0;
+2885:     chain_ids = movable[order].astype(np.int32)
  __pyx_t_9 = __Pyx_PyObject_GetItem(__pyx_v_movable, __pyx_v_order); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2885, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_4 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2885, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2885, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2885, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_chain_ids = __pyx_t_1;
  __pyx_t_1 = 0;
+2886:     sorted_blocks = mblocks[order]
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_mblocks, __pyx_v_order); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2886, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_sorted_blocks = __pyx_t_1;
  __pyx_t_1 = 0;
 2887: 
+2888:     counts = np.bincount(sorted_blocks, minlength=num_blocks).astype(np.int32)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2888, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_bincount); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2888, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2888, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_v_sorted_blocks};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2888, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_minlength, __pyx_t_7, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2888, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2888, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_9 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2888, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2888, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_11};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2888, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_counts = __pyx_t_1;
  __pyx_t_1 = 0;
+2889:     starts = np.zeros(num_blocks + 1, dtype=np.int32)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2889, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2889, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_long((__pyx_v_num_blocks + 1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2889, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2889, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2889, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_t_11};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2889, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2889, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2889, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_starts = __pyx_t_1;
  __pyx_t_1 = 0;
+2890:     starts[1:] = np.cumsum(counts)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2890, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_cumsum); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2890, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_v_counts};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2890, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  if (__Pyx_PyObject_SetSlice(__pyx_v_starts, __pyx_t_1, 1, 0, NULL, NULL, &__pyx_mstate_global->__pyx_slice[1], 1, 0, 0) < (0)) __PYX_ERR(0, 2890, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 2891: 
+2892:     total_movable = int(counts.sum())
  __pyx_t_7 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_7);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_sum, __pyx_callargs+__pyx_t_5, (1-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2892, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_7 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2892, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_total_movable = ((PyObject*)__pyx_t_7);
  __pyx_t_7 = 0;
+2893:     attempts = np.maximum(
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2893, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2893, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+2894:         (n_steps * counts.astype(np.int64) // max(total_movable, 1)), 0).astype(np.int32)
  __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_n_steps); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_14};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 2894, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_14 = PyNumber_Multiply(__pyx_t_11, __pyx_t_4); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_15 = 1;
  __Pyx_INCREF(__pyx_v_total_movable);
  __pyx_t_16 = __pyx_v_total_movable;
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_16, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  if (__pyx_t_8) {
    __pyx_t_12 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2894, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_PyInt_FromNumber(&__pyx_t_12, NULL, 0) < (0)) __PYX_ERR(0, 2894, __pyx_L1_error)
    __pyx_t_4 = __pyx_t_12;
    __pyx_t_12 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_16);
    __pyx_t_4 = __pyx_t_16;
  }
  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_14, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_12, __pyx_mstate_global->__pyx_int_0};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2893, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2894, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_12};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2894, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_attempts = __pyx_t_7;
  __pyx_t_7 = 0;
 2895: 
+2896:     bix = np.arange(num_blocks, dtype=np.int32) // nby
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_t_12};
    __pyx_t_2 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2896, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_2, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2896, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_2);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2896, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_FloorDivide(__pyx_t_7, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2896, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_bix = __pyx_t_2;
  __pyx_t_2 = 0;
+2897:     biy = np.arange(num_blocks, dtype=np.int32) % nby
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_7};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2897, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2897, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2897, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_12 = PyNumber_Remainder(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2897, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_biy = __pyx_t_12;
  __pyx_t_12 = 0;
+2898:     blo_x = (bix * Lx).astype(np.int32)
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2898, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = PyNumber_Multiply(__pyx_v_bix, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2898, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2898, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2898, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_7};
    __pyx_t_12 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2898, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_blo_x = __pyx_t_12;
  __pyx_t_12 = 0;
+2899:     blo_y = (biy * Ly).astype(np.int32)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2899, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_biy, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2899, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_9 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2899, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2899, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_2};
    __pyx_t_12 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2899, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_blo_y = __pyx_t_12;
  __pyx_t_12 = 0;
 2900: 
+2901:     seeds = (np.arange(num_blocks, dtype=np.uint64) + np.uint64(passed_seed) + np.uint64(0x9E3779B9)) \
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_2};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2901, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_1, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2901, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2901, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_passed_seed); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_1};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2901, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_2 = PyNumber_Add(__pyx_t_12, __pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_mstate_global->__pyx_int_2654435769};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2901, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_7 = PyNumber_Add(__pyx_t_2, __pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2901, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+2902:         * np.uint64(0x2545F4914F6CDD1D) + np.uint64(1)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2902, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2902, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_mstate_global->__pyx_int_0x2545f4914f6cdd1d};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2902, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = PyNumber_Multiply(__pyx_t_7, __pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2902, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2902, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2902, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_1};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2902, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_12 = PyNumber_Add(__pyx_t_1, __pyx_t_9); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2902, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_v_seeds = __pyx_t_12;
  __pyx_t_12 = 0;
 2903: 
+2904:     out_delta = np.zeros(num_blocks, dtype=np.int64)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2904, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 2904, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2904, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2904, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2904, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_t_1};
    __pyx_t_2 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2904, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_2, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2904, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_2);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2904, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_out_delta = __pyx_t_12;
  __pyx_t_12 = 0;
+2905:     out_accepted = np.zeros(num_blocks, dtype=np.int32)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2905, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2905, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2905, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2905, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 2905, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_2};
    __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2905, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 2905, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2905, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_out_accepted = __pyx_t_12;
  __pyx_t_12 = 0;
 2906: 
+2907:     cdef int[::1] chain_ids_mv = chain_ids
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_chain_ids, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2907, __pyx_L1_error)
  __pyx_v_chain_ids_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2908:     cdef int[::1] starts_mv = starts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_starts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2908, __pyx_L1_error)
  __pyx_v_starts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2909:     cdef int[::1] attempts_mv = attempts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_attempts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2909, __pyx_L1_error)
  __pyx_v_attempts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2910:     cdef unsigned long long[::1] seeds_mv = seeds
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_PY_LONG_LONG(__pyx_v_seeds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 2910, __pyx_L1_error)
  __pyx_v_seeds_mv = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+2911:     cdef int[::1] blo_x_mv = blo_x
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_x, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2911, __pyx_L1_error)
  __pyx_v_blo_x_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2912:     cdef int[::1] blo_y_mv = blo_y
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_y, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2912, __pyx_L1_error)
  __pyx_v_blo_y_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+2913:     cdef long[::1] out_delta_mv = out_delta
  __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_long(__pyx_v_out_delta, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 2913, __pyx_L1_error)
  __pyx_v_out_delta_mv = __pyx_t_19;
  __pyx_t_19.memview = NULL;
  __pyx_t_19.data = NULL;
+2914:     cdef int[::1] out_accepted_mv = out_accepted
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_out_accepted, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 2914, __pyx_L1_error)
  __pyx_v_out_accepted_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
 2915: 
 2916:     cdef int b
+2917:     cdef int nthreads = num_threads if num_threads > 0 else 1
  __pyx_t_8 = (__pyx_v_num_threads > 0);
  if (__pyx_t_8) {
    __pyx_t_6 = __pyx_v_num_threads;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_nthreads = __pyx_t_6;
 2918: 
+2919:     for b in prange(num_blocks, nogil=True, num_threads=nthreads, schedule='dynamic'):
  {
      PyThreadState * _save;
      _save = PyEval_SaveThread();
      __Pyx_FastGIL_Remember();
      /*try:*/ {
        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic)        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic) num_threads(__pyx_v_nthreads)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_b = (int)(0 + 1 * __pyx_t_10);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          __Pyx_FastGIL_Forget();
          PyEval_RestoreThread(_save);
          goto __pyx_L6;
        }
        __pyx_L6:;
      }
  }
+2920:         run_block_slither_2D(b, chain_ids_mv, starts_mv, attempts_mv, seeds_mv,
                            __pyx_f_5pimms_15mega_crank_fast_run_block_slither_2D(__pyx_v_b, __pyx_v_chain_ids_mv, __pyx_v_starts_mv, __pyx_v_attempts_mv, __pyx_v_seeds_mv, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_blo_x_mv, __pyx_v_blo_y_mv, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_cur_scope->__pyx_v_W, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_invtemp, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall, __pyx_v_out_delta_mv, __pyx_v_out_accepted_mv);
                        }
                    }
                }
            }
        }
        #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
      }
 2921:                              chain_offset, chain_length, chain_homo,
 2922:                              blo_x_mv, blo_y_mv,
 2923:                              Lx, Ly, nbx, nby,
 2924:                              shift_x, shift_y, W,
 2925:                              grid, type_grid, idx_to_bead,
 2926:                              interaction_table, LR_interaction_table, SLR_interaction_table,
 2927:                              angle_lookup, invtemp, XDIM, YDIM, hardwall,
 2928:                              out_delta_mv, out_accepted_mv)
 2929: 
+2930:     cdef long tot_d = 0
  __pyx_v_tot_d = 0;
+2931:     cdef int tot_a = 0
  __pyx_v_tot_a = 0;
+2932:     for b in range(num_blocks):
  __pyx_t_20 = __pyx_v_num_blocks;
  __pyx_t_10 = __pyx_t_20;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_10; __pyx_t_6+=1) {
    __pyx_v_b = __pyx_t_6;
+2933:         tot_d += out_delta_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_d = (__pyx_v_tot_d + (*((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta_mv.data) + __pyx_t_21)) ))));
+2934:         tot_a += out_accepted_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_a = (__pyx_v_tot_a + (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted_mv.data) + __pyx_t_21)) ))));
  }
+2935:     return (energy + tot_d, tot_a)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_12 = __Pyx_PyLong_From_long((__pyx_v_energy + __pyx_v_tot_d)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 2935, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_tot_a); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 2935, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2935, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_12);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_12) != (0)) __PYX_ERR(0, 2935, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_3);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3) != (0)) __PYX_ERR(0, 2935, __pyx_L1_error);
  __pyx_t_12 = 0;
  __pyx_t_3 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 2936: 
 2937: 
 2938: # =====================================================================
 2939: #
 2940: #   PULL (cooperative reptation) megamove kernel
 2941: #
 2942: #   A pull move displaces an interior bead i to a neighbouring empty site and
 2943: #   then cooperatively "pulls" the following beads into the just-vacated sites
 2944: #   until chain connectivity is restored - local reptation of a sub-segment.
 2945: #   Because it threads through occupied space one bead at a time it rearranges
 2946: #   chains in DENSE systems where rigid translate/rotate/pivot would clash.
 2947: #
 2948: #   Detailed balance: the move is reversible (the reverse of a C-ward pull whose
 2949: #   cascade ends at bead k is an N-ward pull at bead k, and vice-versa - the
 2950: #   forward "did-not-stop" conditions force the reverse cascade to retrace the
 2951: #   same beads). Acceptance is Metropolis-Hastings with the proposal-multiplicity
 2952: #   ratio nF/nR, where nF/nR are the forward/reverse first-target counts computed
 2953: #   by the SAME predicate (pull_first_targets) so they can never diverge. Cascades
 2954: #   that reach a terminus are rejected (their reverse has no valid anchor).
 2955: #   Energy is the telescoping per-bead-move sum (the proven mega_slither approach).
 2956: # =====================================================================
 2957: 
+2958: cdef inline int accept_or_reject_ratio(float invtemp, long old_energy, long new_energy,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_accept_or_reject_ratio(float __pyx_v_invtemp, long __pyx_v_old_energy, long __pyx_v_new_energy, int __pyx_v_nF, int __pyx_v_nR) {
  double __pyx_v_acc;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.accept_or_reject_ratio", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 2959:                                        int nF, int nR) noexcept nogil:
 2960:     # Metropolis-Hastings: accept iff rand < (nF/nR) * exp(-(dE)*invtemp)
 2961:     cdef double acc
+2962:     if nR <= 0:
  __pyx_t_1 = (__pyx_v_nR <= 0);
  if (__pyx_t_1) {
/* … */
  }
+2963:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+2964:     acc = (<double>nF / <double>nR) * exp(-(<double>(new_energy - old_energy)) * invtemp)
  if (unlikely(((double)__pyx_v_nR) == 0)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
    __PYX_ERR(0, 2964, __pyx_L1_error)
  }
  __pyx_v_acc = ((((double)__pyx_v_nF) / ((double)__pyx_v_nR)) * exp(((-((double)(__pyx_v_new_energy - __pyx_v_old_energy))) * __pyx_v_invtemp)));
+2965:     if acc >= 1.0:
  __pyx_t_1 = (__pyx_v_acc >= 1.0);
  if (__pyx_t_1) {
/* … */
  }
+2966:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+2967:     if (<double>mc_rand() / <double>PRNG_MAX) < acc:
  __pyx_t_2 = ((double)__pyx_f_5pimms_15mega_crank_fast_mc_rand());
  if (unlikely(((double)__pyx_v_5pimms_15mega_crank_fast_PRNG_MAX) == 0)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
    __PYX_ERR(0, 2967, __pyx_L1_error)
  }
  __pyx_t_1 = ((__pyx_t_2 / ((double)__pyx_v_5pimms_15mega_crank_fast_PRNG_MAX)) < __pyx_v_acc);
  if (__pyx_t_1) {
/* … */
  }
+2968:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+2969:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 2970: 
 2971: 
+2972: cdef inline int cheby_adjacent(int ax, int ay, int az, int bx, int by, int bz,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(int __pyx_v_ax, int __pyx_v_ay, int __pyx_v_az, int __pyx_v_bx, int __pyx_v_by, int __pyx_v_bz, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int __pyx_v_hardwall) {
  int __pyx_v_dx;
  int __pyx_v_dy;
  int __pyx_v_dz;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 2973:                                int XDIM, int YDIM, int ZDIM, int hardwall) noexcept nogil:
 2974:     # 1 iff the two sites are Chebyshev-1 neighbours (minimal-image under PBC;
 2975:     # literal coordinate distance under hardwall, so wrapped sites are NOT adjacent)
+2976:     cdef int dx = ax - bx
  __pyx_v_dx = (__pyx_v_ax - __pyx_v_bx);
+2977:     cdef int dy = ay - by
  __pyx_v_dy = (__pyx_v_ay - __pyx_v_by);
+2978:     cdef int dz = az - bz
  __pyx_v_dz = (__pyx_v_az - __pyx_v_bz);
+2979:     if dx < 0: dx = -dx
  __pyx_t_1 = (__pyx_v_dx < 0);
  if (__pyx_t_1) {
    __pyx_v_dx = (-__pyx_v_dx);
  }
+2980:     if dy < 0: dy = -dy
  __pyx_t_1 = (__pyx_v_dy < 0);
  if (__pyx_t_1) {
    __pyx_v_dy = (-__pyx_v_dy);
  }
+2981:     if dz < 0: dz = -dz
  __pyx_t_1 = (__pyx_v_dz < 0);
  if (__pyx_t_1) {
    __pyx_v_dz = (-__pyx_v_dz);
  }
+2982:     if hardwall == 0:
  __pyx_t_1 = (__pyx_v_hardwall == 0);
  if (__pyx_t_1) {
/* … */
  }
+2983:         if XDIM - dx < dx: dx = XDIM - dx
    __pyx_t_1 = ((__pyx_v_XDIM - __pyx_v_dx) < __pyx_v_dx);
    if (__pyx_t_1) {
      __pyx_v_dx = (__pyx_v_XDIM - __pyx_v_dx);
    }
+2984:         if YDIM - dy < dy: dy = YDIM - dy
    __pyx_t_1 = ((__pyx_v_YDIM - __pyx_v_dy) < __pyx_v_dy);
    if (__pyx_t_1) {
      __pyx_v_dy = (__pyx_v_YDIM - __pyx_v_dy);
    }
+2985:         if ZDIM - dz < dz: dz = ZDIM - dz
    __pyx_t_1 = ((__pyx_v_ZDIM - __pyx_v_dz) < __pyx_v_dz);
    if (__pyx_t_1) {
      __pyx_v_dz = (__pyx_v_ZDIM - __pyx_v_dz);
    }
+2986:     if dx <= 1 and dy <= 1 and dz <= 1:
  __pyx_t_2 = (__pyx_v_dx <= 1);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_dy <= 1);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_dz <= 1);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L11_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+2987:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+2988:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 2989: 
 2990: 
+2991: cdef int pull_first_targets(NUMPY_INT_TYPE[:, :, :] grid,
static int __pyx_f_5pimms_15mega_crank_fast_pull_first_targets(__Pyx_memviewslice __pyx_v_grid, int __pyx_v_anchor_x, int __pyx_v_anchor_y, int __pyx_v_anchor_z, int __pyx_v_mov_x, int __pyx_v_mov_y, int __pyx_v_mov_z, int __pyx_v_hardwall, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int *__pyx_v_out_buf) {
  int __pyx_v_count;
  int __pyx_v_dx;
  int __pyx_v_dy;
  int __pyx_v_dz;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_tz;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.pull_first_targets", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 2992:                             int anchor_x, int anchor_y, int anchor_z,
 2993:                             int mov_x, int mov_y, int mov_z,
 2994:                             int hardwall, int XDIM, int YDIM, int ZDIM,
 2995:                             int* out_buf) noexcept nogil:
 2996:     # empty sites that are Chebyshev-1 neighbours of BOTH the moving bead and the
 2997:     # anchor (so the moved bead stays bonded to the anchor and the next pulled
 2998:     # bead can occupy the moving bead's old site). Writes (x,y,z) triples into
 2999:     # out_buf, returns the count. The current moving-bead site is occupied so it
 3000:     # is never returned. (Assumes each box dim >= 3 so the 27 offsets are distinct.)
+3001:     cdef int count = 0
  __pyx_v_count = 0;
 3002:     cdef int dx, dy, dz, tx, ty, tz
+3003:     for dx in range(-1, 2):
  for (__pyx_t_1 = -1; __pyx_t_1 < 2; __pyx_t_1+=1) {
    __pyx_v_dx = __pyx_t_1;
+3004:         for dy in range(-1, 2):
    for (__pyx_t_2 = -1; __pyx_t_2 < 2; __pyx_t_2+=1) {
      __pyx_v_dy = __pyx_t_2;
+3005:             for dz in range(-1, 2):
      for (__pyx_t_3 = -1; __pyx_t_3 < 2; __pyx_t_3+=1) {
        __pyx_v_dz = __pyx_t_3;
+3006:                 tx = pbc_correction(mov_x + dx, XDIM)
        __pyx_v_tx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_x + __pyx_v_dx), __pyx_v_XDIM);
+3007:                 ty = pbc_correction(mov_y + dy, YDIM)
        __pyx_v_ty = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_y + __pyx_v_dy), __pyx_v_YDIM);
+3008:                 tz = pbc_correction(mov_z + dz, ZDIM)
        __pyx_v_tz = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_z + __pyx_v_dz), __pyx_v_ZDIM);
+3009:                 if grid[tx, ty, tz] != 0:
        __pyx_t_4 = __pyx_v_tx;
        __pyx_t_5 = __pyx_v_ty;
        __pyx_t_6 = __pyx_v_tz;
        __pyx_t_7 = -1;
        if (__pyx_t_4 < 0) {
          __pyx_t_4 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_4 < 0)) __pyx_t_7 = 0;
        } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[0])) __pyx_t_7 = 0;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_7 = 1;
        } else if (unlikely(__pyx_t_5 >= __pyx_v_grid.shape[1])) __pyx_t_7 = 1;
        if (__pyx_t_6 < 0) {
          __pyx_t_6 += __pyx_v_grid.shape[2];
          if (unlikely(__pyx_t_6 < 0)) __pyx_t_7 = 2;
        } else if (unlikely(__pyx_t_6 >= __pyx_v_grid.shape[2])) __pyx_t_7 = 2;
        if (unlikely(__pyx_t_7 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_7);
          __PYX_ERR(0, 3009, __pyx_L1_error)
        }
        __pyx_t_8 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_4 * __pyx_v_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_grid.strides[1]) ) + __pyx_t_6 * __pyx_v_grid.strides[2]) ))) != 0);
        if (__pyx_t_8) {
/* … */
        }
+3010:                     continue
          goto __pyx_L7_continue;
+3011:                 if cheby_adjacent(tx, ty, tz, mov_x, mov_y, mov_z, XDIM, YDIM, ZDIM, hardwall) == 0:
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_mov_x, __pyx_v_mov_y, __pyx_v_mov_z, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 0);
        if (__pyx_t_8) {
/* … */
        }
+3012:                     continue
          goto __pyx_L7_continue;
+3013:                 if cheby_adjacent(tx, ty, tz, anchor_x, anchor_y, anchor_z, XDIM, YDIM, ZDIM, hardwall) == 0:
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_anchor_x, __pyx_v_anchor_y, __pyx_v_anchor_z, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 0);
        if (__pyx_t_8) {
/* … */
        }
+3014:                     continue
          goto __pyx_L7_continue;
+3015:                 out_buf[3 * count] = tx
        (__pyx_v_out_buf[(3 * __pyx_v_count)]) = __pyx_v_tx;
+3016:                 out_buf[3 * count + 1] = ty
        (__pyx_v_out_buf[((3 * __pyx_v_count) + 1)]) = __pyx_v_ty;
+3017:                 out_buf[3 * count + 2] = tz
        (__pyx_v_out_buf[((3 * __pyx_v_count) + 2)]) = __pyx_v_tz;
+3018:                 count = count + 1
        __pyx_v_count = (__pyx_v_count + 1);
        __pyx_L7_continue:;
      }
    }
  }
+3019:     return count
  __pyx_r = __pyx_v_count;
  goto __pyx_L0;
 3020: 
 3021: 
+3022: cdef inline void _revert_segment(NUMPY_INT_TYPE[:, :, :] grid, NUMPY_INT_TYPE[:, :, :] type_grid,
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast__revert_segment(__Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx, int __pyx_v_off, int __pyx_v_lo, int __pyx_v_hi, int *__pyx_v_bx, int *__pyx_v_by, int *__pyx_v_bz, int __pyx_v_chainID) {
  int __pyx_v_j;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_oz;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._revert_segment", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 3023:                                  NUMPY_INT_TYPE_long[:, :] idx, int off, int lo, int hi,
 3024:                                  int* bx, int* by, int* bz, int chainID) noexcept nogil:
 3025:     # restore beads [lo..hi] to their buffered old positions (clear current sites
 3026:     # first, then write old, to handle overlap) - mirrors the mega_slither revert
 3027:     cdef int j, ox, oy, oz
+3028:     for j in range(lo, hi + 1):
  __pyx_t_1 = (__pyx_v_hi + 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = __pyx_v_lo; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+3029:         ox = idx[off + j, 5]; oy = idx[off + j, 6]; oz = idx[off + j, 7]
    __pyx_t_4 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_5 = 5;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3029, __pyx_L1_error)
    }
    __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_5 * __pyx_v_idx.strides[1]) )));
    __pyx_t_5 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_4 = 6;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3029, __pyx_L1_error)
    }
    __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_5 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) )));
    __pyx_t_4 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_5 = 7;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3029, __pyx_L1_error)
    }
    __pyx_v_oz = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_5 * __pyx_v_idx.strides[1]) )));
+3030:         grid[ox, oy, oz] = 0; type_grid[ox, oy, oz] = 0
    __pyx_t_5 = __pyx_v_ox;
    __pyx_t_4 = __pyx_v_oy;
    __pyx_t_7 = __pyx_v_oz;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_grid.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_grid.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_grid.shape[2];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 2;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[2])) __pyx_t_6 = 2;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3030, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_5 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ) + __pyx_t_7 * __pyx_v_grid.strides[2]) )) = 0;
    __pyx_t_7 = __pyx_v_ox;
    __pyx_t_4 = __pyx_v_oy;
    __pyx_t_5 = __pyx_v_oz;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_type_grid.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_type_grid.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_type_grid.shape[2];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 2;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_type_grid.shape[2])) __pyx_t_6 = 2;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3030, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_5 * __pyx_v_type_grid.strides[2]) )) = 0;
  }
+3031:     for j in range(lo, hi + 1):
  __pyx_t_1 = (__pyx_v_hi + 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = __pyx_v_lo; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+3032:         grid[bx[j], by[j], bz[j]] = chainID
    __pyx_t_5 = (__pyx_v_bx[__pyx_v_j]);
    __pyx_t_4 = (__pyx_v_by[__pyx_v_j]);
    __pyx_t_7 = (__pyx_v_bz[__pyx_v_j]);
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_grid.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_grid.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_grid.shape[2];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 2;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_grid.shape[2])) __pyx_t_6 = 2;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3032, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_5 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ) + __pyx_t_7 * __pyx_v_grid.strides[2]) )) = __pyx_v_chainID;
+3033:         type_grid[bx[j], by[j], bz[j]] = idx[off + j, 2]
    __pyx_t_7 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_4 = 2;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3033, __pyx_L1_error)
    }
    __pyx_t_5 = (__pyx_v_bx[__pyx_v_j]);
    __pyx_t_8 = (__pyx_v_by[__pyx_v_j]);
    __pyx_t_9 = (__pyx_v_bz[__pyx_v_j]);
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_type_grid.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_v_type_grid.shape[1];
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
    if (__pyx_t_9 < 0) {
      __pyx_t_9 += __pyx_v_type_grid.shape[2];
      if (unlikely(__pyx_t_9 < 0)) __pyx_t_6 = 2;
    } else if (unlikely(__pyx_t_9 >= __pyx_v_type_grid.shape[2])) __pyx_t_6 = 2;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3033, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_5 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_8 * __pyx_v_type_grid.strides[1]) ) + __pyx_t_9 * __pyx_v_type_grid.strides[2]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_7 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) )));
+3034:         idx[off + j, 5] = bx[j]; idx[off + j, 6] = by[j]; idx[off + j, 7] = bz[j]
    __pyx_t_4 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_7 = 5;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3034, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_7 * __pyx_v_idx.strides[1]) )) = (__pyx_v_bx[__pyx_v_j]);
    __pyx_t_7 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_4 = 6;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3034, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_7 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) )) = (__pyx_v_by[__pyx_v_j]);
    __pyx_t_4 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_7 = 7;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3034, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_7 * __pyx_v_idx.strides[1]) )) = (__pyx_v_bz[__pyx_v_j]);
  }
 3035: 
 3036: 
+3037: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_23mega_pull(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_22mega_pull, "\n    3D pull (cooperative reptation) megamove. chain_selector lists chain indices\n    to pull (each pull-eligible chain appears PULL_SUBSTEPS times, shuffled).\n    Mutates grid / type_grid / idx_to_bead in place. Returns (energy, accepted).\n    chain_homo is accepted for signature symmetry with mega_slither but unused.\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_23mega_pull = {"mega_pull", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_23mega_pull, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_22mega_pull};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_23mega_pull(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  int __pyx_v_max_chain_len;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_pull (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,0};
  PyObject* values[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 3037, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3037, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_pull", 0) < (0)) __PYX_ERR(0, 3037, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 16; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_pull", 1, 16, 16, i); __PYX_ERR(0, 3037, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 16)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3037, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3037, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 3039, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 3040, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 3041, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 3042, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 3043, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 3044, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 3045, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 3046, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 3047, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 3048, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 3049, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 3050, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 3051, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3052, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3053, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3054, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_pull", 1, 16, 16, __pyx_nargs); __PYX_ERR(0, 3037, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_22mega_pull(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_22mega_pull(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, int __pyx_v_max_chain_len) {
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  int __pyx_v_n_steps;
  int __pyx_v_accepted;
  int __pyx_v_step;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_chainID;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_direction;
  int __pyx_v_nF;
  int __pyx_v_nR;
  int __pyx_v_r;
  int __pyx_v_restored;
  int __pyx_v_lo;
  int __pyx_v_hi;
  long __pyx_v_de;
  int __pyx_v_sx;
  int __pyx_v_sy;
  int __pyx_v_sz;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_oz;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_tz;
  int __pyx_v_pnx;
  int __pyx_v_pny;
  int __pyx_v_pnz;
  int __pyx_v_newp[3];
  int __pyx_v_tbuf[81];
  int *__pyx_v_bx;
  int *__pyx_v_by;
  int *__pyx_v_bz;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_XDECREF(__pyx_t_17);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_23mega_pull, 0, __pyx_mstate_global->__pyx_n_u_mega_pull, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[17])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3037, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_pull, __pyx_t_4) < (0)) __PYX_ERR(0, 3037, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 3038: @cython.boundscheck(False)
 3039: def mega_pull(NUMPY_INT_TYPE[:, :, :] grid,
 3040:               NUMPY_INT_TYPE[:, :, :] type_grid,
 3041:               NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 3042:               int[::1] chain_offset,
 3043:               int[::1] chain_length,
 3044:               int[::1] chain_homo,
 3045:               int[::1] chain_selector,
 3046:               NUMPY_INT_TYPE[:, :] interaction_table,
 3047:               NUMPY_INT_TYPE[:, :] LR_interaction_table,
 3048:               NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 3049:               NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 3050:               long energy,
 3051:               float invtemp,
 3052:               int passed_seed,
 3053:               int hardwall,
 3054:               int max_chain_len):
 3055:     """
 3056:     3D pull (cooperative reptation) megamove. chain_selector lists chain indices
 3057:     to pull (each pull-eligible chain appears PULL_SUBSTEPS times, shuffled).
 3058:     Mutates grid / type_grid / idx_to_bead in place. Returns (energy, accepted).
 3059:     chain_homo is accepted for signature symmetry with mega_slither but unused.
 3060:     """
+3061:     mc_seed(passed_seed)
  __pyx_f_5pimms_15mega_crank_fast_mc_seed(__pyx_v_passed_seed);
 3062: 
+3063:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+3064:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+3065:     cdef int ZDIM = grid.shape[2]
  __pyx_v_ZDIM = (__pyx_v_grid.shape[2]);
+3066:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
+3067:     cdef int accepted = 0
  __pyx_v_accepted = 0;
 3068: 
 3069:     cdef int step, c, off, L, chainID, i, j, k, direction, nF, nR, r, restored, lo, hi
 3070:     cdef long de
 3071:     cdef int sx, sy, sz, ox, oy, oz, tx, ty, tz, pnx, pny, pnz
 3072:     cdef int newp[3]
 3073:     cdef int tbuf[81]
 3074: 
+3075:     cdef int* bx = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_bx = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+3076:     cdef int* by = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_by = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+3077:     cdef int* bz = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_bz = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+3078:     if bx == NULL or by == NULL or bz == NULL:
  __pyx_t_2 = (__pyx_v_bx == NULL);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_by == NULL);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_bz == NULL);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+3079:         if bx != NULL: free(bx)
    __pyx_t_1 = (__pyx_v_bx != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_bx);
    }
+3080:         if by != NULL: free(by)
    __pyx_t_1 = (__pyx_v_by != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_by);
    }
+3081:         if bz != NULL: free(bz)
    __pyx_t_1 = (__pyx_v_bz != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_bz);
    }
+3082:         raise MemoryError()
    PyErr_NoMemory(); __PYX_ERR(0, 3082, __pyx_L1_error)
 3083: 
+3084:     try:
  /*try:*/ {
+3085:         for step in range(n_steps):
    __pyx_t_3 = __pyx_v_n_steps;
    __pyx_t_4 = __pyx_t_3;
    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
      __pyx_v_step = __pyx_t_5;
+3086:             c = chain_selector[step]
      __pyx_t_6 = __pyx_v_step;
      __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_selector.data) + __pyx_t_6)) )));
+3087:             off = chain_offset[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_6)) )));
+3088:             L = chain_length[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_6)) )));
+3089:             if L < 3:
      __pyx_t_1 = (__pyx_v_L < 3);
      if (__pyx_t_1) {
/* … */
      }
+3090:                 continue
        goto __pyx_L13_continue;
+3091:             chainID = idx_to_bead[off, 4]
      __pyx_t_6 = __pyx_v_off;
      __pyx_t_7 = 4;
      __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 3092: 
+3093:             for j in range(L):
      __pyx_t_8 = __pyx_v_L;
      __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;
+3094:                 bx[j] = idx_to_bead[off + j, 5]
        __pyx_t_7 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_6 = 5;
        (__pyx_v_bx[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+3095:                 by[j] = idx_to_bead[off + j, 6]
        __pyx_t_6 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_7 = 6;
        (__pyx_v_by[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
+3096:                 bz[j] = idx_to_bead[off + j, 7]
        __pyx_t_7 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_6 = 7;
        (__pyx_v_bz[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
      }
 3097: 
+3098:             i = 1 + randint(0, L - 3)          # interior bead in [1, L-2]
      __pyx_v_i = (1 + __pyx_f_5pimms_15mega_crank_fast_randint(0, (__pyx_v_L - 3)));
+3099:             direction = randint(0, 1)          # 0 = C-ward (anchor i-1), 1 = N-ward (anchor i+1)
      __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_randint(0, 1);
+3100:             restored = 0
      __pyx_v_restored = 0;
+3101:             nR = 0
      __pyx_v_nR = 0;
 3102: 
+3103:             if direction == 0:
      __pyx_t_1 = (__pyx_v_direction == 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L18;
      }
+3104:                 nF = pull_first_targets(grid, bx[i - 1], by[i - 1], bz[i - 1],
        __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i - 1)]), (__pyx_v_by[(__pyx_v_i - 1)]), (__pyx_v_bz[(__pyx_v_i - 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf);
 3105:                                         bx[i], by[i], bz[i], hardwall, XDIM, YDIM, ZDIM, tbuf)
+3106:                 if nF == 0:
        __pyx_t_1 = (__pyx_v_nF == 0);
        if (__pyx_t_1) {
/* … */
        }
+3107:                     continue
          goto __pyx_L13_continue;
+3108:                 r = randint(0, nF - 1)
        __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_randint(0, (__pyx_v_nF - 1));
+3109:                 sx = tbuf[3 * r]; sy = tbuf[3 * r + 1]; sz = tbuf[3 * r + 2]
        __pyx_v_sx = (__pyx_v_tbuf[(3 * __pyx_v_r)]);
        __pyx_v_sy = (__pyx_v_tbuf[((3 * __pyx_v_r) + 1)]);
        __pyx_v_sz = (__pyx_v_tbuf[((3 * __pyx_v_r) + 2)]);
+3110:                 de = get_energy_change_c(grid, type_grid, bx[i], by[i], bz[i], sx, sy, sz,
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+3111:                                          idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
        __pyx_t_6 = (__pyx_v_off + __pyx_v_i);
        __pyx_t_7 = 1;
 3112:                                          SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3113:                 newp[0] = sx; newp[1] = sy; newp[2] = sz
        (__pyx_v_newp[0]) = __pyx_v_sx;
        (__pyx_v_newp[1]) = __pyx_v_sy;
        (__pyx_v_newp[2]) = __pyx_v_sz;
+3114:                 de = de + get_angle_energy_change_c(off + i, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3115:                 _apply_bead_move(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], bz[i], sx, sy, sz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, __pyx_v_chainID);
+3116:                 pnx = sx; pny = sy; pnz = sz
        __pyx_v_pnx = __pyx_v_sx;
        __pyx_v_pny = __pyx_v_sy;
        __pyx_v_pnz = __pyx_v_sz;
+3117:                 k = i
        __pyx_v_k = __pyx_v_i;
+3118:                 for j in range(i + 1, L):
        __pyx_t_8 = __pyx_v_L;
        __pyx_t_9 = __pyx_t_8;
        for (__pyx_t_10 = (__pyx_v_i + 1); __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
          __pyx_v_j = __pyx_t_10;
+3119:                     if cheby_adjacent(pnx, pny, pnz, bx[j], by[j], bz[j], XDIM, YDIM, ZDIM, hardwall) == 1:
          __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_pnx, __pyx_v_pny, __pyx_v_pnz, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), (__pyx_v_bz[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 1);
          if (__pyx_t_1) {
/* … */
          }
+3120:                         k = j - 1; restored = 1; break
            __pyx_v_k = (__pyx_v_j - 1);
            __pyx_v_restored = 1;
            goto __pyx_L21_break;
+3121:                     ox = bx[j]; oy = by[j]; oz = bz[j]
          __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
          __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
          __pyx_v_oz = (__pyx_v_bz[__pyx_v_j]);
+3122:                     tx = bx[j - 1]; ty = by[j - 1]; tz = bz[j - 1]
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j - 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_j - 1)]);
          __pyx_v_tz = (__pyx_v_bz[(__pyx_v_j - 1)]);
+3123:                     de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+3124:                                                   idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
          __pyx_t_7 = (__pyx_v_off + __pyx_v_j);
          __pyx_t_6 = 1;
 3125:                                                   SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3126:                     newp[0] = tx; newp[1] = ty; newp[2] = tz
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
          (__pyx_v_newp[2]) = __pyx_v_tz;
+3127:                     de = de + get_angle_energy_change_c(off + j, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3128:                     _apply_bead_move(grid, type_grid, idx_to_bead, off + j, ox, oy, oz, tx, ty, tz, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
+3129:                     pnx = tx; pny = ty; pnz = tz
          __pyx_v_pnx = __pyx_v_tx;
          __pyx_v_pny = __pyx_v_ty;
          __pyx_v_pnz = __pyx_v_tz;
+3130:                     k = j
          __pyx_v_k = __pyx_v_j;
        }
        __pyx_L21_break:;
+3131:                 lo = i; hi = k
        __pyx_v_lo = __pyx_v_i;
        __pyx_v_hi = __pyx_v_k;
+3132:                 if restored == 1:
        __pyx_t_1 = (__pyx_v_restored == 1);
        if (__pyx_t_1) {
/* … */
        }
+3133:                     nR = pull_first_targets(grid, bx[k + 1], by[k + 1], bz[k + 1],
          __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k + 1)]), (__pyx_v_by[(__pyx_v_k + 1)]), (__pyx_v_bz[(__pyx_v_k + 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_12 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_13 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_14 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf);
+3134:                                             idx_to_bead[off + k, 5], idx_to_bead[off + k, 6], idx_to_bead[off + k, 7],
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 5;
          __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_12 = 6;
          __pyx_t_13 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_14 = 7;
 3135:                                             hardwall, XDIM, YDIM, ZDIM, tbuf)
 3136:             else:
+3137:                 nF = pull_first_targets(grid, bx[i + 1], by[i + 1], bz[i + 1],
      /*else*/ {
/* … */
        __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i + 1)]), (__pyx_v_by[(__pyx_v_i + 1)]), (__pyx_v_bz[(__pyx_v_i + 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf);
 3138:                                         bx[i], by[i], bz[i], hardwall, XDIM, YDIM, ZDIM, tbuf)
+3139:                 if nF == 0:
        __pyx_t_1 = (__pyx_v_nF == 0);
        if (__pyx_t_1) {
/* … */
        }
+3140:                     continue
          goto __pyx_L13_continue;
+3141:                 r = randint(0, nF - 1)
        __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_randint(0, (__pyx_v_nF - 1));
+3142:                 sx = tbuf[3 * r]; sy = tbuf[3 * r + 1]; sz = tbuf[3 * r + 2]
        __pyx_v_sx = (__pyx_v_tbuf[(3 * __pyx_v_r)]);
        __pyx_v_sy = (__pyx_v_tbuf[((3 * __pyx_v_r) + 1)]);
        __pyx_v_sz = (__pyx_v_tbuf[((3 * __pyx_v_r) + 2)]);
+3143:                 de = get_energy_change_c(grid, type_grid, bx[i], by[i], bz[i], sx, sy, sz,
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_14 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_13 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+3144:                                          idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
        __pyx_t_14 = (__pyx_v_off + __pyx_v_i);
        __pyx_t_13 = 1;
 3145:                                          SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3146:                 newp[0] = sx; newp[1] = sy; newp[2] = sz
        (__pyx_v_newp[0]) = __pyx_v_sx;
        (__pyx_v_newp[1]) = __pyx_v_sy;
        (__pyx_v_newp[2]) = __pyx_v_sz;
+3147:                 de = de + get_angle_energy_change_c(off + i, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3148:                 _apply_bead_move(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], bz[i], sx, sy, sz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, __pyx_v_chainID);
+3149:                 pnx = sx; pny = sy; pnz = sz
        __pyx_v_pnx = __pyx_v_sx;
        __pyx_v_pny = __pyx_v_sy;
        __pyx_v_pnz = __pyx_v_sz;
+3150:                 k = i
        __pyx_v_k = __pyx_v_i;
+3151:                 for j in range(i - 1, -1, -1):
        for (__pyx_t_8 = (__pyx_v_i - 1); __pyx_t_8 > -1; __pyx_t_8-=1) {
          __pyx_v_j = __pyx_t_8;
+3152:                     if cheby_adjacent(pnx, pny, pnz, bx[j], by[j], bz[j], XDIM, YDIM, ZDIM, hardwall) == 1:
          __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_pnx, __pyx_v_pny, __pyx_v_pnz, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), (__pyx_v_bz[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 1);
          if (__pyx_t_1) {
/* … */
          }
+3153:                         k = j + 1; restored = 1; break
            __pyx_v_k = (__pyx_v_j + 1);
            __pyx_v_restored = 1;
            goto __pyx_L26_break;
+3154:                     ox = bx[j]; oy = by[j]; oz = bz[j]
          __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
          __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
          __pyx_v_oz = (__pyx_v_bz[__pyx_v_j]);
+3155:                     tx = bx[j + 1]; ty = by[j + 1]; tz = bz[j + 1]
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j + 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_j + 1)]);
          __pyx_v_tz = (__pyx_v_bz[(__pyx_v_j + 1)]);
+3156:                     de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_13 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_14 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+3157:                                                   idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
          __pyx_t_13 = (__pyx_v_off + __pyx_v_j);
          __pyx_t_14 = 1;
 3158:                                                   SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3159:                     newp[0] = tx; newp[1] = ty; newp[2] = tz
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
          (__pyx_v_newp[2]) = __pyx_v_tz;
+3160:                     de = de + get_angle_energy_change_c(off + j, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3161:                     _apply_bead_move(grid, type_grid, idx_to_bead, off + j, ox, oy, oz, tx, ty, tz, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
+3162:                     pnx = tx; pny = ty; pnz = tz
          __pyx_v_pnx = __pyx_v_tx;
          __pyx_v_pny = __pyx_v_ty;
          __pyx_v_pnz = __pyx_v_tz;
+3163:                     k = j
          __pyx_v_k = __pyx_v_j;
        }
        __pyx_L26_break:;
+3164:                 lo = k; hi = i
        __pyx_v_lo = __pyx_v_k;
        __pyx_v_hi = __pyx_v_i;
+3165:                 if restored == 1:
        __pyx_t_1 = (__pyx_v_restored == 1);
        if (__pyx_t_1) {
/* … */
        }
      }
      __pyx_L18:;
+3166:                     nR = pull_first_targets(grid, bx[k - 1], by[k - 1], bz[k - 1],
          __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k - 1)]), (__pyx_v_by[(__pyx_v_k - 1)]), (__pyx_v_bz[(__pyx_v_k - 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_14 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_13 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_12 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf);
+3167:                                             idx_to_bead[off + k, 5], idx_to_bead[off + k, 6], idx_to_bead[off + k, 7],
          __pyx_t_14 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_13 = 5;
          __pyx_t_12 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_11 = 6;
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 7;
 3168:                                             hardwall, XDIM, YDIM, ZDIM, tbuf)
 3169: 
+3170:             if restored == 0:
      __pyx_t_1 = (__pyx_v_restored == 0);
      if (__pyx_t_1) {
/* … */
      }
 3171:                 # cascade reached a terminus -> reject (no valid reverse anchor)
+3172:                 _revert_segment(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, bz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__revert_segment(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_bz, __pyx_v_chainID);
+3173:                 continue
        goto __pyx_L13_continue;
 3174: 
 3175:             # Metropolis-Hastings with the nF/nR proposal-multiplicity correction
+3176:             if accept_or_reject_ratio(invtemp, energy, energy + de, nF, nR) == 1:
      __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject_ratio(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de), __pyx_v_nF, __pyx_v_nR) == 1);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L30;
      }
+3177:                 energy = energy + de
        __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+3178:                 accepted = accepted + 1
        __pyx_v_accepted = (__pyx_v_accepted + 1);
 3179:             else:
+3180:                 _revert_segment(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, bz, chainID)
      /*else*/ {
        __pyx_f_5pimms_15mega_crank_fast__revert_segment(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_bz, __pyx_v_chainID);
      }
      __pyx_L30:;
      __pyx_L13_continue:;
    }
  }
 3181:     finally:
+3182:         free(bx); free(by); free(bz)
  /*finally:*/ {
    /*normal exit:*/{
      free(__pyx_v_bx);
      free(__pyx_v_by);
      free(__pyx_v_bz);
      goto __pyx_L12;
    }
    __pyx_L12:;
  }
 3183: 
+3184:     return (energy, accepted)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_15 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 3184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_15);
  __pyx_t_16 = __Pyx_PyLong_From_int(__pyx_v_accepted); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 3184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_16);
  __pyx_t_17 = PyTuple_New(2); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 3184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_GIVEREF(__pyx_t_15);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_15) != (0)) __PYX_ERR(0, 3184, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_16);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_17, 1, __pyx_t_16) != (0)) __PYX_ERR(0, 3184, __pyx_L1_error);
  __pyx_t_15 = 0;
  __pyx_t_16 = 0;
  __pyx_r = __pyx_t_17;
  __pyx_t_17 = 0;
  goto __pyx_L0;
 3185: 
 3186: 
 3187: # =====================================================================
 3188: #   PULL megamove kernel - 2D variant (mirrors mega_pull; see its notes)
 3189: # =====================================================================
 3190: 
+3191: cdef inline int cheby_adjacent_2D(int ax, int ay, int bx, int by,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(int __pyx_v_ax, int __pyx_v_ay, int __pyx_v_bx, int __pyx_v_by, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_hardwall) {
  int __pyx_v_dx;
  int __pyx_v_dy;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 3192:                                   int XDIM, int YDIM, int hardwall) noexcept nogil:
+3193:     cdef int dx = ax - bx
  __pyx_v_dx = (__pyx_v_ax - __pyx_v_bx);
+3194:     cdef int dy = ay - by
  __pyx_v_dy = (__pyx_v_ay - __pyx_v_by);
+3195:     if dx < 0: dx = -dx
  __pyx_t_1 = (__pyx_v_dx < 0);
  if (__pyx_t_1) {
    __pyx_v_dx = (-__pyx_v_dx);
  }
+3196:     if dy < 0: dy = -dy
  __pyx_t_1 = (__pyx_v_dy < 0);
  if (__pyx_t_1) {
    __pyx_v_dy = (-__pyx_v_dy);
  }
+3197:     if hardwall == 0:
  __pyx_t_1 = (__pyx_v_hardwall == 0);
  if (__pyx_t_1) {
/* … */
  }
+3198:         if XDIM - dx < dx: dx = XDIM - dx
    __pyx_t_1 = ((__pyx_v_XDIM - __pyx_v_dx) < __pyx_v_dx);
    if (__pyx_t_1) {
      __pyx_v_dx = (__pyx_v_XDIM - __pyx_v_dx);
    }
+3199:         if YDIM - dy < dy: dy = YDIM - dy
    __pyx_t_1 = ((__pyx_v_YDIM - __pyx_v_dy) < __pyx_v_dy);
    if (__pyx_t_1) {
      __pyx_v_dy = (__pyx_v_YDIM - __pyx_v_dy);
    }
+3200:     if dx <= 1 and dy <= 1:
  __pyx_t_2 = (__pyx_v_dx <= 1);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L9_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_dy <= 1);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L9_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+3201:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+3202:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 3203: 
 3204: 
+3205: cdef int pull_first_targets_2D(NUMPY_INT_TYPE[:, :] grid,
static int __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_2D(__Pyx_memviewslice __pyx_v_grid, int __pyx_v_anchor_x, int __pyx_v_anchor_y, int __pyx_v_mov_x, int __pyx_v_mov_y, int __pyx_v_hardwall, int __pyx_v_XDIM, int __pyx_v_YDIM, int *__pyx_v_out_buf) {
  int __pyx_v_count;
  int __pyx_v_dx;
  int __pyx_v_dy;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.pull_first_targets_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 3206:                                int anchor_x, int anchor_y,
 3207:                                int mov_x, int mov_y,
 3208:                                int hardwall, int XDIM, int YDIM,
 3209:                                int* out_buf) noexcept nogil:
+3210:     cdef int count = 0
  __pyx_v_count = 0;
 3211:     cdef int dx, dy, tx, ty
+3212:     for dx in range(-1, 2):
  for (__pyx_t_1 = -1; __pyx_t_1 < 2; __pyx_t_1+=1) {
    __pyx_v_dx = __pyx_t_1;
+3213:         for dy in range(-1, 2):
    for (__pyx_t_2 = -1; __pyx_t_2 < 2; __pyx_t_2+=1) {
      __pyx_v_dy = __pyx_t_2;
+3214:             tx = pbc_correction(mov_x + dx, XDIM)
      __pyx_v_tx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_x + __pyx_v_dx), __pyx_v_XDIM);
+3215:             ty = pbc_correction(mov_y + dy, YDIM)
      __pyx_v_ty = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_y + __pyx_v_dy), __pyx_v_YDIM);
+3216:             if grid[tx, ty] != 0:
      __pyx_t_3 = __pyx_v_tx;
      __pyx_t_4 = __pyx_v_ty;
      __pyx_t_5 = -1;
      if (__pyx_t_3 < 0) {
        __pyx_t_3 += __pyx_v_grid.shape[0];
        if (unlikely(__pyx_t_3 < 0)) __pyx_t_5 = 0;
      } else if (unlikely(__pyx_t_3 >= __pyx_v_grid.shape[0])) __pyx_t_5 = 0;
      if (__pyx_t_4 < 0) {
        __pyx_t_4 += __pyx_v_grid.shape[1];
        if (unlikely(__pyx_t_4 < 0)) __pyx_t_5 = 1;
      } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[1])) __pyx_t_5 = 1;
      if (unlikely(__pyx_t_5 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_5);
        __PYX_ERR(0, 3216, __pyx_L1_error)
      }
      __pyx_t_6 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ))) != 0);
      if (__pyx_t_6) {
/* … */
      }
+3217:                 continue
        goto __pyx_L5_continue;
+3218:             if cheby_adjacent_2D(tx, ty, mov_x, mov_y, XDIM, YDIM, hardwall) == 0:
      __pyx_t_6 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_tx, __pyx_v_ty, __pyx_v_mov_x, __pyx_v_mov_y, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 0);
      if (__pyx_t_6) {
/* … */
      }
+3219:                 continue
        goto __pyx_L5_continue;
+3220:             if cheby_adjacent_2D(tx, ty, anchor_x, anchor_y, XDIM, YDIM, hardwall) == 0:
      __pyx_t_6 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_tx, __pyx_v_ty, __pyx_v_anchor_x, __pyx_v_anchor_y, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 0);
      if (__pyx_t_6) {
/* … */
      }
+3221:                 continue
        goto __pyx_L5_continue;
+3222:             out_buf[2 * count] = tx
      (__pyx_v_out_buf[(2 * __pyx_v_count)]) = __pyx_v_tx;
+3223:             out_buf[2 * count + 1] = ty
      (__pyx_v_out_buf[((2 * __pyx_v_count) + 1)]) = __pyx_v_ty;
+3224:             count = count + 1
      __pyx_v_count = (__pyx_v_count + 1);
      __pyx_L5_continue:;
    }
  }
+3225:     return count
  __pyx_r = __pyx_v_count;
  goto __pyx_L0;
 3226: 
 3227: 
+3228: cdef inline void _revert_segment_2D(NUMPY_INT_TYPE[:, :] grid, NUMPY_INT_TYPE[:, :] type_grid,
static CYTHON_INLINE void __pyx_f_5pimms_15mega_crank_fast__revert_segment_2D(__Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx, int __pyx_v_off, int __pyx_v_lo, int __pyx_v_hi, int *__pyx_v_bx, int *__pyx_v_by, int __pyx_v_chainID) {
  int __pyx_v_j;
  int __pyx_v_ox;
  int __pyx_v_oy;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast._revert_segment_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 3229:                                     NUMPY_INT_TYPE_long[:, :] idx, int off, int lo, int hi,
 3230:                                     int* bx, int* by, int chainID) noexcept nogil:
 3231:     cdef int j, ox, oy
+3232:     for j in range(lo, hi + 1):
  __pyx_t_1 = (__pyx_v_hi + 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = __pyx_v_lo; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+3233:         ox = idx[off + j, 5]; oy = idx[off + j, 6]
    __pyx_t_4 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_5 = 5;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3233, __pyx_L1_error)
    }
    __pyx_v_ox = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_5 * __pyx_v_idx.strides[1]) )));
    __pyx_t_5 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_4 = 6;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3233, __pyx_L1_error)
    }
    __pyx_v_oy = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_5 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) )));
+3234:         grid[ox, oy] = 0; type_grid[ox, oy] = 0
    __pyx_t_4 = __pyx_v_ox;
    __pyx_t_5 = __pyx_v_oy;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_grid.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_grid.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3234, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_4 * __pyx_v_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_grid.strides[1]) )) = 0;
    __pyx_t_5 = __pyx_v_ox;
    __pyx_t_4 = __pyx_v_oy;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_type_grid.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_type_grid.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3234, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_5 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_type_grid.strides[1]) )) = 0;
  }
+3235:     for j in range(lo, hi + 1):
  __pyx_t_1 = (__pyx_v_hi + 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = __pyx_v_lo; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+3236:         grid[bx[j], by[j]] = chainID
    __pyx_t_4 = (__pyx_v_bx[__pyx_v_j]);
    __pyx_t_5 = (__pyx_v_by[__pyx_v_j]);
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_grid.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_grid.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_grid.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3236, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_4 * __pyx_v_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_grid.strides[1]) )) = __pyx_v_chainID;
+3237:         type_grid[bx[j], by[j]] = idx[off + j, 2]
    __pyx_t_5 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_4 = 2;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3237, __pyx_L1_error)
    }
    __pyx_t_7 = (__pyx_v_bx[__pyx_v_j]);
    __pyx_t_8 = (__pyx_v_by[__pyx_v_j]);
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_v_type_grid.shape[0];
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_type_grid.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_v_type_grid.shape[1];
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_type_grid.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3237, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_type_grid.data + __pyx_t_7 * __pyx_v_type_grid.strides[0]) ) + __pyx_t_8 * __pyx_v_type_grid.strides[1]) )) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_5 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) )));
+3238:         idx[off + j, 5] = bx[j]; idx[off + j, 6] = by[j]
    __pyx_t_4 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_5 = 5;
    __pyx_t_6 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3238, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_4 * __pyx_v_idx.strides[0]) ) + __pyx_t_5 * __pyx_v_idx.strides[1]) )) = (__pyx_v_bx[__pyx_v_j]);
    __pyx_t_5 = (__pyx_v_off + __pyx_v_j);
    __pyx_t_4 = 6;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_v_idx.shape[0];
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_v_idx.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_4 < 0) {
      __pyx_t_4 += __pyx_v_idx.shape[1];
      if (unlikely(__pyx_t_4 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_idx.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3238, __pyx_L1_error)
    }
    *((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx.data + __pyx_t_5 * __pyx_v_idx.strides[0]) ) + __pyx_t_4 * __pyx_v_idx.strides[1]) )) = (__pyx_v_by[__pyx_v_j]);
  }
 3239: 
 3240: 
+3241: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_25mega_pull_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_24mega_pull_2D, "2D pull megamove. See mega_pull for semantics.");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_25mega_pull_2D = {"mega_pull_2D", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_25mega_pull_2D, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_24mega_pull_2D};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_25mega_pull_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  int __pyx_v_max_chain_len;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_pull_2D (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,0};
  PyObject* values[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 3241, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3241, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_pull_2D", 0) < (0)) __PYX_ERR(0, 3241, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 16; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_pull_2D", 1, 16, 16, i); __PYX_ERR(0, 3241, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 16)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3241, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3241, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 3243, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 3244, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 3245, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 3246, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 3247, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 3248, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 3249, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 3250, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 3251, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 3252, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 3253, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 3254, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 3255, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3256, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3257, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3258, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_pull_2D", 1, 16, 16, __pyx_nargs); __PYX_ERR(0, 3241, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_24mega_pull_2D(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_24mega_pull_2D(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, int __pyx_v_max_chain_len) {
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_n_steps;
  int __pyx_v_accepted;
  int __pyx_v_step;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_chainID;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_direction;
  int __pyx_v_nF;
  int __pyx_v_nR;
  int __pyx_v_r;
  int __pyx_v_restored;
  int __pyx_v_lo;
  int __pyx_v_hi;
  long __pyx_v_de;
  int __pyx_v_sx;
  int __pyx_v_sy;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_pnx;
  int __pyx_v_pny;
  int __pyx_v_newp[2];
  int __pyx_v_tbuf[18];
  int *__pyx_v_bx;
  int *__pyx_v_by;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_25mega_pull_2D, 0, __pyx_mstate_global->__pyx_n_u_mega_pull_2D, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[18])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3241, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_pull_2D, __pyx_t_4) < (0)) __PYX_ERR(0, 3241, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 3242: @cython.boundscheck(False)
 3243: def mega_pull_2D(NUMPY_INT_TYPE[:, :] grid,
 3244:                  NUMPY_INT_TYPE[:, :] type_grid,
 3245:                  NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 3246:                  int[::1] chain_offset,
 3247:                  int[::1] chain_length,
 3248:                  int[::1] chain_homo,
 3249:                  int[::1] chain_selector,
 3250:                  NUMPY_INT_TYPE[:, :] interaction_table,
 3251:                  NUMPY_INT_TYPE[:, :] LR_interaction_table,
 3252:                  NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 3253:                  NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 3254:                  long energy,
 3255:                  float invtemp,
 3256:                  int passed_seed,
 3257:                  int hardwall,
 3258:                  int max_chain_len):
 3259:     """2D pull megamove. See mega_pull for semantics."""
+3260:     mc_seed(passed_seed)
  __pyx_f_5pimms_15mega_crank_fast_mc_seed(__pyx_v_passed_seed);
 3261: 
+3262:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+3263:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+3264:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
+3265:     cdef int accepted = 0
  __pyx_v_accepted = 0;
 3266: 
 3267:     cdef int step, c, off, L, chainID, i, j, k, direction, nF, nR, r, restored, lo, hi
 3268:     cdef long de
 3269:     cdef int sx, sy, ox, oy, tx, ty, pnx, pny
 3270:     cdef int newp[2]
 3271:     cdef int tbuf[18]
 3272: 
+3273:     cdef int* bx = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_bx = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+3274:     cdef int* by = <int*> malloc(max_chain_len * sizeof(int))
  __pyx_v_by = ((int *)malloc((__pyx_v_max_chain_len * (sizeof(int)))));
+3275:     if bx == NULL or by == NULL:
  __pyx_t_2 = (__pyx_v_bx == NULL);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = (__pyx_v_by == NULL);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+3276:         if bx != NULL: free(bx)
    __pyx_t_1 = (__pyx_v_bx != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_bx);
    }
+3277:         if by != NULL: free(by)
    __pyx_t_1 = (__pyx_v_by != NULL);
    if (__pyx_t_1) {
      free(__pyx_v_by);
    }
+3278:         raise MemoryError()
    PyErr_NoMemory(); __PYX_ERR(0, 3278, __pyx_L1_error)
 3279: 
+3280:     try:
  /*try:*/ {
+3281:         for step in range(n_steps):
    __pyx_t_3 = __pyx_v_n_steps;
    __pyx_t_4 = __pyx_t_3;
    for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
      __pyx_v_step = __pyx_t_5;
+3282:             c = chain_selector[step]
      __pyx_t_6 = __pyx_v_step;
      __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_selector.data) + __pyx_t_6)) )));
+3283:             off = chain_offset[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_6)) )));
+3284:             L = chain_length[c]
      __pyx_t_6 = __pyx_v_c;
      __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_6)) )));
+3285:             if L < 3:
      __pyx_t_1 = (__pyx_v_L < 3);
      if (__pyx_t_1) {
/* … */
      }
+3286:                 continue
        goto __pyx_L11_continue;
+3287:             chainID = idx_to_bead[off, 4]
      __pyx_t_6 = __pyx_v_off;
      __pyx_t_7 = 4;
      __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
 3288: 
+3289:             for j in range(L):
      __pyx_t_8 = __pyx_v_L;
      __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;
+3290:                 bx[j] = idx_to_bead[off + j, 5]
        __pyx_t_7 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_6 = 5;
        (__pyx_v_bx[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) )));
+3291:                 by[j] = idx_to_bead[off + j, 6]
        __pyx_t_6 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_7 = 6;
        (__pyx_v_by[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) )));
      }
 3292: 
+3293:             i = 1 + randint(0, L - 3)
      __pyx_v_i = (1 + __pyx_f_5pimms_15mega_crank_fast_randint(0, (__pyx_v_L - 3)));
+3294:             direction = randint(0, 1)
      __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_randint(0, 1);
+3295:             restored = 0
      __pyx_v_restored = 0;
+3296:             nR = 0
      __pyx_v_nR = 0;
 3297: 
+3298:             if direction == 0:
      __pyx_t_1 = (__pyx_v_direction == 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L16;
      }
+3299:                 nF = pull_first_targets_2D(grid, bx[i - 1], by[i - 1], bx[i], by[i],
        __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i - 1)]), (__pyx_v_by[(__pyx_v_i - 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf);
 3300:                                            hardwall, XDIM, YDIM, tbuf)
+3301:                 if nF == 0:
        __pyx_t_1 = (__pyx_v_nF == 0);
        if (__pyx_t_1) {
/* … */
        }
+3302:                     continue
          goto __pyx_L11_continue;
+3303:                 r = randint(0, nF - 1)
        __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_randint(0, (__pyx_v_nF - 1));
+3304:                 sx = tbuf[2 * r]; sy = tbuf[2 * r + 1]
        __pyx_v_sx = (__pyx_v_tbuf[(2 * __pyx_v_r)]);
        __pyx_v_sy = (__pyx_v_tbuf[((2 * __pyx_v_r) + 1)]);
+3305:                 de = get_energy_change_2D_c(grid, type_grid, bx[i], by[i], sx, sy,
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+3306:                                             idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
        __pyx_t_7 = (__pyx_v_off + __pyx_v_i);
        __pyx_t_6 = 1;
 3307:                                             SLR_interaction_table, XDIM, YDIM, hardwall)
+3308:                 newp[0] = sx; newp[1] = sy
        (__pyx_v_newp[0]) = __pyx_v_sx;
        (__pyx_v_newp[1]) = __pyx_v_sy;
+3309:                 de = de + get_angle_energy_change_2D_c(off + i, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3310:                 _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], sx, sy, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_chainID);
+3311:                 pnx = sx; pny = sy
        __pyx_v_pnx = __pyx_v_sx;
        __pyx_v_pny = __pyx_v_sy;
+3312:                 k = i
        __pyx_v_k = __pyx_v_i;
+3313:                 for j in range(i + 1, L):
        __pyx_t_8 = __pyx_v_L;
        __pyx_t_9 = __pyx_t_8;
        for (__pyx_t_10 = (__pyx_v_i + 1); __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
          __pyx_v_j = __pyx_t_10;
+3314:                     if cheby_adjacent_2D(pnx, pny, bx[j], by[j], XDIM, YDIM, hardwall) == 1:
          __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_pnx, __pyx_v_pny, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 1);
          if (__pyx_t_1) {
/* … */
          }
+3315:                         k = j - 1; restored = 1; break
            __pyx_v_k = (__pyx_v_j - 1);
            __pyx_v_restored = 1;
            goto __pyx_L19_break;
+3316:                     ox = bx[j]; oy = by[j]
          __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
          __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
+3317:                     tx = bx[j - 1]; ty = by[j - 1]
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j - 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_j - 1)]);
+3318:                     de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+3319:                                                      idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
          __pyx_t_6 = (__pyx_v_off + __pyx_v_j);
          __pyx_t_7 = 1;
 3320:                                                      SLR_interaction_table, XDIM, YDIM, hardwall)
+3321:                     newp[0] = tx; newp[1] = ty
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
+3322:                     de = de + get_angle_energy_change_2D_c(off + j, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3323:                     _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + j, ox, oy, tx, ty, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
+3324:                     pnx = tx; pny = ty
          __pyx_v_pnx = __pyx_v_tx;
          __pyx_v_pny = __pyx_v_ty;
+3325:                     k = j
          __pyx_v_k = __pyx_v_j;
        }
        __pyx_L19_break:;
+3326:                 lo = i; hi = k
        __pyx_v_lo = __pyx_v_i;
        __pyx_v_hi = __pyx_v_k;
+3327:                 if restored == 1:
        __pyx_t_1 = (__pyx_v_restored == 1);
        if (__pyx_t_1) {
/* … */
        }
+3328:                     nR = pull_first_targets_2D(grid, bx[k + 1], by[k + 1],
          __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k + 1)]), (__pyx_v_by[(__pyx_v_k + 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_7 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_6 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_12 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf);
+3329:                                                idx_to_bead[off + k, 5], idx_to_bead[off + k, 6],
          __pyx_t_7 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_6 = 5;
          __pyx_t_11 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_12 = 6;
 3330:                                                hardwall, XDIM, YDIM, tbuf)
 3331:             else:
+3332:                 nF = pull_first_targets_2D(grid, bx[i + 1], by[i + 1], bx[i], by[i],
      /*else*/ {
/* … */
        __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i + 1)]), (__pyx_v_by[(__pyx_v_i + 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf);
 3333:                                            hardwall, XDIM, YDIM, tbuf)
+3334:                 if nF == 0:
        __pyx_t_1 = (__pyx_v_nF == 0);
        if (__pyx_t_1) {
/* … */
        }
+3335:                     continue
          goto __pyx_L11_continue;
+3336:                 r = randint(0, nF - 1)
        __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_randint(0, (__pyx_v_nF - 1));
+3337:                 sx = tbuf[2 * r]; sy = tbuf[2 * r + 1]
        __pyx_v_sx = (__pyx_v_tbuf[(2 * __pyx_v_r)]);
        __pyx_v_sy = (__pyx_v_tbuf[((2 * __pyx_v_r) + 1)]);
+3338:                 de = get_energy_change_2D_c(grid, type_grid, bx[i], by[i], sx, sy,
        __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_12 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+3339:                                             idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
        __pyx_t_12 = (__pyx_v_off + __pyx_v_i);
        __pyx_t_11 = 1;
 3340:                                             SLR_interaction_table, XDIM, YDIM, hardwall)
+3341:                 newp[0] = sx; newp[1] = sy
        (__pyx_v_newp[0]) = __pyx_v_sx;
        (__pyx_v_newp[1]) = __pyx_v_sy;
+3342:                 de = de + get_angle_energy_change_2D_c(off + i, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3343:                 _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], sx, sy, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_chainID);
+3344:                 pnx = sx; pny = sy
        __pyx_v_pnx = __pyx_v_sx;
        __pyx_v_pny = __pyx_v_sy;
+3345:                 k = i
        __pyx_v_k = __pyx_v_i;
+3346:                 for j in range(i - 1, -1, -1):
        for (__pyx_t_8 = (__pyx_v_i - 1); __pyx_t_8 > -1; __pyx_t_8-=1) {
          __pyx_v_j = __pyx_t_8;
+3347:                     if cheby_adjacent_2D(pnx, pny, bx[j], by[j], XDIM, YDIM, hardwall) == 1:
          __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_pnx, __pyx_v_pny, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 1);
          if (__pyx_t_1) {
/* … */
          }
+3348:                         k = j + 1; restored = 1; break
            __pyx_v_k = (__pyx_v_j + 1);
            __pyx_v_restored = 1;
            goto __pyx_L24_break;
+3349:                     ox = bx[j]; oy = by[j]
          __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
          __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
+3350:                     tx = bx[j + 1]; ty = by[j + 1]
          __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j + 1)]);
          __pyx_v_ty = (__pyx_v_by[(__pyx_v_j + 1)]);
+3351:                     de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_11 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_12 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+3352:                                                      idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
          __pyx_t_11 = (__pyx_v_off + __pyx_v_j);
          __pyx_t_12 = 1;
 3353:                                                      SLR_interaction_table, XDIM, YDIM, hardwall)
+3354:                     newp[0] = tx; newp[1] = ty
          (__pyx_v_newp[0]) = __pyx_v_tx;
          (__pyx_v_newp[1]) = __pyx_v_ty;
+3355:                     de = de + get_angle_energy_change_2D_c(off + j, idx_to_bead, newp, angle_lookup)
          __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3356:                     _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + j, ox, oy, tx, ty, chainID)
          __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
+3357:                     pnx = tx; pny = ty
          __pyx_v_pnx = __pyx_v_tx;
          __pyx_v_pny = __pyx_v_ty;
+3358:                     k = j
          __pyx_v_k = __pyx_v_j;
        }
        __pyx_L24_break:;
+3359:                 lo = k; hi = i
        __pyx_v_lo = __pyx_v_k;
        __pyx_v_hi = __pyx_v_i;
+3360:                 if restored == 1:
        __pyx_t_1 = (__pyx_v_restored == 1);
        if (__pyx_t_1) {
/* … */
        }
      }
      __pyx_L16:;
+3361:                     nR = pull_first_targets_2D(grid, bx[k - 1], by[k - 1],
          __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k - 1)]), (__pyx_v_by[(__pyx_v_k - 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_12 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_11 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_6 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_7 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf);
+3362:                                                idx_to_bead[off + k, 5], idx_to_bead[off + k, 6],
          __pyx_t_12 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_11 = 5;
          __pyx_t_6 = (__pyx_v_off + __pyx_v_k);
          __pyx_t_7 = 6;
 3363:                                                hardwall, XDIM, YDIM, tbuf)
 3364: 
+3365:             if restored == 0:
      __pyx_t_1 = (__pyx_v_restored == 0);
      if (__pyx_t_1) {
/* … */
      }
+3366:                 _revert_segment_2D(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, chainID)
        __pyx_f_5pimms_15mega_crank_fast__revert_segment_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_chainID);
+3367:                 continue
        goto __pyx_L11_continue;
 3368: 
 3369:             # Metropolis-Hastings with the nF/nR proposal-multiplicity correction
+3370:             if accept_or_reject_ratio(invtemp, energy, energy + de, nF, nR) == 1:
      __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_accept_or_reject_ratio(__pyx_v_invtemp, __pyx_v_energy, (__pyx_v_energy + __pyx_v_de), __pyx_v_nF, __pyx_v_nR) == 1);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L28;
      }
+3371:                 energy = energy + de
        __pyx_v_energy = (__pyx_v_energy + __pyx_v_de);
+3372:                 accepted = accepted + 1
        __pyx_v_accepted = (__pyx_v_accepted + 1);
 3373:             else:
+3374:                 _revert_segment_2D(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, chainID)
      /*else*/ {
        __pyx_f_5pimms_15mega_crank_fast__revert_segment_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_chainID);
      }
      __pyx_L28:;
      __pyx_L11_continue:;
    }
  }
 3375:     finally:
+3376:         free(bx); free(by)
  /*finally:*/ {
    /*normal exit:*/{
      free(__pyx_v_bx);
      free(__pyx_v_by);
      goto __pyx_L10;
    }
    __pyx_L10:;
  }
 3377: 
+3378:     return (energy, accepted)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_13 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 3378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyLong_From_int(__pyx_v_accepted); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 3378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 3378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_15);
  __Pyx_GIVEREF(__pyx_t_13);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13) != (0)) __PYX_ERR(0, 3378, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_14);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_14) != (0)) __PYX_ERR(0, 3378, __pyx_L1_error);
  __pyx_t_13 = 0;
  __pyx_t_14 = 0;
  __pyx_r = __pyx_t_15;
  __pyx_t_15 = 0;
  goto __pyx_L0;
 3379: 
 3380: 
 3381: # =====================================================================
 3382: #   PARALLEL pull (cooperative reptation) megamove - chain-level frozen-halo
 3383: #
 3384: #   Like the parallel slither, pull is a whole-chain move, so it uses the same
 3385: #   chain-level decomposition: a chain (length >= 3) is pulled in a block only if
 3386: #   ALL of its beads lie in that block's interior. A pull cascade creates exactly
 3387: #   one NEW occupied site - the first target s the displaced interior bead moves
 3388: #   to - while every other touched site is a relabelling of an already-occupied
 3389: #   chain site. The extra subtlety vs slither is pull's asymmetric proposal: the
 3390: #   Metropolis-Hastings acceptance carries the first-target multiplicity ratio
 3391: #   nF/nR. To keep that ratio self-consistent AND keep the chain inside the block,
 3392: #   the first-target search is restricted to the block interior (pull_first_targets
 3393: #   _interior), so BOTH nF and nR count only interior targets and the moved beads
 3394: #   always land in the interior. The chain therefore stays invariantly in-block;
 3395: #   block footprints are disjoint and run concurrently. Independent of thread
 3396: #   count; targets the same Boltzmann distribution as the serial pull.
 3397: # =====================================================================
 3398: 
+3399: cdef inline int accept_p_ratio(float invtemp, long de, int nF, int nR,
static CYTHON_INLINE int __pyx_f_5pimms_15mega_crank_fast_accept_p_ratio(float __pyx_v_invtemp, long __pyx_v_de, int __pyx_v_nF, int __pyx_v_nR, unsigned PY_LONG_LONG *__pyx_v_rng) {
  double __pyx_v_acc;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.accept_p_ratio", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 3400:                                unsigned long long* rng) noexcept nogil:
 3401:     # per-block Metropolis-Hastings: accept iff rand < (nF/nR) * exp(-de*invtemp)
 3402:     cdef double acc
+3403:     if nR <= 0:
  __pyx_t_1 = (__pyx_v_nR <= 0);
  if (__pyx_t_1) {
/* … */
  }
+3404:         return 0
    __pyx_r = 0;
    goto __pyx_L0;
+3405:     acc = (<double>nF / <double>nR) * exp(-(<double>de) * invtemp)
  if (unlikely(((double)__pyx_v_nR) == 0)) {
    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
    __Pyx_PyGILState_Release(__pyx_gilstate_save);
    __PYX_ERR(0, 3405, __pyx_L1_error)
  }
  __pyx_v_acc = ((((double)__pyx_v_nF) / ((double)__pyx_v_nR)) * exp(((-((double)__pyx_v_de)) * __pyx_v_invtemp)));
+3406:     if acc >= 1.0:
  __pyx_t_1 = (__pyx_v_acc >= 1.0);
  if (__pyx_t_1) {
/* … */
  }
+3407:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+3408:     if rng_uniform(rng) < acc:
  __pyx_t_1 = (__pyx_f_5pimms_15mega_crank_fast_rng_uniform(__pyx_v_rng) < __pyx_v_acc);
  if (__pyx_t_1) {
/* … */
  }
+3409:         return 1
    __pyx_r = 1;
    goto __pyx_L0;
+3410:     return 0
  __pyx_r = 0;
  goto __pyx_L0;
 3411: 
 3412: 
+3413: cdef int pull_first_targets_interior(NUMPY_INT_TYPE[:, :, :] grid,
static int __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior(__Pyx_memviewslice __pyx_v_grid, int __pyx_v_anchor_x, int __pyx_v_anchor_y, int __pyx_v_anchor_z, int __pyx_v_mov_x, int __pyx_v_mov_y, int __pyx_v_mov_z, int __pyx_v_hardwall, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int *__pyx_v_out_buf, int __pyx_v_blo_x_b, int __pyx_v_blo_y_b, int __pyx_v_blo_z_b, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_Lz, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_nbz, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_shift_z, int __pyx_v_W) {
  int __pyx_v_count;
  int __pyx_v_dx;
  int __pyx_v_dy;
  int __pyx_v_dz;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_tz;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.pull_first_targets_interior", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 3414:                                      int anchor_x, int anchor_y, int anchor_z,
 3415:                                      int mov_x, int mov_y, int mov_z,
 3416:                                      int hardwall, int XDIM, int YDIM, int ZDIM,
 3417:                                      int* out_buf,
 3418:                                      int blo_x_b, int blo_y_b, int blo_z_b,
 3419:                                      int Lx, int Ly, int Lz, int nbx, int nby, int nbz,
 3420:                                      int shift_x, int shift_y, int shift_z, int W) noexcept nogil:
 3421:     # as pull_first_targets, but additionally require the target to lie in the
 3422:     # block interior (so the moved bead stays in-block and nF/nR stay consistent).
+3423:     cdef int count = 0
  __pyx_v_count = 0;
 3424:     cdef int dx, dy, dz, tx, ty, tz
+3425:     for dx in range(-1, 2):
  for (__pyx_t_1 = -1; __pyx_t_1 < 2; __pyx_t_1+=1) {
    __pyx_v_dx = __pyx_t_1;
+3426:         for dy in range(-1, 2):
    for (__pyx_t_2 = -1; __pyx_t_2 < 2; __pyx_t_2+=1) {
      __pyx_v_dy = __pyx_t_2;
+3427:             for dz in range(-1, 2):
      for (__pyx_t_3 = -1; __pyx_t_3 < 2; __pyx_t_3+=1) {
        __pyx_v_dz = __pyx_t_3;
+3428:                 tx = pbc_correction(mov_x + dx, XDIM)
        __pyx_v_tx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_x + __pyx_v_dx), __pyx_v_XDIM);
+3429:                 ty = pbc_correction(mov_y + dy, YDIM)
        __pyx_v_ty = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_y + __pyx_v_dy), __pyx_v_YDIM);
+3430:                 tz = pbc_correction(mov_z + dz, ZDIM)
        __pyx_v_tz = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_z + __pyx_v_dz), __pyx_v_ZDIM);
+3431:                 if grid[tx, ty, tz] != 0:
        __pyx_t_4 = __pyx_v_tx;
        __pyx_t_5 = __pyx_v_ty;
        __pyx_t_6 = __pyx_v_tz;
        __pyx_t_7 = -1;
        if (__pyx_t_4 < 0) {
          __pyx_t_4 += __pyx_v_grid.shape[0];
          if (unlikely(__pyx_t_4 < 0)) __pyx_t_7 = 0;
        } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[0])) __pyx_t_7 = 0;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_v_grid.shape[1];
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_7 = 1;
        } else if (unlikely(__pyx_t_5 >= __pyx_v_grid.shape[1])) __pyx_t_7 = 1;
        if (__pyx_t_6 < 0) {
          __pyx_t_6 += __pyx_v_grid.shape[2];
          if (unlikely(__pyx_t_6 < 0)) __pyx_t_7 = 2;
        } else if (unlikely(__pyx_t_6 >= __pyx_v_grid.shape[2])) __pyx_t_7 = 2;
        if (unlikely(__pyx_t_7 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_7);
          __PYX_ERR(0, 3431, __pyx_L1_error)
        }
        __pyx_t_8 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_4 * __pyx_v_grid.strides[0]) ) + __pyx_t_5 * __pyx_v_grid.strides[1]) ) + __pyx_t_6 * __pyx_v_grid.strides[2]) ))) != 0);
        if (__pyx_t_8) {
/* … */
        }
+3432:                     continue
          goto __pyx_L7_continue;
+3433:                 if cheby_adjacent(tx, ty, tz, mov_x, mov_y, mov_z, XDIM, YDIM, ZDIM, hardwall) == 0:
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_mov_x, __pyx_v_mov_y, __pyx_v_mov_z, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 0);
        if (__pyx_t_8) {
/* … */
        }
+3434:                     continue
          goto __pyx_L7_continue;
+3435:                 if cheby_adjacent(tx, ty, tz, anchor_x, anchor_y, anchor_z, XDIM, YDIM, ZDIM, hardwall) == 0:
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_anchor_x, __pyx_v_anchor_y, __pyx_v_anchor_z, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 0);
        if (__pyx_t_8) {
/* … */
        }
+3436:                     continue
          goto __pyx_L7_continue;
+3437:                 if _in_interior_3d(tx, ty, tz, blo_x_b, blo_y_b, blo_z_b,
        if (__pyx_t_8) {
/* … */
        }
 3438:                                    Lx, Ly, Lz, nbx, nby, nbz, shift_x, shift_y, shift_z, W,
+3439:                                    XDIM, YDIM, ZDIM) == 0:
        __pyx_t_8 = (__pyx_f_5pimms_15mega_crank_fast__in_interior_3d(__pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_blo_x_b, __pyx_v_blo_y_b, __pyx_v_blo_z_b, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM) == 0);
+3440:                     continue
          goto __pyx_L7_continue;
+3441:                 out_buf[3 * count] = tx
        (__pyx_v_out_buf[(3 * __pyx_v_count)]) = __pyx_v_tx;
+3442:                 out_buf[3 * count + 1] = ty
        (__pyx_v_out_buf[((3 * __pyx_v_count) + 1)]) = __pyx_v_ty;
+3443:                 out_buf[3 * count + 2] = tz
        (__pyx_v_out_buf[((3 * __pyx_v_count) + 2)]) = __pyx_v_tz;
+3444:                 count = count + 1
        __pyx_v_count = (__pyx_v_count + 1);
        __pyx_L7_continue:;
      }
    }
  }
+3445:     return count
  __pyx_r = __pyx_v_count;
  goto __pyx_L0;
 3446: 
 3447: 
+3448: cdef void run_block_pull(int b,
static void __pyx_f_5pimms_15mega_crank_fast_run_block_pull(int __pyx_v_b, __Pyx_memviewslice __pyx_v_chain_ids, __Pyx_memviewslice __pyx_v_starts, __Pyx_memviewslice __pyx_v_attempts, __Pyx_memviewslice __pyx_v_seeds, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_blo_x, __Pyx_memviewslice __pyx_v_blo_y, __Pyx_memviewslice __pyx_v_blo_z, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_Lz, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_nbz, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_shift_z, int __pyx_v_W, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, float __pyx_v_invtemp, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_ZDIM, int __pyx_v_hardwall, __Pyx_memviewslice __pyx_v_out_delta, __Pyx_memviewslice __pyx_v_out_accepted) {
  int __pyx_v_lo_blk;
  int __pyx_v_hi_blk;
  int __pyx_v_n_block;
  unsigned PY_LONG_LONG __pyx_v_rng;
  long __pyx_v_dsum;
  int __pyx_v_acc;
  CYTHON_UNUSED int __pyx_v_step;
  int __pyx_v_pick;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_chainID;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_direction;
  int __pyx_v_nF;
  int __pyx_v_nR;
  int __pyx_v_r;
  int __pyx_v_restored;
  int __pyx_v_lo;
  int __pyx_v_hi;
  long __pyx_v_de;
  int __pyx_v_sx;
  int __pyx_v_sy;
  int __pyx_v_sz;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_oz;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_tz;
  int __pyx_v_pnx;
  int __pyx_v_pny;
  int __pyx_v_pnz;
  int __pyx_v_newp[3];
  int __pyx_v_tbuf[81];
  int __pyx_v_bx[512];
  int __pyx_v_by[512];
  int __pyx_v_bz[512];
  int __pyx_v_bxb;
  int __pyx_v_byb;
  int __pyx_v_bzb;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.run_block_pull", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 3449:                          int[::1] chain_ids, int[::1] starts, int[::1] attempts,
 3450:                          unsigned long long[::1] seeds,
 3451:                          int[::1] chain_offset, int[::1] chain_length,
 3452:                          int[::1] blo_x, int[::1] blo_y, int[::1] blo_z,
 3453:                          int Lx, int Ly, int Lz, int nbx, int nby, int nbz,
 3454:                          int shift_x, int shift_y, int shift_z, int W,
 3455:                          NUMPY_INT_TYPE[:, :, :] grid, NUMPY_INT_TYPE[:, :, :] type_grid,
 3456:                          NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 3457:                          NUMPY_INT_TYPE[:, :] interaction_table,
 3458:                          NUMPY_INT_TYPE[:, :] LR_interaction_table,
 3459:                          NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 3460:                          NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 3461:                          float invtemp, int XDIM, int YDIM, int ZDIM, int hardwall,
 3462:                          long[::1] out_delta, int[::1] out_accepted) noexcept nogil:
 3463: 
+3464:     cdef int lo_blk = starts[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3464, __pyx_L1_error)
  }
  __pyx_v_lo_blk = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+3465:     cdef int hi_blk = starts[b + 1]
  __pyx_t_1 = (__pyx_v_b + 1);
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3465, __pyx_L1_error)
  }
  __pyx_v_hi_blk = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+3466:     cdef int n_block = hi_blk - lo_blk
  __pyx_v_n_block = (__pyx_v_hi_blk - __pyx_v_lo_blk);
+3467:     out_delta[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3467, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = 0;
+3468:     out_accepted[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3468, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = 0;
+3469:     if n_block <= 0:
  __pyx_t_3 = (__pyx_v_n_block <= 0);
  if (__pyx_t_3) {
/* … */
  }
+3470:         return
    goto __pyx_L0;
 3471: 
+3472:     cdef unsigned long long rng = seeds[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_seeds.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_seeds.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3472, __pyx_L1_error)
  }
  __pyx_v_rng = (*((unsigned PY_LONG_LONG *) ( /* dim=0 */ ((char *) (((unsigned PY_LONG_LONG *) __pyx_v_seeds.data) + __pyx_t_1)) )));
+3473:     cdef long dsum = 0
  __pyx_v_dsum = 0;
+3474:     cdef int acc = 0
  __pyx_v_acc = 0;
 3475:     cdef int step, pick, c, off, L, chainID, i, j, k, direction, nF, nR, r, restored, lo, hi
 3476:     cdef long de
 3477:     cdef int sx, sy, sz, ox, oy, oz, tx, ty, tz, pnx, pny, pnz
 3478:     cdef int newp[3]
 3479:     cdef int tbuf[81]
 3480:     cdef int bx[512]
 3481:     cdef int by[512]
 3482:     cdef int bz[512]
 3483: 
+3484:     cdef int bxb = blo_x[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_blo_x.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_x.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3484, __pyx_L1_error)
  }
  __pyx_v_bxb = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) )));
+3485:     cdef int byb = blo_y[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_blo_y.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_y.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3485, __pyx_L1_error)
  }
  __pyx_v_byb = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_1)) )));
+3486:     cdef int bzb = blo_z[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_blo_z.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_z.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3486, __pyx_L1_error)
  }
  __pyx_v_bzb = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_z.data) + __pyx_t_1)) )));
 3487: 
+3488:     for step in range(attempts[b]):
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_attempts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_attempts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3488, __pyx_L1_error)
  }
  __pyx_t_2 = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_attempts.data) + __pyx_t_1)) )));
  __pyx_t_4 = __pyx_t_2;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_step = __pyx_t_5;
+3489:         pick = lo_blk + <int>(rng_uniform(&rng) * n_block)
    __pyx_v_pick = (__pyx_v_lo_blk + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform((&__pyx_v_rng)) * __pyx_v_n_block)));
+3490:         if pick >= hi_blk:
    __pyx_t_3 = (__pyx_v_pick >= __pyx_v_hi_blk);
    if (__pyx_t_3) {
/* … */
    }
+3491:             pick = hi_blk - 1
      __pyx_v_pick = (__pyx_v_hi_blk - 1);
+3492:         c = chain_ids[pick]
    __pyx_t_1 = __pyx_v_pick;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_ids.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_ids.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3492, __pyx_L1_error)
    }
    __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_ids.data) + __pyx_t_1)) )));
+3493:         off = chain_offset[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_offset.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_offset.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3493, __pyx_L1_error)
    }
    __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_1)) )));
+3494:         L = chain_length[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_length.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_length.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3494, __pyx_L1_error)
    }
    __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_1)) )));
+3495:         if L < 3 or L > 512:
    __pyx_t_7 = (__pyx_v_L < 3);
    if (!__pyx_t_7) {
    } else {
      __pyx_t_3 = __pyx_t_7;
      goto __pyx_L8_bool_binop_done;
    }
    __pyx_t_7 = (__pyx_v_L > 0x200);
    __pyx_t_3 = __pyx_t_7;
    __pyx_L8_bool_binop_done:;
    if (__pyx_t_3) {
/* … */
    }
+3496:             continue
      goto __pyx_L4_continue;
+3497:         chainID = idx_to_bead[off, 4]
    __pyx_t_1 = __pyx_v_off;
    __pyx_t_8 = 4;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3497, __pyx_L1_error)
    }
    __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
 3498: 
+3499:         for j in range(L):
    __pyx_t_6 = __pyx_v_L;
    __pyx_t_9 = __pyx_t_6;
    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_j = __pyx_t_10;
+3500:             bx[j] = idx_to_bead[off + j, 5]
      __pyx_t_8 = (__pyx_v_off + __pyx_v_j);
      __pyx_t_1 = 5;
      __pyx_t_11 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
        __PYX_ERR(0, 3500, __pyx_L1_error)
      }
      (__pyx_v_bx[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+3501:             by[j] = idx_to_bead[off + j, 6]
      __pyx_t_1 = (__pyx_v_off + __pyx_v_j);
      __pyx_t_8 = 6;
      __pyx_t_11 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
        __PYX_ERR(0, 3501, __pyx_L1_error)
      }
      (__pyx_v_by[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
+3502:             bz[j] = idx_to_bead[off + j, 7]
      __pyx_t_8 = (__pyx_v_off + __pyx_v_j);
      __pyx_t_1 = 7;
      __pyx_t_11 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
        __PYX_ERR(0, 3502, __pyx_L1_error)
      }
      (__pyx_v_bz[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
    }
 3503: 
+3504:         i = 1 + rng_randint(&rng, 0, L - 3)
    __pyx_v_i = (1 + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, (__pyx_v_L - 3)));
+3505:         direction = rng_randint(&rng, 0, 1)
    __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 1);
+3506:         restored = 0
    __pyx_v_restored = 0;
+3507:         nR = 0
    __pyx_v_nR = 0;
 3508: 
+3509:         if direction == 0:
    __pyx_t_3 = (__pyx_v_direction == 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L12;
    }
+3510:             nF = pull_first_targets_interior(grid, bx[i - 1], by[i - 1], bz[i - 1],
      __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i - 1)]), (__pyx_v_by[(__pyx_v_i - 1)]), (__pyx_v_bz[(__pyx_v_i - 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_bzb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W);
 3511:                                              bx[i], by[i], bz[i], hardwall, XDIM, YDIM, ZDIM, tbuf,
 3512:                                              bxb, byb, bzb, Lx, Ly, Lz, nbx, nby, nbz,
 3513:                                              shift_x, shift_y, shift_z, W)
+3514:             if nF == 0:
      __pyx_t_3 = (__pyx_v_nF == 0);
      if (__pyx_t_3) {
/* … */
      }
+3515:                 continue
        goto __pyx_L4_continue;
+3516:             r = rng_randint(&rng, 0, nF - 1)
      __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, (__pyx_v_nF - 1));
+3517:             sx = tbuf[3 * r]; sy = tbuf[3 * r + 1]; sz = tbuf[3 * r + 2]
      __pyx_v_sx = (__pyx_v_tbuf[(3 * __pyx_v_r)]);
      __pyx_v_sy = (__pyx_v_tbuf[((3 * __pyx_v_r) + 1)]);
      __pyx_v_sz = (__pyx_v_tbuf[((3 * __pyx_v_r) + 2)]);
+3518:             de = get_energy_change_c(grid, type_grid, bx[i], by[i], bz[i], sx, sy, sz,
      __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+3519:                                      idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
      __pyx_t_1 = (__pyx_v_off + __pyx_v_i);
      __pyx_t_8 = 1;
      __pyx_t_6 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 3519, __pyx_L1_error)
      }
 3520:                                      SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3521:             newp[0] = sx; newp[1] = sy; newp[2] = sz
      (__pyx_v_newp[0]) = __pyx_v_sx;
      (__pyx_v_newp[1]) = __pyx_v_sy;
      (__pyx_v_newp[2]) = __pyx_v_sz;
+3522:             de = de + get_angle_energy_change_c(off + i, idx_to_bead, newp, angle_lookup)
      __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3523:             _apply_bead_move(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], bz[i], sx, sy, sz, chainID)
      __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, __pyx_v_chainID);
+3524:             pnx = sx; pny = sy; pnz = sz
      __pyx_v_pnx = __pyx_v_sx;
      __pyx_v_pny = __pyx_v_sy;
      __pyx_v_pnz = __pyx_v_sz;
+3525:             k = i
      __pyx_v_k = __pyx_v_i;
+3526:             for j in range(i + 1, L):
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_9 = __pyx_t_6;
      for (__pyx_t_10 = (__pyx_v_i + 1); __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
        __pyx_v_j = __pyx_t_10;
+3527:                 if cheby_adjacent(pnx, pny, pnz, bx[j], by[j], bz[j], XDIM, YDIM, ZDIM, hardwall) == 1:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_pnx, __pyx_v_pny, __pyx_v_pnz, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), (__pyx_v_bz[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 1);
        if (__pyx_t_3) {
/* … */
        }
+3528:                     k = j - 1; restored = 1; break
          __pyx_v_k = (__pyx_v_j - 1);
          __pyx_v_restored = 1;
          goto __pyx_L15_break;
+3529:                 ox = bx[j]; oy = by[j]; oz = bz[j]
        __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
        __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
        __pyx_v_oz = (__pyx_v_bz[__pyx_v_j]);
+3530:                 tx = bx[j - 1]; ty = by[j - 1]; tz = bz[j - 1]
        __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j - 1)]);
        __pyx_v_ty = (__pyx_v_by[(__pyx_v_j - 1)]);
        __pyx_v_tz = (__pyx_v_bz[(__pyx_v_j - 1)]);
+3531:                 de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+3532:                                               idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
        __pyx_t_8 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_1 = 1;
        __pyx_t_11 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
        if (unlikely(__pyx_t_11 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
          __PYX_ERR(0, 3532, __pyx_L1_error)
        }
 3533:                                               SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3534:                 newp[0] = tx; newp[1] = ty; newp[2] = tz
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
        (__pyx_v_newp[2]) = __pyx_v_tz;
+3535:                 de = de + get_angle_energy_change_c(off + j, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3536:                 _apply_bead_move(grid, type_grid, idx_to_bead, off + j, ox, oy, oz, tx, ty, tz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
+3537:                 pnx = tx; pny = ty; pnz = tz
        __pyx_v_pnx = __pyx_v_tx;
        __pyx_v_pny = __pyx_v_ty;
        __pyx_v_pnz = __pyx_v_tz;
+3538:                 k = j
        __pyx_v_k = __pyx_v_j;
      }
      __pyx_L15_break:;
+3539:             lo = i; hi = k
      __pyx_v_lo = __pyx_v_i;
      __pyx_v_hi = __pyx_v_k;
+3540:             if restored == 1:
      __pyx_t_3 = (__pyx_v_restored == 1);
      if (__pyx_t_3) {
/* … */
      }
+3541:                 nR = pull_first_targets_interior(grid, bx[k + 1], by[k + 1], bz[k + 1],
        __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k + 1)]), (__pyx_v_by[(__pyx_v_k + 1)]), (__pyx_v_bz[(__pyx_v_k + 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_12 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_13 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_14 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_15 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_bzb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W);
+3542:                                                  idx_to_bead[off + k, 5], idx_to_bead[off + k, 6], idx_to_bead[off + k, 7],
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_8 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3542, __pyx_L1_error)
        }
        __pyx_t_12 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_13 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_12 < 0) {
          __pyx_t_12 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_12 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_12 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_13 < 0) {
          __pyx_t_13 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_13 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_13 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3542, __pyx_L1_error)
        }
        __pyx_t_14 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_15 = 7;
        __pyx_t_6 = -1;
        if (__pyx_t_14 < 0) {
          __pyx_t_14 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_14 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_14 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_15 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3542, __pyx_L1_error)
        }
 3543:                                                  hardwall, XDIM, YDIM, ZDIM, tbuf,
 3544:                                                  bxb, byb, bzb, Lx, Ly, Lz, nbx, nby, nbz,
 3545:                                                  shift_x, shift_y, shift_z, W)
 3546:         else:
+3547:             nF = pull_first_targets_interior(grid, bx[i + 1], by[i + 1], bz[i + 1],
    /*else*/ {
/* … */
      __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i + 1)]), (__pyx_v_by[(__pyx_v_i + 1)]), (__pyx_v_bz[(__pyx_v_i + 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_bzb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W);
 3548:                                              bx[i], by[i], bz[i], hardwall, XDIM, YDIM, ZDIM, tbuf,
 3549:                                              bxb, byb, bzb, Lx, Ly, Lz, nbx, nby, nbz,
 3550:                                              shift_x, shift_y, shift_z, W)
+3551:             if nF == 0:
      __pyx_t_3 = (__pyx_v_nF == 0);
      if (__pyx_t_3) {
/* … */
      }
+3552:                 continue
        goto __pyx_L4_continue;
+3553:             r = rng_randint(&rng, 0, nF - 1)
      __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, (__pyx_v_nF - 1));
+3554:             sx = tbuf[3 * r]; sy = tbuf[3 * r + 1]; sz = tbuf[3 * r + 2]
      __pyx_v_sx = (__pyx_v_tbuf[(3 * __pyx_v_r)]);
      __pyx_v_sy = (__pyx_v_tbuf[((3 * __pyx_v_r) + 1)]);
      __pyx_v_sz = (__pyx_v_tbuf[((3 * __pyx_v_r) + 2)]);
+3555:             de = get_energy_change_c(grid, type_grid, bx[i], by[i], bz[i], sx, sy, sz,
      __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_15 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_14 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall);
+3556:                                      idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
      __pyx_t_15 = (__pyx_v_off + __pyx_v_i);
      __pyx_t_14 = 1;
      __pyx_t_6 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_15 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_15 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_14 < 0) {
        __pyx_t_14 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_14 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_14 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 3556, __pyx_L1_error)
      }
 3557:                                      SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3558:             newp[0] = sx; newp[1] = sy; newp[2] = sz
      (__pyx_v_newp[0]) = __pyx_v_sx;
      (__pyx_v_newp[1]) = __pyx_v_sy;
      (__pyx_v_newp[2]) = __pyx_v_sz;
+3559:             de = de + get_angle_energy_change_c(off + i, idx_to_bead, newp, angle_lookup)
      __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3560:             _apply_bead_move(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], bz[i], sx, sy, sz, chainID)
      __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), (__pyx_v_bz[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_sz, __pyx_v_chainID);
+3561:             pnx = sx; pny = sy; pnz = sz
      __pyx_v_pnx = __pyx_v_sx;
      __pyx_v_pny = __pyx_v_sy;
      __pyx_v_pnz = __pyx_v_sz;
+3562:             k = i
      __pyx_v_k = __pyx_v_i;
+3563:             for j in range(i - 1, -1, -1):
      for (__pyx_t_6 = (__pyx_v_i - 1); __pyx_t_6 > -1; __pyx_t_6-=1) {
        __pyx_v_j = __pyx_t_6;
+3564:                 if cheby_adjacent(pnx, pny, pnz, bx[j], by[j], bz[j], XDIM, YDIM, ZDIM, hardwall) == 1:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent(__pyx_v_pnx, __pyx_v_pny, __pyx_v_pnz, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), (__pyx_v_bz[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall) == 1);
        if (__pyx_t_3) {
/* … */
        }
+3565:                     k = j + 1; restored = 1; break
          __pyx_v_k = (__pyx_v_j + 1);
          __pyx_v_restored = 1;
          goto __pyx_L20_break;
+3566:                 ox = bx[j]; oy = by[j]; oz = bz[j]
        __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
        __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
        __pyx_v_oz = (__pyx_v_bz[__pyx_v_j]);
+3567:                 tx = bx[j + 1]; ty = by[j + 1]; tz = bz[j + 1]
        __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j + 1)]);
        __pyx_v_ty = (__pyx_v_by[(__pyx_v_j + 1)]);
        __pyx_v_tz = (__pyx_v_bz[(__pyx_v_j + 1)]);
+3568:                 de = de + get_energy_change_c(grid, type_grid, ox, oy, oz, tx, ty, tz,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_14 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_15 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall));
+3569:                                               idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
        __pyx_t_14 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_15 = 1;
        __pyx_t_9 = -1;
        if (__pyx_t_14 < 0) {
          __pyx_t_14 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_14 < 0)) __pyx_t_9 = 0;
        } else if (unlikely(__pyx_t_14 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_9 = 0;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_9 = 1;
        } else if (unlikely(__pyx_t_15 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_9 = 1;
        if (unlikely(__pyx_t_9 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_9);
          __PYX_ERR(0, 3569, __pyx_L1_error)
        }
 3570:                                               SLR_interaction_table, XDIM, YDIM, ZDIM, hardwall)
+3571:                 newp[0] = tx; newp[1] = ty; newp[2] = tz
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
        (__pyx_v_newp[2]) = __pyx_v_tz;
+3572:                 de = de + get_angle_energy_change_c(off + j, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3573:                 _apply_bead_move(grid, type_grid, idx_to_bead, off + j, ox, oy, oz, tx, ty, tz, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_oz, __pyx_v_tx, __pyx_v_ty, __pyx_v_tz, __pyx_v_chainID);
+3574:                 pnx = tx; pny = ty; pnz = tz
        __pyx_v_pnx = __pyx_v_tx;
        __pyx_v_pny = __pyx_v_ty;
        __pyx_v_pnz = __pyx_v_tz;
+3575:                 k = j
        __pyx_v_k = __pyx_v_j;
      }
      __pyx_L20_break:;
+3576:             lo = k; hi = i
      __pyx_v_lo = __pyx_v_k;
      __pyx_v_hi = __pyx_v_i;
+3577:             if restored == 1:
      __pyx_t_3 = (__pyx_v_restored == 1);
      if (__pyx_t_3) {
/* … */
      }
    }
    __pyx_L12:;
+3578:                 nR = pull_first_targets_interior(grid, bx[k - 1], by[k - 1], bz[k - 1],
        __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k - 1)]), (__pyx_v_by[(__pyx_v_k - 1)]), (__pyx_v_bz[(__pyx_v_k - 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_15 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_14 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_13 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_12 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_bzb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_v_W);
+3579:                                                  idx_to_bead[off + k, 5], idx_to_bead[off + k, 6], idx_to_bead[off + k, 7],
        __pyx_t_15 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_14 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_14 < 0) {
          __pyx_t_14 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_14 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_14 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3579, __pyx_L1_error)
        }
        __pyx_t_13 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_12 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_13 < 0) {
          __pyx_t_13 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_13 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_13 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_12 < 0) {
          __pyx_t_12 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_12 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_12 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3579, __pyx_L1_error)
        }
        __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 7;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3579, __pyx_L1_error)
        }
 3580:                                                  hardwall, XDIM, YDIM, ZDIM, tbuf,
 3581:                                                  bxb, byb, bzb, Lx, Ly, Lz, nbx, nby, nbz,
 3582:                                                  shift_x, shift_y, shift_z, W)
 3583: 
+3584:         if restored == 0:
    __pyx_t_3 = (__pyx_v_restored == 0);
    if (__pyx_t_3) {
/* … */
    }
+3585:             _revert_segment(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, bz, chainID)
      __pyx_f_5pimms_15mega_crank_fast__revert_segment(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_bz, __pyx_v_chainID);
+3586:             continue
      goto __pyx_L4_continue;
 3587: 
+3588:         if accept_p_ratio(invtemp, de, nF, nR, &rng) == 1:
    __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p_ratio(__pyx_v_invtemp, __pyx_v_de, __pyx_v_nF, __pyx_v_nR, (&__pyx_v_rng)) == 1);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L24;
    }
+3589:             dsum = dsum + de
      __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+3590:             acc = acc + 1
      __pyx_v_acc = (__pyx_v_acc + 1);
 3591:         else:
+3592:             _revert_segment(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, bz, chainID)
    /*else*/ {
      __pyx_f_5pimms_15mega_crank_fast__revert_segment(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_bz, __pyx_v_chainID);
    }
    __pyx_L24:;
    __pyx_L4_continue:;
  }
 3593: 
+3594:     out_delta[b] = dsum
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3594, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = __pyx_v_dsum;
+3595:     out_accepted[b] = acc
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3595, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = __pyx_v_acc;
 3596: 
 3597: 
+3598: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_27mega_pull_parallel(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_26mega_pull_parallel, "\n    Parallel 3D pull megamove (the chain-level-frozen-halo analogue of\n    mega_pull_parallel for slither). chain_selector is used only for the total\n    work count; chains (length >= 3) are picked per block. Returns (energy, accepted).\n    ");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_27mega_pull_parallel = {"mega_pull_parallel", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_27mega_pull_parallel, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_26mega_pull_parallel};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_27mega_pull_parallel(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  CYTHON_UNUSED int __pyx_v_max_chain_len;
  int __pyx_v_num_threads;
  __Pyx_memviewslice __pyx_v_frozen_mask = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_pull_parallel (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,&__pyx_mstate_global->__pyx_n_u_num_threads,&__pyx_mstate_global->__pyx_n_u_frozen_mask,0};
  PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 3598, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 18:
        values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 17:
        values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3598, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_pull_parallel", 0) < (0)) __PYX_ERR(0, 3598, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 18; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_pull_parallel", 1, 18, 18, i); __PYX_ERR(0, 3598, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 18)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 3598, __pyx_L3_error)
      values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 3598, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 3600, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 3601, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 3602, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 3603, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 3604, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 3605, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 3606, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 3607, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 3608, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 3609, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 3610, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 3611, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 3612, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3613, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3614, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3615, __pyx_L3_error)
    __pyx_v_num_threads = __Pyx_PyLong_As_int(values[16]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3616, __pyx_L3_error)
    __pyx_v_frozen_mask = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[17], PyBUF_WRITABLE); if (unlikely(!__pyx_v_frozen_mask.memview)) __PYX_ERR(0, 3617, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_pull_parallel", 1, 18, 18, __pyx_nargs); __PYX_ERR(0, 3598, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_26mega_pull_parallel(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len, __pyx_v_num_threads, __pyx_v_frozen_mask);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_5pimms_15mega_crank_fast_26mega_pull_parallel(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, CYTHON_UNUSED int __pyx_v_max_chain_len, int __pyx_v_num_threads, __Pyx_memviewslice __pyx_v_frozen_mask) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel *__pyx_cur_scope;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_ZDIM;
  int __pyx_v_num_chains;
  int __pyx_v_n_steps;
  PyObject *__pyx_v_idx_np = NULL;
  int __pyx_v_R_int;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_nbz;
  int __pyx_v_Lx;
  int __pyx_v_Ly;
  int __pyx_v_Lz;
  int __pyx_v_num_blocks;
  PyObject *__pyx_v_rstate = NULL;
  int __pyx_v_shift_x;
  int __pyx_v_shift_y;
  int __pyx_v_shift_z;
  PyObject *__pyx_v_gx = NULL;
  PyObject *__pyx_v_gy = NULL;
  PyObject *__pyx_v_gz = NULL;
  PyObject *__pyx_v_dim_block = 0;
  PyObject *__pyx_v_bxj = NULL;
  PyObject *__pyx_v_byj = NULL;
  PyObject *__pyx_v_bzj = NULL;
  PyObject *__pyx_v_block_of_bead = NULL;
  PyObject *__pyx_v_chain_block = NULL;
  PyObject *__pyx_v_movable = NULL;
  PyObject *__pyx_v_mblocks = NULL;
  PyObject *__pyx_v_order = NULL;
  PyObject *__pyx_v_chain_ids = NULL;
  PyObject *__pyx_v_sorted_blocks = NULL;
  PyObject *__pyx_v_counts = NULL;
  PyObject *__pyx_v_starts = NULL;
  PyObject *__pyx_v_total_movable = NULL;
  PyObject *__pyx_v_attempts = NULL;
  PyObject *__pyx_v_bix = NULL;
  PyObject *__pyx_v_biy = NULL;
  PyObject *__pyx_v_biz = NULL;
  PyObject *__pyx_v_blo_x = NULL;
  PyObject *__pyx_v_blo_y = NULL;
  PyObject *__pyx_v_blo_z = NULL;
  PyObject *__pyx_v_seeds = NULL;
  PyObject *__pyx_v_out_delta = NULL;
  PyObject *__pyx_v_out_accepted = NULL;
  __Pyx_memviewslice __pyx_v_chain_ids_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_starts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_attempts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_seeds_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_x_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_y_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_z_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_delta_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_accepted_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_b;
  CYTHON_UNUSED int __pyx_v_nthreads;
  long __pyx_v_tot_d;
  int __pyx_v_tot_a;
  PyObject *__pyx_r = NULL;
  __pyx_cur_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel *)__pyx_tp_new_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel(__pyx_mstate_global->__pyx_ptype_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel, __pyx_mstate_global->__pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 3598, __pyx_L1_error)
  } else {
    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
  }
/* … */
  /* 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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_16);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_17, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_18, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_19, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_idx_np);
  __Pyx_XDECREF(__pyx_v_rstate);
  __Pyx_XDECREF(__pyx_v_gx);
  __Pyx_XDECREF(__pyx_v_gy);
  __Pyx_XDECREF(__pyx_v_gz);
  __Pyx_XDECREF(__pyx_v_dim_block);
  __Pyx_XDECREF(__pyx_v_bxj);
  __Pyx_XDECREF(__pyx_v_byj);
  __Pyx_XDECREF(__pyx_v_bzj);
  __Pyx_XDECREF(__pyx_v_block_of_bead);
  __Pyx_XDECREF(__pyx_v_chain_block);
  __Pyx_XDECREF(__pyx_v_movable);
  __Pyx_XDECREF(__pyx_v_mblocks);
  __Pyx_XDECREF(__pyx_v_order);
  __Pyx_XDECREF(__pyx_v_chain_ids);
  __Pyx_XDECREF(__pyx_v_sorted_blocks);
  __Pyx_XDECREF(__pyx_v_counts);
  __Pyx_XDECREF(__pyx_v_starts);
  __Pyx_XDECREF(__pyx_v_total_movable);
  __Pyx_XDECREF(__pyx_v_attempts);
  __Pyx_XDECREF(__pyx_v_bix);
  __Pyx_XDECREF(__pyx_v_biy);
  __Pyx_XDECREF(__pyx_v_biz);
  __Pyx_XDECREF(__pyx_v_blo_x);
  __Pyx_XDECREF(__pyx_v_blo_y);
  __Pyx_XDECREF(__pyx_v_blo_z);
  __Pyx_XDECREF(__pyx_v_seeds);
  __Pyx_XDECREF(__pyx_v_out_delta);
  __Pyx_XDECREF(__pyx_v_out_accepted);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_ids_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_starts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_attempts_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_seeds_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_x_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_y_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_blo_z_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_delta_mv, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_out_accepted_mv, 1);
  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_27mega_pull_parallel, 0, __pyx_mstate_global->__pyx_n_u_mega_pull_parallel, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[19])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_pull_parallel, __pyx_t_4) < (0)) __PYX_ERR(0, 3598, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel {
  PyObject_HEAD
  int __pyx_v_W;
  int __pyx_v_num_beads;
};

 3599: @cython.boundscheck(False)
 3600: def mega_pull_parallel(NUMPY_INT_TYPE[:, :, :] grid,
 3601:                        NUMPY_INT_TYPE[:, :, :] type_grid,
 3602:                        NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 3603:                        int[::1] chain_offset,
 3604:                        int[::1] chain_length,
 3605:                        int[::1] chain_homo,
 3606:                        int[::1] chain_selector,
 3607:                        NUMPY_INT_TYPE[:, :] interaction_table,
 3608:                        NUMPY_INT_TYPE[:, :] LR_interaction_table,
 3609:                        NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 3610:                        NUMPY_INT_TYPE[:, :, :, :, :, :, :] angle_lookup,
 3611:                        long energy,
 3612:                        float invtemp,
 3613:                        int passed_seed,
 3614:                        int hardwall,
 3615:                        int max_chain_len,
 3616:                        int num_threads,
 3617:                        NUMPY_INT_TYPE[::1] frozen_mask):
 3618:     """
 3619:     Parallel 3D pull megamove (the chain-level-frozen-halo analogue of
 3620:     mega_pull_parallel for slither). chain_selector is used only for the total
 3621:     work count; chains (length >= 3) are picked per block. Returns (energy, accepted).
 3622:     """
+3623:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+3624:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+3625:     cdef int ZDIM = grid.shape[2]
  __pyx_v_ZDIM = (__pyx_v_grid.shape[2]);
+3626:     cdef int num_beads = idx_to_bead.shape[0]
  __pyx_cur_scope->__pyx_v_num_beads = (__pyx_v_idx_to_bead.shape[0]);
+3627:     cdef int num_chains = chain_offset.shape[0]
  __pyx_v_num_chains = (__pyx_v_chain_offset.shape[0]);
+3628:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
 3629: 
+3630:     idx_np = np.asarray(idx_to_bead)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3630, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3630, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_idx_to_bead, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3630, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3630, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_idx_np = __pyx_t_1;
  __pyx_t_1 = 0;
+3631:     cdef int R_int = 3 if np.any(idx_np[:, 1] == 1) else 1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[1]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3631, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3631, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 3631, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_8) {
    __pyx_t_6 = 3;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_R_int = __pyx_t_6;
+3632:     cdef int W = R_int + 2
  __pyx_cur_scope->__pyx_v_W = (__pyx_v_R_int + 2);
 3633: 
+3634:     cdef int cap = 4
  __pyx_v_cap = 4;
+3635:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_4, __pyx_t_3, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3635, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3635, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbx = __pyx_t_6;
+3636:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3636, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3636, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3636, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3636, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, __pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3636, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3636, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nby = __pyx_t_6;
+3637:     cdef int nbz = _choose_nb(ZDIM, W, cap)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_t_4, __pyx_t_3, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3637, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3637, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbz = __pyx_t_6;
+3638:     cdef int Lx = XDIM // nbx
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 3638, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 3638, __pyx_L1_error)
  }
  __pyx_v_Lx = __Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0);
+3639:     cdef int Ly = YDIM // nby
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 3639, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 3639, __pyx_L1_error)
  }
  __pyx_v_Ly = __Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0);
+3640:     cdef int Lz = ZDIM // nbz
  if (unlikely(__pyx_v_nbz == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 3640, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbz == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_ZDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 3640, __pyx_L1_error)
  }
  __pyx_v_Lz = __Pyx_div_int(__pyx_v_ZDIM, __pyx_v_nbz, 0);
+3641:     cdef int num_blocks = nbx * nby * nbz
  __pyx_v_num_blocks = ((__pyx_v_nbx * __pyx_v_nby) * __pyx_v_nbz);
 3642: 
+3643:     rstate = np.random.RandomState(passed_seed & 0x7FFFFFFF)
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3643, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3643, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_2 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyLong_From_long((__pyx_v_passed_seed & 0x7FFFFFFF)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3643, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_RandomState, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3643, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_rstate = __pyx_t_1;
  __pyx_t_1 = 0;
+3644:     cdef int shift_x = int(rstate.randint(0, Lx)) if nbx > 1 else 0
  __pyx_t_8 = (__pyx_v_nbx > 1);
  if (__pyx_t_8) {
    __pyx_t_3 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3644, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_mstate_global->__pyx_int_0, __pyx_t_7};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3644, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_t_7 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3644, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_7); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3644, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_x = __pyx_t_6;
+3645:     cdef int shift_y = int(rstate.randint(0, Ly)) if nby > 1 else 0
  __pyx_t_8 = (__pyx_v_nby > 1);
  if (__pyx_t_8) {
    __pyx_t_1 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3645, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_0, __pyx_t_3};
      __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3645, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
    }
    __pyx_t_3 = __Pyx_PyNumber_Int(__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3645, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_3); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3645, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_y = __pyx_t_6;
+3646:     cdef int shift_z = int(rstate.randint(0, Lz)) if nbz > 1 else 0
  __pyx_t_8 = (__pyx_v_nbz > 1);
  if (__pyx_t_8) {
    __pyx_t_7 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_7);
    __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3646, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_0, __pyx_t_1};
      __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3646, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    }
    __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3646, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3646, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_z = __pyx_t_6;
 3647: 
+3648:     gx = idx_np[:, 5].astype(np.int64)
  __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[2]); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3648, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3648, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3648, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3648, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gx = __pyx_t_1;
  __pyx_t_1 = 0;
+3649:     gy = idx_np[:, 6].astype(np.int64)
  __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[3]); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3649, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3649, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3649, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3649, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gy = __pyx_t_1;
  __pyx_t_1 = 0;
+3650:     gz = idx_np[:, 7].astype(np.int64)
  __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[4]); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3650, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3650, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3650, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3650, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_gz = __pyx_t_1;
  __pyx_t_1 = 0;
 3651: 
+3652:     def dim_block(g, nb, L, DIM, shift):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_18mega_pull_parallel_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_18mega_pull_parallel_1dim_block = {"dim_block", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_18mega_pull_parallel_1dim_block, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_18mega_pull_parallel_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_g = 0;
  PyObject *__pyx_v_nb = 0;
  PyObject *__pyx_v_L = 0;
  PyObject *__pyx_v_DIM = 0;
  PyObject *__pyx_v_shift = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dim_block (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_g,&__pyx_mstate_global->__pyx_n_u_nb,&__pyx_mstate_global->__pyx_n_u_L,&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_shift,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 3652, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3652, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3652, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3652, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3652, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3652, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "dim_block", 0) < (0)) __PYX_ERR(0, 3652, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, i); __PYX_ERR(0, 3652, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3652, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3652, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3652, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3652, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3652, __pyx_L3_error)
    }
    __pyx_v_g = values[0];
    __pyx_v_nb = values[1];
    __pyx_v_L = values[2];
    __pyx_v_DIM = values[3];
    __pyx_v_shift = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 3652, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_18mega_pull_parallel_dim_block(__pyx_self, __pyx_v_g, __pyx_v_nb, __pyx_v_L, __pyx_v_DIM, __pyx_v_shift);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_18mega_pull_parallel_dim_block(PyObject *__pyx_self, PyObject *__pyx_v_g, PyObject *__pyx_v_nb, PyObject *__pyx_v_L, PyObject *__pyx_v_DIM, PyObject *__pyx_v_shift) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel *__pyx_cur_scope;
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel *__pyx_outer_scope;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_bj = NULL;
  PyObject *__pyx_v_within = NULL;
  PyObject *__pyx_v_bad = NULL;
  PyObject *__pyx_r = NULL;
  __pyx_outer_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_4_mega_pull_parallel *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_bj);
  __Pyx_XDECREF(__pyx_v_within);
  __Pyx_XDECREF(__pyx_v_bad);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_18mega_pull_parallel_1dim_block, 0, __pyx_mstate_global->__pyx_n_u_mega_pull_parallel_locals_dim_bl, ((PyObject*)__pyx_cur_scope), __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[4])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3652, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_dim_block = __pyx_t_1;
  __pyx_t_1 = 0;
+3653:         if nb == 1:
  __pyx_t_1 = (__Pyx_PyLong_BoolEqObjC(__pyx_v_nb, __pyx_mstate_global->__pyx_int_1, 1, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 3653, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+3654:             return np.zeros(num_beads, dtype=np.int64)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3654, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3654, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_num_beads); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3654, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3654, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3654, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_8 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_6 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3654, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_6, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3654, __pyx_L1_error)
      __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_8, (2-__pyx_t_8) | (__pyx_t_8*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_6);
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3654, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+3655:         s = (g - shift) % DIM
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_g, __pyx_v_shift); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyNumber_Remainder(__pyx_t_2, __pyx_v_DIM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_5;
  __pyx_t_5 = 0;
+3656:         bj = s // L
  __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_s, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3656, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_bj = __pyx_t_5;
  __pyx_t_5 = 0;
+3657:         within = s - bj * L
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_bj, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3657, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3657, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_within = __pyx_t_2;
  __pyx_t_2 = 0;
+3658:         bad = (s >= nb * L) | (within < W) | (within >= L - W)
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nb, __pyx_v_L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_s, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_L, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Or(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3658, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_bad = __pyx_t_5;
  __pyx_t_5 = 0;
+3659:         bj = bj.copy()
  __pyx_t_6 = __pyx_v_bj;
  __Pyx_INCREF(__pyx_t_6);
  __pyx_t_8 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
    __pyx_t_5 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_copy, __pyx_callargs+__pyx_t_8, (1-__pyx_t_8) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3659, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
  }
  __Pyx_DECREF_SET(__pyx_v_bj, __pyx_t_5);
  __pyx_t_5 = 0;
+3660:         bj[bad] = -1
  if (unlikely((PyObject_SetItem(__pyx_v_bj, __pyx_v_bad, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3660, __pyx_L1_error)
+3661:         return bj
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_bj);
  __pyx_r = __pyx_v_bj;
  goto __pyx_L0;
 3662: 
+3663:     bxj = dim_block(gx, nbx, Lx, XDIM, shift_x)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_shift_x); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_pf_5pimms_15mega_crank_fast_18mega_pull_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gx, __pyx_t_1, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3663, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bxj = __pyx_t_7;
  __pyx_t_7 = 0;
+3664:     byj = dim_block(gy, nby, Ly, YDIM, shift_y)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_shift_y); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __pyx_pf_5pimms_15mega_crank_fast_18mega_pull_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gy, __pyx_t_7, __pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_byj = __pyx_t_1;
  __pyx_t_1 = 0;
+3665:     bzj = dim_block(gz, nbz, Lz, ZDIM, shift_z)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3665, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3665, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_ZDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3665, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_shift_z); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3665, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __pyx_pf_5pimms_15mega_crank_fast_18mega_pull_parallel_dim_block(__pyx_v_dim_block, __pyx_v_gz, __pyx_t_1, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3665, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bzj = __pyx_t_7;
  __pyx_t_7 = 0;
+3666:     block_of_bead = (bxj * nby * nbz + byj * nbz + bzj)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_bxj, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_byj, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = PyNumber_Add(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyNumber_Add(__pyx_t_7, __pyx_v_bzj); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3666, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_block_of_bead = __pyx_t_4;
  __pyx_t_4 = 0;
+3667:     block_of_bead[(bxj < 0) | (byj < 0) | (bzj < 0)] = -1
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_bxj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3667, __pyx_L1_error)
  __pyx_t_7 = PyObject_RichCompare(__pyx_v_byj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3667, __pyx_L1_error)
  __pyx_t_3 = PyNumber_Or(__pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3667, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = PyObject_RichCompare(__pyx_v_bzj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3667, __pyx_L1_error)
  __pyx_t_4 = PyNumber_Or(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3667, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_4, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3667, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 3668: 
+3669:     block_of_bead[np.asarray(frozen_mask) != 0] = -1   # frozen beads -> whole chain frozen
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3669, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3669, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_frozen_mask, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3669, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_3};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3669, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_2 = __Pyx_PyLong_NeObjC(__pyx_t_4, __pyx_mstate_global->__pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3669, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_2, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3669, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+3670:     chain_block = _chain_block_assignment(block_of_bead, chain_offset, num_chains)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_chain_block_assignment); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3670, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_chain_offset, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3670, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_num_chains); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3670, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_v_block_of_bead, __pyx_t_7, __pyx_t_1};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3670, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_v_chain_block = __pyx_t_2;
  __pyx_t_2 = 0;
+3671:     chain_block[np.asarray(chain_length) < 3] = -1     # pull needs L >= 3
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_chain_length, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_1};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3671, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_mstate_global->__pyx_int_3, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3671, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_chain_block, __pyx_t_7, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3671, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+3672:     movable = np.nonzero(chain_block >= 0)[0].astype(np.int32)
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3672, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_nonzero); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3672, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_chain_block, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3672, __pyx_L1_error)
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3672, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3672, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_2 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3672, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3672, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_4};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3672, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_movable = __pyx_t_7;
  __pyx_t_7 = 0;
+3673:     if movable.shape[0] == 0:
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_movable, __pyx_mstate_global->__pyx_n_u_shape); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3673, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3673, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_8 = (__Pyx_PyLong_BoolEqObjC(__pyx_t_9, __pyx_mstate_global->__pyx_int_0, 0, 0)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 3673, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (__pyx_t_8) {
/* … */
  }
+3674:         return (energy, 0)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_9 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3674, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3674, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_9);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 3674, __pyx_L1_error);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_0);
    __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_0);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_mstate_global->__pyx_int_0) != (0)) __PYX_ERR(0, 3674, __pyx_L1_error);
    __pyx_t_9 = 0;
    __pyx_r = __pyx_t_7;
    __pyx_t_7 = 0;
    goto __pyx_L0;
 3675: 
+3676:     mblocks = chain_block[movable]
  __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_chain_block, __pyx_v_movable); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3676, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_v_mblocks = __pyx_t_7;
  __pyx_t_7 = 0;
+3677:     order = np.argsort(mblocks, kind="stable")
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3677, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_argsort); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3677, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_v_mblocks};
    __pyx_t_4 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3677, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_kind, __pyx_mstate_global->__pyx_n_u_stable, __pyx_t_4, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3677, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_4);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3677, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_order = __pyx_t_7;
  __pyx_t_7 = 0;
+3678:     chain_ids = movable[order].astype(np.int32)
  __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_v_movable, __pyx_v_order); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3678, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3678, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3678, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_1};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3678, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_chain_ids = __pyx_t_7;
  __pyx_t_7 = 0;
+3679:     sorted_blocks = mblocks[order]
  __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_mblocks, __pyx_v_order); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3679, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_v_sorted_blocks = __pyx_t_7;
  __pyx_t_7 = 0;
 3680: 
+3681:     counts = np.bincount(sorted_blocks, minlength=num_blocks).astype(np.int32)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_bincount); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_v_sorted_blocks};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3681, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_minlength, __pyx_t_9, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3681, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3681, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_4 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_11};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3681, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_counts = __pyx_t_7;
  __pyx_t_7 = 0;
+3682:     starts = np.zeros(num_blocks + 1, dtype=np.int32)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_long((__pyx_v_num_blocks + 1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_11};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3682, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3682, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3682, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_starts = __pyx_t_7;
  __pyx_t_7 = 0;
+3683:     starts[1:] = np.cumsum(counts)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3683, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_cumsum); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3683, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_counts};
    __pyx_t_7 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3683, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  if (__Pyx_PyObject_SetSlice(__pyx_v_starts, __pyx_t_7, 1, 0, NULL, NULL, &__pyx_mstate_global->__pyx_slice[1], 1, 0, 0) < (0)) __PYX_ERR(0, 3683, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 3684: 
+3685:     total_movable = int(counts.sum())
  __pyx_t_9 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_9);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, NULL};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_sum, __pyx_callargs+__pyx_t_5, (1-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_9 = __Pyx_PyNumber_Int(__pyx_t_7); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3685, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_total_movable = ((PyObject*)__pyx_t_9);
  __pyx_t_9 = 0;
+3686:     attempts = np.maximum(
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3686, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3686, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+3687:         (n_steps * counts.astype(np.int64) // max(total_movable, 1)), 0).astype(np.int32)
  __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_n_steps); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_14};
    __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_14 = PyNumber_Multiply(__pyx_t_11, __pyx_t_2); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_15 = 1;
  __Pyx_INCREF(__pyx_v_total_movable);
  __pyx_t_16 = __pyx_v_total_movable;
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_16, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  if (__pyx_t_8) {
    __pyx_t_12 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_PyInt_FromNumber(&__pyx_t_12, NULL, 0) < (0)) __PYX_ERR(0, 3687, __pyx_L1_error)
    __pyx_t_2 = __pyx_t_12;
    __pyx_t_12 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_16);
    __pyx_t_2 = __pyx_t_16;
  }
  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_14, __pyx_t_2); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_t_12, __pyx_mstate_global->__pyx_int_0};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3686, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_7 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3687, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_attempts = __pyx_t_9;
  __pyx_t_9 = 0;
 3688: 
+3689:     bix = np.arange(num_blocks, dtype=np.int32) // (nby * nbz)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_12};
    __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3689, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3689, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3689, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_7 = __Pyx_PyLong_From_int((__pyx_v_nby * __pyx_v_nbz)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = PyNumber_FloorDivide(__pyx_t_9, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3689, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_bix = __pyx_t_1;
  __pyx_t_1 = 0;
+3690:     biy = (np.arange(num_blocks, dtype=np.int32) // nbz) % nby
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_9};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3690, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3690, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3690, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyNumber_Remainder(__pyx_t_12, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3690, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_biy = __pyx_t_1;
  __pyx_t_1 = 0;
+3691:     biz = np.arange(num_blocks, dtype=np.int32) % nbz
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_12};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3691, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3691, __pyx_L1_error)
    __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3691, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbz); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_9 = PyNumber_Remainder(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3691, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_biz = __pyx_t_9;
  __pyx_t_9 = 0;
+3692:     blo_x = (bix * Lx).astype(np.int32)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3692, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = PyNumber_Multiply(__pyx_v_bix, __pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3692, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3692, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3692, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3692, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_x = __pyx_t_9;
  __pyx_t_9 = 0;
+3693:     blo_y = (biy * Ly).astype(np.int32)
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_biy, __pyx_t_12); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_7 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_1};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3693, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_y = __pyx_t_9;
  __pyx_t_9 = 0;
+3694:     blo_z = (biz * Lz).astype(np.int32)
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Lz); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = PyNumber_Multiply(__pyx_v_biz, __pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3694, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_12};
    __pyx_t_9 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3694, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_blo_z = __pyx_t_9;
  __pyx_t_9 = 0;
 3695: 
+3696:     seeds = (np.arange(num_blocks, dtype=np.uint64) + np.uint64(passed_seed) + np.uint64(0x9E3779B9)) \
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_12};
    __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3696, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3696, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3696, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_passed_seed); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_3};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3696, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_12 = PyNumber_Add(__pyx_t_9, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_mstate_global->__pyx_int_2654435769};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3696, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_1 = PyNumber_Add(__pyx_t_12, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3696, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+3697:         * np.uint64(0x2545F4914F6CDD1D) + np.uint64(1)
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_mstate_global->__pyx_int_0x2545f4914f6cdd1d};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3697, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_1};
    __pyx_t_4 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3697, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_9 = PyNumber_Add(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3697, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_seeds = __pyx_t_9;
  __pyx_t_9 = 0;
 3698: 
+3699:     out_delta = np.zeros(num_blocks, dtype=np.int64)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3699, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_3};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3699, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3699, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3699, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_out_delta = __pyx_t_9;
  __pyx_t_9 = 0;
+3700:     out_accepted = np.zeros(num_blocks, dtype=np.int32)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_12};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3700, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3700, __pyx_L1_error)
    __pyx_t_9 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3700, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_v_out_accepted = __pyx_t_9;
  __pyx_t_9 = 0;
 3701: 
+3702:     cdef int[::1] chain_ids_mv = chain_ids
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_chain_ids, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3702, __pyx_L1_error)
  __pyx_v_chain_ids_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3703:     cdef int[::1] starts_mv = starts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_starts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3703, __pyx_L1_error)
  __pyx_v_starts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3704:     cdef int[::1] attempts_mv = attempts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_attempts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3704, __pyx_L1_error)
  __pyx_v_attempts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3705:     cdef unsigned long long[::1] seeds_mv = seeds
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_PY_LONG_LONG(__pyx_v_seeds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 3705, __pyx_L1_error)
  __pyx_v_seeds_mv = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+3706:     cdef int[::1] blo_x_mv = blo_x
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_x, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3706, __pyx_L1_error)
  __pyx_v_blo_x_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3707:     cdef int[::1] blo_y_mv = blo_y
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_y, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3707, __pyx_L1_error)
  __pyx_v_blo_y_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3708:     cdef int[::1] blo_z_mv = blo_z
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_z, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3708, __pyx_L1_error)
  __pyx_v_blo_z_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3709:     cdef long[::1] out_delta_mv = out_delta
  __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_long(__pyx_v_out_delta, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 3709, __pyx_L1_error)
  __pyx_v_out_delta_mv = __pyx_t_19;
  __pyx_t_19.memview = NULL;
  __pyx_t_19.data = NULL;
+3710:     cdef int[::1] out_accepted_mv = out_accepted
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_out_accepted, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3710, __pyx_L1_error)
  __pyx_v_out_accepted_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
 3711: 
 3712:     cdef int b
+3713:     cdef int nthreads = num_threads if num_threads > 0 else 1
  __pyx_t_8 = (__pyx_v_num_threads > 0);
  if (__pyx_t_8) {
    __pyx_t_6 = __pyx_v_num_threads;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_nthreads = __pyx_t_6;
 3714: 
+3715:     for b in prange(num_blocks, nogil=True, num_threads=nthreads, schedule='dynamic'):
  {
      PyThreadState * _save;
      _save = PyEval_SaveThread();
      __Pyx_FastGIL_Remember();
      /*try:*/ {
        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic)        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic) num_threads(__pyx_v_nthreads)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_b = (int)(0 + 1 * __pyx_t_10);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          __Pyx_FastGIL_Forget();
          PyEval_RestoreThread(_save);
          goto __pyx_L6;
        }
        __pyx_L6:;
      }
  }
+3716:         run_block_pull(b, chain_ids_mv, starts_mv, attempts_mv, seeds_mv,
                            __pyx_f_5pimms_15mega_crank_fast_run_block_pull(__pyx_v_b, __pyx_v_chain_ids_mv, __pyx_v_starts_mv, __pyx_v_attempts_mv, __pyx_v_seeds_mv, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_blo_x_mv, __pyx_v_blo_y_mv, __pyx_v_blo_z_mv, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_Lz, __pyx_v_nbx, __pyx_v_nby, __pyx_v_nbz, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_shift_z, __pyx_cur_scope->__pyx_v_W, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_invtemp, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_ZDIM, __pyx_v_hardwall, __pyx_v_out_delta_mv, __pyx_v_out_accepted_mv);
                        }
                    }
                }
            }
        }
        #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
      }
 3717:                        chain_offset, chain_length,
 3718:                        blo_x_mv, blo_y_mv, blo_z_mv,
 3719:                        Lx, Ly, Lz, nbx, nby, nbz,
 3720:                        shift_x, shift_y, shift_z, W,
 3721:                        grid, type_grid, idx_to_bead,
 3722:                        interaction_table, LR_interaction_table, SLR_interaction_table,
 3723:                        angle_lookup, invtemp, XDIM, YDIM, ZDIM, hardwall,
 3724:                        out_delta_mv, out_accepted_mv)
 3725: 
+3726:     cdef long tot_d = 0
  __pyx_v_tot_d = 0;
+3727:     cdef int tot_a = 0
  __pyx_v_tot_a = 0;
+3728:     for b in range(num_blocks):
  __pyx_t_20 = __pyx_v_num_blocks;
  __pyx_t_10 = __pyx_t_20;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_10; __pyx_t_6+=1) {
    __pyx_v_b = __pyx_t_6;
+3729:         tot_d += out_delta_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_d = (__pyx_v_tot_d + (*((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta_mv.data) + __pyx_t_21)) ))));
+3730:         tot_a += out_accepted_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_a = (__pyx_v_tot_a + (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted_mv.data) + __pyx_t_21)) ))));
  }
+3731:     return (energy + tot_d, tot_a)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_9 = __Pyx_PyLong_From_long((__pyx_v_energy + __pyx_v_tot_d)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3731, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_tot_a); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3731, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3731, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9) != (0)) __PYX_ERR(0, 3731, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7) != (0)) __PYX_ERR(0, 3731, __pyx_L1_error);
  __pyx_t_9 = 0;
  __pyx_t_7 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 3732: 
 3733: 
+3734: cdef int pull_first_targets_interior_2D(NUMPY_INT_TYPE[:, :] grid,
static int __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior_2D(__Pyx_memviewslice __pyx_v_grid, int __pyx_v_anchor_x, int __pyx_v_anchor_y, int __pyx_v_mov_x, int __pyx_v_mov_y, int __pyx_v_hardwall, int __pyx_v_XDIM, int __pyx_v_YDIM, int *__pyx_v_out_buf, int __pyx_v_blo_x_b, int __pyx_v_blo_y_b, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_W) {
  int __pyx_v_count;
  int __pyx_v_dx;
  int __pyx_v_dy;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.pull_first_targets_interior_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
  return __pyx_r;
}
 3735:                                         int anchor_x, int anchor_y,
 3736:                                         int mov_x, int mov_y,
 3737:                                         int hardwall, int XDIM, int YDIM,
 3738:                                         int* out_buf,
 3739:                                         int blo_x_b, int blo_y_b,
 3740:                                         int Lx, int Ly, int nbx, int nby,
 3741:                                         int shift_x, int shift_y, int W) noexcept nogil:
+3742:     cdef int count = 0
  __pyx_v_count = 0;
 3743:     cdef int dx, dy, tx, ty
+3744:     for dx in range(-1, 2):
  for (__pyx_t_1 = -1; __pyx_t_1 < 2; __pyx_t_1+=1) {
    __pyx_v_dx = __pyx_t_1;
+3745:         for dy in range(-1, 2):
    for (__pyx_t_2 = -1; __pyx_t_2 < 2; __pyx_t_2+=1) {
      __pyx_v_dy = __pyx_t_2;
+3746:             tx = pbc_correction(mov_x + dx, XDIM)
      __pyx_v_tx = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_x + __pyx_v_dx), __pyx_v_XDIM);
+3747:             ty = pbc_correction(mov_y + dy, YDIM)
      __pyx_v_ty = __pyx_f_5pimms_15mega_crank_fast_pbc_correction((__pyx_v_mov_y + __pyx_v_dy), __pyx_v_YDIM);
+3748:             if grid[tx, ty] != 0:
      __pyx_t_3 = __pyx_v_tx;
      __pyx_t_4 = __pyx_v_ty;
      __pyx_t_5 = -1;
      if (__pyx_t_3 < 0) {
        __pyx_t_3 += __pyx_v_grid.shape[0];
        if (unlikely(__pyx_t_3 < 0)) __pyx_t_5 = 0;
      } else if (unlikely(__pyx_t_3 >= __pyx_v_grid.shape[0])) __pyx_t_5 = 0;
      if (__pyx_t_4 < 0) {
        __pyx_t_4 += __pyx_v_grid.shape[1];
        if (unlikely(__pyx_t_4 < 0)) __pyx_t_5 = 1;
      } else if (unlikely(__pyx_t_4 >= __pyx_v_grid.shape[1])) __pyx_t_5 = 1;
      if (unlikely(__pyx_t_5 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_5);
        __PYX_ERR(0, 3748, __pyx_L1_error)
      }
      __pyx_t_6 = ((*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_grid.data + __pyx_t_3 * __pyx_v_grid.strides[0]) ) + __pyx_t_4 * __pyx_v_grid.strides[1]) ))) != 0);
      if (__pyx_t_6) {
/* … */
      }
+3749:                 continue
        goto __pyx_L5_continue;
+3750:             if cheby_adjacent_2D(tx, ty, mov_x, mov_y, XDIM, YDIM, hardwall) == 0:
      __pyx_t_6 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_tx, __pyx_v_ty, __pyx_v_mov_x, __pyx_v_mov_y, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 0);
      if (__pyx_t_6) {
/* … */
      }
+3751:                 continue
        goto __pyx_L5_continue;
+3752:             if cheby_adjacent_2D(tx, ty, anchor_x, anchor_y, XDIM, YDIM, hardwall) == 0:
      __pyx_t_6 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_tx, __pyx_v_ty, __pyx_v_anchor_x, __pyx_v_anchor_y, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 0);
      if (__pyx_t_6) {
/* … */
      }
+3753:                 continue
        goto __pyx_L5_continue;
+3754:             if _in_interior_2d(tx, ty, blo_x_b, blo_y_b, Lx, Ly, nbx, nby,
      if (__pyx_t_6) {
/* … */
      }
+3755:                                shift_x, shift_y, W, XDIM, YDIM) == 0:
      __pyx_t_6 = (__pyx_f_5pimms_15mega_crank_fast__in_interior_2d(__pyx_v_tx, __pyx_v_ty, __pyx_v_blo_x_b, __pyx_v_blo_y_b, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W, __pyx_v_XDIM, __pyx_v_YDIM) == 0);
+3756:                 continue
        goto __pyx_L5_continue;
+3757:             out_buf[2 * count] = tx
      (__pyx_v_out_buf[(2 * __pyx_v_count)]) = __pyx_v_tx;
+3758:             out_buf[2 * count + 1] = ty
      (__pyx_v_out_buf[((2 * __pyx_v_count) + 1)]) = __pyx_v_ty;
+3759:             count = count + 1
      __pyx_v_count = (__pyx_v_count + 1);
      __pyx_L5_continue:;
    }
  }
+3760:     return count
  __pyx_r = __pyx_v_count;
  goto __pyx_L0;
 3761: 
 3762: 
+3763: cdef void run_block_pull_2D(int b,
static void __pyx_f_5pimms_15mega_crank_fast_run_block_pull_2D(int __pyx_v_b, __Pyx_memviewslice __pyx_v_chain_ids, __Pyx_memviewslice __pyx_v_starts, __Pyx_memviewslice __pyx_v_attempts, __Pyx_memviewslice __pyx_v_seeds, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, __Pyx_memviewslice __pyx_v_blo_x, __Pyx_memviewslice __pyx_v_blo_y, int __pyx_v_Lx, int __pyx_v_Ly, int __pyx_v_nbx, int __pyx_v_nby, int __pyx_v_shift_x, int __pyx_v_shift_y, int __pyx_v_W, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, float __pyx_v_invtemp, int __pyx_v_XDIM, int __pyx_v_YDIM, int __pyx_v_hardwall, __Pyx_memviewslice __pyx_v_out_delta, __Pyx_memviewslice __pyx_v_out_accepted) {
  int __pyx_v_lo_blk;
  int __pyx_v_hi_blk;
  int __pyx_v_n_block;
  unsigned PY_LONG_LONG __pyx_v_rng;
  long __pyx_v_dsum;
  int __pyx_v_acc;
  CYTHON_UNUSED int __pyx_v_step;
  int __pyx_v_pick;
  int __pyx_v_c;
  int __pyx_v_off;
  int __pyx_v_L;
  int __pyx_v_chainID;
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_k;
  int __pyx_v_direction;
  int __pyx_v_nF;
  int __pyx_v_nR;
  int __pyx_v_r;
  int __pyx_v_restored;
  int __pyx_v_lo;
  int __pyx_v_hi;
  long __pyx_v_de;
  int __pyx_v_sx;
  int __pyx_v_sy;
  int __pyx_v_ox;
  int __pyx_v_oy;
  int __pyx_v_tx;
  int __pyx_v_ty;
  int __pyx_v_pnx;
  int __pyx_v_pny;
  int __pyx_v_newp[2];
  int __pyx_v_tbuf[18];
  int __pyx_v_bx[512];
  int __pyx_v_by[512];
  int __pyx_v_bxb;
  int __pyx_v_byb;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
  __Pyx_WriteUnraisable("pimms.mega_crank_fast.run_block_pull_2D", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_PyGILState_Release(__pyx_gilstate_save);
  __pyx_L0:;
}
 3764:                             int[::1] chain_ids, int[::1] starts, int[::1] attempts,
 3765:                             unsigned long long[::1] seeds,
 3766:                             int[::1] chain_offset, int[::1] chain_length,
 3767:                             int[::1] blo_x, int[::1] blo_y,
 3768:                             int Lx, int Ly, int nbx, int nby,
 3769:                             int shift_x, int shift_y, int W,
 3770:                             NUMPY_INT_TYPE[:, :] grid, NUMPY_INT_TYPE[:, :] type_grid,
 3771:                             NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 3772:                             NUMPY_INT_TYPE[:, :] interaction_table,
 3773:                             NUMPY_INT_TYPE[:, :] LR_interaction_table,
 3774:                             NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 3775:                             NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 3776:                             float invtemp, int XDIM, int YDIM, int hardwall,
 3777:                             long[::1] out_delta, int[::1] out_accepted) noexcept nogil:
 3778: 
+3779:     cdef int lo_blk = starts[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3779, __pyx_L1_error)
  }
  __pyx_v_lo_blk = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+3780:     cdef int hi_blk = starts[b + 1]
  __pyx_t_1 = (__pyx_v_b + 1);
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_starts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_starts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3780, __pyx_L1_error)
  }
  __pyx_v_hi_blk = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_starts.data) + __pyx_t_1)) )));
+3781:     cdef int n_block = hi_blk - lo_blk
  __pyx_v_n_block = (__pyx_v_hi_blk - __pyx_v_lo_blk);
+3782:     out_delta[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3782, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_1)) )) = 0;
+3783:     out_accepted[b] = 0
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3783, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_1)) )) = 0;
+3784:     if n_block <= 0:
  __pyx_t_3 = (__pyx_v_n_block <= 0);
  if (__pyx_t_3) {
/* … */
  }
+3785:         return
    goto __pyx_L0;
 3786: 
+3787:     cdef unsigned long long rng = seeds[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_seeds.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_seeds.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3787, __pyx_L1_error)
  }
  __pyx_v_rng = (*((unsigned PY_LONG_LONG *) ( /* dim=0 */ ((char *) (((unsigned PY_LONG_LONG *) __pyx_v_seeds.data) + __pyx_t_1)) )));
+3788:     cdef long dsum = 0
  __pyx_v_dsum = 0;
+3789:     cdef int acc = 0
  __pyx_v_acc = 0;
 3790:     cdef int step, pick, c, off, L, chainID, i, j, k, direction, nF, nR, r, restored, lo, hi
 3791:     cdef long de
 3792:     cdef int sx, sy, ox, oy, tx, ty, pnx, pny
 3793:     cdef int newp[2]
 3794:     cdef int tbuf[18]
 3795:     cdef int bx[512]
 3796:     cdef int by[512]
 3797: 
+3798:     cdef int bxb = blo_x[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_blo_x.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_x.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3798, __pyx_L1_error)
  }
  __pyx_v_bxb = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_x.data) + __pyx_t_1)) )));
+3799:     cdef int byb = blo_y[b]
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_blo_y.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_blo_y.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3799, __pyx_L1_error)
  }
  __pyx_v_byb = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_blo_y.data) + __pyx_t_1)) )));
 3800: 
+3801:     for step in range(attempts[b]):
  __pyx_t_1 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_1 += __pyx_v_attempts.shape[0];
    if (unlikely(__pyx_t_1 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_attempts.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3801, __pyx_L1_error)
  }
  __pyx_t_2 = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_attempts.data) + __pyx_t_1)) )));
  __pyx_t_4 = __pyx_t_2;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_step = __pyx_t_5;
+3802:         pick = lo_blk + <int>(rng_uniform(&rng) * n_block)
    __pyx_v_pick = (__pyx_v_lo_blk + ((int)(__pyx_f_5pimms_15mega_crank_fast_rng_uniform((&__pyx_v_rng)) * __pyx_v_n_block)));
+3803:         if pick >= hi_blk:
    __pyx_t_3 = (__pyx_v_pick >= __pyx_v_hi_blk);
    if (__pyx_t_3) {
/* … */
    }
+3804:             pick = hi_blk - 1
      __pyx_v_pick = (__pyx_v_hi_blk - 1);
+3805:         c = chain_ids[pick]
    __pyx_t_1 = __pyx_v_pick;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_ids.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_ids.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3805, __pyx_L1_error)
    }
    __pyx_v_c = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_ids.data) + __pyx_t_1)) )));
+3806:         off = chain_offset[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_offset.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_offset.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3806, __pyx_L1_error)
    }
    __pyx_v_off = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_offset.data) + __pyx_t_1)) )));
+3807:         L = chain_length[c]
    __pyx_t_1 = __pyx_v_c;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_chain_length.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_chain_length.shape[0])) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3807, __pyx_L1_error)
    }
    __pyx_v_L = (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_chain_length.data) + __pyx_t_1)) )));
+3808:         if L < 3 or L > 512:
    __pyx_t_7 = (__pyx_v_L < 3);
    if (!__pyx_t_7) {
    } else {
      __pyx_t_3 = __pyx_t_7;
      goto __pyx_L8_bool_binop_done;
    }
    __pyx_t_7 = (__pyx_v_L > 0x200);
    __pyx_t_3 = __pyx_t_7;
    __pyx_L8_bool_binop_done:;
    if (__pyx_t_3) {
/* … */
    }
+3809:             continue
      goto __pyx_L4_continue;
+3810:         chainID = idx_to_bead[off, 4]
    __pyx_t_1 = __pyx_v_off;
    __pyx_t_8 = 4;
    __pyx_t_6 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
      if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
    if (unlikely(__pyx_t_6 != -1)) {
      __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
      __PYX_ERR(0, 3810, __pyx_L1_error)
    }
    __pyx_v_chainID = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
 3811: 
+3812:         for j in range(L):
    __pyx_t_6 = __pyx_v_L;
    __pyx_t_9 = __pyx_t_6;
    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_j = __pyx_t_10;
+3813:             bx[j] = idx_to_bead[off + j, 5]
      __pyx_t_8 = (__pyx_v_off + __pyx_v_j);
      __pyx_t_1 = 5;
      __pyx_t_11 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
        __PYX_ERR(0, 3813, __pyx_L1_error)
      }
      (__pyx_v_bx[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) )));
+3814:             by[j] = idx_to_bead[off + j, 6]
      __pyx_t_1 = (__pyx_v_off + __pyx_v_j);
      __pyx_t_8 = 6;
      __pyx_t_11 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 1;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
        __PYX_ERR(0, 3814, __pyx_L1_error)
      }
      (__pyx_v_by[__pyx_v_j]) = (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) )));
    }
 3815: 
+3816:         i = 1 + rng_randint(&rng, 0, L - 3)
    __pyx_v_i = (1 + __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, (__pyx_v_L - 3)));
+3817:         direction = rng_randint(&rng, 0, 1)
    __pyx_v_direction = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, 1);
+3818:         restored = 0
    __pyx_v_restored = 0;
+3819:         nR = 0
    __pyx_v_nR = 0;
 3820: 
+3821:         if direction == 0:
    __pyx_t_3 = (__pyx_v_direction == 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L12;
    }
+3822:             nF = pull_first_targets_interior_2D(grid, bx[i - 1], by[i - 1], bx[i], by[i],
      __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i - 1)]), (__pyx_v_by[(__pyx_v_i - 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W);
 3823:                                                 hardwall, XDIM, YDIM, tbuf,
 3824:                                                 bxb, byb, Lx, Ly, nbx, nby, shift_x, shift_y, W)
+3825:             if nF == 0:
      __pyx_t_3 = (__pyx_v_nF == 0);
      if (__pyx_t_3) {
/* … */
      }
+3826:                 continue
        goto __pyx_L4_continue;
+3827:             r = rng_randint(&rng, 0, nF - 1)
      __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, (__pyx_v_nF - 1));
+3828:             sx = tbuf[2 * r]; sy = tbuf[2 * r + 1]
      __pyx_v_sx = (__pyx_v_tbuf[(2 * __pyx_v_r)]);
      __pyx_v_sy = (__pyx_v_tbuf[((2 * __pyx_v_r) + 1)]);
+3829:             de = get_energy_change_2D_c(grid, type_grid, bx[i], by[i], sx, sy,
      __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+3830:                                         idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
      __pyx_t_8 = (__pyx_v_off + __pyx_v_i);
      __pyx_t_1 = 1;
      __pyx_t_6 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_1 < 0) {
        __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 3830, __pyx_L1_error)
      }
 3831:                                         SLR_interaction_table, XDIM, YDIM, hardwall)
+3832:             newp[0] = sx; newp[1] = sy
      (__pyx_v_newp[0]) = __pyx_v_sx;
      (__pyx_v_newp[1]) = __pyx_v_sy;
+3833:             de = de + get_angle_energy_change_2D_c(off + i, idx_to_bead, newp, angle_lookup)
      __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3834:             _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], sx, sy, chainID)
      __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_chainID);
+3835:             pnx = sx; pny = sy
      __pyx_v_pnx = __pyx_v_sx;
      __pyx_v_pny = __pyx_v_sy;
+3836:             k = i
      __pyx_v_k = __pyx_v_i;
+3837:             for j in range(i + 1, L):
      __pyx_t_6 = __pyx_v_L;
      __pyx_t_9 = __pyx_t_6;
      for (__pyx_t_10 = (__pyx_v_i + 1); __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
        __pyx_v_j = __pyx_t_10;
+3838:                 if cheby_adjacent_2D(pnx, pny, bx[j], by[j], XDIM, YDIM, hardwall) == 1:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_pnx, __pyx_v_pny, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 1);
        if (__pyx_t_3) {
/* … */
        }
+3839:                     k = j - 1; restored = 1; break
          __pyx_v_k = (__pyx_v_j - 1);
          __pyx_v_restored = 1;
          goto __pyx_L15_break;
+3840:                 ox = bx[j]; oy = by[j]
        __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
        __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
+3841:                 tx = bx[j - 1]; ty = by[j - 1]
        __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j - 1)]);
        __pyx_v_ty = (__pyx_v_by[(__pyx_v_j - 1)]);
+3842:                 de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+3843:                                                  idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
        __pyx_t_1 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_8 = 1;
        __pyx_t_11 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_11 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_11 = 0;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_11 = 1;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_11 = 1;
        if (unlikely(__pyx_t_11 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_11);
          __PYX_ERR(0, 3843, __pyx_L1_error)
        }
 3844:                                                  SLR_interaction_table, XDIM, YDIM, hardwall)
+3845:                 newp[0] = tx; newp[1] = ty
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
+3846:                 de = de + get_angle_energy_change_2D_c(off + j, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3847:                 _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + j, ox, oy, tx, ty, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
+3848:                 pnx = tx; pny = ty
        __pyx_v_pnx = __pyx_v_tx;
        __pyx_v_pny = __pyx_v_ty;
+3849:                 k = j
        __pyx_v_k = __pyx_v_j;
      }
      __pyx_L15_break:;
+3850:             lo = i; hi = k
      __pyx_v_lo = __pyx_v_i;
      __pyx_v_hi = __pyx_v_k;
+3851:             if restored == 1:
      __pyx_t_3 = (__pyx_v_restored == 1);
      if (__pyx_t_3) {
/* … */
      }
+3852:                 nR = pull_first_targets_interior_2D(grid, bx[k + 1], by[k + 1],
        __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k + 1)]), (__pyx_v_by[(__pyx_v_k + 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_8 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_1 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_12 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_13 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W);
+3853:                                                     idx_to_bead[off + k, 5], idx_to_bead[off + k, 6],
        __pyx_t_8 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_1 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3853, __pyx_L1_error)
        }
        __pyx_t_12 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_13 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_12 < 0) {
          __pyx_t_12 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_12 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_12 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_13 < 0) {
          __pyx_t_13 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_13 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_13 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3853, __pyx_L1_error)
        }
 3854:                                                     hardwall, XDIM, YDIM, tbuf,
 3855:                                                     bxb, byb, Lx, Ly, nbx, nby, shift_x, shift_y, W)
 3856:         else:
+3857:             nF = pull_first_targets_interior_2D(grid, bx[i + 1], by[i + 1], bx[i], by[i],
    /*else*/ {
/* … */
      __pyx_v_nF = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_i + 1)]), (__pyx_v_by[(__pyx_v_i + 1)]), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W);
 3858:                                                 hardwall, XDIM, YDIM, tbuf,
 3859:                                                 bxb, byb, Lx, Ly, nbx, nby, shift_x, shift_y, W)
+3860:             if nF == 0:
      __pyx_t_3 = (__pyx_v_nF == 0);
      if (__pyx_t_3) {
/* … */
      }
+3861:                 continue
        goto __pyx_L4_continue;
+3862:             r = rng_randint(&rng, 0, nF - 1)
      __pyx_v_r = __pyx_f_5pimms_15mega_crank_fast_rng_randint((&__pyx_v_rng), 0, (__pyx_v_nF - 1));
+3863:             sx = tbuf[2 * r]; sy = tbuf[2 * r + 1]
      __pyx_v_sx = (__pyx_v_tbuf[(2 * __pyx_v_r)]);
      __pyx_v_sy = (__pyx_v_tbuf[((2 * __pyx_v_r) + 1)]);
+3864:             de = get_energy_change_2D_c(grid, type_grid, bx[i], by[i], sx, sy,
      __pyx_v_de = __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_13 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_12 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall);
+3865:                                         idx_to_bead[off + i, 1], interaction_table, LR_interaction_table,
      __pyx_t_13 = (__pyx_v_off + __pyx_v_i);
      __pyx_t_12 = 1;
      __pyx_t_6 = -1;
      if (__pyx_t_13 < 0) {
        __pyx_t_13 += __pyx_v_idx_to_bead.shape[0];
        if (unlikely(__pyx_t_13 < 0)) __pyx_t_6 = 0;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
      if (__pyx_t_12 < 0) {
        __pyx_t_12 += __pyx_v_idx_to_bead.shape[1];
        if (unlikely(__pyx_t_12 < 0)) __pyx_t_6 = 1;
      } else if (unlikely(__pyx_t_12 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
      if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
        __PYX_ERR(0, 3865, __pyx_L1_error)
      }
 3866:                                         SLR_interaction_table, XDIM, YDIM, hardwall)
+3867:             newp[0] = sx; newp[1] = sy
      (__pyx_v_newp[0]) = __pyx_v_sx;
      (__pyx_v_newp[1]) = __pyx_v_sy;
+3868:             de = de + get_angle_energy_change_2D_c(off + i, idx_to_bead, newp, angle_lookup)
      __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_i), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3869:             _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + i, bx[i], by[i], sx, sy, chainID)
      __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_i), (__pyx_v_bx[__pyx_v_i]), (__pyx_v_by[__pyx_v_i]), __pyx_v_sx, __pyx_v_sy, __pyx_v_chainID);
+3870:             pnx = sx; pny = sy
      __pyx_v_pnx = __pyx_v_sx;
      __pyx_v_pny = __pyx_v_sy;
+3871:             k = i
      __pyx_v_k = __pyx_v_i;
+3872:             for j in range(i - 1, -1, -1):
      for (__pyx_t_6 = (__pyx_v_i - 1); __pyx_t_6 > -1; __pyx_t_6-=1) {
        __pyx_v_j = __pyx_t_6;
+3873:                 if cheby_adjacent_2D(pnx, pny, bx[j], by[j], XDIM, YDIM, hardwall) == 1:
        __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_cheby_adjacent_2D(__pyx_v_pnx, __pyx_v_pny, (__pyx_v_bx[__pyx_v_j]), (__pyx_v_by[__pyx_v_j]), __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall) == 1);
        if (__pyx_t_3) {
/* … */
        }
+3874:                     k = j + 1; restored = 1; break
          __pyx_v_k = (__pyx_v_j + 1);
          __pyx_v_restored = 1;
          goto __pyx_L20_break;
+3875:                 ox = bx[j]; oy = by[j]
        __pyx_v_ox = (__pyx_v_bx[__pyx_v_j]);
        __pyx_v_oy = (__pyx_v_by[__pyx_v_j]);
+3876:                 tx = bx[j + 1]; ty = by[j + 1]
        __pyx_v_tx = (__pyx_v_bx[(__pyx_v_j + 1)]);
        __pyx_v_ty = (__pyx_v_by[(__pyx_v_j + 1)]);
+3877:                 de = de + get_energy_change_2D_c(grid, type_grid, ox, oy, tx, ty,
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_energy_change_2D_c(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_12 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_13 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall));
+3878:                                                  idx_to_bead[off + j, 1], interaction_table, LR_interaction_table,
        __pyx_t_12 = (__pyx_v_off + __pyx_v_j);
        __pyx_t_13 = 1;
        __pyx_t_9 = -1;
        if (__pyx_t_12 < 0) {
          __pyx_t_12 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_12 < 0)) __pyx_t_9 = 0;
        } else if (unlikely(__pyx_t_12 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_9 = 0;
        if (__pyx_t_13 < 0) {
          __pyx_t_13 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_13 < 0)) __pyx_t_9 = 1;
        } else if (unlikely(__pyx_t_13 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_9 = 1;
        if (unlikely(__pyx_t_9 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_9);
          __PYX_ERR(0, 3878, __pyx_L1_error)
        }
 3879:                                                  SLR_interaction_table, XDIM, YDIM, hardwall)
+3880:                 newp[0] = tx; newp[1] = ty
        (__pyx_v_newp[0]) = __pyx_v_tx;
        (__pyx_v_newp[1]) = __pyx_v_ty;
+3881:                 de = de + get_angle_energy_change_2D_c(off + j, idx_to_bead, newp, angle_lookup)
        __pyx_v_de = (__pyx_v_de + __pyx_f_5pimms_15mega_crank_fast_get_angle_energy_change_2D_c((__pyx_v_off + __pyx_v_j), __pyx_v_idx_to_bead, __pyx_v_newp, __pyx_v_angle_lookup));
+3882:                 _apply_bead_move_2D(grid, type_grid, idx_to_bead, off + j, ox, oy, tx, ty, chainID)
        __pyx_f_5pimms_15mega_crank_fast__apply_bead_move_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, (__pyx_v_off + __pyx_v_j), __pyx_v_ox, __pyx_v_oy, __pyx_v_tx, __pyx_v_ty, __pyx_v_chainID);
+3883:                 pnx = tx; pny = ty
        __pyx_v_pnx = __pyx_v_tx;
        __pyx_v_pny = __pyx_v_ty;
+3884:                 k = j
        __pyx_v_k = __pyx_v_j;
      }
      __pyx_L20_break:;
+3885:             lo = k; hi = i
      __pyx_v_lo = __pyx_v_k;
      __pyx_v_hi = __pyx_v_i;
+3886:             if restored == 1:
      __pyx_t_3 = (__pyx_v_restored == 1);
      if (__pyx_t_3) {
/* … */
      }
    }
    __pyx_L12:;
+3887:                 nR = pull_first_targets_interior_2D(grid, bx[k - 1], by[k - 1],
        __pyx_v_nR = __pyx_f_5pimms_15mega_crank_fast_pull_first_targets_interior_2D(__pyx_v_grid, (__pyx_v_bx[(__pyx_v_k - 1)]), (__pyx_v_by[(__pyx_v_k - 1)]), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_13 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_12 * __pyx_v_idx_to_bead.strides[1]) ))), (*((__pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_idx_to_bead.data + __pyx_t_1 * __pyx_v_idx_to_bead.strides[0]) ) + __pyx_t_8 * __pyx_v_idx_to_bead.strides[1]) ))), __pyx_v_hardwall, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_tbuf, __pyx_v_bxb, __pyx_v_byb, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_v_W);
+3888:                                                     idx_to_bead[off + k, 5], idx_to_bead[off + k, 6],
        __pyx_t_13 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_12 = 5;
        __pyx_t_6 = -1;
        if (__pyx_t_13 < 0) {
          __pyx_t_13 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_13 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_13 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_12 < 0) {
          __pyx_t_12 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_12 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_12 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3888, __pyx_L1_error)
        }
        __pyx_t_1 = (__pyx_v_off + __pyx_v_k);
        __pyx_t_8 = 6;
        __pyx_t_6 = -1;
        if (__pyx_t_1 < 0) {
          __pyx_t_1 += __pyx_v_idx_to_bead.shape[0];
          if (unlikely(__pyx_t_1 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_1 >= __pyx_v_idx_to_bead.shape[0])) __pyx_t_6 = 0;
        if (__pyx_t_8 < 0) {
          __pyx_t_8 += __pyx_v_idx_to_bead.shape[1];
          if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 1;
        } else if (unlikely(__pyx_t_8 >= __pyx_v_idx_to_bead.shape[1])) __pyx_t_6 = 1;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_6);
          __PYX_ERR(0, 3888, __pyx_L1_error)
        }
 3889:                                                     hardwall, XDIM, YDIM, tbuf,
 3890:                                                     bxb, byb, Lx, Ly, nbx, nby, shift_x, shift_y, W)
 3891: 
+3892:         if restored == 0:
    __pyx_t_3 = (__pyx_v_restored == 0);
    if (__pyx_t_3) {
/* … */
    }
+3893:             _revert_segment_2D(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, chainID)
      __pyx_f_5pimms_15mega_crank_fast__revert_segment_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_chainID);
+3894:             continue
      goto __pyx_L4_continue;
 3895: 
+3896:         if accept_p_ratio(invtemp, de, nF, nR, &rng) == 1:
    __pyx_t_3 = (__pyx_f_5pimms_15mega_crank_fast_accept_p_ratio(__pyx_v_invtemp, __pyx_v_de, __pyx_v_nF, __pyx_v_nR, (&__pyx_v_rng)) == 1);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L24;
    }
+3897:             dsum = dsum + de
      __pyx_v_dsum = (__pyx_v_dsum + __pyx_v_de);
+3898:             acc = acc + 1
      __pyx_v_acc = (__pyx_v_acc + 1);
 3899:         else:
+3900:             _revert_segment_2D(grid, type_grid, idx_to_bead, off, lo, hi, bx, by, chainID)
    /*else*/ {
      __pyx_f_5pimms_15mega_crank_fast__revert_segment_2D(__pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_off, __pyx_v_lo, __pyx_v_hi, __pyx_v_bx, __pyx_v_by, __pyx_v_chainID);
    }
    __pyx_L24:;
    __pyx_L4_continue:;
  }
 3901: 
+3902:     out_delta[b] = dsum
  __pyx_t_8 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_8 < 0) {
    __pyx_t_8 += __pyx_v_out_delta.shape[0];
    if (unlikely(__pyx_t_8 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_8 >= __pyx_v_out_delta.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3902, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta.data) + __pyx_t_8)) )) = __pyx_v_dsum;
+3903:     out_accepted[b] = acc
  __pyx_t_8 = __pyx_v_b;
  __pyx_t_2 = -1;
  if (__pyx_t_8 < 0) {
    __pyx_t_8 += __pyx_v_out_accepted.shape[0];
    if (unlikely(__pyx_t_8 < 0)) __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_8 >= __pyx_v_out_accepted.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexErrorNogil(__pyx_t_2);
    __PYX_ERR(0, 3903, __pyx_L1_error)
  }
  *((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted.data) + __pyx_t_8)) )) = __pyx_v_acc;
 3904: 
 3905: 
+3906: @cython.wraparound(False)
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_29mega_pull_parallel_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_5pimms_15mega_crank_fast_28mega_pull_parallel_2D, "Parallel 2D pull megamove (the 2D analogue of mega_pull_parallel).");
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_29mega_pull_parallel_2D = {"mega_pull_parallel_2D", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_29mega_pull_parallel_2D, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_5pimms_15mega_crank_fast_28mega_pull_parallel_2D};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_29mega_pull_parallel_2D(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  __Pyx_memviewslice __pyx_v_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_type_grid = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_idx_to_bead = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_offset = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_length = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_chain_selector = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_LR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_SLR_interaction_table = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_angle_lookup = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_energy;
  float __pyx_v_invtemp;
  int __pyx_v_passed_seed;
  int __pyx_v_hardwall;
  CYTHON_UNUSED int __pyx_v_max_chain_len;
  int __pyx_v_num_threads;
  __Pyx_memviewslice __pyx_v_frozen_mask = { 0, 0, { 0 }, { 0 }, { 0 } };
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("mega_pull_parallel_2D (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_grid,&__pyx_mstate_global->__pyx_n_u_type_grid,&__pyx_mstate_global->__pyx_n_u_idx_to_bead,&__pyx_mstate_global->__pyx_n_u_chain_offset,&__pyx_mstate_global->__pyx_n_u_chain_length,&__pyx_mstate_global->__pyx_n_u_chain_homo,&__pyx_mstate_global->__pyx_n_u_chain_selector,&__pyx_mstate_global->__pyx_n_u_interaction_table,&__pyx_mstate_global->__pyx_n_u_LR_interaction_table,&__pyx_mstate_global->__pyx_n_u_SLR_interaction_table,&__pyx_mstate_global->__pyx_n_u_angle_lookup,&__pyx_mstate_global->__pyx_n_u_energy,&__pyx_mstate_global->__pyx_n_u_invtemp,&__pyx_mstate_global->__pyx_n_u_passed_seed,&__pyx_mstate_global->__pyx_n_u_hardwall,&__pyx_mstate_global->__pyx_n_u_max_chain_len,&__pyx_mstate_global->__pyx_n_u_num_threads,&__pyx_mstate_global->__pyx_n_u_frozen_mask,0};
  PyObject* values[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 3906, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case 18:
        values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 17:
        values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 16:
        values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 15:
        values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 14:
        values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 13:
        values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 12:
        values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 11:
        values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case 10:
        values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  9:
        values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  8:
        values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  7:
        values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  6:
        values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3906, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "mega_pull_parallel_2D", 0) < (0)) __PYX_ERR(0, 3906, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 18; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("mega_pull_parallel_2D", 1, 18, 18, i); __PYX_ERR(0, 3906, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 18)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[5] = __Pyx_ArgRef_FASTCALL(__pyx_args, 5);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[5])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[6] = __Pyx_ArgRef_FASTCALL(__pyx_args, 6);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[6])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[7] = __Pyx_ArgRef_FASTCALL(__pyx_args, 7);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[7])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[8] = __Pyx_ArgRef_FASTCALL(__pyx_args, 8);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[8])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[9] = __Pyx_ArgRef_FASTCALL(__pyx_args, 9);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[9])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[10] = __Pyx_ArgRef_FASTCALL(__pyx_args, 10);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[10])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[11] = __Pyx_ArgRef_FASTCALL(__pyx_args, 11);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[11])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[12] = __Pyx_ArgRef_FASTCALL(__pyx_args, 12);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[12])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[13] = __Pyx_ArgRef_FASTCALL(__pyx_args, 13);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[13])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[14] = __Pyx_ArgRef_FASTCALL(__pyx_args, 14);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[14])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[15] = __Pyx_ArgRef_FASTCALL(__pyx_args, 15);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[15])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[16] = __Pyx_ArgRef_FASTCALL(__pyx_args, 16);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[16])) __PYX_ERR(0, 3906, __pyx_L3_error)
      values[17] = __Pyx_ArgRef_FASTCALL(__pyx_args, 17);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[17])) __PYX_ERR(0, 3906, __pyx_L3_error)
    }
    __pyx_v_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_grid.memview)) __PYX_ERR(0, 3908, __pyx_L3_error)
    __pyx_v_type_grid = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_type_grid.memview)) __PYX_ERR(0, 3909, __pyx_L3_error)
    __pyx_v_idx_to_bead = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_idx_to_bead.memview)) __PYX_ERR(0, 3910, __pyx_L3_error)
    __pyx_v_chain_offset = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_offset.memview)) __PYX_ERR(0, 3911, __pyx_L3_error)
    __pyx_v_chain_length = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_length.memview)) __PYX_ERR(0, 3912, __pyx_L3_error)
    __pyx_v_chain_homo = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_homo.memview)) __PYX_ERR(0, 3913, __pyx_L3_error)
    __pyx_v_chain_selector = __Pyx_PyObject_to_MemoryviewSlice_dc_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_chain_selector.memview)) __PYX_ERR(0, 3914, __pyx_L3_error)
    __pyx_v_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_interaction_table.memview)) __PYX_ERR(0, 3915, __pyx_L3_error)
    __pyx_v_LR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_LR_interaction_table.memview)) __PYX_ERR(0, 3916, __pyx_L3_error)
    __pyx_v_SLR_interaction_table = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[9], PyBUF_WRITABLE); if (unlikely(!__pyx_v_SLR_interaction_table.memview)) __PYX_ERR(0, 3917, __pyx_L3_error)
    __pyx_v_angle_lookup = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsdsds_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_angle_lookup.memview)) __PYX_ERR(0, 3918, __pyx_L3_error)
    __pyx_v_energy = __Pyx_PyLong_As_long(values[11]); if (unlikely((__pyx_v_energy == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 3919, __pyx_L3_error)
    __pyx_v_invtemp = __Pyx_PyFloat_AsFloat(values[12]); if (unlikely((__pyx_v_invtemp == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 3920, __pyx_L3_error)
    __pyx_v_passed_seed = __Pyx_PyLong_As_int(values[13]); if (unlikely((__pyx_v_passed_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3921, __pyx_L3_error)
    __pyx_v_hardwall = __Pyx_PyLong_As_int(values[14]); if (unlikely((__pyx_v_hardwall == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3922, __pyx_L3_error)
    __pyx_v_max_chain_len = __Pyx_PyLong_As_int(values[15]); if (unlikely((__pyx_v_max_chain_len == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3923, __pyx_L3_error)
    __pyx_v_num_threads = __Pyx_PyLong_As_int(values[16]); if (unlikely((__pyx_v_num_threads == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3924, __pyx_L3_error)
    __pyx_v_frozen_mask = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE(values[17], PyBUF_WRITABLE); if (unlikely(!__pyx_v_frozen_mask.memview)) __PYX_ERR(0, 3925, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("mega_pull_parallel_2D", 1, 18, 18, __pyx_nargs); __PYX_ERR(0, 3906, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel_2D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_28mega_pull_parallel_2D(__pyx_self, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_chain_homo, __pyx_v_chain_selector, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_energy, __pyx_v_invtemp, __pyx_v_passed_seed, __pyx_v_hardwall, __pyx_v_max_chain_len, __pyx_v_num_threads, __pyx_v_frozen_mask);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_type_grid, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_idx_to_bead, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_offset, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_length, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_homo, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_chain_selector, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_LR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_SLR_interaction_table, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_angle_lookup, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_frozen_mask, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_5pimms_15mega_crank_fast_28mega_pull_parallel_2D(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_grid, __Pyx_memviewslice __pyx_v_type_grid, __Pyx_memviewslice __pyx_v_idx_to_bead, __Pyx_memviewslice __pyx_v_chain_offset, __Pyx_memviewslice __pyx_v_chain_length, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_chain_homo, __Pyx_memviewslice __pyx_v_chain_selector, __Pyx_memviewslice __pyx_v_interaction_table, __Pyx_memviewslice __pyx_v_LR_interaction_table, __Pyx_memviewslice __pyx_v_SLR_interaction_table, __Pyx_memviewslice __pyx_v_angle_lookup, long __pyx_v_energy, float __pyx_v_invtemp, int __pyx_v_passed_seed, int __pyx_v_hardwall, CYTHON_UNUSED int __pyx_v_max_chain_len, int __pyx_v_num_threads, __Pyx_memviewslice __pyx_v_frozen_mask) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D *__pyx_cur_scope;
  int __pyx_v_XDIM;
  int __pyx_v_YDIM;
  int __pyx_v_num_chains;
  int __pyx_v_n_steps;
  PyObject *__pyx_v_idx_np = NULL;
  int __pyx_v_R_int;
  int __pyx_v_cap;
  int __pyx_v_nbx;
  int __pyx_v_nby;
  int __pyx_v_Lx;
  int __pyx_v_Ly;
  int __pyx_v_num_blocks;
  PyObject *__pyx_v_rstate = NULL;
  int __pyx_v_shift_x;
  int __pyx_v_shift_y;
  PyObject *__pyx_v_gx = NULL;
  PyObject *__pyx_v_gy = NULL;
  PyObject *__pyx_v_dim_block = 0;
  PyObject *__pyx_v_bxj = NULL;
  PyObject *__pyx_v_byj = NULL;
  PyObject *__pyx_v_block_of_bead = NULL;
  PyObject *__pyx_v_chain_block = NULL;
  PyObject *__pyx_v_movable = NULL;
  PyObject *__pyx_v_mblocks = NULL;
  PyObject *__pyx_v_order = NULL;
  PyObject *__pyx_v_chain_ids = NULL;
  PyObject *__pyx_v_sorted_blocks = NULL;
  PyObject *__pyx_v_counts = NULL;
  PyObject *__pyx_v_starts = NULL;
  PyObject *__pyx_v_total_movable = NULL;
  PyObject *__pyx_v_attempts = NULL;
  PyObject *__pyx_v_bix = NULL;
  PyObject *__pyx_v_biy = NULL;
  PyObject *__pyx_v_blo_x = NULL;
  PyObject *__pyx_v_blo_y = NULL;
  PyObject *__pyx_v_seeds = NULL;
  PyObject *__pyx_v_out_delta = NULL;
  PyObject *__pyx_v_out_accepted = NULL;
  __Pyx_memviewslice __pyx_v_chain_ids_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_starts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_attempts_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_seeds_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_x_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_blo_y_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_delta_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_out_accepted_mv = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_b;
  CYTHON_UNUSED int __pyx_v_nthreads;
  long __pyx_v_tot_d;
  int __pyx_v_tot_a;
  PyObject *__pyx_r = NULL;
  __pyx_cur_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D *)__pyx_tp_new_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D(__pyx_mstate_global->__pyx_ptype_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D, __pyx_mstate_global->__pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 3906, __pyx_L1_error)
  } else {
    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
  }
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_29mega_pull_parallel_2D, 0, __pyx_mstate_global->__pyx_n_u_mega_pull_parallel_2D, NULL, __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[20])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3906, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030E0000
  PyUnstable_Object_EnableDeferredRefcount(__pyx_t_4);
  #endif
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_mega_pull_parallel_2D, __pyx_t_4) < (0)) __PYX_ERR(0, 3906, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D {
  PyObject_HEAD
  int __pyx_v_W;
  int __pyx_v_num_beads;
};

 3907: @cython.boundscheck(False)
 3908: def mega_pull_parallel_2D(NUMPY_INT_TYPE[:, :] grid,
 3909:                           NUMPY_INT_TYPE[:, :] type_grid,
 3910:                           NUMPY_INT_TYPE_long[:, :] idx_to_bead,
 3911:                           int[::1] chain_offset,
 3912:                           int[::1] chain_length,
 3913:                           int[::1] chain_homo,
 3914:                           int[::1] chain_selector,
 3915:                           NUMPY_INT_TYPE[:, :] interaction_table,
 3916:                           NUMPY_INT_TYPE[:, :] LR_interaction_table,
 3917:                           NUMPY_INT_TYPE[:, :] SLR_interaction_table,
 3918:                           NUMPY_INT_TYPE[:, :, :, :, :] angle_lookup,
 3919:                           long energy,
 3920:                           float invtemp,
 3921:                           int passed_seed,
 3922:                           int hardwall,
 3923:                           int max_chain_len,
 3924:                           int num_threads,
 3925:                           NUMPY_INT_TYPE[::1] frozen_mask):
 3926:     """Parallel 2D pull megamove (the 2D analogue of mega_pull_parallel)."""
+3927:     cdef int XDIM = grid.shape[0]
  __pyx_v_XDIM = (__pyx_v_grid.shape[0]);
+3928:     cdef int YDIM = grid.shape[1]
  __pyx_v_YDIM = (__pyx_v_grid.shape[1]);
+3929:     cdef int num_beads = idx_to_bead.shape[0]
  __pyx_cur_scope->__pyx_v_num_beads = (__pyx_v_idx_to_bead.shape[0]);
+3930:     cdef int num_chains = chain_offset.shape[0]
  __pyx_v_num_chains = (__pyx_v_chain_offset.shape[0]);
+3931:     cdef int n_steps = chain_selector.shape[0]
  __pyx_v_n_steps = (__pyx_v_chain_selector.shape[0]);
 3932: 
+3933:     idx_np = np.asarray(idx_to_bead)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_idx_to_bead, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3933, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3933, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_idx_np = __pyx_t_1;
  __pyx_t_1 = 0;
+3934:     cdef int R_int = 3 if np.any(idx_np[:, 1] == 1) else 1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3934, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_any); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3934, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[1]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3934, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyLong_EqObjC(__pyx_t_3, __pyx_mstate_global->__pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3934, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3934, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 3934, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_8) {
    __pyx_t_6 = 3;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_R_int = __pyx_t_6;
+3935:     cdef int W = R_int + 2
  __pyx_cur_scope->__pyx_v_W = (__pyx_v_R_int + 2);
 3936: 
+3937:     cdef int cap = 4
  __pyx_v_cap = 4;
+3938:     cdef int nbx = _choose_nb(XDIM, W, cap)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3938, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_4, __pyx_t_3, __pyx_t_9};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3938, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3938, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nbx = __pyx_t_6;
+3939:     cdef int nby = _choose_nb(YDIM, W, cap)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_choose_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3939, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3939, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3939, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_cap); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3939, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, __pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3939, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_6 = __Pyx_PyLong_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3939, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_nby = __pyx_t_6;
+3940:     cdef int Lx = XDIM // nbx
  if (unlikely(__pyx_v_nbx == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 3940, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nbx == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_XDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 3940, __pyx_L1_error)
  }
  __pyx_v_Lx = __Pyx_div_int(__pyx_v_XDIM, __pyx_v_nbx, 0);
+3941:     cdef int Ly = YDIM // nby
  if (unlikely(__pyx_v_nby == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero");
    __PYX_ERR(0, 3941, __pyx_L1_error)
  }
  else if (sizeof(int) == sizeof(long) && (!(((int)-1) > 0)) && unlikely(__pyx_v_nby == (int)-1)  && unlikely(__Pyx_UNARY_NEG_WOULD_OVERFLOW(__pyx_v_YDIM))) {
    PyErr_SetString(PyExc_OverflowError, "value too large to perform division");
    __PYX_ERR(0, 3941, __pyx_L1_error)
  }
  __pyx_v_Ly = __Pyx_div_int(__pyx_v_YDIM, __pyx_v_nby, 0);
+3942:     cdef int num_blocks = nbx * nby
  __pyx_v_num_blocks = (__pyx_v_nbx * __pyx_v_nby);
 3943: 
+3944:     rstate = np.random.RandomState(passed_seed & 0x7FFFFFFF)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3944, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3944, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_9 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_9);
  __pyx_t_2 = __Pyx_PyLong_From_long((__pyx_v_passed_seed & 0x7FFFFFFF)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3944, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_RandomState, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3944, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_rstate = __pyx_t_1;
  __pyx_t_1 = 0;
+3945:     cdef int shift_x = int(rstate.randint(0, Lx)) if nbx > 1 else 0
  __pyx_t_8 = (__pyx_v_nbx > 1);
  if (__pyx_t_8) {
    __pyx_t_4 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3945, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_mstate_global->__pyx_int_0, __pyx_t_2};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3945, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_t_2 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3945, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_2); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3945, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_x = __pyx_t_6;
+3946:     cdef int shift_y = int(rstate.randint(0, Ly)) if nby > 1 else 0
  __pyx_t_8 = (__pyx_v_nby > 1);
  if (__pyx_t_8) {
    __pyx_t_1 = __pyx_v_rstate;
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3946, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = 0;
    {
      PyObject *__pyx_callargs[3] = {__pyx_t_1, __pyx_mstate_global->__pyx_int_0, __pyx_t_4};
      __pyx_t_2 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_randint, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3946, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_t_4 = __Pyx_PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3946, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_10 = __Pyx_PyLong_As_int(__pyx_t_4); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 3946, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_6 = __pyx_t_10;
  } else {
    __pyx_t_6 = 0;
  }
  __pyx_v_shift_y = __pyx_t_6;
 3947: 
+3948:     gx = idx_np[:, 5].astype(np.int64)
  __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[2]); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3948, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3948, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3948, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3948, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_v_gx = __pyx_t_4;
  __pyx_t_4 = 0;
+3949:     gy = idx_np[:, 6].astype(np.int64)
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_idx_np, __pyx_mstate_global->__pyx_tuple[3]); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3949, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3949, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3949, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_9};
    __pyx_t_4 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3949, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_v_gy = __pyx_t_4;
  __pyx_t_4 = 0;
 3950: 
+3951:     def dim_block(g, nb, L, DIM, shift):
/* Python wrapper */
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_1dim_block = {"dim_block", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_1dim_block, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_1dim_block(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_g = 0;
  PyObject *__pyx_v_nb = 0;
  PyObject *__pyx_v_L = 0;
  PyObject *__pyx_v_DIM = 0;
  PyObject *__pyx_v_shift = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dim_block (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_g,&__pyx_mstate_global->__pyx_n_u_nb,&__pyx_mstate_global->__pyx_n_u_L,&__pyx_mstate_global->__pyx_n_u_DIM,&__pyx_mstate_global->__pyx_n_u_shift,0};
  PyObject* values[5] = {0,0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 3951, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  5:
        values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3951, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3951, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3951, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3951, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3951, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "dim_block", 0) < (0)) __PYX_ERR(0, 3951, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 5; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, i); __PYX_ERR(0, 3951, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 3951, __pyx_L3_error)
      values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 3951, __pyx_L3_error)
      values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 3951, __pyx_L3_error)
      values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 3951, __pyx_L3_error)
      values[4] = __Pyx_ArgRef_FASTCALL(__pyx_args, 4);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[4])) __PYX_ERR(0, 3951, __pyx_L3_error)
    }
    __pyx_v_g = values[0];
    __pyx_v_nb = values[1];
    __pyx_v_L = values[2];
    __pyx_v_DIM = values[3];
    __pyx_v_shift = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("dim_block", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 3951, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel_2D.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_dim_block(__pyx_self, __pyx_v_g, __pyx_v_nb, __pyx_v_L, __pyx_v_DIM, __pyx_v_shift);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_dim_block(PyObject *__pyx_self, PyObject *__pyx_v_g, PyObject *__pyx_v_nb, PyObject *__pyx_v_L, PyObject *__pyx_v_DIM, PyObject *__pyx_v_shift) {
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D *__pyx_cur_scope;
  struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D *__pyx_outer_scope;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_bj = NULL;
  PyObject *__pyx_v_within = NULL;
  PyObject *__pyx_v_bad = NULL;
  PyObject *__pyx_r = NULL;
  __pyx_outer_scope = (struct __pyx_obj_5pimms_15mega_crank_fast___pyx_scope_struct_5_mega_pull_parallel_2D *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pimms.mega_crank_fast.mega_pull_parallel_2D.dim_block", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_bj);
  __Pyx_XDECREF(__pyx_v_within);
  __Pyx_XDECREF(__pyx_v_bad);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_4 = __Pyx_CyFunction_New(&__pyx_mdef_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_1dim_block, 0, __pyx_mstate_global->__pyx_n_u_mega_pull_parallel_2D_locals_dim, ((PyObject*)__pyx_cur_scope), __pyx_mstate_global->__pyx_n_u_pimms_mega_crank_fast, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[5])); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3951, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_dim_block = __pyx_t_4;
  __pyx_t_4 = 0;
+3952:         if nb == 1:
  __pyx_t_1 = (__Pyx_PyLong_BoolEqObjC(__pyx_v_nb, __pyx_mstate_global->__pyx_int_1, 1, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 3952, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
  }
+3953:             return np.zeros(num_beads, dtype=np.int64)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3953, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3953, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_num_beads); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3953, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3953, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3953, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5);
      assert(__pyx_t_3);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
      __pyx_t_8 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_4};
      __pyx_t_6 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3953, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_6, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3953, __pyx_L1_error)
      __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_5, __pyx_callargs+__pyx_t_8, (2-__pyx_t_8) | (__pyx_t_8*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_6);
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3953, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    }
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
+3954:         s = (g - shift) % DIM
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_g, __pyx_v_shift); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3954, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyNumber_Remainder(__pyx_t_2, __pyx_v_DIM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3954, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_5;
  __pyx_t_5 = 0;
+3955:         bj = s // L
  __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_s, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3955, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_bj = __pyx_t_5;
  __pyx_t_5 = 0;
+3956:         within = s - bj * L
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_bj, __pyx_v_L); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3956, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3956, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_within = __pyx_t_2;
  __pyx_t_2 = 0;
+3957:         bad = (s >= nb * L) | (within < W) | (within >= L - W)
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nb, __pyx_v_L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_s, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Or(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyLong_From_int(__pyx_cur_scope->__pyx_v_W); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_L, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyObject_RichCompare(__pyx_v_within, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Or(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3957, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_bad = __pyx_t_5;
  __pyx_t_5 = 0;
+3958:         bj = bj.copy()
  __pyx_t_6 = __pyx_v_bj;
  __Pyx_INCREF(__pyx_t_6);
  __pyx_t_8 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
    __pyx_t_5 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_copy, __pyx_callargs+__pyx_t_8, (1-__pyx_t_8) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 3958, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
  }
  __Pyx_DECREF_SET(__pyx_v_bj, __pyx_t_5);
  __pyx_t_5 = 0;
+3959:         bj[bad] = -1
  if (unlikely((PyObject_SetItem(__pyx_v_bj, __pyx_v_bad, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3959, __pyx_L1_error)
+3960:         return bj
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_bj);
  __pyx_r = __pyx_v_bj;
  goto __pyx_L0;
 3961: 
+3962:     bxj = dim_block(gx, nbx, Lx, XDIM, shift_x)
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nbx); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_XDIM); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_shift_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __pyx_pf_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_dim_block(__pyx_v_dim_block, __pyx_v_gx, __pyx_t_4, __pyx_t_3, __pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_bxj = __pyx_t_2;
  __pyx_t_2 = 0;
+3963:     byj = dim_block(gy, nby, Ly, YDIM, shift_y)
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = __Pyx_PyLong_From_int(__pyx_v_YDIM); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_shift_y); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __pyx_pf_5pimms_15mega_crank_fast_21mega_pull_parallel_2D_dim_block(__pyx_v_dim_block, __pyx_v_gy, __pyx_t_2, __pyx_t_1, __pyx_t_9, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3963, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_byj = __pyx_t_4;
  __pyx_t_4 = 0;
+3964:     block_of_bead = (bxj * nby + byj)
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3964, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_bxj, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3964, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_v_byj); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3964, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_block_of_bead = __pyx_t_4;
  __pyx_t_4 = 0;
+3965:     block_of_bead[(bxj < 0) | (byj < 0)] = -1
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_bxj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3965, __pyx_L1_error)
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_byj, __pyx_mstate_global->__pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3965, __pyx_L1_error)
  __pyx_t_9 = PyNumber_Or(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3965, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_9, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3965, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 3966: 
+3967:     block_of_bead[np.asarray(frozen_mask) != 0] = -1   # frozen beads -> whole chain frozen
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3967, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3967, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_frozen_mask, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5pimms_13cython_config_NUMPY_INT_TYPE, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3967, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3967, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_1 = __Pyx_PyLong_NeObjC(__pyx_t_9, __pyx_mstate_global->__pyx_int_0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3967, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_block_of_bead, __pyx_t_1, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3967, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+3968:     chain_block = _chain_block_assignment(block_of_bead, chain_offset, num_chains)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_chain_block_assignment); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3968, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_chain_offset, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3968, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_num_chains); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3968, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_v_block_of_bead, __pyx_t_3, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (4-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3968, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_v_chain_block = __pyx_t_1;
  __pyx_t_1 = 0;
+3969:     chain_block[np.asarray(chain_length) < 3] = -1
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3969, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3969, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_chain_length, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3969, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3969, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_mstate_global->__pyx_int_3, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3969, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely((PyObject_SetItem(__pyx_v_chain_block, __pyx_t_3, __pyx_mstate_global->__pyx_int_neg_1) < 0))) __PYX_ERR(0, 3969, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+3970:     movable = np.nonzero(chain_block >= 0)[0].astype(np.int32)
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3970, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_nonzero); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3970, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = PyObject_RichCompare(__pyx_v_chain_block, __pyx_mstate_global->__pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3970, __pyx_L1_error)
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_9};
    __pyx_t_2 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3970, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3970, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_1 = __pyx_t_7;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3970, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3970, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_9};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3970, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_movable = __pyx_t_3;
  __pyx_t_3 = 0;
+3971:     if movable.shape[0] == 0:
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_movable, __pyx_mstate_global->__pyx_n_u_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3971, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyLong_From_long, 0, 0, 0, 1, __Pyx_ReferenceSharing_OwnStrongReference); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3971, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_8 = (__Pyx_PyLong_BoolEqObjC(__pyx_t_7, __pyx_mstate_global->__pyx_int_0, 0, 0)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 3971, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (__pyx_t_8) {
/* … */
  }
+3972:         return (energy, 0)
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_PyLong_From_long(__pyx_v_energy); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3972, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3972, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_7);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7) != (0)) __PYX_ERR(0, 3972, __pyx_L1_error);
    __Pyx_INCREF(__pyx_mstate_global->__pyx_int_0);
    __Pyx_GIVEREF(__pyx_mstate_global->__pyx_int_0);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_mstate_global->__pyx_int_0) != (0)) __PYX_ERR(0, 3972, __pyx_L1_error);
    __pyx_t_7 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
 3973: 
+3974:     mblocks = chain_block[movable]
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_chain_block, __pyx_v_movable); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3974, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_mblocks = __pyx_t_3;
  __pyx_t_3 = 0;
+3975:     order = np.argsort(mblocks, kind="stable")
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3975, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_argsort); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3975, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_v_mblocks};
    __pyx_t_9 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3975, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_kind, __pyx_mstate_global->__pyx_n_u_stable, __pyx_t_9, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3975, __pyx_L1_error)
    __pyx_t_3 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_1, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_9);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3975, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_order = __pyx_t_3;
  __pyx_t_3 = 0;
+3976:     chain_ids = movable[order].astype(np.int32)
  __pyx_t_9 = __Pyx_PyObject_GetItem(__pyx_v_movable, __pyx_v_order); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3976, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_1 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3976, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3976, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_2};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3976, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_chain_ids = __pyx_t_3;
  __pyx_t_3 = 0;
+3977:     sorted_blocks = mblocks[order]
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_mblocks, __pyx_v_order); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3977, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_sorted_blocks = __pyx_t_3;
  __pyx_t_3 = 0;
 3978: 
+3979:     counts = np.bincount(sorted_blocks, minlength=num_blocks).astype(np.int32)
  __pyx_t_1 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_bincount); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_1);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_v_sorted_blocks};
    __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3979, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_minlength, __pyx_t_7, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3979, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3979, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_9 = __pyx_t_2;
  __Pyx_INCREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_11};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3979, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_counts = __pyx_t_3;
  __pyx_t_3 = 0;
+3980:     starts = np.zeros(num_blocks + 1, dtype=np.int32)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3980, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3980, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyLong_From_long((__pyx_v_num_blocks + 1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3980, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3980, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3980, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_t_11};
    __pyx_t_4 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3980, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_7, __pyx_t_4, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3980, __pyx_L1_error)
    __pyx_t_3 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_4);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3980, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_v_starts = __pyx_t_3;
  __pyx_t_3 = 0;
+3981:     starts[1:] = np.cumsum(counts)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3981, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_cumsum); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3981, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_v_counts};
    __pyx_t_3 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3981, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  if (__Pyx_PyObject_SetSlice(__pyx_v_starts, __pyx_t_3, 1, 0, NULL, NULL, &__pyx_mstate_global->__pyx_slice[1], 1, 0, 0) < (0)) __PYX_ERR(0, 3981, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 3982: 
+3983:     total_movable = int(counts.sum())
  __pyx_t_7 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_7);
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
    __pyx_t_3 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_sum, __pyx_callargs+__pyx_t_5, (1-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3983, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_7 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3983, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_total_movable = ((PyObject*)__pyx_t_7);
  __pyx_t_7 = 0;
+3984:     attempts = np.maximum(
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_maximum); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+3985:         (n_steps * counts.astype(np.int64) // max(total_movable, 1)), 0).astype(np.int32)
  __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_n_steps); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = __pyx_v_counts;
  __Pyx_INCREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_14};
    __pyx_t_1 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3985, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  }
  __pyx_t_14 = PyNumber_Multiply(__pyx_t_11, __pyx_t_1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_14);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_15 = 1;
  __Pyx_INCREF(__pyx_v_total_movable);
  __pyx_t_16 = __pyx_v_total_movable;
  __pyx_t_11 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_16, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  if (__pyx_t_8) {
    __pyx_t_12 = __Pyx_PyLong_From_long(__pyx_t_15); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3985, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_PyInt_FromNumber(&__pyx_t_12, NULL, 0) < (0)) __PYX_ERR(0, 3985, __pyx_L1_error)
    __pyx_t_1 = __pyx_t_12;
    __pyx_t_12 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_16);
    __pyx_t_1 = __pyx_t_16;
  }
  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
  __pyx_t_12 = PyNumber_FloorDivide(__pyx_t_14, __pyx_t_1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_12, __pyx_mstate_global->__pyx_int_0};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (3-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3984, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_3 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_12};
    __pyx_t_7 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3985, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_v_attempts = __pyx_t_7;
  __pyx_t_7 = 0;
 3986: 
+3987:     bix = np.arange(num_blocks, dtype=np.int32) // nby
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_t_12};
    __pyx_t_2 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3987, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_2, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3987, __pyx_L1_error)
    __pyx_t_7 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_2);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3987, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
  }
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyNumber_FloorDivide(__pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_bix = __pyx_t_2;
  __pyx_t_2 = 0;
+3988:     biy = np.arange(num_blocks, dtype=np.int32) % nby
  __pyx_t_3 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_3);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_7};
    __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3988, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3988, __pyx_L1_error)
    __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3988, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
  }
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_nby); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_12 = PyNumber_Remainder(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_biy = __pyx_t_12;
  __pyx_t_12 = 0;
+3989:     blo_x = (bix * Lx).astype(np.int32)
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_Lx); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = PyNumber_Multiply(__pyx_v_bix, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __pyx_t_9;
  __Pyx_INCREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_7};
    __pyx_t_12 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3989, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_blo_x = __pyx_t_12;
  __pyx_t_12 = 0;
+3990:     blo_y = (biy * Ly).astype(np.int32)
  __pyx_t_7 = __Pyx_PyLong_From_int(__pyx_v_Ly); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_biy, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_9 = __pyx_t_4;
  __Pyx_INCREF(__pyx_t_9);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 0;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_2};
    __pyx_t_12 = __Pyx_PyObject_FastCallMethod((PyObject*)__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3990, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_blo_y = __pyx_t_12;
  __pyx_t_12 = 0;
 3991: 
+3992:     seeds = (np.arange(num_blocks, dtype=np.uint64) + np.uint64(passed_seed) + np.uint64(0x9E3779B9)) \
  __pyx_t_4 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_9))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_9);
    assert(__pyx_t_4);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3992, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3992, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_9, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3992, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_passed_seed); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_2, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_3};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_2, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3992, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_2 = PyNumber_Add(__pyx_t_12, __pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_12 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_12);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_12);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_mstate_global->__pyx_int_2654435769};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3992, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_7 = PyNumber_Add(__pyx_t_2, __pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+3993:         * np.uint64(0x2545F4914F6CDD1D) + np.uint64(1)
  __pyx_t_2 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3993, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3993, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    assert(__pyx_t_2);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_mstate_global->__pyx_int_0x2545f4914f6cdd1d};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_3, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3993, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_7, __pyx_t_9); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3993, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3993, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3993, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_12))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_12);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_mstate_global->__pyx_int_1};
    __pyx_t_9 = __Pyx_PyObject_FastCall((PyObject*)__pyx_t_12, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3993, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
  }
  __pyx_t_12 = PyNumber_Add(__pyx_t_3, __pyx_t_9); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3993, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_v_seeds = __pyx_t_12;
  __pyx_t_12 = 0;
 3994: 
+3995:     out_delta = np.zeros(num_blocks, dtype=np.int64)
  __pyx_t_9 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 3995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
    assert(__pyx_t_9);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_9, __pyx_t_3};
    __pyx_t_2 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3995, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_2, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3995, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_7, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_2);
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3995, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_out_delta = __pyx_t_12;
  __pyx_t_12 = 0;
+3996:     out_accepted = np.zeros(num_blocks, dtype=np.int32)
  __pyx_t_7 = NULL;
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3996, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 3996, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyLong_From_int(__pyx_v_num_blocks); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3996, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3996, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_int32); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 3996, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = 1;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
    assert(__pyx_t_7);
    PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx__function);
    __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
    __pyx_t_5 = 0;
  }
  #endif
  {
    PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_7, __pyx_t_2};
    __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3996, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_3, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 3996, __pyx_L1_error)
    __pyx_t_12 = __Pyx_Object_Vectorcall_CallFromBuilder((PyObject*)__pyx_t_4, __pyx_callargs+__pyx_t_5, (2-__pyx_t_5) | (__pyx_t_5*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 3996, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
  }
  __pyx_v_out_accepted = __pyx_t_12;
  __pyx_t_12 = 0;
 3997: 
+3998:     cdef int[::1] chain_ids_mv = chain_ids
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_chain_ids, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3998, __pyx_L1_error)
  __pyx_v_chain_ids_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+3999:     cdef int[::1] starts_mv = starts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_starts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 3999, __pyx_L1_error)
  __pyx_v_starts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+4000:     cdef int[::1] attempts_mv = attempts
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_attempts, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 4000, __pyx_L1_error)
  __pyx_v_attempts_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+4001:     cdef unsigned long long[::1] seeds_mv = seeds
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_PY_LONG_LONG(__pyx_v_seeds, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 4001, __pyx_L1_error)
  __pyx_v_seeds_mv = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+4002:     cdef int[::1] blo_x_mv = blo_x
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_x, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 4002, __pyx_L1_error)
  __pyx_v_blo_x_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+4003:     cdef int[::1] blo_y_mv = blo_y
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_blo_y, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 4003, __pyx_L1_error)
  __pyx_v_blo_y_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
+4004:     cdef long[::1] out_delta_mv = out_delta
  __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_long(__pyx_v_out_delta, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 4004, __pyx_L1_error)
  __pyx_v_out_delta_mv = __pyx_t_19;
  __pyx_t_19.memview = NULL;
  __pyx_t_19.data = NULL;
+4005:     cdef int[::1] out_accepted_mv = out_accepted
  __pyx_t_17 = __Pyx_PyObject_to_MemoryviewSlice_dc_int(__pyx_v_out_accepted, PyBUF_WRITABLE); if (unlikely(!__pyx_t_17.memview)) __PYX_ERR(0, 4005, __pyx_L1_error)
  __pyx_v_out_accepted_mv = __pyx_t_17;
  __pyx_t_17.memview = NULL;
  __pyx_t_17.data = NULL;
 4006: 
 4007:     cdef int b
+4008:     cdef int nthreads = num_threads if num_threads > 0 else 1
  __pyx_t_8 = (__pyx_v_num_threads > 0);
  if (__pyx_t_8) {
    __pyx_t_6 = __pyx_v_num_threads;
  } else {
    __pyx_t_6 = 1;
  }
  __pyx_v_nthreads = __pyx_t_6;
 4009: 
+4010:     for b in prange(num_blocks, nogil=True, num_threads=nthreads, schedule='dynamic'):
  {
      PyThreadState * _save;
      _save = PyEval_SaveThread();
      __Pyx_FastGIL_Remember();
      /*try:*/ {
        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic)        __pyx_t_6 = __pyx_v_num_blocks;
        {
            #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_20 = (__pyx_t_6 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_b) lastprivate(__pyx_v_b) schedule(dynamic) num_threads(__pyx_v_nthreads)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_b = (int)(0 + 1 * __pyx_t_10);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          __Pyx_FastGIL_Forget();
          PyEval_RestoreThread(_save);
          goto __pyx_L6;
        }
        __pyx_L6:;
      }
  }
+4011:         run_block_pull_2D(b, chain_ids_mv, starts_mv, attempts_mv, seeds_mv,
                            __pyx_f_5pimms_15mega_crank_fast_run_block_pull_2D(__pyx_v_b, __pyx_v_chain_ids_mv, __pyx_v_starts_mv, __pyx_v_attempts_mv, __pyx_v_seeds_mv, __pyx_v_chain_offset, __pyx_v_chain_length, __pyx_v_blo_x_mv, __pyx_v_blo_y_mv, __pyx_v_Lx, __pyx_v_Ly, __pyx_v_nbx, __pyx_v_nby, __pyx_v_shift_x, __pyx_v_shift_y, __pyx_cur_scope->__pyx_v_W, __pyx_v_grid, __pyx_v_type_grid, __pyx_v_idx_to_bead, __pyx_v_interaction_table, __pyx_v_LR_interaction_table, __pyx_v_SLR_interaction_table, __pyx_v_angle_lookup, __pyx_v_invtemp, __pyx_v_XDIM, __pyx_v_YDIM, __pyx_v_hardwall, __pyx_v_out_delta_mv, __pyx_v_out_accepted_mv);
                        }
                    }
                }
            }
        }
        #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
      }
 4012:                           chain_offset, chain_length,
 4013:                           blo_x_mv, blo_y_mv,
 4014:                           Lx, Ly, nbx, nby,
 4015:                           shift_x, shift_y, W,
 4016:                           grid, type_grid, idx_to_bead,
 4017:                           interaction_table, LR_interaction_table, SLR_interaction_table,
 4018:                           angle_lookup, invtemp, XDIM, YDIM, hardwall,
 4019:                           out_delta_mv, out_accepted_mv)
 4020: 
+4021:     cdef long tot_d = 0
  __pyx_v_tot_d = 0;
+4022:     cdef int tot_a = 0
  __pyx_v_tot_a = 0;
+4023:     for b in range(num_blocks):
  __pyx_t_20 = __pyx_v_num_blocks;
  __pyx_t_10 = __pyx_t_20;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_10; __pyx_t_6+=1) {
    __pyx_v_b = __pyx_t_6;
+4024:         tot_d += out_delta_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_d = (__pyx_v_tot_d + (*((long *) ( /* dim=0 */ ((char *) (((long *) __pyx_v_out_delta_mv.data) + __pyx_t_21)) ))));
+4025:         tot_a += out_accepted_mv[b]
    __pyx_t_21 = __pyx_v_b;
    __pyx_v_tot_a = (__pyx_v_tot_a + (*((int *) ( /* dim=0 */ ((char *) (((int *) __pyx_v_out_accepted_mv.data) + __pyx_t_21)) ))));
  }
+4026:     return (energy + tot_d, tot_a)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_12 = __Pyx_PyLong_From_long((__pyx_v_energy + __pyx_v_tot_d)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 4026, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_4 = __Pyx_PyLong_From_int(__pyx_v_tot_a); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 4026, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 4026, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_12);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_12) != (0)) __PYX_ERR(0, 4026, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4) != (0)) __PYX_ERR(0, 4026, __pyx_L1_error);
  __pyx_t_12 = 0;
  __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;