Generated by Cython 3.0.11

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

+001: # cython: language_level=3
  __pyx_t_7 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 002: # cython: profile=True
 003: 
 004: import cython
+005: import numpy as np
  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 006: from libc.math cimport frexp, floor
 007: cimport numpy as np
 008: cimport scipy.special.cython_special
+009: np.import_array()
  __pyx_t_9 = __pyx_f_5numpy_import_array(); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 9, __pyx_L1_error)
+010: ctypedef unsigned long long int uint64
typedef unsigned PY_LONG_LONG __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64;
 011: ctypedef unsigned int uint
 012: 
 013: @cython.boundscheck(False)
+014: cpdef hash_int_c(uint64[:] vals):
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_1hash_int_c(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 PyObject *__pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c(__Pyx_memviewslice __pyx_v_vals, CYTHON_UNUSED int __pyx_skip_dispatch) {
  Py_ssize_t __pyx_v_N;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint __pyx_v_shift1;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint __pyx_v_shift2;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint __pyx_v_shift3;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_mult1;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_mult2;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_add1;
  int __pyx_v_i;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_r;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__11)
  __Pyx_TraceCall("hash_int_c", __pyx_f[0], 14, 0, __PYX_ERR(0, 14, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.hash_int_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_1hash_int_c(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_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c, "Use simple hashing for generating random numbers from indices\n    deterministically. See\n    https://stackoverflow.com/questions/664014/what-integer-hash-function-are-good-that-accepts-an-integer-hash-key\n    ");
static PyMethodDef __pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_1hash_int_c = {"hash_int_c", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_1hash_int_c, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c};
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_1hash_int_c(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_vals = { 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("hash_int_c (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __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 **__pyx_pyargnames[] = {&__pyx_n_s_vals,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_vals)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "hash_int_c") < 0)) __PYX_ERR(0, 14, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
    }
    __pyx_v_vals = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_vals.memview)) __PYX_ERR(0, 14, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("hash_int_c", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 14, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_vals, 1);
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.hash_int_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c(__pyx_self, __pyx_v_vals);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_vals, 1);
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_vals) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__11)
  __Pyx_TraceCall("hash_int_c (wrapper)", __pyx_f[0], 14, 0, __PYX_ERR(0, 14, __pyx_L1_error));
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_vals.memview)) { __Pyx_RaiseUnboundLocalError("vals"); __PYX_ERR(0, 14, __pyx_L1_error) }
  __pyx_t_1 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c(__pyx_v_vals, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.hash_int_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__26 = PyTuple_Pack(1, __pyx_n_s_vals); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_1hash_int_c, 0, __pyx_n_s_hash_int_c, NULL, __pyx_n_s_tt_sketch_drm_fast_lazy_gaussian_2, __pyx_d, ((PyObject *)__pyx_codeobj__11)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_hash_int_c, __pyx_t_7) < 0) __PYX_ERR(0, 14, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_codeobj__11 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tt_sketch_drm_fast_lazy_gaussian, __pyx_n_s_hash_int_c, 14, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__11)) __PYX_ERR(0, 14, __pyx_L1_error)
 015:     """Use simple hashing for generating random numbers from indices
 016:     deterministically. See
 017:     https://stackoverflow.com/questions/664014/what-integer-hash-function-are-good-that-accepts-an-integer-hash-key
 018:     """
+019:     cdef Py_ssize_t N = vals.shape[0]
  __pyx_v_N = (__pyx_v_vals.shape[0]);
+020:     cdef uint shift1 = 30
  __pyx_v_shift1 = 30;
+021:     cdef uint shift2 = 27
  __pyx_v_shift2 = 27;
+022:     cdef uint shift3 = 31
  __pyx_v_shift3 = 31;
+023:     cdef uint64 mult1 = 0xBF58476D1CE4E5B9
  __pyx_v_mult1 = 0xBF58476D1CE4E5B9;
+024:     cdef uint64 mult2 = 0x94D049BB133111EB
  __pyx_v_mult2 = 0x94D049BB133111EB;
+025:     cdef uint64 add1 = 0X4BE98134A5976FD3
  __pyx_v_add1 = 0X4BE98134A5976FD3;
 026: 
 027:     cdef int i
 028:     cdef uint64 r
+029:     for i in range(N):
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+030:         r = vals[i]
    __pyx_t_4 = __pyx_v_i;
    if (__pyx_t_4 < 0) __pyx_t_4 += __pyx_v_vals.shape[0];
    __pyx_v_r = (*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_4 * __pyx_v_vals.strides[0]) )));
+031:         r = r + add1
    __pyx_v_r = (__pyx_v_r + __pyx_v_add1);
+032:         r ^= r >> shift1
    __pyx_v_r = (__pyx_v_r ^ (__pyx_v_r >> __pyx_v_shift1));
+033:         r *= mult1
    __pyx_v_r = (__pyx_v_r * __pyx_v_mult1);
+034:         r ^= r >> shift2
    __pyx_v_r = (__pyx_v_r ^ (__pyx_v_r >> __pyx_v_shift2));
+035:         r *= mult2
    __pyx_v_r = (__pyx_v_r * __pyx_v_mult2);
+036:         r ^= r >> shift3
    __pyx_v_r = (__pyx_v_r ^ (__pyx_v_r >> __pyx_v_shift3));
+037:         vals[i] = r
    __pyx_t_4 = __pyx_v_i;
    if (__pyx_t_4 < 0) __pyx_t_4 += __pyx_v_vals.shape[0];
    *((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_vals.data + __pyx_t_4 * __pyx_v_vals.strides[0]) )) = __pyx_v_r;
  }
 038: 
 039: @cython.boundscheck(False)
