Cython: _factorize.pyx

Generated by Cython 3.1.8

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

Raw output: _factorize.c

    +001: """

      __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_test, __pyx_t_3) < (0)) __PYX_ERR(0, 1, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

     002: Factorization algorithms.

     003: """

     004: from cpython cimport Py_LT

     005: from libc.math cimport log

     006: cimport numpy as np

    +007: import numpy as np

      __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_mstate_global->__pyx_n_u_numpy, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_np, __pyx_t_2) < (0)) __PYX_ERR(0, 7, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

     008:

     009:

    +010: from zipline.utils.numpy_utils import unsigned_int_dtype_with_size_in_bytes

      __pyx_t_2 = __Pyx_PyList_Pack(1, __pyx_mstate_global->__pyx_n_u_unsigned_int_dtype_with_size_in); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_3 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_zipline_utils_numpy_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 10, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_unsigned_int_dtype_with_size_in); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_unsigned_int_dtype_with_size_in, __pyx_t_2) < (0)) __PYX_ERR(0, 10, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

     011:

    +012: cdef inline double log2(double d):

    static CYTHON_INLINE double __pyx_f_7zipline_3lib_10_factorize_log2(double __pyx_v_d) {
      double __pyx_r;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[39]))
      __Pyx_TraceStartFunc("log2", __pyx_f[0], 12, 0, 0, 0, __PYX_ERR(0, 12, __pyx_L1_error));
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 12, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.log2", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = -1;
      __pyx_L0:;
      __Pyx_PyMonitoring_ExitScope(0);
      return __pyx_r;
    }

    +013:     return log(d) / log(2);

      __pyx_t_1 = log(__pyx_v_d);
      __pyx_t_2 = log(2.0);
      if (unlikely(__pyx_t_2 == 0)) {
        PyErr_SetString(PyExc_ZeroDivisionError, "float division");
        __PYX_ERR(0, 13, __pyx_L1_error)
      }
      __pyx_r = (__pyx_t_1 / __pyx_t_2);
      __Pyx_TraceReturnCValue(__pyx_r, PyFloat_FromDouble, 2, 0, __PYX_ERR(0, 13, __pyx_L1_error));
      goto __pyx_L0;

     014:

    +015: cpdef inline smallest_uint_that_can_hold(Py_ssize_t maxval):

    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_1smallest_uint_that_can_hold(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 CYTHON_INLINE PyObject *__pyx_f_7zipline_3lib_10_factorize_smallest_uint_that_can_hold(Py_ssize_t __pyx_v_maxval, CYTHON_UNUSED int __pyx_skip_dispatch) {
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[40]))
      __Pyx_TraceStartFunc("smallest_uint_that_can_hold", __pyx_f[0], 15, 0, 0, __pyx_skip_dispatch, __PYX_ERR(0, 15, __pyx_L1_error));
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_2);
      __Pyx_XDECREF(__pyx_t_3);
      __Pyx_XDECREF(__pyx_t_4);
      __Pyx_XDECREF(__pyx_t_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 15, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.smallest_uint_that_can_hold", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      __pyx_L0:;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    /* Python wrapper */
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_1smallest_uint_that_can_hold(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_7zipline_3lib_10_factorize_smallest_uint_that_can_hold, "Choose the smallest numpy unsigned int dtype that can hold ``maxval``.\n    ");
    static PyMethodDef __pyx_mdef_7zipline_3lib_10_factorize_1smallest_uint_that_can_hold = {"smallest_uint_that_can_hold", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7zipline_3lib_10_factorize_1smallest_uint_that_can_hold, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7zipline_3lib_10_factorize_smallest_uint_that_can_hold};
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_1smallest_uint_that_can_hold(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
    ) {
      Py_ssize_t __pyx_v_maxval;
      #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("smallest_uint_that_can_hold (wrapper)", 0);
      #if !CYTHON_METH_FASTCALL
      #if CYTHON_ASSUME_SAFE_SIZE
      __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
      #else
      __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
      #endif
      #endif
      __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
      {
        PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_maxval,0};
      PyObject* values[1] = {0};
        const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
        if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 15, __pyx_L3_error)
        if (__pyx_kwds_len > 0) {
          switch (__pyx_nargs) {
            case  1:
            values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 15, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  0: break;
            default: goto __pyx_L5_argtuple_error;
          }
          const Py_ssize_t kwd_pos_args = __pyx_nargs;
          if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "smallest_uint_that_can_hold", 0) < (0)) __PYX_ERR(0, 15, __pyx_L3_error)
          for (Py_ssize_t i = __pyx_nargs; i < 1; i++) {
            if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("smallest_uint_that_can_hold", 1, 1, 1, i); __PYX_ERR(0, 15, __pyx_L3_error) }
          }
        } else if (unlikely(__pyx_nargs != 1)) {
          goto __pyx_L5_argtuple_error;
        } else {
          values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 15, __pyx_L3_error)
        }
        __pyx_v_maxval = __Pyx_PyIndex_AsSsize_t(values[0]); if (unlikely((__pyx_v_maxval == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
      }
      goto __pyx_L6_skip;
      __pyx_L5_argtuple_error:;
      __Pyx_RaiseArgtupleInvalid("smallest_uint_that_can_hold", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 15, __pyx_L3_error)
      __pyx_L6_skip:;
      goto __pyx_L4_argument_unpacking_done;
      __pyx_L3_error:;
      for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
        Py_XDECREF(values[__pyx_temp]);
      }
      __Pyx_AddTraceback("zipline.lib._factorize.smallest_uint_that_can_hold", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __Pyx_RefNannyFinishContext();
      return NULL;
      __pyx_L4_argument_unpacking_done:;
      __pyx_r = __pyx_pf_7zipline_3lib_10_factorize_smallest_uint_that_can_hold(__pyx_self, __pyx_v_maxval);
      int __pyx_lineno = 0;
      const char *__pyx_filename = NULL;
      int __pyx_clineno = 0;

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

    static PyObject *__pyx_pf_7zipline_3lib_10_factorize_smallest_uint_that_can_hold(CYTHON_UNUSED PyObject *__pyx_self, Py_ssize_t __pyx_v_maxval) {
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[40]))
      __Pyx_TraceStartFunc("smallest_uint_that_can_hold (wrapper)", __pyx_f[0], 15, 0, 0, 0, __PYX_ERR(0, 15, __pyx_L1_error));
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = __pyx_f_7zipline_3lib_10_factorize_smallest_uint_that_can_hold(__pyx_v_maxval, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __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_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 15, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.smallest_uint_that_can_hold", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = NULL;
      __pyx_L0:;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }
    /* … */
      __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7zipline_3lib_10_factorize_1smallest_uint_that_can_hold, 0, __pyx_mstate_global->__pyx_n_u_smallest_uint_that_can_hold, NULL, __pyx_mstate_global->__pyx_n_u_zipline_lib__factorize, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[40])); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 15, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_smallest_uint_that_can_hold, __pyx_t_3) < (0)) __PYX_ERR(0, 15, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

     016:     """Choose the smallest numpy unsigned int dtype that can hold ``maxval``.

     017:     """

    +018:     if maxval < 1:

      __pyx_t_1 = (__pyx_v_maxval < 1);
      if (__pyx_t_1) {
    /* … */
      }

     019:         # lim x -> 0 log2(x) == -infinity so we floor at uint8

    +020:         return np.uint8

        __Pyx_XDECREF(__pyx_r);
        __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_uint8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 20, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_r = __pyx_t_3;
        __pyx_t_3 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 5, 0, __PYX_ERR(0, 20, __pyx_L1_error));
        goto __pyx_L0;

     021:     else:

     022:         # The number of bits required to hold the codes up to ``length`` is

     023:         # log2(length). The number of bits per bytes is 8. We cannot have

     024:         # fractional bytes so we need to round up. Finally, we can only have

     025:         # integers with widths 1, 2, 4, or 8 so so we need to round up to the

     026:         # next value by looking up the next largest size in ``_int_sizes``.

    +027:         return unsigned_int_dtype_with_size_in_bytes(

      /*else*/ {
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_2 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_unsigned_int_dtype_with_size_in); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);

    +028:             _int_sizes[int(np.ceil(log2(maxval) / 8))]

        if (unlikely(__pyx_v_7zipline_3lib_10_factorize__int_sizes == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
          __PYX_ERR(0, 28, __pyx_L1_error)
        }
        __pyx_t_6 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 28, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_ceil); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 28, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_9 = __pyx_f_7zipline_3lib_10_factorize_log2(__pyx_v_maxval); if (unlikely(__pyx_t_9 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error)
        __pyx_t_7 = PyFloat_FromDouble((__pyx_t_9 / 8.0)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 28, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_10 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_8))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8);
          assert(__pyx_t_6);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_8, __pyx__function);
          __pyx_t_10 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_7};
          __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+__pyx_t_10, (2-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 28, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
        }
        __pyx_t_8 = __Pyx_PyNumber_Int(__pyx_t_5); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 28, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_5 = __Pyx_PyObject_GetItem(__pyx_v_7zipline_3lib_10_factorize__int_sizes, __pyx_t_8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 28, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __pyx_t_10 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
          assert(__pyx_t_2);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
          __Pyx_INCREF(__pyx_t_2);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
          __pyx_t_10 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_5};
          __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+__pyx_t_10, (2-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
        }
        __pyx_r = __pyx_t_3;
        __pyx_t_3 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 8, 0, __PYX_ERR(0, 27, __pyx_L1_error));
        goto __pyx_L0;
      }

     029:         )

     030:

     031: ctypedef fused unsigned_integral:

     032:     np.uint8_t

     033:     np.uint16_t

     034:     np.uint32_t

     035:     np.uint64_t

     036:

     037: cdef class _NoneFirstSortKey:

     038:     """Box to sort ``None`` to the front of the categories list.

     039:     """

     040:     cdef object value

     041:

    +042:     def __cinit__(self, value):

    /* Python wrapper */
    static int __pyx_pw_7zipline_3lib_10_factorize_17_NoneFirstSortKey_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
    static int __pyx_pw_7zipline_3lib_10_factorize_17_NoneFirstSortKey_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
      PyObject *__pyx_v_value = 0;
      CYTHON_UNUSED Py_ssize_t __pyx_nargs;
      CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
      int __pyx_r;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
      #if CYTHON_ASSUME_SAFE_SIZE
      __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
      #else
      __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
      #endif
      __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
      {
        PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_value,0};
      PyObject* values[1] = {0};
        const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_VARARGS(__pyx_kwds) : 0;
        if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 42, __pyx_L3_error)
        if (__pyx_kwds_len > 0) {
          switch (__pyx_nargs) {
            case  1:
            values[0] = __Pyx_ArgRef_VARARGS(__pyx_args, 0);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 42, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  0: break;
            default: goto __pyx_L5_argtuple_error;
          }
          const Py_ssize_t kwd_pos_args = __pyx_nargs;
          if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "__cinit__", 0) < (0)) __PYX_ERR(0, 42, __pyx_L3_error)
          for (Py_ssize_t i = __pyx_nargs; i < 1; i++) {
            if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, i); __PYX_ERR(0, 42, __pyx_L3_error) }
          }
        } else if (unlikely(__pyx_nargs != 1)) {
          goto __pyx_L5_argtuple_error;
        } else {
          values[0] = __Pyx_ArgRef_VARARGS(__pyx_args, 0);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 42, __pyx_L3_error)
        }
        __pyx_v_value = values[0];
      }
      goto __pyx_L6_skip;
      __pyx_L5_argtuple_error:;
      __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 42, __pyx_L3_error)
      __pyx_L6_skip:;
      goto __pyx_L4_argument_unpacking_done;
      __pyx_L3_error:;
      for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
        Py_XDECREF(values[__pyx_temp]);
      }
      __Pyx_AddTraceback("zipline.lib._factorize._NoneFirstSortKey.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __Pyx_RefNannyFinishContext();
      return -1;
      __pyx_L4_argument_unpacking_done:;
      __pyx_r = __pyx_pf_7zipline_3lib_10_factorize_17_NoneFirstSortKey___cinit__(((struct __pyx_obj_7zipline_3lib_10_factorize__NoneFirstSortKey *)__pyx_v_self), __pyx_v_value);
      int __pyx_lineno = 0;
      const char *__pyx_filename = NULL;
      int __pyx_clineno = 0;

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

    static int __pyx_pf_7zipline_3lib_10_factorize_17_NoneFirstSortKey___cinit__(struct __pyx_obj_7zipline_3lib_10_factorize__NoneFirstSortKey *__pyx_v_self, PyObject *__pyx_v_value) {
      int __pyx_r;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[41]))
      __Pyx_TraceStartFunc("__cinit__", __pyx_f[0], 42, 0, 0, 0, __PYX_ERR(0, 42, __pyx_L1_error));
    /* … */
      /* function exit code */
      __pyx_r = 0;
      __Pyx_TraceReturnCValue(__pyx_r, __Pyx_Owned_Py_None, 0, 0, __PYX_ERR(0, 42, __pyx_L1_error));
      goto __pyx_L0;
      __pyx_L1_error:;
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 42, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize._NoneFirstSortKey.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = -1;
      __pyx_L0:;
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    +043:         self.value = value

      __Pyx_INCREF(__pyx_v_value);
      __Pyx_GIVEREF(__pyx_v_value);
      __Pyx_GOTREF(__pyx_v_self->value);
      __Pyx_DECREF(__pyx_v_self->value);
      __pyx_v_self->value = __pyx_v_value;

     044:

    +045:     def __richcmp__(_NoneFirstSortKey self, _NoneFirstSortKey other, int op):

    /* Python wrapper */
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_17_NoneFirstSortKey_3__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_v_op); /*proto*/
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_17_NoneFirstSortKey_3__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_v_op) {
      CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
      PyObject *__pyx_r = 0;
      __Pyx_RefNannyDeclarations
      __Pyx_RefNannySetupContext("__richcmp__ (wrapper)", 0);
      __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
      if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_mstate_global->__pyx_ptype_7zipline_3lib_10_factorize__NoneFirstSortKey, 1, "other", 0))) __PYX_ERR(0, 45, __pyx_L1_error)
      __pyx_r = __pyx_pf_7zipline_3lib_10_factorize_17_NoneFirstSortKey_2__richcmp__(((struct __pyx_obj_7zipline_3lib_10_factorize__NoneFirstSortKey *)__pyx_v_self), ((struct __pyx_obj_7zipline_3lib_10_factorize__NoneFirstSortKey *)__pyx_v_other), ((int)__pyx_v_op));
      int __pyx_lineno = 0;
      const char *__pyx_filename = NULL;
      int __pyx_clineno = 0;

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

    static PyObject *__pyx_pf_7zipline_3lib_10_factorize_17_NoneFirstSortKey_2__richcmp__(struct __pyx_obj_7zipline_3lib_10_factorize__NoneFirstSortKey *__pyx_v_self, struct __pyx_obj_7zipline_3lib_10_factorize__NoneFirstSortKey *__pyx_v_other, int __pyx_v_op) {
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[42]))
      __Pyx_TraceStartFunc("__richcmp__", __pyx_f[0], 45, 0, 0, 0, __PYX_ERR(0, 45, __pyx_L1_error));
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_2);
      __Pyx_XDECREF(__pyx_t_3);
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 45, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize._NoneFirstSortKey.__richcmp__", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = NULL;
      __pyx_L0:;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    +046:         if op == Py_LT:

      __pyx_t_1 = (__pyx_v_op == Py_LT);
      if (__pyx_t_1) {
    /* … */
      }

    +047:             return (

        __Pyx_XDECREF(__pyx_r);

    +048:                     self.value is None or

        __pyx_t_1 = (__pyx_v_self->value == Py_None);
        if (!__pyx_t_1) {
        } else {
          __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
          __pyx_t_2 = __pyx_t_3;
          __pyx_t_3 = 0;
          goto __pyx_L4_bool_binop_done;
        }

    +049:                     (other.value is not None and self.value < other.value)

        __pyx_t_1 = (__pyx_v_other->value != Py_None);
        if (__pyx_t_1) {
        } else {
          __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
          __pyx_t_2 = __pyx_t_3;
          __pyx_t_3 = 0;
          goto __pyx_L4_bool_binop_done;
        }
        __pyx_t_3 = PyObject_RichCompare(__pyx_v_self->value, __pyx_v_other->value, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error)
        __Pyx_INCREF(__pyx_t_3);
        __pyx_t_2 = __pyx_t_3;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_L4_bool_binop_done:;
        __pyx_r = __pyx_t_2;
        __pyx_t_2 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 5, 0, __PYX_ERR(0, 47, __pyx_L1_error));
        goto __pyx_L0;

     050:             )

     051:

    +052:         return NotImplemented

      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_builtin_NotImplemented);
      __pyx_r = __pyx_builtin_NotImplemented;
      __Pyx_TraceReturnValue(__pyx_r, 21, 0, __PYX_ERR(0, 52, __pyx_L1_error));
      goto __pyx_L0;

     053:

    +054: cdef factorize_strings_known_impl(np.ndarray[object] values,

    static PyObject *__pyx_fuse_0__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(PyArrayObject *__pyx_v_values, Py_ssize_t __pyx_v_nvalues, PyObject *__pyx_v_categories, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_missing_code;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[45]))
      __Pyx_TraceStartFunc("__pyx_fuse_0factorize_strings_known_impl", __pyx_f[0], 54, 0, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      __Pyx_INCREF(__pyx_v_categories);
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* 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_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __Pyx_XDECREF(__pyx_t_9);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_12);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    static PyObject *__pyx_fuse_1__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(PyArrayObject *__pyx_v_values, Py_ssize_t __pyx_v_nvalues, PyObject *__pyx_v_categories, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_missing_code;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[46]))
      __Pyx_TraceStartFunc("__pyx_fuse_1factorize_strings_known_impl", __pyx_f[0], 54, 0, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      __Pyx_INCREF(__pyx_v_categories);
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* 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_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __Pyx_XDECREF(__pyx_t_9);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_12);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    static PyObject *__pyx_fuse_2__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(PyArrayObject *__pyx_v_values, Py_ssize_t __pyx_v_nvalues, PyObject *__pyx_v_categories, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_missing_code;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[47]))
      __Pyx_TraceStartFunc("__pyx_fuse_2factorize_strings_known_impl", __pyx_f[0], 54, 0, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      __Pyx_INCREF(__pyx_v_categories);
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* 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_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __Pyx_XDECREF(__pyx_t_9);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_12);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    static PyObject *__pyx_fuse_3__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(PyArrayObject *__pyx_v_values, Py_ssize_t __pyx_v_nvalues, PyObject *__pyx_v_categories, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_missing_code;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[48]))
      __Pyx_TraceStartFunc("__pyx_fuse_3factorize_strings_known_impl", __pyx_f[0], 54, 0, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      __Pyx_INCREF(__pyx_v_categories);
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 54, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* 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_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __Pyx_XDECREF(__pyx_t_9);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_12);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 54, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

     055:                                   Py_ssize_t nvalues,

     056:                                   list categories,

     057:                                   object missing_value,

     058:                                   bint sort,

     059:                                   np.ndarray[unsigned_integral] codes):

    +060:     if sort:

      if (__pyx_v_sort) {
    /* … */
      }
    /* … */
      if (__pyx_v_sort) {
    /* … */
      }
    /* … */
      if (__pyx_v_sort) {
    /* … */
      }
    /* … */
      if (__pyx_v_sort) {
    /* … */
      }

    +061:         categories = sorted(categories, key=_NoneFirstSortKey)

        __pyx_t_2 = NULL;
        __Pyx_INCREF(__pyx_builtin_sorted);
        __pyx_t_3 = __pyx_builtin_sorted;
        __pyx_t_4 = 1;
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_v_categories};
          __pyx_t_5 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_key, ((PyObject *)__pyx_mstate_global->__pyx_ptype_7zipline_3lib_10_factorize__NoneFirstSortKey), __pyx_t_5, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 61, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_5);
          __Pyx_XDECREF(__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;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_1))) __PYX_ERR(0, 61, __pyx_L1_error)
        __Pyx_DECREF_SET(__pyx_v_categories, ((PyObject*)__pyx_t_1));
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_2 = NULL;
        __Pyx_INCREF(__pyx_builtin_sorted);
        __pyx_t_3 = __pyx_builtin_sorted;
        __pyx_t_4 = 1;
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_v_categories};
          __pyx_t_5 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_key, ((PyObject *)__pyx_mstate_global->__pyx_ptype_7zipline_3lib_10_factorize__NoneFirstSortKey), __pyx_t_5, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 61, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_5);
          __Pyx_XDECREF(__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;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_1))) __PYX_ERR(0, 61, __pyx_L1_error)
        __Pyx_DECREF_SET(__pyx_v_categories, ((PyObject*)__pyx_t_1));
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_2 = NULL;
        __Pyx_INCREF(__pyx_builtin_sorted);
        __pyx_t_3 = __pyx_builtin_sorted;
        __pyx_t_4 = 1;
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_v_categories};
          __pyx_t_5 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_key, ((PyObject *)__pyx_mstate_global->__pyx_ptype_7zipline_3lib_10_factorize__NoneFirstSortKey), __pyx_t_5, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 61, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_5);
          __Pyx_XDECREF(__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;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_1))) __PYX_ERR(0, 61, __pyx_L1_error)
        __Pyx_DECREF_SET(__pyx_v_categories, ((PyObject*)__pyx_t_1));
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_2 = NULL;
        __Pyx_INCREF(__pyx_builtin_sorted);
        __pyx_t_3 = __pyx_builtin_sorted;
        __pyx_t_4 = 1;
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_2, __pyx_v_categories};
          __pyx_t_5 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_key, ((PyObject *)__pyx_mstate_global->__pyx_ptype_7zipline_3lib_10_factorize__NoneFirstSortKey), __pyx_t_5, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 61, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_5);
          __Pyx_XDECREF(__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;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_1))) __PYX_ERR(0, 61, __pyx_L1_error)
        __Pyx_DECREF_SET(__pyx_v_categories, ((PyObject*)__pyx_t_1));
        __pyx_t_1 = 0;

     062:

    +063:     cdef dict reverse_categories = dict(

      __pyx_t_3 = NULL;
      __Pyx_INCREF((PyObject *)(&PyDict_Type));
      __pyx_t_5 = ((PyObject *)(&PyDict_Type));
    /* … */
      __pyx_t_3 = NULL;
      __Pyx_INCREF((PyObject *)(&PyDict_Type));
      __pyx_t_5 = ((PyObject *)(&PyDict_Type));
    /* … */
      __pyx_t_3 = NULL;
      __Pyx_INCREF((PyObject *)(&PyDict_Type));
      __pyx_t_5 = ((PyObject *)(&PyDict_Type));
    /* … */
      __pyx_t_3 = NULL;
      __Pyx_INCREF((PyObject *)(&PyDict_Type));
      __pyx_t_5 = ((PyObject *)(&PyDict_Type));

    +064:         zip(categories, range(len(categories)))

      __pyx_t_6 = NULL;
      __Pyx_INCREF(__pyx_builtin_zip);
      __pyx_t_7 = __pyx_builtin_zip;
      __pyx_t_9 = NULL;
      __Pyx_INCREF(__pyx_builtin_range);
      __pyx_t_10 = __pyx_builtin_range;
      if (unlikely(__pyx_v_categories == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
        __PYX_ERR(0, 64, __pyx_L1_error)
      }
      __pyx_t_11 = __Pyx_PyList_GET_SIZE(__pyx_v_categories); if (unlikely(__pyx_t_11 == ((Py_ssize_t)-1))) __PYX_ERR(0, 64, __pyx_L1_error)
      __pyx_t_12 = PyLong_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_12};
        __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_categories, __pyx_t_8};
        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+__pyx_t_4, (3-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_2};
        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_6 = NULL;
      __Pyx_INCREF(__pyx_builtin_zip);
      __pyx_t_7 = __pyx_builtin_zip;
      __pyx_t_9 = NULL;
      __Pyx_INCREF(__pyx_builtin_range);
      __pyx_t_10 = __pyx_builtin_range;
      if (unlikely(__pyx_v_categories == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
        __PYX_ERR(0, 64, __pyx_L1_error)
      }
      __pyx_t_11 = __Pyx_PyList_GET_SIZE(__pyx_v_categories); if (unlikely(__pyx_t_11 == ((Py_ssize_t)-1))) __PYX_ERR(0, 64, __pyx_L1_error)
      __pyx_t_12 = PyLong_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_12};
        __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_categories, __pyx_t_8};
        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+__pyx_t_4, (3-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_2};
        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_6 = NULL;
      __Pyx_INCREF(__pyx_builtin_zip);
      __pyx_t_7 = __pyx_builtin_zip;
      __pyx_t_9 = NULL;
      __Pyx_INCREF(__pyx_builtin_range);
      __pyx_t_10 = __pyx_builtin_range;
      if (unlikely(__pyx_v_categories == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
        __PYX_ERR(0, 64, __pyx_L1_error)
      }
      __pyx_t_11 = __Pyx_PyList_GET_SIZE(__pyx_v_categories); if (unlikely(__pyx_t_11 == ((Py_ssize_t)-1))) __PYX_ERR(0, 64, __pyx_L1_error)
      __pyx_t_12 = PyLong_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_12};
        __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_categories, __pyx_t_8};
        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+__pyx_t_4, (3-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_2};
        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_6 = NULL;
      __Pyx_INCREF(__pyx_builtin_zip);
      __pyx_t_7 = __pyx_builtin_zip;
      __pyx_t_9 = NULL;
      __Pyx_INCREF(__pyx_builtin_range);
      __pyx_t_10 = __pyx_builtin_range;
      if (unlikely(__pyx_v_categories == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
        __PYX_ERR(0, 64, __pyx_L1_error)
      }
      __pyx_t_11 = __Pyx_PyList_GET_SIZE(__pyx_v_categories); if (unlikely(__pyx_t_11 == ((Py_ssize_t)-1))) __PYX_ERR(0, 64, __pyx_L1_error)
      __pyx_t_12 = PyLong_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 64, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_12};
        __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_categories, __pyx_t_8};
        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+__pyx_t_4, (3-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 64, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_4 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_2};
        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;

     065:     )

     066:     cdef Py_ssize_t i

    +067:     cdef Py_ssize_t missing_code = reverse_categories[missing_value]

      __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_reverse_categories, __pyx_v_missing_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_missing_code = __pyx_t_11;
    /* … */
      __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_reverse_categories, __pyx_v_missing_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_missing_code = __pyx_t_11;
    /* … */
      __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_reverse_categories, __pyx_v_missing_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_missing_code = __pyx_t_11;
    /* … */
      __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_reverse_categories, __pyx_v_missing_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_missing_code = __pyx_t_11;

     068:

    +069:     for i in range(nvalues):

      __pyx_t_11 = __pyx_v_nvalues;
      __pyx_t_13 = __pyx_t_11;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_i = __pyx_t_14;
    /* … */
      __pyx_t_11 = __pyx_v_nvalues;
      __pyx_t_13 = __pyx_t_11;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_i = __pyx_t_14;
    /* … */
      __pyx_t_11 = __pyx_v_nvalues;
      __pyx_t_13 = __pyx_t_11;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_i = __pyx_t_14;
    /* … */
      __pyx_t_11 = __pyx_v_nvalues;
      __pyx_t_13 = __pyx_t_11;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_i = __pyx_t_14;

    +070:         codes[i] = reverse_categories.get(values[i], missing_code)

        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_missing_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_2 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_17 = __Pyx_PyLong_As_npy_uint8(__pyx_t_2); if (unlikely((__pyx_t_17 == ((npy_uint8)-1)) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint8_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_t_17;
      }
    /* … */
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_missing_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_2 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_17 = __Pyx_PyLong_As_npy_uint16(__pyx_t_2); if (unlikely((__pyx_t_17 == ((npy_uint16)-1)) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint16_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_t_17;
      }
    /* … */
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_missing_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_2 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_17 = __Pyx_PyLong_As_npy_uint32(__pyx_t_2); if (unlikely((__pyx_t_17 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint32_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_t_17;
      }
    /* … */
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_missing_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_2 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_17 = __Pyx_PyLong_As_npy_uint64(__pyx_t_2); if (unlikely((__pyx_t_17 == ((npy_uint64)-1)) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_t_15 = __pyx_v_i;
        __pyx_t_16 = -1;
        if (__pyx_t_15 < 0) {
          __pyx_t_15 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_15 < 0)) __pyx_t_16 = 0;
        } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_16 = 0;
        if (unlikely(__pyx_t_16 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_16);
          __PYX_ERR(0, 70, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint64_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_t_17;
      }

     071:

    +072:     return codes, np.asarray(categories, dtype=object), reverse_categories

      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
        assert(__pyx_t_5);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
        __pyx_t_4 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_5, __pyx_v_categories};
        __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 72, __pyx_L1_error)
        __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_GIVEREF(__pyx_t_2);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __pyx_t_2 = 0;
      __pyx_r = __pyx_t_3;
      __pyx_t_3 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 39, 0, __PYX_ERR(0, 72, __pyx_L1_error));
      goto __pyx_L0;
    /* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
        assert(__pyx_t_5);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
        __pyx_t_4 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_5, __pyx_v_categories};
        __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 72, __pyx_L1_error)
        __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_GIVEREF(__pyx_t_2);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __pyx_t_2 = 0;
      __pyx_r = __pyx_t_3;
      __pyx_t_3 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 39, 0, __PYX_ERR(0, 72, __pyx_L1_error));
      goto __pyx_L0;
    /* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
        assert(__pyx_t_5);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
        __pyx_t_4 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_5, __pyx_v_categories};
        __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 72, __pyx_L1_error)
        __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_GIVEREF(__pyx_t_2);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __pyx_t_2 = 0;
      __pyx_r = __pyx_t_3;
      __pyx_t_3 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 39, 0, __PYX_ERR(0, 72, __pyx_L1_error));
      goto __pyx_L0;
    /* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
        assert(__pyx_t_5);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_3, __pyx__function);
        __pyx_t_4 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_5, __pyx_v_categories};
        __pyx_t_1 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_1, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 72, __pyx_L1_error)
        __pyx_t_2 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_1);
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
      }
      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_GIVEREF(__pyx_t_2);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 72, __pyx_L1_error);
      __pyx_t_2 = 0;
      __pyx_r = __pyx_t_3;
      __pyx_t_3 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 39, 0, __PYX_ERR(0, 72, __pyx_L1_error));
      goto __pyx_L0;

     073:

    +074: cpdef factorize_strings_known_categories(np.ndarray[object] values,

    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_3factorize_strings_known_categories(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_7zipline_3lib_10_factorize_factorize_strings_known_categories(PyArrayObject *__pyx_v_values, PyObject *__pyx_v_categories, PyObject *__pyx_v_missing_value, int __pyx_v_sort, CYTHON_UNUSED int __pyx_skip_dispatch) {
      Py_ssize_t __pyx_v_ncategories;
      Py_ssize_t __pyx_v_nvalues;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[49]))
      __Pyx_TraceStartFunc("factorize_strings_known_categories", __pyx_f[0], 74, 0, 0, __pyx_skip_dispatch, __PYX_ERR(0, 74, __pyx_L1_error));
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 74, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_4);
      __Pyx_XDECREF(__pyx_t_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      __Pyx_XDECREF(__pyx_t_9);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 74, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_categories", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    /* Python wrapper */
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_3factorize_strings_known_categories(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_7zipline_3lib_10_factorize_2factorize_strings_known_categories, "\n    Factorize an array whose categories are already known.\n\n    Any entries not in the specified categories will be given the code for\n    `missing_value`.\n    ");
    static PyMethodDef __pyx_mdef_7zipline_3lib_10_factorize_3factorize_strings_known_categories = {"factorize_strings_known_categories", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7zipline_3lib_10_factorize_3factorize_strings_known_categories, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7zipline_3lib_10_factorize_2factorize_strings_known_categories};
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_3factorize_strings_known_categories(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
    ) {
      PyArrayObject *__pyx_v_values = 0;
      PyObject *__pyx_v_categories = 0;
      PyObject *__pyx_v_missing_value = 0;
      int __pyx_v_sort;
      #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("factorize_strings_known_categories (wrapper)", 0);
      #if !CYTHON_METH_FASTCALL
      #if CYTHON_ASSUME_SAFE_SIZE
      __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
      #else
      __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
      #endif
      #endif
      __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
      {
        PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_values,&__pyx_mstate_global->__pyx_n_u_categories,&__pyx_mstate_global->__pyx_n_u_missing_value,&__pyx_mstate_global->__pyx_n_u_sort,0};
      PyObject* values[4] = {0,0,0,0};
        const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
        if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 74, __pyx_L3_error)
        if (__pyx_kwds_len > 0) {
          switch (__pyx_nargs) {
            case  4:
            values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 74, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  3:
            values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 74, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  2:
            values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 74, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  1:
            values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 74, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  0: break;
            default: goto __pyx_L5_argtuple_error;
          }
          const Py_ssize_t kwd_pos_args = __pyx_nargs;
          if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "factorize_strings_known_categories", 0) < (0)) __PYX_ERR(0, 74, __pyx_L3_error)
          for (Py_ssize_t i = __pyx_nargs; i < 4; i++) {
            if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("factorize_strings_known_categories", 1, 4, 4, i); __PYX_ERR(0, 74, __pyx_L3_error) }
          }
        } else if (unlikely(__pyx_nargs != 4)) {
          goto __pyx_L5_argtuple_error;
        } else {
          values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 74, __pyx_L3_error)
          values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 74, __pyx_L3_error)
          values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 74, __pyx_L3_error)
          values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 74, __pyx_L3_error)
        }
        __pyx_v_values = ((PyArrayObject *)values[0]);
        __pyx_v_categories = ((PyObject*)values[1]);
        __pyx_v_missing_value = values[2];
        __pyx_v_sort = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_sort == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 77, __pyx_L3_error)
      }
      goto __pyx_L6_skip;
      __pyx_L5_argtuple_error:;
      __Pyx_RaiseArgtupleInvalid("factorize_strings_known_categories", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 74, __pyx_L3_error)
      __pyx_L6_skip:;
      goto __pyx_L4_argument_unpacking_done;
      __pyx_L3_error:;
      for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
        Py_XDECREF(values[__pyx_temp]);
      }
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_categories", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __Pyx_RefNannyFinishContext();
      return NULL;
      __pyx_L4_argument_unpacking_done:;
      if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values), __pyx_mstate_global->__pyx_ptype_5numpy_ndarray, 1, "values", 0))) __PYX_ERR(0, 74, __pyx_L1_error)
      if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_categories), (&PyList_Type), 1, "categories", 1))) __PYX_ERR(0, 75, __pyx_L1_error)
      __pyx_r = __pyx_pf_7zipline_3lib_10_factorize_2factorize_strings_known_categories(__pyx_self, __pyx_v_values, __pyx_v_categories, __pyx_v_missing_value, __pyx_v_sort);
      int __pyx_lineno = 0;
      const char *__pyx_filename = NULL;
      int __pyx_clineno = 0;

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

    static PyObject *__pyx_pf_7zipline_3lib_10_factorize_2factorize_strings_known_categories(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_values, PyObject *__pyx_v_categories, PyObject *__pyx_v_missing_value, int __pyx_v_sort) {
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[49]))
      __Pyx_TraceStartFunc("factorize_strings_known_categories (wrapper)", __pyx_f[0], 74, 0, 0, 0, __PYX_ERR(0, 74, __pyx_L1_error));
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 74, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = __pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_categories(__pyx_v_values, __pyx_v_categories, __pyx_v_missing_value, __pyx_v_sort, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __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);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 74, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_known_categories", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = NULL;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }
    /* … */
      __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7zipline_3lib_10_factorize_3factorize_strings_known_categories, 0, __pyx_mstate_global->__pyx_n_u_factorize_strings_known_categori, NULL, __pyx_mstate_global->__pyx_n_u_zipline_lib__factorize, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[49])); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_factorize_strings_known_categori, __pyx_t_3) < (0)) __PYX_ERR(0, 74, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

     075:                                          list categories,

     076:                                          object missing_value,

     077:                                          bint sort):

     078:     """

     079:     Factorize an array whose categories are already known.

     080:

     081:     Any entries not in the specified categories will be given the code for

     082:     `missing_value`.

     083:     """

    +084:     if missing_value not in categories:

      __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_missing_value, __pyx_v_categories, Py_NE)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 84, __pyx_L1_error)
      if (__pyx_t_1) {
    /* … */
      }

    +085:         categories.insert(0, missing_value)

        if (unlikely(__pyx_v_categories == Py_None)) {
          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "insert");
          __PYX_ERR(0, 85, __pyx_L1_error)
        }
        __pyx_t_2 = PyList_Insert(__pyx_v_categories, 0, __pyx_v_missing_value); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 85, __pyx_L1_error)

     086:

    +087:     cdef Py_ssize_t ncategories = len(categories)

      if (unlikely(__pyx_v_categories == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
        __PYX_ERR(0, 87, __pyx_L1_error)
      }
      __pyx_t_3 = __Pyx_PyList_GET_SIZE(__pyx_v_categories); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(0, 87, __pyx_L1_error)
      __pyx_v_ncategories = __pyx_t_3;

    +088:     cdef Py_ssize_t nvalues = len(values)

      __pyx_t_3 = PyObject_Length(((PyObject *)__pyx_v_values)); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(0, 88, __pyx_L1_error)
      __pyx_v_nvalues = __pyx_t_3;

    +089:     if ncategories <= 2 ** 8:

      __pyx_t_1 = (__pyx_v_ncategories <= 0x100);
      if (__pyx_t_1) {
    /* … */
      }

    +090:         return factorize_strings_known_impl[np.uint8_t](

        __Pyx_XDECREF(__pyx_r);
    /* … */
        __pyx_t_7 = __pyx_fuse_0__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_nvalues, __pyx_v_categories, __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_4)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 90, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_r = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 22, 0, __PYX_ERR(0, 90, __pyx_L1_error));
        goto __pyx_L0;

     091:             values,

     092:             nvalues,

     093:             categories,

     094:             missing_value,

     095:             sort,

    +096:             np.empty(nvalues, dtype=np.uint8)

        __pyx_t_5 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 96, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 96, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_6 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 96, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 96, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_uint8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 96, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __pyx_t_10 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_7))) {
          __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7);
          assert(__pyx_t_5);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_7);
          __Pyx_INCREF(__pyx_t_5);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_7, __pyx__function);
          __pyx_t_10 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_5, __pyx_t_6};
          __pyx_t_8 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 96, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_8);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_9, __pyx_t_8, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 96, __pyx_L1_error)
          __pyx_t_4 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_7, __pyx_callargs+__pyx_t_10, (2-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_8);
          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 96, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
        }
        if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 96, __pyx_L1_error)

     097:         )

    +098:     elif ncategories <= 2 ** 16:

      __pyx_t_1 = (__pyx_v_ncategories <= 0x10000);
      if (__pyx_t_1) {
    /* … */
      }

    +099:         return factorize_strings_known_impl[np.uint16_t](

        __Pyx_XDECREF(__pyx_r);
    /* … */
        __pyx_t_9 = __pyx_fuse_1__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_nvalues, __pyx_v_categories, __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_7)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 99, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_r = __pyx_t_9;
        __pyx_t_9 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 43, 0, __PYX_ERR(0, 99, __pyx_L1_error));
        goto __pyx_L0;

     100:             values,

     101:             nvalues,

     102:             categories,

     103:             missing_value,

     104:             sort,

    +105:             np.empty(nvalues, np.uint16),

        __pyx_t_4 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 105, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 105, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __pyx_t_8 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 105, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 105, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_uint16); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 105, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_10 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_9))) {
          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_9);
          assert(__pyx_t_4);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_9);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_9, __pyx__function);
          __pyx_t_10 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_8, __pyx_t_5};
          __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+__pyx_t_10, (3-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
          if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 105, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
        }
        if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 105, __pyx_L1_error)

     106:         )

    +107:     elif ncategories <= 2 ** 32:

      __pyx_t_9 = PyLong_FromSsize_t(__pyx_v_ncategories); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 107, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_7 = PyObject_RichCompare(__pyx_t_9, __pyx_mstate_global->__pyx_int_4294967296, Py_LE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 107, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 107, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (__pyx_t_1) {
    /* … */
      }

    +108:         return factorize_strings_known_impl[np.uint32_t](

        __Pyx_XDECREF(__pyx_r);
    /* … */
        __pyx_t_8 = __pyx_fuse_2__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_nvalues, __pyx_v_categories, __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_7)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 108, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_r = __pyx_t_8;
        __pyx_t_8 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 63, 0, __PYX_ERR(0, 108, __pyx_L1_error));
        goto __pyx_L0;

     109:             values,

     110:             nvalues,

     111:             categories,

     112:             missing_value,

     113:             sort,

    +114:             np.empty(nvalues, np.uint32),

        __pyx_t_9 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 114, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 114, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 114, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 114, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_uint32); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 114, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_t_10 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_8))) {
          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8);
          assert(__pyx_t_9);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_9);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_8, __pyx__function);
          __pyx_t_10 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_9, __pyx_t_5, __pyx_t_6};
          __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+__pyx_t_10, (3-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 114, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
        }
        if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 114, __pyx_L1_error)

     115:         )

    +116:     elif ncategories <= 2 ** 64:

      __pyx_t_8 = PyLong_FromSsize_t(__pyx_v_ncategories); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 116, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_7 = PyObject_RichCompare(__pyx_t_8, __pyx_mstate_global->__pyx_int_0x10000000000000000, Py_LE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 116, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 116, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (likely(__pyx_t_1)) {
    /* … */
      }

    +117:         return factorize_strings_known_impl[np.uint64_t](

        __Pyx_XDECREF(__pyx_r);
    /* … */
        __pyx_t_5 = __pyx_fuse_3__pyx_f_7zipline_3lib_10_factorize_factorize_strings_known_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_nvalues, __pyx_v_categories, __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_7)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 117, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_r = __pyx_t_5;
        __pyx_t_5 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 83, 0, __PYX_ERR(0, 117, __pyx_L1_error));
        goto __pyx_L0;

     118:             values,

     119:             nvalues,

     120:             categories,

     121:             missing_value,

     122:             sort,

    +123:             np.empty(nvalues, np.uint64),

        __pyx_t_8 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_6 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 123, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 123, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_t_10 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_5))) {
          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
          assert(__pyx_t_8);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_8);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_5, __pyx__function);
          __pyx_t_10 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_8, __pyx_t_6, __pyx_t_4};
          __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+__pyx_t_10, (3-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
        }
        if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 123, __pyx_L1_error)

     124:         )

     125:     else:

    +126:         raise ValueError('ncategories larger than uint64')

      /*else*/ {
        __pyx_t_7 = NULL;
        __Pyx_INCREF(__pyx_builtin_ValueError);
        __pyx_t_4 = __pyx_builtin_ValueError;
        __pyx_t_10 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_mstate_global->__pyx_kp_u_ncategories_larger_than_uint64};
          __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+__pyx_t_10, (2-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
        }
        __Pyx_Raise(__pyx_t_5, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __PYX_ERR(0, 126, __pyx_L1_error)
      }

     127:

    +128: cdef factorize_strings_impl(np.ndarray[object] values,

    static PyObject *__pyx_fuse_0__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(PyArrayObject *__pyx_v_values, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_categories = 0;
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_code;
      PyObject *__pyx_v_key = 0;
      PyArrayObject *__pyx_v_sorter = 0;
      PyArrayObject *__pyx_v_reverse_indexer = 0;
      int __pyx_v_ncategories;
      PyArrayObject *__pyx_v_categories_array = 0;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_categories_array;
      __Pyx_Buffer __pyx_pybuffer_categories_array;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_reverse_indexer;
      __Pyx_Buffer __pyx_pybuffer_reverse_indexer;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_sorter;
      __Pyx_Buffer __pyx_pybuffer_sorter;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[50]))
      __Pyx_TraceStartFunc("__pyx_fuse_0factorize_strings_impl", __pyx_f[0], 128, 0, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __pyx_pybuffer_sorter.pybuffer.buf = NULL;
      __pyx_pybuffer_sorter.refcount = 0;
      __pyx_pybuffernd_sorter.data = NULL;
      __pyx_pybuffernd_sorter.rcbuffer = &__pyx_pybuffer_sorter;
      __pyx_pybuffer_reverse_indexer.pybuffer.buf = NULL;
      __pyx_pybuffer_reverse_indexer.refcount = 0;
      __pyx_pybuffernd_reverse_indexer.data = NULL;
      __pyx_pybuffernd_reverse_indexer.rcbuffer = &__pyx_pybuffer_reverse_indexer;
      __pyx_pybuffer_categories_array.pybuffer.buf = NULL;
      __pyx_pybuffer_categories_array.refcount = 0;
      __pyx_pybuffernd_categories_array.data = NULL;
      __pyx_pybuffernd_categories_array.rcbuffer = &__pyx_pybuffer_categories_array;
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_11);
      __Pyx_XDECREF(__pyx_t_12);
      __Pyx_XDECREF(__pyx_t_14);
      __Pyx_XDECREF(__pyx_t_15);
      __Pyx_XDECREF(__pyx_t_19);
      __Pyx_XDECREF(__pyx_t_20);
      __Pyx_XDECREF(__pyx_t_21);
      __Pyx_XDECREF(__pyx_t_22);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_key);
      __Pyx_XDECREF((PyObject *)__pyx_v_sorter);
      __Pyx_XDECREF((PyObject *)__pyx_v_reverse_indexer);
      __Pyx_XDECREF((PyObject *)__pyx_v_categories_array);
      __Pyx_XDECREF((PyObject *)__pyx_v_codes);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    static PyObject *__pyx_fuse_1__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(PyArrayObject *__pyx_v_values, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_categories = 0;
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_code;
      PyObject *__pyx_v_key = 0;
      PyArrayObject *__pyx_v_sorter = 0;
      PyArrayObject *__pyx_v_reverse_indexer = 0;
      int __pyx_v_ncategories;
      PyArrayObject *__pyx_v_categories_array = 0;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_categories_array;
      __Pyx_Buffer __pyx_pybuffer_categories_array;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_reverse_indexer;
      __Pyx_Buffer __pyx_pybuffer_reverse_indexer;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_sorter;
      __Pyx_Buffer __pyx_pybuffer_sorter;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[51]))
      __Pyx_TraceStartFunc("__pyx_fuse_1factorize_strings_impl", __pyx_f[0], 128, 0, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __pyx_pybuffer_sorter.pybuffer.buf = NULL;
      __pyx_pybuffer_sorter.refcount = 0;
      __pyx_pybuffernd_sorter.data = NULL;
      __pyx_pybuffernd_sorter.rcbuffer = &__pyx_pybuffer_sorter;
      __pyx_pybuffer_reverse_indexer.pybuffer.buf = NULL;
      __pyx_pybuffer_reverse_indexer.refcount = 0;
      __pyx_pybuffernd_reverse_indexer.data = NULL;
      __pyx_pybuffernd_reverse_indexer.rcbuffer = &__pyx_pybuffer_reverse_indexer;
      __pyx_pybuffer_categories_array.pybuffer.buf = NULL;
      __pyx_pybuffer_categories_array.refcount = 0;
      __pyx_pybuffernd_categories_array.data = NULL;
      __pyx_pybuffernd_categories_array.rcbuffer = &__pyx_pybuffer_categories_array;
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_11);
      __Pyx_XDECREF(__pyx_t_12);
      __Pyx_XDECREF(__pyx_t_14);
      __Pyx_XDECREF(__pyx_t_15);
      __Pyx_XDECREF(__pyx_t_19);
      __Pyx_XDECREF(__pyx_t_20);
      __Pyx_XDECREF(__pyx_t_21);
      __Pyx_XDECREF(__pyx_t_22);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_key);
      __Pyx_XDECREF((PyObject *)__pyx_v_sorter);
      __Pyx_XDECREF((PyObject *)__pyx_v_reverse_indexer);
      __Pyx_XDECREF((PyObject *)__pyx_v_categories_array);
      __Pyx_XDECREF((PyObject *)__pyx_v_codes);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    static PyObject *__pyx_fuse_2__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(PyArrayObject *__pyx_v_values, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_categories = 0;
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_code;
      PyObject *__pyx_v_key = 0;
      PyArrayObject *__pyx_v_sorter = 0;
      PyArrayObject *__pyx_v_reverse_indexer = 0;
      int __pyx_v_ncategories;
      PyArrayObject *__pyx_v_categories_array = 0;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_categories_array;
      __Pyx_Buffer __pyx_pybuffer_categories_array;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_reverse_indexer;
      __Pyx_Buffer __pyx_pybuffer_reverse_indexer;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_sorter;
      __Pyx_Buffer __pyx_pybuffer_sorter;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[52]))
      __Pyx_TraceStartFunc("__pyx_fuse_2factorize_strings_impl", __pyx_f[0], 128, 0, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __pyx_pybuffer_sorter.pybuffer.buf = NULL;
      __pyx_pybuffer_sorter.refcount = 0;
      __pyx_pybuffernd_sorter.data = NULL;
      __pyx_pybuffernd_sorter.rcbuffer = &__pyx_pybuffer_sorter;
      __pyx_pybuffer_reverse_indexer.pybuffer.buf = NULL;
      __pyx_pybuffer_reverse_indexer.refcount = 0;
      __pyx_pybuffernd_reverse_indexer.data = NULL;
      __pyx_pybuffernd_reverse_indexer.rcbuffer = &__pyx_pybuffer_reverse_indexer;
      __pyx_pybuffer_categories_array.pybuffer.buf = NULL;
      __pyx_pybuffer_categories_array.refcount = 0;
      __pyx_pybuffernd_categories_array.data = NULL;
      __pyx_pybuffernd_categories_array.rcbuffer = &__pyx_pybuffer_categories_array;
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_11);
      __Pyx_XDECREF(__pyx_t_12);
      __Pyx_XDECREF(__pyx_t_14);
      __Pyx_XDECREF(__pyx_t_15);
      __Pyx_XDECREF(__pyx_t_19);
      __Pyx_XDECREF(__pyx_t_20);
      __Pyx_XDECREF(__pyx_t_21);
      __Pyx_XDECREF(__pyx_t_22);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_key);
      __Pyx_XDECREF((PyObject *)__pyx_v_sorter);
      __Pyx_XDECREF((PyObject *)__pyx_v_reverse_indexer);
      __Pyx_XDECREF((PyObject *)__pyx_v_categories_array);
      __Pyx_XDECREF((PyObject *)__pyx_v_codes);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    static PyObject *__pyx_fuse_3__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(PyArrayObject *__pyx_v_values, PyObject *__pyx_v_missing_value, int __pyx_v_sort, PyArrayObject *__pyx_v_codes) {
      PyObject *__pyx_v_categories = 0;
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_i;
      Py_ssize_t __pyx_v_code;
      PyObject *__pyx_v_key = 0;
      PyArrayObject *__pyx_v_sorter = 0;
      PyArrayObject *__pyx_v_reverse_indexer = 0;
      int __pyx_v_ncategories;
      PyArrayObject *__pyx_v_categories_array = 0;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_categories_array;
      __Pyx_Buffer __pyx_pybuffer_categories_array;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_codes;
      __Pyx_Buffer __pyx_pybuffer_codes;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_reverse_indexer;
      __Pyx_Buffer __pyx_pybuffer_reverse_indexer;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_sorter;
      __Pyx_Buffer __pyx_pybuffer_sorter;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[53]))
      __Pyx_TraceStartFunc("__pyx_fuse_3factorize_strings_impl", __pyx_f[0], 128, 0, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __pyx_pybuffer_sorter.pybuffer.buf = NULL;
      __pyx_pybuffer_sorter.refcount = 0;
      __pyx_pybuffernd_sorter.data = NULL;
      __pyx_pybuffernd_sorter.rcbuffer = &__pyx_pybuffer_sorter;
      __pyx_pybuffer_reverse_indexer.pybuffer.buf = NULL;
      __pyx_pybuffer_reverse_indexer.refcount = 0;
      __pyx_pybuffernd_reverse_indexer.data = NULL;
      __pyx_pybuffernd_reverse_indexer.rcbuffer = &__pyx_pybuffer_reverse_indexer;
      __pyx_pybuffer_categories_array.pybuffer.buf = NULL;
      __pyx_pybuffer_categories_array.refcount = 0;
      __pyx_pybuffernd_categories_array.data = NULL;
      __pyx_pybuffernd_categories_array.rcbuffer = &__pyx_pybuffer_categories_array;
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      __pyx_pybuffer_codes.pybuffer.buf = NULL;
      __pyx_pybuffer_codes.refcount = 0;
      __pyx_pybuffernd_codes.data = NULL;
      __pyx_pybuffernd_codes.rcbuffer = &__pyx_pybuffer_codes;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 128, __pyx_L1_error)
      }
      __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_1);
      __Pyx_XDECREF(__pyx_t_10);
      __Pyx_XDECREF(__pyx_t_11);
      __Pyx_XDECREF(__pyx_t_12);
      __Pyx_XDECREF(__pyx_t_14);
      __Pyx_XDECREF(__pyx_t_15);
      __Pyx_XDECREF(__pyx_t_19);
      __Pyx_XDECREF(__pyx_t_20);
      __Pyx_XDECREF(__pyx_t_21);
      __Pyx_XDECREF(__pyx_t_22);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 128, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF(__pyx_v_categories);
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_key);
      __Pyx_XDECREF((PyObject *)__pyx_v_sorter);
      __Pyx_XDECREF((PyObject *)__pyx_v_reverse_indexer);
      __Pyx_XDECREF((PyObject *)__pyx_v_categories_array);
      __Pyx_XDECREF((PyObject *)__pyx_v_codes);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

     129:                             object missing_value,

     130:                             bint sort,

     131:                             np.ndarray[unsigned_integral] codes):

    +132:     cdef list categories = [missing_value]

      __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_missing_value);
      __Pyx_GIVEREF(__pyx_v_missing_value);
      if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_missing_value) != (0)) __PYX_ERR(0, 132, __pyx_L1_error);
      __pyx_v_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_missing_value);
      __Pyx_GIVEREF(__pyx_v_missing_value);
      if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_missing_value) != (0)) __PYX_ERR(0, 132, __pyx_L1_error);
      __pyx_v_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_missing_value);
      __Pyx_GIVEREF(__pyx_v_missing_value);
      if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_missing_value) != (0)) __PYX_ERR(0, 132, __pyx_L1_error);
      __pyx_v_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_missing_value);
      __Pyx_GIVEREF(__pyx_v_missing_value);
      if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_missing_value) != (0)) __PYX_ERR(0, 132, __pyx_L1_error);
      __pyx_v_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;

    +133:     cdef dict reverse_categories = {missing_value: 0}

      __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (PyDict_SetItem(__pyx_t_1, __pyx_v_missing_value, __pyx_mstate_global->__pyx_int_0) < (0)) __PYX_ERR(0, 133, __pyx_L1_error)
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (PyDict_SetItem(__pyx_t_1, __pyx_v_missing_value, __pyx_mstate_global->__pyx_int_0) < (0)) __PYX_ERR(0, 133, __pyx_L1_error)
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (PyDict_SetItem(__pyx_t_1, __pyx_v_missing_value, __pyx_mstate_global->__pyx_int_0) < (0)) __PYX_ERR(0, 133, __pyx_L1_error)
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (PyDict_SetItem(__pyx_t_1, __pyx_v_missing_value, __pyx_mstate_global->__pyx_int_0) < (0)) __PYX_ERR(0, 133, __pyx_L1_error)
      __pyx_v_reverse_categories = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;

     134:

     135:     cdef Py_ssize_t i, code

    +136:     cdef object key = None

      __Pyx_INCREF(Py_None);
      __pyx_v_key = Py_None;
    /* … */
      __Pyx_INCREF(Py_None);
      __pyx_v_key = Py_None;
    /* … */
      __Pyx_INCREF(Py_None);
      __pyx_v_key = Py_None;
    /* … */
      __Pyx_INCREF(Py_None);
      __pyx_v_key = Py_None;

     137:

    +138:     for i in range(len(values)):

      __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_values)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 138, __pyx_L1_error)
      __pyx_t_3 = __pyx_t_2;
      for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
        __pyx_v_i = __pyx_t_4;
    /* … */
      __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_values)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 138, __pyx_L1_error)
      __pyx_t_3 = __pyx_t_2;
      for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
        __pyx_v_i = __pyx_t_4;
    /* … */
      __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_values)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 138, __pyx_L1_error)
      __pyx_t_3 = __pyx_t_2;
      for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
        __pyx_v_i = __pyx_t_4;
    /* … */
      __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_values)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 138, __pyx_L1_error)
      __pyx_t_3 = __pyx_t_2;
      for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
        __pyx_v_i = __pyx_t_4;

    +139:         key = values[i]

        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 139, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __Pyx_DECREF_SET(__pyx_v_key, __pyx_t_1);
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 139, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __Pyx_DECREF_SET(__pyx_v_key, __pyx_t_1);
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 139, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __Pyx_DECREF_SET(__pyx_v_key, __pyx_t_1);
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_values.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_values.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 139, __pyx_L1_error)
        }
        __pyx_t_1 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_values.diminfo[0].strides);
        if (unlikely(__pyx_t_1 == NULL)) __pyx_t_1 = Py_None;
        __Pyx_INCREF((PyObject*)__pyx_t_1);
        __Pyx_DECREF_SET(__pyx_v_key, __pyx_t_1);
        __pyx_t_1 = 0;

    +140:         code = reverse_categories.get(key, -1)

        __pyx_t_1 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_v_key, __pyx_mstate_global->__pyx_int_neg_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_code = __pyx_t_7;
    /* … */
        __pyx_t_1 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_v_key, __pyx_mstate_global->__pyx_int_neg_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_code = __pyx_t_7;
    /* … */
        __pyx_t_1 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_v_key, __pyx_mstate_global->__pyx_int_neg_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_code = __pyx_t_7;
    /* … */
        __pyx_t_1 = __Pyx_PyDict_GetItemDefault(__pyx_v_reverse_categories, __pyx_v_key, __pyx_mstate_global->__pyx_int_neg_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 140, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_v_code = __pyx_t_7;

    +141:         if code == -1:

        __pyx_t_8 = (__pyx_v_code == -1L);
        if (__pyx_t_8) {
    /* … */
        }
    /* … */
        __pyx_t_8 = (__pyx_v_code == -1L);
        if (__pyx_t_8) {
    /* … */
        }
    /* … */
        __pyx_t_8 = (__pyx_v_code == -1L);
        if (__pyx_t_8) {
    /* … */
        }
    /* … */
        __pyx_t_8 = (__pyx_v_code == -1L);
        if (__pyx_t_8) {
    /* … */
        }

     142:             # Assign new code.

    +143:             code = len(reverse_categories)

          __pyx_t_7 = PyDict_Size(__pyx_v_reverse_categories); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 143, __pyx_L1_error)
          __pyx_v_code = __pyx_t_7;
    /* … */
          __pyx_t_7 = PyDict_Size(__pyx_v_reverse_categories); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 143, __pyx_L1_error)
          __pyx_v_code = __pyx_t_7;
    /* … */
          __pyx_t_7 = PyDict_Size(__pyx_v_reverse_categories); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 143, __pyx_L1_error)
          __pyx_v_code = __pyx_t_7;
    /* … */
          __pyx_t_7 = PyDict_Size(__pyx_v_reverse_categories); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 143, __pyx_L1_error)
          __pyx_v_code = __pyx_t_7;

    +144:             reverse_categories[key] = code

          __pyx_t_1 = PyLong_FromSsize_t(__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          if (unlikely((PyDict_SetItem(__pyx_v_reverse_categories, __pyx_v_key, __pyx_t_1) < 0))) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    /* … */
          __pyx_t_1 = PyLong_FromSsize_t(__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          if (unlikely((PyDict_SetItem(__pyx_v_reverse_categories, __pyx_v_key, __pyx_t_1) < 0))) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    /* … */
          __pyx_t_1 = PyLong_FromSsize_t(__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          if (unlikely((PyDict_SetItem(__pyx_v_reverse_categories, __pyx_v_key, __pyx_t_1) < 0))) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    /* … */
          __pyx_t_1 = PyLong_FromSsize_t(__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          if (unlikely((PyDict_SetItem(__pyx_v_reverse_categories, __pyx_v_key, __pyx_t_1) < 0))) __PYX_ERR(0, 144, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

    +145:             categories.append(key)

          __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_categories, __pyx_v_key); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error)
    /* … */
          __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_categories, __pyx_v_key); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error)
    /* … */
          __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_categories, __pyx_v_key); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error)
    /* … */
          __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_categories, __pyx_v_key); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error)

    +146:         codes[i] = code

        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 146, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint8_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_v_code;
      }
    /* … */
        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 146, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint16_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_v_code;
      }
    /* … */
        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 146, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint32_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_v_code;
      }
    /* … */
        __pyx_t_5 = __pyx_v_i;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_codes.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_codes.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 146, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint64_t *, __pyx_pybuffernd_codes.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_codes.diminfo[0].strides) = __pyx_v_code;
      }

     147:

     148:     cdef np.ndarray[np.int64_t, ndim=1] sorter

     149:     cdef np.ndarray[unsigned_integral, ndim=1] reverse_indexer

     150:     cdef int ncategories

    +151:     cdef np.ndarray[object] categories_array = np.asarray(

      __pyx_t_10 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    /* … */
      if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 151, __pyx_L1_error)
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
          __pyx_v_categories_array = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.buf = NULL;
          __PYX_ERR(0, 151, __pyx_L1_error)
        } else {__pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
        }
      }
      __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_10 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    /* … */
      if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 151, __pyx_L1_error)
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
          __pyx_v_categories_array = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.buf = NULL;
          __PYX_ERR(0, 151, __pyx_L1_error)
        } else {__pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
        }
      }
      __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_10 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    /* … */
      if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 151, __pyx_L1_error)
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
          __pyx_v_categories_array = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.buf = NULL;
          __PYX_ERR(0, 151, __pyx_L1_error)
        } else {__pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
        }
      }
      __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_1);
      __pyx_t_1 = 0;
    /* … */
      __pyx_t_10 = NULL;
      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_asarray); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 151, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    /* … */
      if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 151, __pyx_L1_error)
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
          __pyx_v_categories_array = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.buf = NULL;
          __PYX_ERR(0, 151, __pyx_L1_error)
        } else {__pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
        }
      }
      __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_1);
      __pyx_t_1 = 0;

     152:         categories,

    +153:         dtype=object,

      __pyx_t_13 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_12);
        assert(__pyx_t_10);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
        __Pyx_INCREF(__pyx_t_10);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
        __pyx_t_13 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_10, __pyx_v_categories};
        __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 151, __pyx_L1_error)
        __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_12, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
    /* … */
      __pyx_t_13 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_12);
        assert(__pyx_t_10);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
        __Pyx_INCREF(__pyx_t_10);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
        __pyx_t_13 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_10, __pyx_v_categories};
        __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 151, __pyx_L1_error)
        __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_12, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
    /* … */
      __pyx_t_13 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_12);
        assert(__pyx_t_10);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
        __Pyx_INCREF(__pyx_t_10);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
        __pyx_t_13 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_10, __pyx_v_categories};
        __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 151, __pyx_L1_error)
        __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_12, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }
    /* … */
      __pyx_t_13 = 1;
      #if CYTHON_UNPACK_METHODS
      if (unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_12);
        assert(__pyx_t_10);
        PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_12);
        __Pyx_INCREF(__pyx_t_10);
        __Pyx_INCREF(__pyx__function);
        __Pyx_DECREF_SET(__pyx_t_12, __pyx__function);
        __pyx_t_13 = 0;
      }
      #endif
      {
        PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_10, __pyx_v_categories};
        __pyx_t_11 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_builtin_object, __pyx_t_11, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 151, __pyx_L1_error)
        __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_12, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_11);
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
      }

     154:     )

     155:

    +156:     if sort:

      if (__pyx_v_sort) {
    /* … */
      }
    /* … */
      if (__pyx_v_sort) {
    /* … */
      }
    /* … */
      if (__pyx_v_sort) {
    /* … */
      }
    /* … */
      if (__pyx_v_sort) {
    /* … */
      }

     157:         # This is all adapted from pandas.core.algorithms.factorize.

    +158:         ncategories = len(categories_array)

        __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_categories_array)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 158, __pyx_L1_error)
        __pyx_v_ncategories = __pyx_t_2;
    /* … */
        __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_categories_array)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 158, __pyx_L1_error)
        __pyx_v_ncategories = __pyx_t_2;
    /* … */
        __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_categories_array)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 158, __pyx_L1_error)
        __pyx_v_ncategories = __pyx_t_2;
    /* … */
        __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_categories_array)); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 158, __pyx_L1_error)
        __pyx_v_ncategories = __pyx_t_2;

    +159:         sorter = np.empty(ncategories, dtype=np.int64)

        __pyx_t_12 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GetModuleGlobalName(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_10))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
          assert(__pyx_t_12);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_10, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_14 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_15, __pyx_t_14, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 159, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_10, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_14);
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 159, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)__pyx_v_sorter, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_sorter.diminfo[0].strides = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sorter.diminfo[0].shape = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 159, __pyx_L1_error)
        }
        __pyx_v_sorter = ((PyArrayObject *)__pyx_t_1);
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_12 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GetModuleGlobalName(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_10))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
          assert(__pyx_t_12);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_10, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_14 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_15, __pyx_t_14, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 159, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_10, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_14);
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 159, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)__pyx_v_sorter, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_sorter.diminfo[0].strides = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sorter.diminfo[0].shape = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 159, __pyx_L1_error)
        }
        __pyx_v_sorter = ((PyArrayObject *)__pyx_t_1);
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_12 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GetModuleGlobalName(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_10))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
          assert(__pyx_t_12);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_10, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_14 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_15, __pyx_t_14, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 159, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_10, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_14);
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 159, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)__pyx_v_sorter, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_sorter.diminfo[0].strides = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sorter.diminfo[0].shape = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 159, __pyx_L1_error)
        }
        __pyx_v_sorter = ((PyArrayObject *)__pyx_t_1);
        __pyx_t_1 = 0;
    /* … */
        __pyx_t_12 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_11 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GetModuleGlobalName(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_mstate_global->__pyx_n_u_int64); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_10))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
          assert(__pyx_t_12);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_10, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_14 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_15, __pyx_t_14, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 159, __pyx_L1_error)
          __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_10, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_14);
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 159, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sorter.rcbuffer->pybuffer, (PyObject*)__pyx_v_sorter, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_sorter.diminfo[0].strides = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sorter.diminfo[0].shape = __pyx_pybuffernd_sorter.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 159, __pyx_L1_error)
        }
        __pyx_v_sorter = ((PyArrayObject *)__pyx_t_1);
        __pyx_t_1 = 0;

     160:

     161:         # Don't include missing_value in the argsort, because None is

     162:         # unorderable with bytes/str in py3. Always just sort it to 0.

    +163:         sorter[1:] = categories_array[1:].argsort() + 1

        __pyx_t_14 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_categories_array), __pyx_mstate_global->__pyx_slice[0]); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_10 = __pyx_t_14;
        __Pyx_INCREF(__pyx_t_10);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
          __pyx_t_1 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_argsort, __pyx_callargs+__pyx_t_13, (1-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_14 = __Pyx_PyLong_AddObjC(__pyx_t_1, __pyx_mstate_global->__pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_sorter), __pyx_mstate_global->__pyx_slice[0], __pyx_t_14) < 0))) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    /* … */
        __pyx_t_14 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_categories_array), __pyx_mstate_global->__pyx_slice[0]); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_10 = __pyx_t_14;
        __Pyx_INCREF(__pyx_t_10);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
          __pyx_t_1 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_argsort, __pyx_callargs+__pyx_t_13, (1-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_14 = __Pyx_PyLong_AddObjC(__pyx_t_1, __pyx_mstate_global->__pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_sorter), __pyx_mstate_global->__pyx_slice[0], __pyx_t_14) < 0))) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    /* … */
        __pyx_t_14 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_categories_array), __pyx_mstate_global->__pyx_slice[0]); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_10 = __pyx_t_14;
        __Pyx_INCREF(__pyx_t_10);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
          __pyx_t_1 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_argsort, __pyx_callargs+__pyx_t_13, (1-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_14 = __Pyx_PyLong_AddObjC(__pyx_t_1, __pyx_mstate_global->__pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_sorter), __pyx_mstate_global->__pyx_slice[0], __pyx_t_14) < 0))) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    /* … */
        __pyx_t_14 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_categories_array), __pyx_mstate_global->__pyx_slice[0]); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_10 = __pyx_t_14;
        __Pyx_INCREF(__pyx_t_10);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
          __pyx_t_1 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_argsort, __pyx_callargs+__pyx_t_13, (1-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_14 = __Pyx_PyLong_AddObjC(__pyx_t_1, __pyx_mstate_global->__pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        if (unlikely((PyObject_SetItem(((PyObject *)__pyx_v_sorter), __pyx_mstate_global->__pyx_slice[0], __pyx_t_14) < 0))) __PYX_ERR(0, 163, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;

    +164:         sorter[0] = 0

        __pyx_t_5 = 0;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_sorter.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_sorter.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 164, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_sorter.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_sorter.diminfo[0].strides) = 0;
    /* … */
        __pyx_t_5 = 0;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_sorter.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_sorter.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 164, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_sorter.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_sorter.diminfo[0].strides) = 0;
    /* … */
        __pyx_t_5 = 0;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_sorter.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_sorter.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 164, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_sorter.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_sorter.diminfo[0].strides) = 0;
    /* … */
        __pyx_t_5 = 0;
        __pyx_t_6 = -1;
        if (__pyx_t_5 < 0) {
          __pyx_t_5 += __pyx_pybuffernd_sorter.diminfo[0].shape;
          if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
        } else if (unlikely(__pyx_t_5 >= __pyx_pybuffernd_sorter.diminfo[0].shape)) __pyx_t_6 = 0;
        if (unlikely(__pyx_t_6 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_6);
          __PYX_ERR(0, 164, __pyx_L1_error)
        }
        *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int64_t *, __pyx_pybuffernd_sorter.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_sorter.diminfo[0].strides) = 0;

     165:

    +166:         reverse_indexer = np.empty(ncategories, dtype=codes.dtype)

        __pyx_t_1 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_codes), __pyx_mstate_global->__pyx_n_u_dtype); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_15))) {
          __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_15);
          assert(__pyx_t_1);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_15);
          __Pyx_INCREF(__pyx_t_1);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_15, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_10};
          __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_11, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 166, __pyx_L1_error)
          __pyx_t_14 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 166, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)__pyx_v_reverse_indexer, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_reverse_indexer.diminfo[0].strides = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_reverse_indexer.diminfo[0].shape = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 166, __pyx_L1_error)
        }
        __pyx_v_reverse_indexer = ((PyArrayObject *)__pyx_t_14);
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_1 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_codes), __pyx_mstate_global->__pyx_n_u_dtype); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_15))) {
          __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_15);
          assert(__pyx_t_1);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_15);
          __Pyx_INCREF(__pyx_t_1);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_15, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_10};
          __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_11, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 166, __pyx_L1_error)
          __pyx_t_14 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 166, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)__pyx_v_reverse_indexer, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_reverse_indexer.diminfo[0].strides = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_reverse_indexer.diminfo[0].shape = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 166, __pyx_L1_error)
        }
        __pyx_v_reverse_indexer = ((PyArrayObject *)__pyx_t_14);
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_1 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_codes), __pyx_mstate_global->__pyx_n_u_dtype); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_15))) {
          __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_15);
          assert(__pyx_t_1);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_15);
          __Pyx_INCREF(__pyx_t_1);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_15, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_10};
          __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_11, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 166, __pyx_L1_error)
          __pyx_t_14 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 166, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)__pyx_v_reverse_indexer, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_reverse_indexer.diminfo[0].strides = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_reverse_indexer.diminfo[0].shape = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 166, __pyx_L1_error)
        }
        __pyx_v_reverse_indexer = ((PyArrayObject *)__pyx_t_14);
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_1 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_codes), __pyx_mstate_global->__pyx_n_u_dtype); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 166, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_15))) {
          __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_15);
          assert(__pyx_t_1);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_15);
          __Pyx_INCREF(__pyx_t_1);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_15, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_1, __pyx_t_10};
          __pyx_t_12 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_11, __pyx_t_12, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 166, __pyx_L1_error)
          __pyx_t_14 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_12);
          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 166, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 166, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer, (PyObject*)__pyx_v_reverse_indexer, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_reverse_indexer.diminfo[0].strides = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_reverse_indexer.diminfo[0].shape = __pyx_pybuffernd_reverse_indexer.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 166, __pyx_L1_error)
        }
        __pyx_v_reverse_indexer = ((PyArrayObject *)__pyx_t_14);
        __pyx_t_14 = 0;

    +167:         reverse_indexer.put(sorter, np.arange(ncategories))

        __pyx_t_15 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_15);
        __pyx_t_11 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_1))) {
          __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1);
          assert(__pyx_t_11);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_t_10};
          __pyx_t_12 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
        }
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_15, ((PyObject *)__pyx_v_sorter), __pyx_t_12};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_put, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    /* … */
        __pyx_t_15 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_15);
        __pyx_t_11 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_1))) {
          __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1);
          assert(__pyx_t_11);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_t_10};
          __pyx_t_12 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
        }
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_15, ((PyObject *)__pyx_v_sorter), __pyx_t_12};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_put, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    /* … */
        __pyx_t_15 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_15);
        __pyx_t_11 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_1))) {
          __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1);
          assert(__pyx_t_11);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_t_10};
          __pyx_t_12 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
        }
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_15, ((PyObject *)__pyx_v_sorter), __pyx_t_12};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_put, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
    /* … */
        __pyx_t_15 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_15);
        __pyx_t_11 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_mstate_global->__pyx_n_u_arange); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 167, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_13 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_1))) {
          __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1);
          assert(__pyx_t_11);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_1, __pyx__function);
          __pyx_t_13 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_t_10};
          __pyx_t_12 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_12);
        }
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_15, ((PyObject *)__pyx_v_sorter), __pyx_t_12};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_put, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 167, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;

     168:

    +169:         codes = reverse_indexer.take(codes)

        __pyx_t_12 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_codes)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 169, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 169, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 169, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_codes, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_codes)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 169, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 169, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint16_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 169, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_codes, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_codes)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 169, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 169, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint32_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 169, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_codes, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = ((PyObject *)__pyx_v_reverse_indexer);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_codes)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 169, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 169, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_codes.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_codes.rcbuffer->pybuffer, (PyObject*)__pyx_v_codes, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
            }
            __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0;
          }
          __pyx_pybuffernd_codes.diminfo[0].strides = __pyx_pybuffernd_codes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_codes.diminfo[0].shape = __pyx_pybuffernd_codes.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 169, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_codes, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;

    +170:         categories_array = categories_array.take(sorter)

        __pyx_t_12 = ((PyObject *)__pyx_v_categories_array);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_sorter)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 170, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 170, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_categories_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 170, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_categories_array, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = ((PyObject *)__pyx_v_categories_array);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_sorter)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 170, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 170, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_categories_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 170, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_categories_array, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = ((PyObject *)__pyx_v_categories_array);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_sorter)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 170, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 170, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_categories_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 170, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_categories_array, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = ((PyObject *)__pyx_v_categories_array);
        __Pyx_INCREF(__pyx_t_12);
        __pyx_t_13 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, ((PyObject *)__pyx_v_sorter)};
          __pyx_t_14 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_take, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 170, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 170, __pyx_L1_error)
        {
          __Pyx_BufFmt_StackElem __pyx_stack[1];
          __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer);
          __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_14), &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
          if (unlikely(__pyx_t_6 < 0)) {
            PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
            if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_categories_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_categories_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
              Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
              __Pyx_RaiseBufferFallbackError();
            } else {
              PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
            }
            __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0;
          }
          __pyx_pybuffernd_categories_array.diminfo[0].strides = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_categories_array.diminfo[0].shape = __pyx_pybuffernd_categories_array.rcbuffer->pybuffer.shape[0];
          if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 170, __pyx_L1_error)
        }
        __Pyx_DECREF_SET(__pyx_v_categories_array, ((PyArrayObject *)__pyx_t_14));
        __pyx_t_14 = 0;

    +171:         reverse_categories = dict(zip(categories_array, range(ncategories)))

        __pyx_t_12 = NULL;
        __Pyx_INCREF((PyObject *)(&PyDict_Type));
        __pyx_t_15 = ((PyObject *)(&PyDict_Type));
        __pyx_t_10 = NULL;
        __Pyx_INCREF(__pyx_builtin_zip);
        __pyx_t_11 = __pyx_builtin_zip;
        __pyx_t_20 = NULL;
        __Pyx_INCREF(__pyx_builtin_range);
        __pyx_t_21 = __pyx_builtin_range;
        __pyx_t_22 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 171, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_22);
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_20, __pyx_t_22};
          __pyx_t_19 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
          __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
          __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
          if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_19);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_10, ((PyObject *)__pyx_v_categories_array), __pyx_t_19};
          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_1};
          __pyx_t_14 = __Pyx_PyObject_FastCall(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF_SET(__pyx_v_reverse_categories, ((PyObject*)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = NULL;
        __Pyx_INCREF((PyObject *)(&PyDict_Type));
        __pyx_t_15 = ((PyObject *)(&PyDict_Type));
        __pyx_t_10 = NULL;
        __Pyx_INCREF(__pyx_builtin_zip);
        __pyx_t_11 = __pyx_builtin_zip;
        __pyx_t_20 = NULL;
        __Pyx_INCREF(__pyx_builtin_range);
        __pyx_t_21 = __pyx_builtin_range;
        __pyx_t_22 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 171, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_22);
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_20, __pyx_t_22};
          __pyx_t_19 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
          __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
          __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
          if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_19);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_10, ((PyObject *)__pyx_v_categories_array), __pyx_t_19};
          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_1};
          __pyx_t_14 = __Pyx_PyObject_FastCall(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF_SET(__pyx_v_reverse_categories, ((PyObject*)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = NULL;
        __Pyx_INCREF((PyObject *)(&PyDict_Type));
        __pyx_t_15 = ((PyObject *)(&PyDict_Type));
        __pyx_t_10 = NULL;
        __Pyx_INCREF(__pyx_builtin_zip);
        __pyx_t_11 = __pyx_builtin_zip;
        __pyx_t_20 = NULL;
        __Pyx_INCREF(__pyx_builtin_range);
        __pyx_t_21 = __pyx_builtin_range;
        __pyx_t_22 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 171, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_22);
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_20, __pyx_t_22};
          __pyx_t_19 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
          __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
          __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
          if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_19);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_10, ((PyObject *)__pyx_v_categories_array), __pyx_t_19};
          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_1};
          __pyx_t_14 = __Pyx_PyObject_FastCall(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF_SET(__pyx_v_reverse_categories, ((PyObject*)__pyx_t_14));
        __pyx_t_14 = 0;
    /* … */
        __pyx_t_12 = NULL;
        __Pyx_INCREF((PyObject *)(&PyDict_Type));
        __pyx_t_15 = ((PyObject *)(&PyDict_Type));
        __pyx_t_10 = NULL;
        __Pyx_INCREF(__pyx_builtin_zip);
        __pyx_t_11 = __pyx_builtin_zip;
        __pyx_t_20 = NULL;
        __Pyx_INCREF(__pyx_builtin_range);
        __pyx_t_21 = __pyx_builtin_range;
        __pyx_t_22 = __Pyx_PyLong_From_int(__pyx_v_ncategories); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 171, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_22);
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_20, __pyx_t_22};
          __pyx_t_19 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
          __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
          __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
          if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_19);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[3] = {__pyx_t_10, ((PyObject *)__pyx_v_categories_array), __pyx_t_19};
          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+__pyx_t_13, (3-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
        }
        __pyx_t_13 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_1};
          __pyx_t_14 = __Pyx_PyObject_FastCall(__pyx_t_15, __pyx_callargs+__pyx_t_13, (2-__pyx_t_13) | (__pyx_t_13*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 171, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_14);
        }
        __Pyx_DECREF_SET(__pyx_v_reverse_categories, ((PyObject*)__pyx_t_14));
        __pyx_t_14 = 0;

     172:

    +173:     return codes, categories_array, reverse_categories

      __Pyx_XDECREF(__pyx_r);
      __pyx_t_14 = PyTuple_New(3); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 173, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF((PyObject *)__pyx_v_categories_array);
      __Pyx_GIVEREF((PyObject *)__pyx_v_categories_array);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, ((PyObject *)__pyx_v_categories_array)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __pyx_r = __pyx_t_14;
      __pyx_t_14 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 116, 0, __PYX_ERR(0, 173, __pyx_L1_error));
      goto __pyx_L0;
    /* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_14 = PyTuple_New(3); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 173, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF((PyObject *)__pyx_v_categories_array);
      __Pyx_GIVEREF((PyObject *)__pyx_v_categories_array);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, ((PyObject *)__pyx_v_categories_array)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __pyx_r = __pyx_t_14;
      __pyx_t_14 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 116, 0, __PYX_ERR(0, 173, __pyx_L1_error));
      goto __pyx_L0;
    /* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_14 = PyTuple_New(3); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 173, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF((PyObject *)__pyx_v_categories_array);
      __Pyx_GIVEREF((PyObject *)__pyx_v_categories_array);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, ((PyObject *)__pyx_v_categories_array)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __pyx_r = __pyx_t_14;
      __pyx_t_14 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 116, 0, __PYX_ERR(0, 173, __pyx_L1_error));
      goto __pyx_L0;
    /* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_14 = PyTuple_New(3); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 173, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF((PyObject *)__pyx_v_categories_array);
      __Pyx_GIVEREF((PyObject *)__pyx_v_categories_array);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 1, ((PyObject *)__pyx_v_categories_array)) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 173, __pyx_L1_error);
      __pyx_r = __pyx_t_14;
      __pyx_t_14 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 116, 0, __PYX_ERR(0, 173, __pyx_L1_error));
      goto __pyx_L0;

     174:

    +175: cdef list _int_sizes = [1, 1, 2, 4, 4, 8, 8, 8, 8]

      __pyx_t_3 = __Pyx_PyList_Pack(9, __pyx_mstate_global->__pyx_int_1, __pyx_mstate_global->__pyx_int_1, __pyx_mstate_global->__pyx_int_2, __pyx_mstate_global->__pyx_int_4, __pyx_mstate_global->__pyx_int_4, __pyx_mstate_global->__pyx_int_8, __pyx_mstate_global->__pyx_int_8, __pyx_mstate_global->__pyx_int_8, __pyx_mstate_global->__pyx_int_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 175, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_XGOTREF(__pyx_v_7zipline_3lib_10_factorize__int_sizes);
      __Pyx_DECREF_SET(__pyx_v_7zipline_3lib_10_factorize__int_sizes, ((PyObject*)__pyx_t_3));
      __Pyx_GIVEREF(__pyx_t_3);
      __pyx_t_3 = 0;

     176:

    +177: cpdef factorize_strings(np.ndarray[object] values,

    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_5factorize_strings(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_7zipline_3lib_10_factorize_factorize_strings(PyArrayObject *__pyx_v_values, PyObject *__pyx_v_missing_value, int __pyx_v_sort, CYTHON_UNUSED int __pyx_skip_dispatch) {
      Py_ssize_t __pyx_v_nvalues;
      PyArrayObject *__pyx_v_codes = 0;
      PyArrayObject *__pyx_v_categories_array = 0;
      PyObject *__pyx_v_reverse_categories = 0;
      Py_ssize_t __pyx_v_length;
      PyObject *__pyx_v_narrowest_dtype = NULL;
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[54]))
      __Pyx_TraceStartFunc("factorize_strings", __pyx_f[0], 177, 0, 0, __pyx_skip_dispatch, __PYX_ERR(0, 177, __pyx_L1_error));
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 177, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
    /* … */
      /* function exit code */
      __pyx_L1_error:;
      __Pyx_XDECREF(__pyx_t_3);
      __Pyx_XDECREF(__pyx_t_4);
      __Pyx_XDECREF(__pyx_t_5);
      __Pyx_XDECREF(__pyx_t_6);
      __Pyx_XDECREF(__pyx_t_7);
      __Pyx_XDECREF(__pyx_t_8);
      { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
        __Pyx_PyThreadState_declare
        __Pyx_PyThreadState_assign
        __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
        __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
      __Pyx_TraceException(__pyx_lineno, 0, 0);
      #if CYTHON_USE_SYS_MONITORING
      __Pyx_TraceExceptionUnwind(0, 0);
      #else
      __Pyx_TraceReturnValue(NULL, 0, 0, __PYX_ERR(0, 177, __pyx_L1_error));
      #endif
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __pyx_r = 0;
      goto __pyx_L2;
      __pyx_L0:;
      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_values.rcbuffer->pybuffer);
      __pyx_L2:;
      __Pyx_XDECREF((PyObject *)__pyx_v_codes);
      __Pyx_XDECREF((PyObject *)__pyx_v_categories_array);
      __Pyx_XDECREF(__pyx_v_reverse_categories);
      __Pyx_XDECREF(__pyx_v_narrowest_dtype);
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_PyMonitoring_ExitScope(0);
      __Pyx_RefNannyFinishContext();
      return __pyx_r;
    }

    /* Python wrapper */
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_5factorize_strings(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_7zipline_3lib_10_factorize_4factorize_strings, "\n    Factorize an array of (possibly duplicated) labels into an array of indices\n    into a unique array of labels.\n\n    This is ~30% faster than pandas.factorize, at the cost of not having\n    special treatment for NaN, which we don't care about because we only\n    support arrays of strings.\n\n    (Though it's faster even if you throw in the nan checks that pandas does,\n    because we're using dict and list instead of PyObjectHashTable and\n    ObjectVector.  Python's builtin data structures are **really**\n    well-optimized.)\n    ");
    static PyMethodDef __pyx_mdef_7zipline_3lib_10_factorize_5factorize_strings = {"factorize_strings", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7zipline_3lib_10_factorize_5factorize_strings, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7zipline_3lib_10_factorize_4factorize_strings};
    static PyObject *__pyx_pw_7zipline_3lib_10_factorize_5factorize_strings(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
    ) {
      PyArrayObject *__pyx_v_values = 0;
      PyObject *__pyx_v_missing_value = 0;
      int __pyx_v_sort;
      #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("factorize_strings (wrapper)", 0);
      #if !CYTHON_METH_FASTCALL
      #if CYTHON_ASSUME_SAFE_SIZE
      __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
      #else
      __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
      #endif
      #endif
      __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
      {
        PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_values,&__pyx_mstate_global->__pyx_n_u_missing_value,&__pyx_mstate_global->__pyx_n_u_sort,0};
      PyObject* values[3] = {0,0,0};
        const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
        if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 177, __pyx_L3_error)
        if (__pyx_kwds_len > 0) {
          switch (__pyx_nargs) {
            case  3:
            values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 177, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  2:
            values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 177, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  1:
            values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
            if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 177, __pyx_L3_error)
            CYTHON_FALLTHROUGH;
            case  0: break;
            default: goto __pyx_L5_argtuple_error;
          }
          const Py_ssize_t kwd_pos_args = __pyx_nargs;
          if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "factorize_strings", 0) < (0)) __PYX_ERR(0, 177, __pyx_L3_error)
          for (Py_ssize_t i = __pyx_nargs; i < 3; i++) {
            if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("factorize_strings", 1, 3, 3, i); __PYX_ERR(0, 177, __pyx_L3_error) }
          }
        } else if (unlikely(__pyx_nargs != 3)) {
          goto __pyx_L5_argtuple_error;
        } else {
          values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 177, __pyx_L3_error)
          values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 177, __pyx_L3_error)
          values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
          if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 177, __pyx_L3_error)
        }
        __pyx_v_values = ((PyArrayObject *)values[0]);
        __pyx_v_missing_value = values[1];
        __pyx_v_sort = __Pyx_PyLong_As_int(values[2]); if (unlikely((__pyx_v_sort == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 179, __pyx_L3_error)
      }
      goto __pyx_L6_skip;
      __pyx_L5_argtuple_error:;
      __Pyx_RaiseArgtupleInvalid("factorize_strings", 1, 3, 3, __pyx_nargs); __PYX_ERR(0, 177, __pyx_L3_error)
      __pyx_L6_skip:;
      goto __pyx_L4_argument_unpacking_done;
      __pyx_L3_error:;
      for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
        Py_XDECREF(values[__pyx_temp]);
      }
      __Pyx_AddTraceback("zipline.lib._factorize.factorize_strings", __pyx_clineno, __pyx_lineno, __pyx_filename);
      __Pyx_RefNannyFinishContext();
      return NULL;
      __pyx_L4_argument_unpacking_done:;
      if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_values), __pyx_mstate_global->__pyx_ptype_5numpy_ndarray, 1, "values", 0))) __PYX_ERR(0, 177, __pyx_L1_error)
      __pyx_r = __pyx_pf_7zipline_3lib_10_factorize_4factorize_strings(__pyx_self, __pyx_v_values, __pyx_v_missing_value, __pyx_v_sort);
      int __pyx_lineno = 0;
      const char *__pyx_filename = NULL;
      int __pyx_clineno = 0;

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

    static PyObject *__pyx_pf_7zipline_3lib_10_factorize_4factorize_strings(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_values, PyObject *__pyx_v_missing_value, int __pyx_v_sort) {
      __Pyx_LocalBuf_ND __pyx_pybuffernd_values;
      __Pyx_Buffer __pyx_pybuffer_values;
      PyObject *__pyx_r = NULL;
      __Pyx_TraceDeclarationsFunc
      __Pyx_TraceFrameInit(((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[54]))
      __Pyx_TraceStartFunc("factorize_strings (wrapper)", __pyx_f[0], 177, 0, 0, 0, __PYX_ERR(0, 177, __pyx_L1_error));
      __pyx_pybuffer_values.pybuffer.buf = NULL;
      __pyx_pybuffer_values.refcount = 0;
      __pyx_pybuffernd_values.data = NULL;
      __pyx_pybuffernd_values.rcbuffer = &__pyx_pybuffer_values;
      {
        __Pyx_BufFmt_StackElem __pyx_stack[1];
        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_values.rcbuffer->pybuffer, (PyObject*)__pyx_v_values, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 177, __pyx_L1_error)
      }
      __pyx_pybuffernd_values.diminfo[0].strides = __pyx_pybuffernd_values.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_values.diminfo[0].shape = __pyx_pybuffernd_values.rcbuffer->pybuffer.shape[0];
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = __pyx_f_7zipline_3lib_10_factorize_factorize_strings(__pyx_v_values, __pyx_v_missing_value, __pyx_v_sort, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 177, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_r = __pyx_t_1;
      __pyx_t_1 = 0;
      goto __pyx_L0;
    /* … */
      __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7zipline_3lib_10_factorize_5factorize_strings, 0, __pyx_mstate_global->__pyx_n_u_factorize_strings, NULL, __pyx_mstate_global->__pyx_n_u_zipline_lib__factorize, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[54])); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 177, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_factorize_strings, __pyx_t_3) < (0)) __PYX_ERR(0, 177, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

     178:                         object missing_value,

     179:                         int sort):

     180:     """

     181:     Factorize an array of (possibly duplicated) labels into an array of indices

     182:     into a unique array of labels.

     183:

     184:     This is ~30% faster than pandas.factorize, at the cost of not having

     185:     special treatment for NaN, which we don't care about because we only

     186:     support arrays of strings.

     187:

     188:     (Though it's faster even if you throw in the nan checks that pandas does,

     189:     because we're using dict and list instead of PyObjectHashTable and

     190:     ObjectVector.  Python's builtin data structures are **really**

     191:     well-optimized.)

     192:     """

    +193:     cdef Py_ssize_t nvalues = len(values)

      __pyx_t_1 = PyObject_Length(((PyObject *)__pyx_v_values)); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 193, __pyx_L1_error)
      __pyx_v_nvalues = __pyx_t_1;

     194:     cdef np.ndarray codes

     195:     cdef np.ndarray categories_array

     196:     cdef dict reverse_categories

     197:

     198:     # use exclusive less than because we need to account for the possibility

     199:     # that the missing value is not in values

    +200:     if nvalues < 2 ** 8:

      __pyx_t_2 = (__pyx_v_nvalues < 0x100);
      if (__pyx_t_2) {
    /* … */
      }

     201:         # we won't try to shrink because the ``codes`` array cannot get any

     202:         # smaller

    +203:         return factorize_strings_impl[np.uint8_t](

        __Pyx_XDECREF(__pyx_r);
    /* … */
        __pyx_t_6 = __pyx_fuse_0__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_3)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 203, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_r = __pyx_t_6;
        __pyx_t_6 = 0;
        __Pyx_TraceReturnValue(__pyx_r, 9, 0, __PYX_ERR(0, 203, __pyx_L1_error));
        goto __pyx_L0;

     204:             values,

     205:             missing_value,

     206:             sort,

    +207:             np.empty(nvalues, dtype=np.uint8)

        __pyx_t_4 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 207, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 207, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 207, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 207, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 207, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_9 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6);
          assert(__pyx_t_4);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_6);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_6, __pyx__function);
          __pyx_t_9 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, __pyx_t_5};
          __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 207, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_8, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 207, __pyx_L1_error)
          __pyx_t_3 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_6, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 207, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
        }
        if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 207, __pyx_L1_error)

     208:         )

    +209:     elif nvalues < 2 ** 16:

      __pyx_t_2 = (__pyx_v_nvalues < 0x10000);
      if (__pyx_t_2) {
    /* … */
        goto __pyx_L3;
      }

    +210:         (codes,

        if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 210, __pyx_L1_error)
        if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 210, __pyx_L1_error)
        if (!(likely(PyDict_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_4))) __PYX_ERR(0, 210, __pyx_L1_error)
        __pyx_v_codes = ((PyArrayObject *)__pyx_t_6);
        __pyx_t_6 = 0;
        __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_5);
        __pyx_t_5 = 0;
        __pyx_v_reverse_categories = ((PyObject*)__pyx_t_4);
        __pyx_t_4 = 0;

     211:          categories_array,

    +212:          reverse_categories) = factorize_strings_impl[np.uint16_t](

        __pyx_t_8 = __pyx_fuse_1__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_6)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 212, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        if ((likely(PyTuple_CheckExact(__pyx_t_8))) || (PyList_CheckExact(__pyx_t_8))) {
          PyObject* sequence = __pyx_t_8;
          Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
          if (unlikely(size != 3)) {
            if (size > 3) __Pyx_RaiseTooManyValuesError(3);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            __PYX_ERR(0, 210, __pyx_L1_error)
          }
          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0);
            __Pyx_INCREF(__pyx_t_6);
            __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1);
            __Pyx_INCREF(__pyx_t_5);
            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2);
            __Pyx_INCREF(__pyx_t_4);
          } else {
            __pyx_t_6 = __Pyx_PyList_GetItemRef(sequence, 0);
            if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 210, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_6);
            __pyx_t_5 = __Pyx_PyList_GetItemRef(sequence, 1);
            if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 210, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_5);
            __pyx_t_4 = __Pyx_PyList_GetItemRef(sequence, 2);
            if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_4);
          }
          #else
          __pyx_t_6 = __Pyx_PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 210, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_5 = __Pyx_PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 210, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          __pyx_t_4 = __Pyx_PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_7 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 210, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __pyx_t_10 = (CYTHON_COMPILING_IN_LIMITED_API) ? PyIter_Next : __Pyx_PyObject_GetIterNextFunc(__pyx_t_7);
          index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L4_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_6);
          index = 1; __pyx_t_5 = __pyx_t_10(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L4_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_5);
          index = 2; __pyx_t_4 = __pyx_t_10(__pyx_t_7); if (unlikely(!__pyx_t_4)) goto __pyx_L4_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_4);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_7), 3) < (0)) __PYX_ERR(0, 210, __pyx_L1_error)
          __pyx_t_10 = NULL;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          goto __pyx_L5_unpacking_done;
          __pyx_L4_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __pyx_t_10 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          __PYX_ERR(0, 210, __pyx_L1_error)
          __pyx_L5_unpacking_done:;
        }

     213:             values,

     214:             missing_value,

     215:             sort,

    +216:             np.empty(nvalues, dtype=np.uint16),

        __pyx_t_3 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 216, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 216, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_7 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 216, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 216, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_uint16); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 216, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_9 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_8))) {
          __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_8);
          assert(__pyx_t_3);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_3);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_8, __pyx__function);
          __pyx_t_9 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_3, __pyx_t_7};
          __pyx_t_5 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 216, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_4, __pyx_t_5, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 216, __pyx_L1_error)
          __pyx_t_6 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_8, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_5);
          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 216, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
        }
        if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 216, __pyx_L1_error)

     217:         )

    +218:     elif nvalues < 2 ** 32:

      __pyx_t_8 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 218, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_4 = PyObject_RichCompare(__pyx_t_8, __pyx_mstate_global->__pyx_int_4294967296, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 218, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 218, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (__pyx_t_2) {
    /* … */
        goto __pyx_L3;
      }

    +219:         (codes,

        if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 219, __pyx_L1_error)
        if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 219, __pyx_L1_error)
        if (!(likely(PyDict_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_3))) __PYX_ERR(0, 219, __pyx_L1_error)
        __pyx_v_codes = ((PyArrayObject *)__pyx_t_4);
        __pyx_t_4 = 0;
        __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_7);
        __pyx_t_7 = 0;
        __pyx_v_reverse_categories = ((PyObject*)__pyx_t_3);
        __pyx_t_3 = 0;

     220:          categories_array,

    +221:          reverse_categories) = factorize_strings_impl[np.uint32_t](

        __pyx_t_6 = __pyx_fuse_2__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 221, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
          PyObject* sequence = __pyx_t_6;
          Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
          if (unlikely(size != 3)) {
            if (size > 3) __Pyx_RaiseTooManyValuesError(3);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            __PYX_ERR(0, 219, __pyx_L1_error)
          }
          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0);
            __Pyx_INCREF(__pyx_t_4);
            __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1);
            __Pyx_INCREF(__pyx_t_7);
            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2);
            __Pyx_INCREF(__pyx_t_3);
          } else {
            __pyx_t_4 = __Pyx_PyList_GetItemRef(sequence, 0);
            if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 219, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_4);
            __pyx_t_7 = __Pyx_PyList_GetItemRef(sequence, 1);
            if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 219, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_7);
            __pyx_t_3 = __Pyx_PyList_GetItemRef(sequence, 2);
            if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 219, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_3);
          }
          #else
          __pyx_t_4 = __Pyx_PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 219, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          __pyx_t_7 = __Pyx_PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 219, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          __pyx_t_3 = __Pyx_PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 219, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
          #endif
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_5 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 219, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_10 = (CYTHON_COMPILING_IN_LIMITED_API) ? PyIter_Next : __Pyx_PyObject_GetIterNextFunc(__pyx_t_5);
          index = 0; __pyx_t_4 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_4);
          index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_7);
          index = 2; __pyx_t_3 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L6_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_3);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_5), 3) < (0)) __PYX_ERR(0, 219, __pyx_L1_error)
          __pyx_t_10 = NULL;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          goto __pyx_L7_unpacking_done;
          __pyx_L6_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __pyx_t_10 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          __PYX_ERR(0, 219, __pyx_L1_error)
          __pyx_L7_unpacking_done:;
        }

     222:             values,

     223:             missing_value,

     224:             sort,

    +225:             np.empty(nvalues, dtype=np.uint32),

        __pyx_t_8 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 225, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 225, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_5 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 225, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 225, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_uint32); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_9 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);
          assert(__pyx_t_8);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_6);
          __Pyx_INCREF(__pyx_t_8);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_6, __pyx__function);
          __pyx_t_9 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_8, __pyx_t_5};
          __pyx_t_7 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 225, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_3, __pyx_t_7, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 225, __pyx_L1_error)
          __pyx_t_4 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_6, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_7);
          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 225, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
        }
        if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 225, __pyx_L1_error)

     226:         )

    +227:     elif nvalues < 2 ** 64:

      __pyx_t_6 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 227, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_3 = PyObject_RichCompare(__pyx_t_6, __pyx_mstate_global->__pyx_int_0x10000000000000000, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 227, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 227, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (likely(__pyx_t_2)) {
    /* … */
        goto __pyx_L3;
      }

    +228:         (codes,

        if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 228, __pyx_L1_error)
        if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 228, __pyx_L1_error)
        if (!(likely(PyDict_CheckExact(__pyx_t_8))||((__pyx_t_8) == Py_None) || __Pyx_RaiseUnexpectedTypeError("dict", __pyx_t_8))) __PYX_ERR(0, 228, __pyx_L1_error)
        __pyx_v_codes = ((PyArrayObject *)__pyx_t_3);
        __pyx_t_3 = 0;
        __pyx_v_categories_array = ((PyArrayObject *)__pyx_t_5);
        __pyx_t_5 = 0;
        __pyx_v_reverse_categories = ((PyObject*)__pyx_t_8);
        __pyx_t_8 = 0;

     229:          categories_array,

    +230:          reverse_categories) = factorize_strings_impl[np.uint64_t](

        __pyx_t_4 = __pyx_fuse_3__pyx_f_7zipline_3lib_10_factorize_factorize_strings_impl(((PyArrayObject *)__pyx_v_values), __pyx_v_missing_value, __pyx_v_sort, ((PyArrayObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 230, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
          PyObject* sequence = __pyx_t_4;
          Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
          if (unlikely(size != 3)) {
            if (size > 3) __Pyx_RaiseTooManyValuesError(3);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            __PYX_ERR(0, 228, __pyx_L1_error)
          }
          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0);
            __Pyx_INCREF(__pyx_t_3);
            __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1);
            __Pyx_INCREF(__pyx_t_5);
            __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2);
            __Pyx_INCREF(__pyx_t_8);
          } else {
            __pyx_t_3 = __Pyx_PyList_GetItemRef(sequence, 0);
            if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 228, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_3);
            __pyx_t_5 = __Pyx_PyList_GetItemRef(sequence, 1);
            if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 228, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_5);
            __pyx_t_8 = __Pyx_PyList_GetItemRef(sequence, 2);
            if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 228, __pyx_L1_error)
            __Pyx_XGOTREF(__pyx_t_8);
          }
          #else
          __pyx_t_3 = __Pyx_PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 228, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
          __pyx_t_5 = __Pyx_PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 228, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          __pyx_t_8 = __Pyx_PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 228, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_8);
          #endif
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 228, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          __pyx_t_10 = (CYTHON_COMPILING_IN_LIMITED_API) ? PyIter_Next : __Pyx_PyObject_GetIterNextFunc(__pyx_t_7);
          index = 0; __pyx_t_3 = __pyx_t_10(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L8_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_3);
          index = 1; __pyx_t_5 = __pyx_t_10(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L8_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_5);
          index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_7); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_8);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_7), 3) < (0)) __PYX_ERR(0, 228, __pyx_L1_error)
          __pyx_t_10 = NULL;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          goto __pyx_L9_unpacking_done;
          __pyx_L8_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __pyx_t_10 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          __PYX_ERR(0, 228, __pyx_L1_error)
          __pyx_L9_unpacking_done:;
        }

     231:             values,

     232:             missing_value,

     233:             sort,

    +234:             np.empty(nvalues, dtype=np.uint64),

        __pyx_t_6 = NULL;
        __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 234, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_mstate_global->__pyx_n_u_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 234, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_7 = PyLong_FromSsize_t(__pyx_v_nvalues); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 234, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_mstate_global->__pyx_n_u_uint64); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 234, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_9 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
          assert(__pyx_t_6);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
          __pyx_t_9 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[2 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_6, __pyx_t_7};
          __pyx_t_5 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 234, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_dtype, __pyx_t_8, __pyx_t_5, __pyx_callargs+2, 0) < (0)) __PYX_ERR(0, 234, __pyx_L1_error)
          __pyx_t_3 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_4, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_5);
          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 234, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
        }
        if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 234, __pyx_L1_error)

     235:         )

     236:     else:

     237:         # unreachable

    +238:         raise ValueError('nvalues larger than uint64')

      /*else*/ {
        __pyx_t_8 = NULL;
        __Pyx_INCREF(__pyx_builtin_ValueError);
        __pyx_t_5 = __pyx_builtin_ValueError;
        __pyx_t_9 = 1;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_mstate_global->__pyx_kp_u_nvalues_larger_than_uint64};
          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (__pyx_t_9*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
        }
        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __PYX_ERR(0, 238, __pyx_L1_error)
      }
      __pyx_L3:;

     239:

    +240:     length = len(categories_array)

      __pyx_t_1 = PyObject_Length(((PyObject *)__pyx_v_categories_array)); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 240, __pyx_L1_error)
      __pyx_v_length = __pyx_t_1;

    +241:     narrowest_dtype = smallest_uint_that_can_hold(length)

      __pyx_t_4 = __pyx_f_7zipline_3lib_10_factorize_smallest_uint_that_can_hold(__pyx_v_length, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 241, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_v_narrowest_dtype = __pyx_t_4;
      __pyx_t_4 = 0;

    +242:     if codes.dtype != narrowest_dtype:

      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_codes), __pyx_mstate_global->__pyx_n_u_dtype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 242, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_v_narrowest_dtype, Py_NE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 242, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 242, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (__pyx_t_2) {
    /* … */
      }

     243:         # condense the codes down to the narrowest dtype possible

    +244:         codes = codes.astype(narrowest_dtype)

        __pyx_t_4 = ((PyObject *)__pyx_v_codes);
        __Pyx_INCREF(__pyx_t_4);
        __pyx_t_9 = 0;
        {
          PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_narrowest_dtype};
          __pyx_t_5 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_astype, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
          if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
        }
        if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_mstate_global->__pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 244, __pyx_L1_error)
        __Pyx_DECREF_SET(__pyx_v_codes, ((PyArrayObject *)__pyx_t_5));
        __pyx_t_5 = 0;

     245:

    +246:     return codes, categories_array, reverse_categories

      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 246, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF((PyObject *)__pyx_v_codes);
      __Pyx_GIVEREF((PyObject *)__pyx_v_codes);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_codes)) != (0)) __PYX_ERR(0, 246, __pyx_L1_error);
      __Pyx_INCREF((PyObject *)__pyx_v_categories_array);
      __Pyx_GIVEREF((PyObject *)__pyx_v_categories_array);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, ((PyObject *)__pyx_v_categories_array)) != (0)) __PYX_ERR(0, 246, __pyx_L1_error);
      __Pyx_INCREF(__pyx_v_reverse_categories);
      __Pyx_GIVEREF(__pyx_v_reverse_categories);
      if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_reverse_categories) != (0)) __PYX_ERR(0, 246, __pyx_L1_error);
      __pyx_r = __pyx_t_5;
      __pyx_t_5 = 0;
      __Pyx_TraceReturnValue(__pyx_r, 110, 0, __PYX_ERR(0, 246, __pyx_L1_error));
      goto __pyx_L0;