+040: cdef uint_to_normal(double[:] nums):
static PyObject *__pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian_uint_to_normal(__Pyx_memviewslice __pyx_v_nums) {
  Py_ssize_t __pyx_v_N;
  Py_ssize_t __pyx_v_i;
  int __pyx_v_e;
  double __pyx_v_x;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceCall("uint_to_normal", __pyx_f[0], 40, 0, __PYX_ERR(0, 40, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.uint_to_normal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 041:     """Turn hashed indices into normally distributed numbers"""
 042:     # cdef double[:] nums = <double[:]>inds
+043:     cdef Py_ssize_t N = nums.shape[0]
  __pyx_v_N = (__pyx_v_nums.shape[0]);
 044:     cdef Py_ssize_t i
 045:     cdef int e
 046:     cdef double x
+047:     for i in range(N): #prange here messes stuff up when parallelizing
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+048:         x = frexp(nums[i], &e) * 2 - 1
    __pyx_t_4 = __pyx_v_i;
    if (__pyx_t_4 < 0) __pyx_t_4 += __pyx_v_nums.shape[0];
    __pyx_v_x = ((frexp((*((double *) ( /* dim=0 */ (__pyx_v_nums.data + __pyx_t_4 * __pyx_v_nums.strides[0]) ))), (&__pyx_v_e)) * 2.0) - 1.0);
+049:         x = scipy.special.cython_special.ndtri(x)
    __pyx_v_x = __pyx_f_5scipy_7special_14cython_special_ndtri(__pyx_v_x, 0);
+050:         nums[i] = x
    __pyx_t_4 = __pyx_v_i;
    if (__pyx_t_4 < 0) __pyx_t_4 += __pyx_v_nums.shape[0];
    *((double *) ( /* dim=0 */ (__pyx_v_nums.data + __pyx_t_4 * __pyx_v_nums.strides[0]) )) = __pyx_v_x;
  }
 051: 
 052: @cython.boundscheck(False)
+053: cpdef double[:] _inds_to_rand_double(
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_3_inds_to_rand_double(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 __Pyx_memviewslice __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_rand_double(__Pyx_memviewslice __pyx_v_indices, __Pyx_memviewslice __pyx_v_shape, int __pyx_v_rank_min, int __pyx_v_rank_max, __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_seed, CYTHON_UNUSED int __pyx_skip_dispatch) {
  __Pyx_memviewslice __pyx_v_indices_flat = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_N;
  int __pyx_v_n_dim;
  int __pyx_v_rank;
  int __pyx_v_prod;
  int __pyx_v_i;
  int __pyx_v_j;
  __Pyx_memviewslice __pyx_v_size_salt = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_indices_flat_large = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_hashes = { 0, 0, { 0 }, { 0 }, { 0 } };
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_SETBIT3;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_SETBITS12;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_h;
  __Pyx_memviewslice __pyx_v_nums = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__12)
  __Pyx_TraceCall("_inds_to_rand_double", __pyx_f[0], 53, 0, __PYX_ERR(0, 53, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_4, 1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_17);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_18, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_20, 1);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian._inds_to_rand_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
  }
  __pyx_L2:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_indices_flat, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_size_salt, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_indices_flat_large, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_hashes, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_nums, 1);
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_3_inds_to_rand_double(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_9tt_sketch_3drm_18fast_lazy_gaussian_3_inds_to_rand_double = {"_inds_to_rand_double", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_3_inds_to_rand_double, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_3_inds_to_rand_double(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_indices = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_shape = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_rank_min;
  int __pyx_v_rank_max;
  __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_seed;
  #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("_inds_to_rand_double (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __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 **__pyx_pyargnames[] = {&__pyx_n_s_indices,&__pyx_n_s_shape,&__pyx_n_s_rank_min,&__pyx_n_s_rank_max,&__pyx_n_s_seed,0};
  PyObject* values[5] = {0,0,0,0,0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_indices)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 53, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 53, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("_inds_to_rand_double", 1, 5, 5, 1); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank_min)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 53, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("_inds_to_rand_double", 1, 5, 5, 2); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank_max)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 53, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("_inds_to_rand_double", 1, 5, 5, 3); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_seed)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 53, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("_inds_to_rand_double", 1, 5, 5, 4); __PYX_ERR(0, 53, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_inds_to_rand_double") < 0)) __PYX_ERR(0, 53, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
    }
    __pyx_v_indices = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_indices.memview)) __PYX_ERR(0, 54, __pyx_L3_error)
    __pyx_v_shape = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_shape.memview)) __PYX_ERR(0, 55, __pyx_L3_error)
    __pyx_v_rank_min = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_rank_min == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L3_error)
    __pyx_v_rank_max = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_rank_max == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 57, __pyx_L3_error)
    __pyx_v_seed = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(values[4]); if (unlikely((__pyx_v_seed == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L3_error)
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_inds_to_rand_double", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 53, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_indices, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_shape, 1);
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian._inds_to_rand_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_2_inds_to_rand_double(__pyx_self, __pyx_v_indices, __pyx_v_shape, __pyx_v_rank_min, __pyx_v_rank_max, __pyx_v_seed);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_indices, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_shape, 1);
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_2_inds_to_rand_double(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_indices, __Pyx_memviewslice __pyx_v_shape, int __pyx_v_rank_min, int __pyx_v_rank_max, __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_seed) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__12)
  __Pyx_TraceCall("_inds_to_rand_double (wrapper)", __pyx_f[0], 53, 0, __PYX_ERR(0, 53, __pyx_L1_error));
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_indices.memview)) { __Pyx_RaiseUnboundLocalError("indices"); __PYX_ERR(0, 53, __pyx_L1_error) }
  if (unlikely(!__pyx_v_shape.memview)) { __Pyx_RaiseUnboundLocalError("shape"); __PYX_ERR(0, 53, __pyx_L1_error) }
  __pyx_t_1 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_rand_double(__pyx_v_indices, __pyx_v_shape, __pyx_v_rank_min, __pyx_v_rank_max, __pyx_v_seed, 0); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 53, __pyx_L1_error)
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_t_1, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __pyx_t_1.memview = NULL; __pyx_t_1.data = NULL;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian._inds_to_rand_double", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__27 = PyTuple_Pack(5, __pyx_n_s_indices, __pyx_n_s_shape, __pyx_n_s_rank_min, __pyx_n_s_rank_max, __pyx_n_s_seed); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_3_inds_to_rand_double, 0, __pyx_n_s_inds_to_rand_double, NULL, __pyx_n_s_tt_sketch_drm_fast_lazy_gaussian_2, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_inds_to_rand_double, __pyx_t_7) < 0) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tt_sketch_drm_fast_lazy_gaussian, __pyx_n_s_inds_to_rand_double, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 53, __pyx_L1_error)
 054:     uint64[:,:] indices,
 055:     uint64[:] shape,
 056:     int rank_min,
 057:     int rank_max,
 058:     uint64 seed,
 059: ):
+060:     cdef uint64[:] indices_flat = np.copy(indices[0])
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_copy); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4.data = __pyx_v_indices.data;
  __pyx_t_4.memview = __pyx_v_indices.memview;
  __PYX_INC_MEMVIEW(&__pyx_t_4, 1);
  {
    Py_ssize_t __pyx_tmp_idx = 0;
        Py_ssize_t __pyx_tmp_shape = __pyx_v_indices.shape[0];
    Py_ssize_t __pyx_tmp_stride = __pyx_v_indices.strides[0];
        if (__pyx_tmp_idx < 0)
            __pyx_tmp_idx += __pyx_tmp_shape;
        __pyx_t_4.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_4.shape[0] = __pyx_v_indices.shape[1];
__pyx_t_4.strides[0] = __pyx_v_indices.strides[1];
    __pyx_t_4.suboffsets[0] = -1;

__pyx_t_2 = __pyx_memoryview_fromslice(__pyx_t_4, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_4, 1);
  __pyx_t_4.memview = NULL; __pyx_t_4.data = NULL;
  __pyx_t_5 = NULL;
  __pyx_t_6 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_6 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 60, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_indices_flat = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
+061:     cdef int N = indices.shape[1]
  __pyx_v_N = (__pyx_v_indices.shape[1]);
+062:     cdef int n_dim = len(shape)
  __pyx_t_7 = __Pyx_MemoryView_Len(__pyx_v_shape); 
  __pyx_v_n_dim = __pyx_t_7;
+063:     cdef int rank = rank_max - rank_min
  __pyx_v_rank = (__pyx_v_rank_max - __pyx_v_rank_min);
 064: 
+065:     cdef int prod = shape[0]
  __pyx_t_8 = 0;
  if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_shape.shape[0];
  __pyx_v_prod = (*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_shape.data + __pyx_t_8 * __pyx_v_shape.strides[0]) )));
 066:     cdef int i
 067:     cdef int j
+068:     for i in range(1,n_dim):
  __pyx_t_9 = __pyx_v_n_dim;
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_i = __pyx_t_11;
+069:         for j in range(N):
    __pyx_t_12 = __pyx_v_N;
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_j = __pyx_t_14;
+070:             indices_flat[j] += indices[i,j] * prod
      __pyx_t_8 = __pyx_v_i;
      __pyx_t_15 = __pyx_v_j;
      if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_indices.shape[0];
      if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_indices.shape[1];
      __pyx_t_16 = __pyx_v_j;
      if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_indices_flat.shape[0];
      *((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_indices_flat.data + __pyx_t_16 * __pyx_v_indices_flat.strides[0]) )) += ((*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_indices.data + __pyx_t_8 * __pyx_v_indices.strides[0]) ) + __pyx_t_15 * __pyx_v_indices.strides[1]) ))) * __pyx_v_prod);
    }
+071:         prod *= shape[i]
    __pyx_t_15 = __pyx_v_i;
    if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_shape.shape[0];
    __pyx_v_prod = (__pyx_v_prod * (*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_shape.data + __pyx_t_15 * __pyx_v_shape.strides[0]) ))));
  }
 072: 
+073:     cdef uint64[:] size_salt = np.arange(rank_min, rank_max, dtype=np.uint64)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_arange); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_rank_min); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_rank_max); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_1);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_2);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint64); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_17) < 0) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
  __pyx_t_17 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_t_17, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
  __pyx_v_size_salt = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
+074:     hash_int_c(size_salt)
  __pyx_t_17 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c(__pyx_v_size_salt, 0); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 74, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
 075:     # print(np.array(size_salt)) (if we increase rank then first r size salts
 076:     # are still the same)
 077: 
+078:     for i in range(rank):
  __pyx_t_9 = __pyx_v_rank;
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_i = __pyx_t_11;
+079:         size_salt[i] += seed
    __pyx_t_15 = __pyx_v_i;
    if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_size_salt.shape[0];
    *((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_size_salt.data + __pyx_t_15 * __pyx_v_size_salt.strides[0]) )) += __pyx_v_seed;
  }
 080: 
+081:     cdef uint64[:,:] indices_flat_large = np.empty(
  __Pyx_GetModuleGlobalName(__pyx_t_17, __pyx_n_s_np); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_17, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
/* … */
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_3);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3)) __PYX_ERR(0, 81, __pyx_L1_error);
  __pyx_t_3 = 0;
/* … */
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_indices_flat_large = __pyx_t_18;
  __pyx_t_18.memview = NULL;
  __pyx_t_18.data = NULL;
+082:         (N, rank), dtype=np.uint64
  __pyx_t_17 = __Pyx_PyInt_From_int(__pyx_v_N); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_rank); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_17);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_17)) __PYX_ERR(0, 82, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5)) __PYX_ERR(0, 82, __pyx_L1_error);
  __pyx_t_17 = 0;
  __pyx_t_5 = 0;
/* … */
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_17, __pyx_n_s_np); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_17, __pyx_n_s_uint64); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 083:     )
 084: 
+085:     for i in range(N):
  __pyx_t_9 = __pyx_v_N;
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_i = __pyx_t_11;
+086:         for j in range(rank):
    __pyx_t_12 = __pyx_v_rank;
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_j = __pyx_t_14;
+087:             indices_flat_large[i,j] = indices_flat[i] + size_salt[j]
      __pyx_t_15 = __pyx_v_i;
      if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_indices_flat.shape[0];
      __pyx_t_8 = __pyx_v_j;
      if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_size_salt.shape[0];
      __pyx_t_16 = __pyx_v_i;
      __pyx_t_19 = __pyx_v_j;
      if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_indices_flat_large.shape[0];
      if (__pyx_t_19 < 0) __pyx_t_19 += __pyx_v_indices_flat_large.shape[1];
      *((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_indices_flat_large.data + __pyx_t_16 * __pyx_v_indices_flat_large.strides[0]) ) + __pyx_t_19 * __pyx_v_indices_flat_large.strides[1]) )) = ((*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_indices_flat.data + __pyx_t_15 * __pyx_v_indices_flat.strides[0]) ))) + (*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_size_salt.data + __pyx_t_8 * __pyx_v_size_salt.strides[0]) ))));
    }
  }
 088: 
+089:     cdef uint64[:] hashes =  np.reshape(indices_flat_large, -1)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 89, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_reshape); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 89, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_indices_flat_large, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 89, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = NULL;
  __pyx_t_6 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_6 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_t_3, __pyx_int_neg_1};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 89, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_hashes = __pyx_t_4;
  __pyx_t_4.memview = NULL;
  __pyx_t_4.data = NULL;
 090: 
+091:     cdef uint64 SETBIT3 = 0x2000000000000000
  __pyx_v_SETBIT3 = 0x2000000000000000;
+092:     cdef uint64 SETBITS12 = 0x3FFFFFFFFFFFFFFF
  __pyx_v_SETBITS12 = 0x3FFFFFFFFFFFFFFF;
 093:     cdef uint64 h
+094:     hash_int_c(hashes)
  __pyx_t_1 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian_hash_int_c(__pyx_v_hashes, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 94, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+095:     for i in range(N*rank):
  __pyx_t_9 = (__pyx_v_N * __pyx_v_rank);
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_i = __pyx_t_11;
 096:         # Set first three bits to 001
 097:         # Avoids NaN values and zero values for float exp
 098:         # Assures mantissa is between 0.5 and 1.0
+099:         h = hashes[i]
    __pyx_t_8 = __pyx_v_i;
    if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_hashes.shape[0];
    __pyx_v_h = (*((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_hashes.data + __pyx_t_8 * __pyx_v_hashes.strides[0]) )));
+100:         h = (h | SETBIT3) & SETBITS12
    __pyx_v_h = ((__pyx_v_h | __pyx_v_SETBIT3) & __pyx_v_SETBITS12);
+101:         hashes[i] = h
    __pyx_t_8 = __pyx_v_i;
    if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_hashes.shape[0];
    *((__pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 *) ( /* dim=0 */ (__pyx_v_hashes.data + __pyx_t_8 * __pyx_v_hashes.strides[0]) )) = __pyx_v_h;
  }
+102:     cdef double[:] nums = np.frombuffer(hashes, dtype=np.float64)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_frombuffer); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_hashes, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(0, 102, __pyx_L1_error);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float64); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_17) < 0) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
  __pyx_t_17 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_17);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_20 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_17, PyBUF_WRITABLE); if (unlikely(!__pyx_t_20.memview)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
  __pyx_v_nums = __pyx_t_20;
  __pyx_t_20.memview = NULL;
  __pyx_t_20.data = NULL;
 103: 
 104: 
+105:     return nums
  __PYX_INC_MEMVIEW(&__pyx_v_nums, 1);
  __pyx_r = __pyx_v_nums;
  goto __pyx_L0;
 106: 
 107: 
+108: cdef double[:] _inds_to_normal(
static __Pyx_memviewslice __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_normal(__Pyx_memviewslice __pyx_v_indices, __Pyx_memviewslice __pyx_v_shape, int __pyx_v_rank_min, int __pyx_v_rank_max, __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_seed) {
  __Pyx_memviewslice __pyx_v_nums = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_TraceDeclarations
  __Pyx_TraceCall("_inds_to_normal", __pyx_f[0], 108, 0, __PYX_ERR(0, 108, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_2);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian._inds_to_normal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
  }
  __pyx_L2:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_nums, 1);
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 109:     uint64[:,:] indices,
 110:     uint64[:] shape,
 111:     int rank_min,
 112:     int rank_max,
 113:     uint64 seed,
 114: ):
+115:     cdef double[:] nums = _inds_to_rand_double(
  __pyx_t_1 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_rand_double(__pyx_v_indices, __pyx_v_shape, __pyx_v_rank_min, __pyx_v_rank_max, __pyx_v_seed, 0); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 115, __pyx_L1_error)
  __pyx_v_nums = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
 116:         indices, shape, rank_min, rank_max, seed
 117:     )
+118:     uint_to_normal(nums)
  __pyx_t_2 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian_uint_to_normal(__pyx_v_nums); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+119:     return nums
  __PYX_INC_MEMVIEW(&__pyx_v_nums, 1);
  __pyx_r = __pyx_v_nums;
  goto __pyx_L0;
 120: 
 121: @cython.boundscheck(False)
+122: cdef short[:] _inds_to_sparse_sign(
static __Pyx_memviewslice __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_sparse_sign(__Pyx_memviewslice __pyx_v_indices, __Pyx_memviewslice __pyx_v_shape, int __pyx_v_rank, int __pyx_v_nnz, __pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64 __pyx_v_seed) {
  Py_ssize_t __pyx_v_N;
  __Pyx_memviewslice __pyx_v_uniform_nums = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_sparse_sign = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_i;
  int __pyx_v_j;
  int __pyx_v_e;
  short __pyx_v_temp;
  int __pyx_v_rand_num;
  __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_TraceDeclarations
  __Pyx_TraceCall("_inds_to_sparse_sign", __pyx_f[0], 122, 0, __PYX_ERR(0, 122, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 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_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __pyx_r.data = NULL;
  __pyx_r.memview = NULL;
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian._inds_to_sparse_sign", __pyx_clineno, __pyx_lineno, __pyx_filename);
  goto __pyx_L2;
  __pyx_L0:;
  if (unlikely(!__pyx_r.memview)) {
    PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
  }
  __pyx_L2:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_uniform_nums, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_sparse_sign, 1);
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 123:     uint64[:,:] indices,
 124:     uint64[:] shape,
 125:     int rank,
 126:     int nnz,
 127:     uint64 seed,
 128: ):
+129:     cdef Py_ssize_t N = indices.shape[1]
  __pyx_v_N = (__pyx_v_indices.shape[1]);
+130:     cdef double[:] uniform_nums = _inds_to_rand_double(
  __pyx_t_1 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_rand_double(__pyx_v_indices, __pyx_v_shape, 0, __pyx_v_nnz, __pyx_v_seed, 0); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 130, __pyx_L1_error)
  __pyx_v_uniform_nums = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
 131:         indices, shape, 0, nnz, seed
 132:     )
+133:     cdef short[:] sparse_sign = torch.zeros((N*rank), dtype=np.int16)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyInt_FromSsize_t((__pyx_v_N * __pyx_v_rank)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2)) __PYX_ERR(0, 133, __pyx_L1_error);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_int16); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __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_t_7 = __Pyx_PyObject_to_MemoryviewSlice_ds_short(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_sparse_sign = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 134:     cdef int i
 135:     cdef int j
 136:     cdef int e
 137:     cdef short temp
 138:     cdef int rand_num
 139: 
+140:     for i in range(N):
  __pyx_t_8 = __pyx_v_N;
  __pyx_t_9 = __pyx_t_8;
  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;
 141:         # populate matrix with rand signs
+142:         for j in range(nnz):
    __pyx_t_11 = __pyx_v_nnz;
    __pyx_t_12 = __pyx_t_11;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
 143:             # Replace uniform num with mantissa, store exponent in &e
+144:             uniform_nums[i*nnz+j] = frexp(uniform_nums[i*nnz+j], &e) * 2 - 1
      __pyx_t_14 = ((__pyx_v_i * __pyx_v_nnz) + __pyx_v_j);
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_uniform_nums.shape[0];
      __pyx_t_15 = ((__pyx_v_i * __pyx_v_nnz) + __pyx_v_j);
      if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_uniform_nums.shape[0];
      *((double *) ( /* dim=0 */ (__pyx_v_uniform_nums.data + __pyx_t_15 * __pyx_v_uniform_nums.strides[0]) )) = ((frexp((*((double *) ( /* dim=0 */ (__pyx_v_uniform_nums.data + __pyx_t_14 * __pyx_v_uniform_nums.strides[0]) ))), (&__pyx_v_e)) * 2.0) - 1.0);
+145:             sparse_sign[i*rank+j] = (e % 2) * 2 - 1  # random sign
      __pyx_t_14 = ((__pyx_v_i * __pyx_v_rank) + __pyx_v_j);
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_sparse_sign.shape[0];
      *((short *) ( /* dim=0 */ (__pyx_v_sparse_sign.data + __pyx_t_14 * __pyx_v_sparse_sign.strides[0]) )) = ((__Pyx_mod_long(__pyx_v_e, 2) * 2) - 1);
    }
 146: 
 147:         # randomly permute
+148:         for j in range(nnz):
    __pyx_t_11 = __pyx_v_nnz;
    __pyx_t_12 = __pyx_t_11;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
 149:             # random int in [j,rank)
+150:             rand_num = <int>(uniform_nums[i*nnz+j]*(rank-j) + j)
      __pyx_t_14 = ((__pyx_v_i * __pyx_v_nnz) + __pyx_v_j);
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_uniform_nums.shape[0];
      __pyx_v_rand_num = ((int)(((*((double *) ( /* dim=0 */ (__pyx_v_uniform_nums.data + __pyx_t_14 * __pyx_v_uniform_nums.strides[0]) ))) * (__pyx_v_rank - __pyx_v_j)) + __pyx_v_j));
+151:             temp = sparse_sign[i*rank+j]
      __pyx_t_14 = ((__pyx_v_i * __pyx_v_rank) + __pyx_v_j);
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_sparse_sign.shape[0];
      __pyx_v_temp = (*((short *) ( /* dim=0 */ (__pyx_v_sparse_sign.data + __pyx_t_14 * __pyx_v_sparse_sign.strides[0]) )));
+152:             sparse_sign[i*rank+j] = sparse_sign[i*rank+rand_num]
      __pyx_t_14 = ((__pyx_v_i * __pyx_v_rank) + __pyx_v_rand_num);
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_sparse_sign.shape[0];
      __pyx_t_15 = ((__pyx_v_i * __pyx_v_rank) + __pyx_v_j);
      if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_sparse_sign.shape[0];
      *((short *) ( /* dim=0 */ (__pyx_v_sparse_sign.data + __pyx_t_15 * __pyx_v_sparse_sign.strides[0]) )) = (*((short *) ( /* dim=0 */ (__pyx_v_sparse_sign.data + __pyx_t_14 * __pyx_v_sparse_sign.strides[0]) )));
+153:             sparse_sign[i*rank+rand_num]=temp
      __pyx_t_14 = ((__pyx_v_i * __pyx_v_rank) + __pyx_v_rand_num);
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_sparse_sign.shape[0];
      *((short *) ( /* dim=0 */ (__pyx_v_sparse_sign.data + __pyx_t_14 * __pyx_v_sparse_sign.strides[0]) )) = __pyx_v_temp;
    }
  }
+154:     return sparse_sign
  __PYX_INC_MEMVIEW(&__pyx_v_sparse_sign, 1);
  __pyx_r = __pyx_v_sparse_sign;
  goto __pyx_L0;
 155: 
+156: def inds_to_sparse_sign(
/* Python wrapper */
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_5inds_to_sparse_sign(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_9tt_sketch_3drm_18fast_lazy_gaussian_4inds_to_sparse_sign, "\n    Converts a list of indices into the non-zero entries of a sparse sign matrix\n    ");
static PyMethodDef __pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_5inds_to_sparse_sign = {"inds_to_sparse_sign", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_5inds_to_sparse_sign, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_9tt_sketch_3drm_18fast_lazy_gaussian_4inds_to_sparse_sign};
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_5inds_to_sparse_sign(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_indices = 0;
  PyObject *__pyx_v_shape = 0;
  PyObject *__pyx_v_rank = 0;
  PyObject *__pyx_v_rank_min = 0;
  PyObject *__pyx_v_rank_max = 0;
  PyObject *__pyx_v_non_zero_per_row = 0;
  PyObject *__pyx_v_seed = 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("inds_to_sparse_sign (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __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 **__pyx_pyargnames[] = {&__pyx_n_s_indices,&__pyx_n_s_shape,&__pyx_n_s_rank,&__pyx_n_s_rank_min,&__pyx_n_s_rank_max,&__pyx_n_s_non_zero_per_row,&__pyx_n_s_seed,0};
  PyObject* values[7] = {0,0,0,0,0,0,0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_indices)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, 1); __PYX_ERR(0, 156, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, 2); __PYX_ERR(0, 156, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank_min)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, 3); __PYX_ERR(0, 156, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank_max)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, 4); __PYX_ERR(0, 156, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_non_zero_per_row)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, 5); __PYX_ERR(0, 156, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_seed)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[6]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, 6); __PYX_ERR(0, 156, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "inds_to_sparse_sign") < 0)) __PYX_ERR(0, 156, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 7)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
      values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
      values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
    }
    __pyx_v_indices = values[0];
    __pyx_v_shape = values[1];
    __pyx_v_rank = values[2];
    __pyx_v_rank_min = values[3];
    __pyx_v_rank_max = values[4];
    __pyx_v_non_zero_per_row = values[5];
    __pyx_v_seed = values[6];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("inds_to_sparse_sign", 1, 7, 7, __pyx_nargs); __PYX_ERR(0, 156, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.inds_to_sparse_sign", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_4inds_to_sparse_sign(__pyx_self, __pyx_v_indices, __pyx_v_shape, __pyx_v_rank, __pyx_v_rank_min, __pyx_v_rank_max, __pyx_v_non_zero_per_row, __pyx_v_seed);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

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

static PyObject *__pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_4inds_to_sparse_sign(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_indices, PyObject *__pyx_v_shape, PyObject *__pyx_v_rank, PyObject *__pyx_v_rank_min, PyObject *__pyx_v_rank_max, PyObject *__pyx_v_non_zero_per_row, PyObject *__pyx_v_seed) {
  PyObject *__pyx_v_N = NULL;
  __Pyx_memviewslice __pyx_v_nums_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_nums = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__13)
  __Pyx_TraceCall("inds_to_sparse_sign", __pyx_f[0], 156, 0, __PYX_ERR(0, 156, __pyx_L1_error));
  __Pyx_INCREF(__pyx_v_indices);
  __Pyx_INCREF(__pyx_v_shape);
  __Pyx_INCREF(__pyx_v_rank_min);
  __Pyx_INCREF(__pyx_v_rank_max);
  __Pyx_INCREF(__pyx_v_non_zero_per_row);
  __Pyx_INCREF(__pyx_v_seed);
/* … */
  /* 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_6);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.inds_to_sparse_sign", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_N);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_nums_view, 1);
  __Pyx_XDECREF(__pyx_v_nums);
  __Pyx_XDECREF(__pyx_v_indices);
  __Pyx_XDECREF(__pyx_v_shape);
  __Pyx_XDECREF(__pyx_v_rank_min);
  __Pyx_XDECREF(__pyx_v_rank_max);
  __Pyx_XDECREF(__pyx_v_non_zero_per_row);
  __Pyx_XDECREF(__pyx_v_seed);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__28 = PyTuple_Pack(10, __pyx_n_s_indices, __pyx_n_s_shape, __pyx_n_s_rank, __pyx_n_s_rank_min, __pyx_n_s_rank_max, __pyx_n_s_non_zero_per_row, __pyx_n_s_seed, __pyx_n_s_N, __pyx_n_s_nums_view, __pyx_n_s_nums); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__28);
  __Pyx_GIVEREF(__pyx_tuple__28);
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_5inds_to_sparse_sign, 0, __pyx_n_s_inds_to_sparse_sign, NULL, __pyx_n_s_tt_sketch_drm_fast_lazy_gaussian_2, __pyx_d, ((PyObject *)__pyx_codeobj__13)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_inds_to_sparse_sign, __pyx_t_7) < 0) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(7, 0, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tt_sketch_drm_fast_lazy_gaussian, __pyx_n_s_inds_to_sparse_sign, 156, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) __PYX_ERR(0, 156, __pyx_L1_error)
 157:     indices,
 158:     shape,
 159:     rank,
 160:     rank_min,
 161:     rank_max,
 162:     non_zero_per_row,
 163:     seed
 164: ):
 165:     """
 166:     Converts a list of indices into the non-zero entries of a sparse sign matrix
 167:     """
+168:     indices = indices.astype(np.uint64)
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_indices, __pyx_n_s_astype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }
  __Pyx_DECREF_SET(__pyx_v_indices, __pyx_t_1);
  __pyx_t_1 = 0;
+169:     N = indices.shape[1]
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_indices, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 169, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 169, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_N = __pyx_t_2;
  __pyx_t_2 = 0;
+170:     shape = np.array(shape,dtype=np.uint64)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_shape);
  __Pyx_GIVEREF(__pyx_v_shape);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape)) __PYX_ERR(0, 170, __pyx_L1_error);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint64); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF_SET(__pyx_v_shape, __pyx_t_6);
  __pyx_t_6 = 0;
+171:     rank_min = int(rank_min)
  __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_v_rank_min); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 171, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF_SET(__pyx_v_rank_min, __pyx_t_6);
  __pyx_t_6 = 0;
+172:     rank_max = int(rank_max)
  __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_v_rank_max); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 172, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF_SET(__pyx_v_rank_max, __pyx_t_6);
  __pyx_t_6 = 0;
+173:     non_zero_per_row = int(non_zero_per_row)
  __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_v_non_zero_per_row); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 173, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF_SET(__pyx_v_non_zero_per_row, __pyx_t_6);
  __pyx_t_6 = 0;
+174:     seed = np.mod(seed,2**63,dtype=np.uint64)
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_mod); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_v_seed);
  __Pyx_GIVEREF(__pyx_v_seed);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_seed)) __PYX_ERR(0, 174, __pyx_L1_error);
  __Pyx_INCREF(__pyx_int_0x8000000000000000);
  __Pyx_GIVEREF(__pyx_int_0x8000000000000000);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_0x8000000000000000)) __PYX_ERR(0, 174, __pyx_L1_error);
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 174, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF_SET(__pyx_v_seed, __pyx_t_3);
  __pyx_t_3 = 0;
+175:     nums_view = _inds_to_sparse_sign(
  __pyx_t_12 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_sparse_sign(__pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 175, __pyx_L1_error)
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
  __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
  __pyx_v_nums_view = __pyx_t_12;
  __pyx_t_12.memview = NULL;
  __pyx_t_12.data = NULL;
+176:         indices, shape, rank, non_zero_per_row, seed
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_v_indices, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 176, __pyx_L1_error)
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_v_shape, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 176, __pyx_L1_error)
  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_rank); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 176, __pyx_L1_error)
  __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_v_non_zero_per_row); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 176, __pyx_L1_error)
  __pyx_t_11 = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(__pyx_v_seed); if (unlikely((__pyx_t_11 == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 176, __pyx_L1_error)
 177:     )
+178:     nums = np.array(nums_view).reshape(N,rank)
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_array); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __pyx_memoryview_fromslice(__pyx_v_nums_view, 1, (PyObject *(*)(char *)) __pyx_memview_get_short, (int (*)(char *, PyObject *)) __pyx_memview_set_short, 0);; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_1 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_t_6};
    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_reshape); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_N, __pyx_v_rank};
    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 178, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __pyx_v_nums = __pyx_t_3;
  __pyx_t_3 = 0;
+179:     nums = nums[:, rank_min:rank_max]
  __pyx_t_3 = PySlice_New(__pyx_v_rank_min, __pyx_v_rank_max, Py_None); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 179, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_slice__5);
  __Pyx_GIVEREF(__pyx_slice__5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_slice__5)) __PYX_ERR(0, 179, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_3);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error);
  __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_nums, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 179, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF_SET(__pyx_v_nums, __pyx_t_3);
  __pyx_t_3 = 0;
+180:     return nums
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_nums);
  __pyx_r = __pyx_v_nums;
  goto __pyx_L0;
 181: 
 182: 
+183: def inds_to_normal(
/* Python wrapper */
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_7inds_to_normal(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_9tt_sketch_3drm_18fast_lazy_gaussian_6inds_to_normal, "\n    Converts a list of indices into the associated entries of gaussian matrix\n    ");
static PyMethodDef __pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_7inds_to_normal = {"inds_to_normal", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_7inds_to_normal, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_9tt_sketch_3drm_18fast_lazy_gaussian_6inds_to_normal};
static PyObject *__pyx_pw_9tt_sketch_3drm_18fast_lazy_gaussian_7inds_to_normal(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_indices = 0;
  PyObject *__pyx_v_shape = 0;
  PyObject *__pyx_v_rank_min = 0;
  PyObject *__pyx_v_rank_max = 0;
  PyObject *__pyx_v_seed = 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("inds_to_normal (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __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 **__pyx_pyargnames[] = {&__pyx_n_s_indices,&__pyx_n_s_shape,&__pyx_n_s_rank_min,&__pyx_n_s_rank_max,&__pyx_n_s_seed,0};
  PyObject* values[5] = {0,0,0,0,0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_indices)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 183, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shape)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 183, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_normal", 1, 5, 5, 1); __PYX_ERR(0, 183, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank_min)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 183, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_normal", 1, 5, 5, 2); __PYX_ERR(0, 183, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rank_max)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 183, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_normal", 1, 5, 5, 3); __PYX_ERR(0, 183, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_seed)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 183, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("inds_to_normal", 1, 5, 5, 4); __PYX_ERR(0, 183, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "inds_to_normal") < 0)) __PYX_ERR(0, 183, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 5)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
    }
    __pyx_v_indices = values[0];
    __pyx_v_shape = values[1];
    __pyx_v_rank_min = values[2];
    __pyx_v_rank_max = values[3];
    __pyx_v_seed = values[4];
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("inds_to_normal", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 183, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.inds_to_normal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_6inds_to_normal(__pyx_self, __pyx_v_indices, __pyx_v_shape, __pyx_v_rank_min, __pyx_v_rank_max, __pyx_v_seed);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

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

static PyObject *__pyx_pf_9tt_sketch_3drm_18fast_lazy_gaussian_6inds_to_normal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_indices, PyObject *__pyx_v_shape, PyObject *__pyx_v_rank_min, PyObject *__pyx_v_rank_max, PyObject *__pyx_v_seed) {
  PyObject *__pyx_v_N = NULL;
  PyObject *__pyx_v_rank = NULL;
  __Pyx_memviewslice __pyx_v_nums_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_nums = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_TraceFrameInit(__pyx_codeobj__14)
  __Pyx_TraceCall("inds_to_normal", __pyx_f[0], 183, 0, __PYX_ERR(0, 183, __pyx_L1_error));
  __Pyx_INCREF(__pyx_v_indices);
  __Pyx_INCREF(__pyx_v_shape);
  __Pyx_INCREF(__pyx_v_rank_min);
  __Pyx_INCREF(__pyx_v_rank_max);
  __Pyx_INCREF(__pyx_v_seed);
/* … */
  /* 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_6);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 1);
  __Pyx_AddTraceback("tt_sketch.drm.fast_lazy_gaussian.inds_to_normal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_N);
  __Pyx_XDECREF(__pyx_v_rank);
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_nums_view, 1);
  __Pyx_XDECREF(__pyx_v_nums);
  __Pyx_XDECREF(__pyx_v_indices);
  __Pyx_XDECREF(__pyx_v_shape);
  __Pyx_XDECREF(__pyx_v_rank_min);
  __Pyx_XDECREF(__pyx_v_rank_max);
  __Pyx_XDECREF(__pyx_v_seed);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__29 = PyTuple_Pack(9, __pyx_n_s_indices, __pyx_n_s_shape, __pyx_n_s_rank_min, __pyx_n_s_rank_max, __pyx_n_s_seed, __pyx_n_s_N, __pyx_n_s_rank, __pyx_n_s_nums_view, __pyx_n_s_nums); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 183, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_9tt_sketch_3drm_18fast_lazy_gaussian_7inds_to_normal, 0, __pyx_n_s_inds_to_normal, NULL, __pyx_n_s_tt_sketch_drm_fast_lazy_gaussian_2, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 183, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_inds_to_normal, __pyx_t_7) < 0) __PYX_ERR(0, 183, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 184:     indices,
 185:     shape,
 186:     rank_min,
 187:     rank_max,
 188:     seed
 189: ):
 190:     """
 191:     Converts a list of indices into the associated entries of gaussian matrix
 192:     """
+193:     indices = indices.astype(np.uint64)
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_indices, __pyx_n_s_astype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_4};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 193, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }
  __Pyx_DECREF_SET(__pyx_v_indices, __pyx_t_1);
  __pyx_t_1 = 0;
+194:     N = indices.shape[1]
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_indices, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_N = __pyx_t_2;
  __pyx_t_2 = 0;
+195:     shape = np.array(shape,dtype=np.uint64)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_shape);
  __Pyx_GIVEREF(__pyx_v_shape);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape)) __PYX_ERR(0, 195, __pyx_L1_error);
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_uint64); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF_SET(__pyx_v_shape, __pyx_t_6);
  __pyx_t_6 = 0;
+196:     rank_min = int(rank_min)
  __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_v_rank_min); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 196, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF_SET(__pyx_v_rank_min, __pyx_t_6);
  __pyx_t_6 = 0;
+197:     rank_max = int(rank_max)
  __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_v_rank_max); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 197, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF_SET(__pyx_v_rank_max, __pyx_t_6);
  __pyx_t_6 = 0;
+198:     rank = rank_max - rank_min
  __pyx_t_6 = PyNumber_Subtract(__pyx_v_rank_max, __pyx_v_rank_min); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 198, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_v_rank = __pyx_t_6;
  __pyx_t_6 = 0;
+199:     seed = np.mod(seed,2**63,dtype=np.uint64)
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_mod); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_v_seed);
  __Pyx_GIVEREF(__pyx_v_seed);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_seed)) __PYX_ERR(0, 199, __pyx_L1_error);
  __Pyx_INCREF(__pyx_int_0x8000000000000000);
  __Pyx_GIVEREF(__pyx_int_0x8000000000000000);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_0x8000000000000000)) __PYX_ERR(0, 199, __pyx_L1_error);
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint64); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF_SET(__pyx_v_seed, __pyx_t_3);
  __pyx_t_3 = 0;
+200:     nums_view = _inds_to_normal(indices, shape, rank_min, rank_max, seed)
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_v_indices, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 200, __pyx_L1_error)
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_9tt_sketch_3drm_18fast_lazy_gaussian_uint64(__pyx_v_shape, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 200, __pyx_L1_error)
  __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_rank_min); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 200, __pyx_L1_error)
  __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_v_rank_max); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 200, __pyx_L1_error)
  __pyx_t_11 = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(__pyx_v_seed); if (unlikely((__pyx_t_11 == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 200, __pyx_L1_error)
  __pyx_t_12 = __pyx_f_9tt_sketch_3drm_18fast_lazy_gaussian__inds_to_normal(__pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 200, __pyx_L1_error)
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
  __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
  __pyx_v_nums_view = __pyx_t_12;
  __pyx_t_12.memview = NULL;
  __pyx_t_12.data = NULL;
+201:     nums = np.array(nums_view)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_array); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_nums_view, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_6, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 201, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __pyx_v_nums = __pyx_t_3;
  __pyx_t_3 = 0;
+202:     return nums.reshape(N,rank)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_nums, __pyx_n_s_reshape); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 202, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_2 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (likely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_6);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_6, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_N, __pyx_v_rank};
    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 202, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;